diff --git a/CHANGELOG.md b/CHANGELOG.md
index 20d1eb2ed..c99717a4d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,42 @@
Changelog
==========
+Version 6.5.5 *(2019-03-05)*
+----------------------------
+
+ * Improve new file discovery
+ * Fixed some third party intent related glitches
+ * Fixed some issues related to grouping thumbnails
+ * Added a note at Sorting and Grouping dialog to avoid some confusion
+ * Avoid deleting filtered out file types at deleting folders
+
+Version 6.5.4 *(2019-02-28)*
+----------------------------
+
+ * Allow customizing file loading priority
+ * Fixed the handling of some image picker intents
+ * Speeded up renaming files on SD cards
+ * Added some file loading performance improvements
+ * Some stability improvements
+
+Version 6.5.3 *(2019-02-22)*
+----------------------------
+
+ * Added main screen menu buttons for fast Recycle Bin showing/hiding
+ * Added a new setting item for changing date and time format
+ * Do not shuffle images with Random sorting that often
+ * Fixed some glitches related to file rename, delete, move
+ * Added many smaller bugfixes and UX improvements
+
+Version 6.5.2 *(2019-02-16)*
+----------------------------
+
+ * Added an option to disable rotating fullscreen images with gestures
+ * Improved OTG usb device handling
+ * Fixed Grouping by date taken
+ * Improved the performance at deleting files from the fullscreen view
+ * Some stability improvements
+
Version 6.5.1 *(2019-02-11)*
----------------------------
diff --git a/README.md b/README.md
index 6b7f501ad..b39f5fa3a 100644
--- a/README.md
+++ b/README.md
@@ -30,8 +30,8 @@ The fingerprint permission is needed for locking either hidden item visibility,
This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
-
-
+
+
diff --git a/app/build.gradle b/app/build.gradle
index 36a42465f..8dd25ee8d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,8 +15,8 @@ android {
applicationId "com.simplemobiletools.gallery.pro"
minSdkVersion 21
targetSdkVersion 28
- versionCode 229
- versionName "6.5.1"
+ versionCode 233
+ versionName "6.5.5"
multiDexEnabled true
setProperty("archivesBaseName", "gallery")
}
@@ -61,22 +61,22 @@ android {
}
dependencies {
- implementation 'com.simplemobiletools:commons:5.7.7'
+ implementation 'com.simplemobiletools:commons:5.10.0'
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.16'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3'
- implementation 'com.google.android.exoplayer:exoplayer-core:2.9.2'
+ 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'
implementation 'org.apache.sanselan:sanselan:0.97-incubator'
implementation 'info.androidhive:imagefilters:1.0.7'
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.caverock:androidsvg-aar:1.3'
- implementation 'com.github.tibbi:gestureviews:bd0a8e67a1'
- implementation 'com.github.tibbi:subsampling-scale-image-view:6c14987053'
- kapt 'com.github.bumptech.glide:compiler:4.8.0' // keep it here too, not just in Commons, else loading SVGs wont work
+ implementation 'com.github.tibbi:gestureviews:cb7c2c191a'
+ implementation 'com.github.tibbi:subsampling-scale-image-view:7e4202eaee'
+ kapt 'com.github.bumptech.glide:compiler:4.9.0' // keep it here too, not just in Commons, else loading SVGs wont work
kapt 'androidx.room:room-compiler:2.0.0'
implementation 'androidx.room:room-runtime:2.0.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8b41fb872..dff3c06f6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,6 +14,10 @@
+
+
uri
+ isPathOnOTG(realPath) -> uri
realPath.startsWith("file:/") -> Uri.parse(realPath)
else -> Uri.fromFile(File(realPath))
}
@@ -766,6 +771,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private fun getNewFilePath(): Pair {
var newPath = applicationContext.getRealPathFromURI(saveUri) ?: ""
+ if (newPath.startsWith("/mnt/")) {
+ newPath = ""
+ }
+
var shouldAppendFilename = true
if (newPath.isEmpty()) {
val filename = applicationContext.getFilenameFromContentUri(saveUri) ?: ""
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 38de24828..365aaec98 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
@@ -17,7 +17,6 @@ import android.widget.Toast
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
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.extensions.*
@@ -44,6 +43,7 @@ import com.simplemobiletools.gallery.pro.models.Medium
import kotlinx.android.synthetic.main.activity_main.*
import java.io.*
import java.util.*
+import kotlin.collections.ArrayList
class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private val PICK_MEDIA = 2
@@ -147,6 +147,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
updateWidgets()
+ registerFileUpdateListener()
}
override fun onStart() {
@@ -239,6 +240,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
config.tempSkipDeleteConfirmation = false
mTempShowHiddenHandler.removeCallbacksAndMessages(null)
removeTempFolder()
+ unregisterFileUpdateListener()
if (!config.showAll) {
GalleryDatabase.destroyInstance()
@@ -265,9 +267,12 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
menuInflater.inflate(R.menu.menu_main_intent, menu)
} else {
menuInflater.inflate(R.menu.menu_main, menu)
+ val useBin = config.useRecycleBin
menu.apply {
findItem(R.id.increase_column_count).isVisible = config.viewTypeFolders == VIEW_TYPE_GRID && config.dirColumnCnt < MAX_COLUMN_COUNT
findItem(R.id.reduce_column_count).isVisible = config.viewTypeFolders == VIEW_TYPE_GRID && config.dirColumnCnt > 1
+ findItem(R.id.hide_the_recycle_bin).isVisible = useBin && config.showRecycleBinAtFolders
+ findItem(R.id.show_the_recycle_bin).isVisible = useBin && !config.showRecycleBinAtFolders
setupSearch(this)
}
}
@@ -288,6 +293,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
R.id.temporarily_show_hidden -> tryToggleTemporarilyShowHidden()
R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden()
R.id.create_new_folder -> createNewFolder()
+ R.id.show_the_recycle_bin -> toggleRecycleBin(true)
+ R.id.hide_the_recycle_bin -> toggleRecycleBin(false)
R.id.increase_column_count -> increaseColumnCount()
R.id.reduce_column_count -> reduceColumnCount()
R.id.settings -> launchSettings()
@@ -371,17 +378,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
- private fun checkOTGInclusion() {
+ private fun checkOTGPath() {
Thread {
- if (hasOTGConnected()) {
- runOnUiThread {
- ConfirmationDialog(this, getString(R.string.usb_detected), positive = R.string.ok, negative = 0) {
- handleOTGPermission {
- config.addIncludedFolder(OTG_PATH)
- }
- }
- }
+ if (!config.wasOTGHandled && hasPermission(PERMISSION_WRITE_STORAGE) && hasOTGConnected() && config.OTGPath.isEmpty()) {
config.wasOTGHandled = true
+ getStorageDirectories().firstOrNull { it.trimEnd('/') != internalStoragePath && it.trimEnd('/') != sdCardPath }?.apply {
+ val otgPath = trimEnd('/')
+ config.OTGPath = otgPath
+ config.addIncludedFolder(otgPath)
+ }
}
}.start()
}
@@ -389,9 +394,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun tryLoadGallery() {
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
- if (!config.wasOTGHandled && hasPermission(PERMISSION_WRITE_STORAGE)) {
- checkOTGInclusion()
- }
+ checkOTGPath()
if (config.showAll) {
showAllMedia()
@@ -497,36 +500,39 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
+ val itemsToDelete = ArrayList()
+ val filter = config.filterMedia
+ val showHidden = config.shouldShowHidden
+ fileDirItems.filter { it.isDirectory }.forEach {
+ val files = File(it.path).listFiles()
+ files?.filter {
+ it.absolutePath.isMediaFile() && (showHidden || !it.name.startsWith('.')) &&
+ ((it.isImageFast() && filter and TYPE_IMAGES != 0) ||
+ (it.isVideoFast() && filter and TYPE_VIDEOS != 0) ||
+ (it.isGif() && filter and TYPE_GIFS != 0) ||
+ (it.isRawFast() && filter and TYPE_RAWS != 0) ||
+ (it.isSvg() && filter and TYPE_SVGS != 0))
+ }?.mapTo(itemsToDelete) { it.toFileDirItem(this) }
+ }
+
if (config.useRecycleBin) {
val pathsToDelete = ArrayList()
- val filter = config.filterMedia
- val showHidden = config.shouldShowHidden
- fileDirItems.filter { it.isDirectory }.forEach {
- val files = File(it.path).listFiles()
- files?.filter {
- it.absolutePath.isMediaFile() && (showHidden || !it.name.startsWith('.')) &&
- ((it.isImageFast() && filter and TYPE_IMAGES != 0) ||
- (it.isVideoFast() && filter and TYPE_VIDEOS != 0) ||
- (it.isGif() && filter and TYPE_GIFS != 0) ||
- (it.isRawFast() && filter and TYPE_RAWS != 0) ||
- (it.isSvg() && filter and TYPE_SVGS != 0))
- }?.mapTo(pathsToDelete) { it.absolutePath }
- }
+ itemsToDelete.mapTo(pathsToDelete) { it.path }
movePathsInRecycleBin(pathsToDelete, mMediumDao) {
if (it) {
- deleteFilteredFolders(fileDirItems, folders)
+ deleteFilteredFileDirItems(itemsToDelete, folders)
} else {
toast(R.string.unknown_error_occurred)
}
}
} else {
- deleteFilteredFolders(fileDirItems, folders)
+ deleteFilteredFileDirItems(itemsToDelete, folders)
}
}
- private fun deleteFilteredFolders(fileDirItems: ArrayList, folders: ArrayList) {
- deleteFolders(fileDirItems) {
+ private fun deleteFilteredFileDirItems(fileDirItems: ArrayList, folders: ArrayList) {
+ deleteFiles(fileDirItems) {
runOnUiThread {
refreshItems()
}
@@ -617,6 +623,18 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
mZoomListener = null
}
+ private fun toggleRecycleBin(show: Boolean) {
+ config.showRecycleBinAtFolders = show
+ invalidateOptionsMenu()
+ Thread {
+ var dirs = getCurrentlyDisplayedDirs()
+ if (!show) {
+ dirs = dirs.filter { it.path != RECYCLE_BIN } as ArrayList
+ }
+ gotDirectories(dirs)
+ }.start()
+ }
+
private fun createNewFolder() {
FilePickerDialog(this, internalStoragePath, false, config.shouldShowHidden, false, true) {
CreateNewFolderDialog(this, it) {
@@ -681,7 +699,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
var resultUri: Uri? = null
if (mIsThirdPartyIntent) {
when {
- intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true -> {
+ intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true && intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0 -> {
resultUri = fillExtraOutput(resultData)
}
resultData.extras?.containsKey(PICKED_PATHS) == true -> fillPickedPaths(resultData, resultIntent)
@@ -803,6 +821,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val tempFolderPath = config.tempFolderPath
val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
+ val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
val favoritePaths = getFavoritePaths()
val dirPathsToRemove = ArrayList()
@@ -812,14 +831,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
return
}
- val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths, false)
+ val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperFileSize, favoritePaths, false)
val newDir = if (curMedia.isEmpty()) {
if (directory.path != tempFolderPath) {
dirPathsToRemove.add(directory.path)
}
directory
} else {
- createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending)
+ createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize)
}
// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed
@@ -885,7 +904,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
return
}
- val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths, false)
+ val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperFileSize, favoritePaths, false)
if (newMedia.isEmpty()) {
continue
}
@@ -899,12 +918,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
- val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, isSortingAscending)
+ val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize)
dirs.add(newDir)
setupAdapter(dirs)
- mDirectoryDao.insert(newDir)
- if (folder != RECYCLE_BIN) {
- mMediumDao.insertAll(newMedia)
+ try {
+ mDirectoryDao.insert(newDir)
+ if (folder != RECYCLE_BIN) {
+ mMediumDao.insertAll(newMedia)
+ }
+ } catch (ignored: Exception) {
}
}
@@ -939,14 +961,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun createDirectoryFromMedia(path: String, curMedia: ArrayList, albumCovers: ArrayList, hiddenString: String,
- includedFolders: MutableSet, isSortingAscending: Boolean): Directory {
- var thumbnail = curMedia.firstOrNull { getDoesFilePathExist(it.path) }?.path ?: ""
- if (thumbnail.startsWith(OTG_PATH)) {
- thumbnail = thumbnail.getOTGPublicPath(applicationContext)
- }
-
+ includedFolders: MutableSet, isSortingAscending: Boolean, getProperFileSize: Boolean): Directory {
+ var thumbnail = curMedia.firstOrNull { File(it.path).exists() }?.path ?: ""
albumCovers.forEach {
- if (it.path == path && getDoesFilePathExist(it.tmb)) {
+ if (it.path == path && File(it.tmb).exists()) {
thumbnail = it.tmb
}
}
@@ -956,7 +974,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val dirName = checkAppendingHidden(path, hiddenString, includedFolders)
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 = curMedia.sumByLong { it.size }
+ val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L
val mediaTypes = curMedia.getDirMediaTypes()
return Directory(null, path, thumbnail, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes)
}
@@ -1030,10 +1048,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun checkInvalidDirectories(dirs: ArrayList) {
val invalidDirs = ArrayList()
dirs.filter { !it.areFavorites() && !it.isRecycleBin() }.forEach {
- if (!getDoesFilePathExist(it.path)) {
+ if (!File(it.path).exists()) {
invalidDirs.add(it)
} else if (it.path != config.tempFolderPath) {
- val children = if (it.path.startsWith(OTG_PATH)) getOTGFolderChildrenNames(it.path) else File(it.path).list()?.asList()
+ val children = File(it.path).list()?.asList()
val hasMediaFile = children?.any { it?.isMediaFile() == true } ?: false
if (!hasMediaFile) {
invalidDirs.add(it)
@@ -1066,7 +1084,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun getCurrentlyDisplayedDirs() = getRecyclerAdapter()?.dirs ?: ArrayList()
- private fun getBubbleTextItem(index: Int) = getRecyclerAdapter()?.dirs?.getOrNull(index)?.getBubbleText(config.directorySorting) ?: ""
+ private fun getBubbleTextItem(index: Int) = getRecyclerAdapter()?.dirs?.getOrNull(index)?.getBubbleText(config.directorySorting, this)
+ ?: ""
private fun setupLatestMediaId() {
Thread {
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 5a474751e..dff45ff8f 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
@@ -23,9 +23,9 @@ import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.OTG_PATH
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.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.commons.views.MyRecyclerView
@@ -108,6 +108,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
if (mShowAll) {
supportActionBar?.setDisplayHomeAsUpEnabled(false)
+ registerFileUpdateListener()
}
media_empty_text.setOnClickListener {
@@ -153,10 +154,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_refresh_layout.isEnabled = config.enablePullToRefresh
- tryLoadGallery()
invalidateOptionsMenu()
media_empty_text_label.setTextColor(config.textColor)
media_empty_text.setTextColor(getAdjustedPrimaryColor())
+
+ if (mMedia.isEmpty() || config.getFileSorting(mPath) and SORT_BY_RANDOM == 0) {
+ tryLoadGallery()
+ }
}
override fun onPause() {
@@ -190,6 +194,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
if (config.showAll && !isChangingConfigurations) {
config.temporarilyShowHidden = false
config.tempSkipDeleteConfirmation = false
+ unregisterFileUpdateListener()
GalleryDatabase.destroyInstance()
}
@@ -339,8 +344,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val dirName = when {
mPath == FAVORITES -> getString(R.string.favorites)
mPath == RECYCLE_BIN -> getString(R.string.recycle_bin)
- mPath == OTG_PATH -> getString(R.string.usb)
- mPath.startsWith(OTG_PATH) -> mPath.trimEnd('/').substringAfterLast('/')
+ mPath == config.OTGPath -> getString(R.string.usb)
else -> getHumanizedFilename(mPath)
}
updateActionBarTitle(if (mShowAll) resources.getString(R.string.all_folders) else dirName)
@@ -415,7 +419,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun checkLastMediaChanged() {
- if (isDestroyed) {
+ if (isDestroyed || config.getFileSorting(mPath) and SORT_BY_RANDOM != 0) {
return
}
@@ -547,7 +551,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun deleteDirectoryIfEmpty() {
val fileDirItem = FileDirItem(mPath, mPath.getFilenameFromPath(), true)
- if (config.deleteEmptyFolders && !fileDirItem.isDownloadsFolder() && fileDirItem.isDirectory && fileDirItem.getProperFileCount(applicationContext, true) == 0) {
+ if (config.deleteEmptyFolders && !fileDirItem.isDownloadsFolder() && fileDirItem.isDirectory && fileDirItem.getProperFileCount(true) == 0) {
tryDeleteFileDirItem(fileDirItem, true, true)
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt
index c9c413caa..1a9f62a45 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt
@@ -14,6 +14,7 @@ import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.IS_FROM_GALLERY
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.REAL_FILE_PATH
+import com.simplemobiletools.commons.helpers.SIDELOADING_TRUE
import com.simplemobiletools.gallery.pro.BuildConfig
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.*
@@ -40,6 +41,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_holder)
+ if (config.appSideloadingStatus == SIDELOADING_TRUE) {
+ showSideloadingDialog()
+ return
+ }
+
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
checkIntent(savedInstanceState)
@@ -68,6 +74,18 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
private fun checkIntent(savedInstanceState: Bundle? = null) {
mUri = intent.data ?: return
+ val uri = mUri.toString()
+ if (uri.startsWith("content:/") && uri.contains("/storage/")) {
+ val guessedPath = uri.substring(uri.indexOf("/storage/"))
+ if (File(guessedPath).exists()) {
+ val extras = intent.extras ?: Bundle()
+ extras.apply {
+ putString(REAL_FILE_PATH, guessedPath)
+ intent.putExtras(this)
+ }
+ }
+ }
+
var filename = getFilenameFromUri(mUri!!)
mIsFromGallery = intent.getBooleanExtra(IS_FROM_GALLERY, false)
if (mIsFromGallery && filename.isVideoFast() && config.openVideosOnSeparateScreen) {
@@ -76,7 +94,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
if (intent.extras?.containsKey(REAL_FILE_PATH) == true) {
- val realPath = intent.extras.getString(REAL_FILE_PATH)
+ val realPath = intent.extras!!.getString(REAL_FILE_PATH)
if (realPath != null) {
if (realPath.getFilenameFromPath().contains('.') || filename.contains('.')) {
sendViewPagerIntent(realPath)
@@ -133,6 +151,12 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
fragment_holder.background = ColorDrawable(Color.BLACK)
}
+ if (config.maxBrightness) {
+ val attributes = window.attributes
+ attributes.screenBrightness = 1f
+ window.attributes = attributes
+ }
+
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
val isFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
mFragment?.fullscreenToggled(isFullscreen)
@@ -245,7 +269,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
private fun initBottomActionButtons() {
arrayListOf(bottom_favorite, bottom_delete, bottom_rotate, bottom_properties, bottom_change_orientation, bottom_slideshow, bottom_show_on_map,
- bottom_toggle_file_visibility, bottom_rename, bottom_copy).forEach {
+ bottom_toggle_file_visibility, bottom_rename, bottom_copy, bottom_move).forEach {
it.beGone()
}
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 fd581e8ef..2b879b9b5 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
@@ -3,10 +3,7 @@ package com.simplemobiletools.gallery.pro.activities
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
-import com.simplemobiletools.commons.dialogs.ConfirmationDialog
-import com.simplemobiletools.commons.dialogs.FilePickerDialog
-import com.simplemobiletools.commons.dialogs.RadioGroupDialog
-import com.simplemobiletools.commons.dialogs.SecurityDialog
+import com.simplemobiletools.commons.dialogs.*
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
@@ -38,11 +35,12 @@ class SettingsActivity : SimpleActivity() {
private fun setupSettingItems() {
setupCustomizeColors()
setupUseEnglish()
+ setupChangeDateTimeFormat()
+ setupFileLoadingPriority()
setupManageIncludedFolders()
setupManageExcludedFolders()
setupManageHiddenFolders()
setupShowHiddenItems()
- setupDoExtraCheck()
setupAutoplayVideos()
setupRememberLastVideo()
setupLoopVideos()
@@ -61,6 +59,7 @@ class SettingsActivity : SimpleActivity() {
setupAllowPhotoGestures()
setupAllowVideoGestures()
setupAllowDownGesture()
+ setupAllowRotatingWithGestures()
setupShowNotch()
setupBottomActions()
setupThumbnailVideoDuration()
@@ -112,6 +111,33 @@ class SettingsActivity : SimpleActivity() {
}
}
+ private fun setupChangeDateTimeFormat() {
+ settings_change_date_time_format_holder.setOnClickListener {
+ ChangeDateTimeFormatDialog(this) {}
+ }
+ }
+
+ private fun setupFileLoadingPriority() {
+ settings_file_loading_priority.text = getFileLoadingPriorityText()
+ settings_file_loading_priority_holder.setOnClickListener {
+ val items = arrayListOf(
+ RadioItem(PRIORITY_SPEED, getString(R.string.speed)),
+ RadioItem(PRIORITY_COMPROMISE, getString(R.string.compromise)),
+ RadioItem(PRIORITY_VALIDITY, getString(R.string.avoid_showing_invalid_files)))
+
+ RadioGroupDialog(this@SettingsActivity, items, config.fileLoadingPriority) {
+ config.fileLoadingPriority = it as Int
+ settings_file_loading_priority.text = getFileLoadingPriorityText()
+ }
+ }
+ }
+
+ private fun getFileLoadingPriorityText() = getString(when (config.fileLoadingPriority) {
+ PRIORITY_SPEED -> R.string.speed
+ PRIORITY_COMPROMISE -> R.string.compromise
+ else -> R.string.avoid_showing_invalid_files
+ })
+
private fun setupManageIncludedFolders() {
settings_manage_included_folders_holder.setOnClickListener {
startActivity(Intent(this, IncludedFoldersActivity::class.java))
@@ -150,14 +176,6 @@ class SettingsActivity : SimpleActivity() {
config.showHiddenMedia = settings_show_hidden_items.isChecked
}
- private fun setupDoExtraCheck() {
- settings_do_extra_check.isChecked = config.doExtraCheck
- settings_do_extra_check_holder.setOnClickListener {
- settings_do_extra_check.toggle()
- config.doExtraCheck = settings_do_extra_check.isChecked
- }
- }
-
private fun setupAutoplayVideos() {
settings_autoplay_videos.isChecked = config.autoplayVideos
settings_autoplay_videos_holder.setOnClickListener {
@@ -349,6 +367,14 @@ class SettingsActivity : SimpleActivity() {
}
}
+ private fun setupAllowRotatingWithGestures() {
+ settings_allow_rotating_with_gestures.isChecked = config.allowRotatingWithGestures
+ settings_allow_rotating_with_gestures_holder.setOnClickListener {
+ settings_allow_rotating_with_gestures.toggle()
+ config.allowRotatingWithGestures = settings_allow_rotating_with_gestures.isChecked
+ }
+ }
+
private fun setupShowNotch() {
settings_show_notch_holder.beVisibleIf(isPiePlus())
settings_show_notch.isChecked = config.showNotch
@@ -401,6 +427,7 @@ class SettingsActivity : SimpleActivity() {
}
private fun updateDeepZoomToggleButtons() {
+ settings_allow_rotating_with_gestures_holder.beVisibleIf(config.allowZoomingImages)
settings_show_highest_quality_holder.beVisibleIf(config.allowZoomingImages)
settings_allow_one_to_one_zoom_holder.beVisibleIf(config.allowZoomingImages)
}
@@ -575,10 +602,14 @@ class SettingsActivity : SimpleActivity() {
put(APP_ICON_COLOR, config.appIconColor)
put(USE_ENGLISH, config.useEnglish)
put(WAS_USE_ENGLISH_TOGGLED, config.wasUseEnglishToggled)
+ put(WIDGET_BG_COLOR, config.widgetBgColor)
+ put(WIDGET_TEXT_COLOR, config.widgetTextColor)
+ put(DATE_FORMAT, config.dateFormat)
+ put(USE_24_HOUR_FORMAT, config.use24HourFormat)
put(INCLUDED_FOLDERS, TextUtils.join(",", config.includedFolders))
put(EXCLUDED_FOLDERS, TextUtils.join(",", config.excludedFolders))
put(SHOW_HIDDEN_MEDIA, config.showHiddenMedia)
- put(DO_EXTRA_CHECK, config.doExtraCheck)
+ put(FILE_LOADING_PRIORITY, config.fileLoadingPriority)
put(AUTOPLAY_VIDEOS, config.autoplayVideos)
put(REMEMBER_LAST_VIDEO_POSITION, config.rememberLastVideoPosition)
put(LAST_VIDEO_PATH, config.lastVideoPath)
@@ -598,6 +629,7 @@ class SettingsActivity : SimpleActivity() {
put(ALLOW_INSTANT_CHANGE, config.allowInstantChange)
put(ALLOW_PHOTO_GESTURES, config.allowPhotoGestures)
put(ALLOW_DOWN_GESTURE, config.allowDownGesture)
+ put(ALLOW_ROTATING_WITH_GESTURES, config.allowRotatingWithGestures)
put(SHOW_NOTCH, config.showNotch)
put(SCREEN_ROTATION, config.screenRotation)
put(ALLOW_ZOOMING_IMAGES, config.allowZoomingImages)
@@ -625,8 +657,6 @@ class SettingsActivity : SimpleActivity() {
put(MEDIA_COLUMN_CNT, config.mediaColumnCnt)
put(SHOW_ALL, config.showAll)
put(SHOW_WIDGET_FOLDER_NAME, config.showWidgetFolderName)
- put(WIDGET_BG_COLOR, config.widgetBgColor)
- put(WIDGET_TEXT_COLOR, config.widgetTextColor)
put(VIEW_TYPE_FILES, config.viewTypeFiles)
put(VIEW_TYPE_FOLDERS, config.viewTypeFolders)
put(SLIDESHOW_INTERVAL, config.slideshowInterval)
@@ -695,10 +725,14 @@ class SettingsActivity : SimpleActivity() {
}
USE_ENGLISH -> config.useEnglish = value.toBoolean()
WAS_USE_ENGLISH_TOGGLED -> config.wasUseEnglishToggled = value.toBoolean()
+ WIDGET_BG_COLOR -> config.widgetBgColor = value.toInt()
+ WIDGET_TEXT_COLOR -> config.widgetTextColor = value.toInt()
+ DATE_FORMAT -> config.dateFormat = value.toString()
+ USE_24_HOUR_FORMAT -> config.use24HourFormat = value.toBoolean()
INCLUDED_FOLDERS -> config.addIncludedFolders(value.toStringSet())
EXCLUDED_FOLDERS -> config.addExcludedFolders(value.toStringSet())
SHOW_HIDDEN_MEDIA -> config.showHiddenMedia = value.toBoolean()
- DO_EXTRA_CHECK -> config.doExtraCheck = value.toBoolean()
+ FILE_LOADING_PRIORITY -> config.fileLoadingPriority = value.toInt()
AUTOPLAY_VIDEOS -> config.autoplayVideos = value.toBoolean()
REMEMBER_LAST_VIDEO_POSITION -> config.rememberLastVideoPosition = value.toBoolean()
LAST_VIDEO_PATH -> config.lastVideoPath = value.toString()
@@ -718,6 +752,7 @@ class SettingsActivity : SimpleActivity() {
ALLOW_INSTANT_CHANGE -> config.allowInstantChange = value.toBoolean()
ALLOW_PHOTO_GESTURES -> config.allowPhotoGestures = value.toBoolean()
ALLOW_DOWN_GESTURE -> config.allowDownGesture = value.toBoolean()
+ ALLOW_ROTATING_WITH_GESTURES -> config.allowRotatingWithGestures = value.toBoolean()
SHOW_NOTCH -> config.showNotch = value.toBoolean()
SCREEN_ROTATION -> config.screenRotation = value.toInt()
ALLOW_ZOOMING_IMAGES -> config.allowZoomingImages = value.toBoolean()
@@ -745,8 +780,6 @@ class SettingsActivity : SimpleActivity() {
MEDIA_COLUMN_CNT -> config.mediaColumnCnt = value.toInt()
SHOW_ALL -> config.showAll = value.toBoolean()
SHOW_WIDGET_FOLDER_NAME -> config.showWidgetFolderName = value.toBoolean()
- WIDGET_BG_COLOR -> config.widgetBgColor = value.toInt()
- WIDGET_TEXT_COLOR -> config.widgetTextColor = value.toInt()
VIEW_TYPE_FILES -> config.viewTypeFiles = value.toInt()
VIEW_TYPE_FOLDERS -> config.viewTypeFolders = value.toInt()
SLIDESHOW_INTERVAL -> config.slideshowInterval = value.toInt()
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SimpleActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SimpleActivity.kt
index 8d0017ff8..2be7d90fe 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SimpleActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SimpleActivity.kt
@@ -1,13 +1,28 @@
package com.simplemobiletools.gallery.pro.activities
import android.annotation.SuppressLint
+import android.database.ContentObserver
+import android.net.Uri
+import android.provider.MediaStore
import android.view.WindowManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity
+import com.simplemobiletools.commons.extensions.getRealPathFromURI
import com.simplemobiletools.commons.helpers.isPiePlus
import com.simplemobiletools.gallery.pro.R
+import com.simplemobiletools.gallery.pro.extensions.addPathToDB
import com.simplemobiletools.gallery.pro.extensions.config
open class SimpleActivity : BaseSimpleActivity() {
+ val observer = object : ContentObserver(null) {
+ override fun onChange(selfChange: Boolean, uri: Uri) {
+ super.onChange(selfChange, uri)
+ val path = getRealPathFromURI(uri)
+ if (path != null) {
+ addPathToDB(path)
+ }
+ }
+ }
+
override fun getAppIconIDs() = arrayListOf(
R.mipmap.ic_launcher_red,
R.mipmap.ic_launcher_pink,
@@ -46,4 +61,19 @@ open class SimpleActivity : BaseSimpleActivity() {
}
}
}
+
+ protected fun registerFileUpdateListener() {
+ try {
+ contentResolver.registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, observer)
+ contentResolver.registerContentObserver(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, observer)
+ } catch (ignored: Exception) {
+ }
+ }
+
+ protected fun unregisterFileUpdateListener() {
+ try {
+ contentResolver.unregisterContentObserver(observer)
+ } catch (ignored: Exception) {
+ }
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SplashActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SplashActivity.kt
index 611cfe083..97dfbb648 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SplashActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SplashActivity.kt
@@ -4,7 +4,7 @@ import android.content.Intent
import com.simplemobiletools.commons.activities.BaseSplashActivity
class SplashActivity : BaseSplashActivity() {
- override fun getAppPackageName() = "-1"
+ override fun getAppPackageName() = packageName
override fun initActivity() {
startActivity(Intent(this, MainActivity::class.java))
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 0ea59f08f..0588987c3 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
@@ -153,6 +153,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() && visibleBottomActions and BOTTOM_ACTION_ROTATE == 0
findItem(R.id.menu_set_as).isVisible = visibleBottomActions and BOTTOM_ACTION_SET_AS == 0
findItem(R.id.menu_copy_to).isVisible = visibleBottomActions and BOTTOM_ACTION_COPY == 0
+ findItem(R.id.menu_move_to).isVisible = visibleBottomActions and BOTTOM_ACTION_MOVE == 0
findItem(R.id.menu_save_as).isVisible = rotationDegrees != 0
findItem(R.id.menu_hide).isVisible = !currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin()
findItem(R.id.menu_unhide).isVisible = currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin()
@@ -243,7 +244,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return
}
- if (!getDoesFilePathExist(mPath)) {
+ if (!File(mPath).exists()) {
finish()
return
}
@@ -267,9 +268,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
isShowingRecycleBin -> RECYCLE_BIN
else -> mPath.getParentPath()
}
- if (mDirectory.startsWith(OTG_PATH.trimEnd('/'))) {
- mDirectory += "/"
- }
supportActionBar?.title = mPath.getFilenameFromPath()
view_pager.onGlobalLayout {
@@ -587,11 +585,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun saveImageAs() {
val currPath = getCurrentPath()
SaveAsDialog(this, currPath, false) {
+ val newPath = it
handleSAFDialog(it) {
toast(R.string.saving)
Thread {
val photoFragment = getCurrentPhotoFragment() ?: return@Thread
- saveRotatedImageToFile(currPath, it, photoFragment.mCurrentRotationDegrees, true) {
+ saveRotatedImageToFile(currPath, newPath, photoFragment.mCurrentRotationDegrees, true) {
toast(R.string.file_saved)
getCurrentPhotoFragment()?.mCurrentRotationDegrees = 0
invalidateOptionsMenu()
@@ -779,6 +778,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
bottom_copy.setOnClickListener {
copyMoveTo(true)
}
+
+ bottom_move.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_MOVE != 0)
+ bottom_move.setOnClickListener {
+ moveFileTo()
+ }
}
private fun updateBottomActionIcons(medium: Medium?) {
@@ -867,7 +871,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun deleteConfirmed() {
val path = getCurrentMedia().getOrNull(mPos)?.path ?: return
- if (getIsPathDirectory(path) || !path.isMediaFile()) {
+ if (File(path).isDirectory || !path.isMediaFile()) {
return
}
@@ -959,8 +963,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun deleteDirectoryIfEmpty() {
- val fileDirItem = FileDirItem(mDirectory, mDirectory.getFilenameFromPath(), getIsPathDirectory(mDirectory))
- if (config.deleteEmptyFolders && !fileDirItem.isDownloadsFolder() && fileDirItem.isDirectory && fileDirItem.getProperFileCount(applicationContext, true) == 0) {
+ val fileDirItem = FileDirItem(mDirectory, mDirectory.getFilenameFromPath(), File(mDirectory).isDirectory)
+ if (config.deleteEmptyFolders && !fileDirItem.isDownloadsFolder() && fileDirItem.isDirectory && fileDirItem.getProperFileCount(true) == 0) {
tryDeleteFileDirItem(fileDirItem, true, true)
}
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 3a9050af2..20feaa695 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
@@ -66,12 +66,7 @@ class WidgetConfigureActivity : SimpleActivity() {
private fun initVariables() {
mBgColor = config.widgetBgColor
- if (mBgColor == 1) {
- mBgColor = Color.BLACK
- mBgAlpha = .2f
- } else {
- mBgAlpha = Color.alpha(mBgColor) / 255f
- }
+ mBgAlpha = Color.alpha(mBgColor) / 255f
mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor))
config_bg_seekbar.apply {
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 80ec519f3..cc8b1b52a 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
@@ -12,7 +12,6 @@ import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.dialogs.RenameItemsDialog
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.OTG_PATH
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
@@ -321,20 +320,16 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList()
val showHidden = activity.config.shouldShowHidden
getSelectedPaths().forEach {
- if (it.startsWith(OTG_PATH)) {
- paths.addAll(getOTGFilePaths(it, showHidden))
- } else if (it != FAVORITES) {
- val filter = config.filterMedia
- File(it).listFiles()?.filter {
- !activity.getIsPathDirectory(it.absolutePath) &&
- it.absolutePath.isMediaFile() && (showHidden || !it.name.startsWith('.')) &&
- ((it.isImageFast() && filter and TYPE_IMAGES != 0) ||
- (it.isVideoFast() && filter and TYPE_VIDEOS != 0) ||
- (it.isGif() && filter and TYPE_GIFS != 0) ||
- (it.isRawFast() && filter and TYPE_RAWS != 0) ||
- (it.isSvg() && filter and TYPE_SVGS != 0))
- }?.mapTo(paths) { it.absolutePath }
- }
+ val filter = config.filterMedia
+ File(it).listFiles()?.filter {
+ !File(it.absolutePath).isDirectory &&
+ it.absolutePath.isMediaFile() && (showHidden || !it.name.startsWith('.')) &&
+ ((it.isImageFast() && filter and TYPE_IMAGES != 0) ||
+ (it.isVideoFast() && filter and TYPE_VIDEOS != 0) ||
+ (it.isGif() && filter and TYPE_GIFS != 0) ||
+ (it.isRawFast() && filter and TYPE_RAWS != 0) ||
+ (it.isSvg() && filter and TYPE_SVGS != 0))
+ }?.mapTo(paths) { it.absolutePath }
}
val fileDirItems = paths.map { FileDirItem(it, it.getFilenameFromPath()) } as ArrayList
@@ -345,25 +340,6 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList {
- val paths = ArrayList()
- val filter = config.filterMedia
- activity.getOTGFolderChildren(path)?.filter { it.name != null }?.forEach {
- if (!it.isDirectory &&
- it.name!!.isMediaFile() && (showHidden || !it.name!!.startsWith('.')) &&
- ((it.name!!.isImageFast() && filter and TYPE_IMAGES != 0) ||
- (it.name!!.isVideoFast() && filter and TYPE_VIDEOS != 0) ||
- (it.name!!.isGif() && filter and TYPE_GIFS != 0) ||
- (it.name!!.isRawFast() && filter and TYPE_RAWS != 0) ||
- (it.name!!.isSvg() && filter and TYPE_SVGS != 0))
- ) {
- val relativePath = it.uri.path.substringAfterLast("${activity.config.OTGPartition}:")
- paths.add("$OTG_PATH$relativePath")
- }
- }
- return paths
- }
-
private fun askConfirmDelete() {
when {
config.isDeletePasswordProtectionOn -> activity.handleDeletePasswordProtection {
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt
index 09a183cb9..c1f7475b9 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt
@@ -13,7 +13,6 @@ import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.dialogs.RenameItemsDialog
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.OTG_PATH
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
@@ -374,7 +373,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList(selectedKeys.size)
val removeMedia = ArrayList(selectedKeys.size)
@@ -435,7 +434,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList {
val pathToUse = if (showAll) SHOW_ALL else mPath
- val getProperDateTaken = context.config.getFileSorting(pathToUse) and SORT_BY_DATE_TAKEN != 0
+ val getProperDateTaken = context.config.getFileSorting(pathToUse) and SORT_BY_DATE_TAKEN != 0 || context.config.getFolderGrouping(pathToUse) and GROUP_BY_DATE_TAKEN != 0
+ val getProperFileSize = context.config.getFileSorting(pathToUse) and SORT_BY_SIZE != 0
val favoritePaths = context.getFavoritePaths()
val getVideoDurations = context.config.showThumbnailVideoDuration
val media = if (showAll) {
val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES }
val media = ArrayList()
foldersToScan.forEach {
- val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, favoritePaths, getVideoDurations, false)
+ val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations, false)
media.addAll(newMedia)
}
mediaFetcher.sortMedia(media, context.config.getFileSorting(SHOW_ALL))
media
} else {
- mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, favoritePaths, getVideoDurations)
+ mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations)
}
return mediaFetcher.groupMedia(media, pathToUse)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeSortingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeSortingDialog.kt
index 5dfbe80cb..79c0961a6 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeSortingDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeSortingDialog.kt
@@ -24,6 +24,7 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti
view = activity.layoutInflater.inflate(R.layout.dialog_change_sorting, null).apply {
use_for_this_folder_divider.beVisibleIf(showFolderCheckbox)
sorting_dialog_use_for_this_folder.beVisibleIf(showFolderCheckbox)
+ sorting_dialog_bottom_note.beVisibleIf(!isDirectorySorting)
sorting_dialog_use_for_this_folder.isChecked = config.hasCustomSorting(pathToUse)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ManageBottomActionsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ManageBottomActionsDialog.kt
index 760f51be2..217559e73 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ManageBottomActionsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ManageBottomActionsDialog.kt
@@ -27,6 +27,7 @@ class ManageBottomActionsDialog(val activity: BaseSimpleActivity, val callback:
manage_bottom_actions_rename.isChecked = actions and BOTTOM_ACTION_RENAME != 0
manage_bottom_actions_set_as.isChecked = actions and BOTTOM_ACTION_SET_AS != 0
manage_bottom_actions_copy.isChecked = actions and BOTTOM_ACTION_COPY != 0
+ manage_bottom_actions_move.isChecked = actions and BOTTOM_ACTION_MOVE != 0
}
AlertDialog.Builder(activity)
@@ -66,6 +67,8 @@ class ManageBottomActionsDialog(val activity: BaseSimpleActivity, val callback:
result += BOTTOM_ACTION_SET_AS
if (manage_bottom_actions_copy.isChecked)
result += BOTTOM_ACTION_COPY
+ if (manage_bottom_actions_move.isChecked)
+ result += BOTTOM_ACTION_MOVE
}
activity.config.visibleBottomActions = result
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 2adcb6835..80b9a2f70 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
@@ -124,12 +124,12 @@ class PickDirectoryDialog(val activity: BaseSimpleActivity, val sourcePath: Stri
if (scrollHorizontally) {
directories_horizontal_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
directories_horizontal_fastscroller.setViews(directories_grid) {
- directories_horizontal_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting))
+ directories_horizontal_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting, activity))
}
} else {
directories_vertical_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
directories_vertical_fastscroller.setViews(directories_grid) {
- directories_vertical_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting))
+ directories_vertical_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting, activity))
}
}
}
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 f75a8f301..23264db5d 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
@@ -86,12 +86,12 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
if (scrollHorizontally) {
media_horizontal_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid) {
- media_horizontal_fastscroller.updateBubbleText((media[it] as? Medium)?.getBubbleText(sorting) ?: "")
+ media_horizontal_fastscroller.updateBubbleText((media[it] as? Medium)?.getBubbleText(sorting, activity) ?: "")
}
} else {
media_vertical_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid) {
- media_vertical_fastscroller.updateBubbleText((media[it] as? Medium)?.getBubbleText(sorting) ?: "")
+ media_vertical_fastscroller.updateBubbleText((media[it] as? Medium)?.getBubbleText(sorting, activity) ?: "")
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SaveAsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SaveAsDialog.kt
index 614fb7bfc..0b522d761 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SaveAsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SaveAsDialog.kt
@@ -7,6 +7,7 @@ import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.dialog_save_as.view.*
+import java.io.File
class SaveAsDialog(val activity: BaseSimpleActivity, val path: String, val appendFilename: Boolean, val callback: (savePath: String) -> Unit) {
@@ -66,7 +67,7 @@ class SaveAsDialog(val activity: BaseSimpleActivity, val path: String, val appen
return@setOnClickListener
}
- if (activity.getDoesFilePathExist(newPath)) {
+ if (File(newPath).exists()) {
val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFilename)
ConfirmationDialog(activity, title) {
callback(newPath)
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 487f45272..481391aaa 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
@@ -60,7 +60,8 @@ fun Activity.openPath(path: String, forceChooser: Boolean) {
}
fun Activity.openEditor(path: String, forceChooser: Boolean = false) {
- openEditorIntent(path, forceChooser, BuildConfig.APPLICATION_ID)
+ val newPath = path.removePrefix("file://")
+ openEditorIntent(newPath, forceChooser, BuildConfig.APPLICATION_ID)
}
fun Activity.launchCamera() {
@@ -406,7 +407,7 @@ fun BaseSimpleActivity.saveRotatedImageToFile(oldPath: String, newPath: String,
saveFile(tmpPath, bitmap, it as FileOutputStream, newDegrees)
}
- if (getDoesFilePathExist(newPath)) {
+ if (File(newPath).exists()) {
tryDeleteFileDirItem(FileDirItem(newPath, newPath.getFilenameFromPath()), false, true)
}
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 9e2ce8af0..15f51a3de 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
@@ -374,16 +374,10 @@ fun Context.getFolderNameFromPath(path: String): String {
return when (path) {
internalStoragePath -> getString(R.string.internal)
sdCardPath -> getString(R.string.sd_card)
- OTG_PATH -> getString(R.string.usb)
+ otgPath -> getString(R.string.usb)
FAVORITES -> getString(R.string.favorites)
RECYCLE_BIN -> getString(R.string.recycle_bin)
- else -> {
- if (path.startsWith(OTG_PATH)) {
- path.trimEnd('/').substringAfterLast('/')
- } else {
- path.getFilenameFromPath()
- }
- }
+ else -> path.getFilenameFromPath()
}
}
@@ -431,7 +425,7 @@ fun Context.addTempFolderIfNeeded(dirs: ArrayList): ArrayList LOCATION_SD
- path.startsWith(OTG_PATH) -> LOCATION_OTG
+ isPathOnOTG(path) -> LOCATION_OTG
else -> LOCAITON_INTERNAL
}
}
@@ -571,7 +565,7 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
callback(grouped.clone() as ArrayList)
val mediaToDelete = ArrayList()
- media.filter { !getDoesFilePathExist(it.path) }.forEach {
+ media.filter { !File(it.path).exists() }.forEach {
if (it.path.startsWith(recycleBinPath)) {
deleteDBPath(mediumDao, it.path)
} else {
@@ -579,13 +573,18 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
}
}
- mediumDao.deleteMedia(*mediaToDelete.toTypedArray())
+ try {
+ if (mediaToDelete.isNotEmpty()) {
+ mediumDao.deleteMedia(*mediaToDelete.toTypedArray())
+ }
+ } catch (ignored: Exception) {
+ }
}.start()
}
fun Context.removeInvalidDBDirectories(dirs: ArrayList? = null, directoryDao: DirectoryDao = galleryDB.DirectoryDao()) {
val dirsToCheck = dirs ?: directoryDao.getAll()
- dirsToCheck.filter { !it.areFavorites() && !it.isRecycleBin() && !getDoesFilePathExist(it.path) && it.path != config.tempFolderPath }.forEach {
+ dirsToCheck.filter { !it.areFavorites() && !it.isRecycleBin() && !File(it.path).exists() && it.path != config.tempFolderPath }.forEach {
directoryDao.deleteDirPath(it.path)
}
}
@@ -593,22 +592,32 @@ fun Context.removeInvalidDBDirectories(dirs: ArrayList? = null, direc
fun Context.updateDBMediaPath(oldPath: String, newPath: String) {
val newFilename = newPath.getFilenameFromPath()
val newParentPath = newPath.getParentPath()
- galleryDB.MediumDao().updateMedium(oldPath, newParentPath, newFilename, newPath)
+ try {
+ galleryDB.MediumDao().updateMedium(oldPath, newParentPath, newFilename, newPath)
+ } catch (ignored: Exception) {
+ }
}
fun Context.updateDBDirectory(directory: Directory, directoryDao: DirectoryDao) {
directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types)
}
-fun Context.getOTGFolderChildren(path: String) = getDocumentFile(path)?.listFiles()
-
-fun Context.getOTGFolderChildrenNames(path: String) = getOTGFolderChildren(path)?.map { it.name }?.toMutableList()
-
-fun Context.getFavoritePaths() = galleryDB.MediumDao().getFavoritePaths() as ArrayList
+fun Context.getFavoritePaths(): ArrayList {
+ return try {
+ galleryDB.MediumDao().getFavoritePaths() as ArrayList
+ } catch (e: Exception) {
+ ArrayList()
+ }
+}
// remove the "recycle_bin" from the file path prefix, replace it with real bin path /data/user...
fun Context.getUpdatedDeletedMedia(mediumDao: MediumDao): ArrayList {
- val media = mediumDao.getDeletedMedia() as ArrayList
+ val media = try {
+ mediumDao.getDeletedMedia() as ArrayList
+ } catch (ignored: Exception) {
+ ArrayList()
+ }
+
media.forEach {
it.path = File(recycleBinPath, it.path.removePrefix(RECYCLE_BIN)).toString()
}
@@ -616,7 +625,10 @@ fun Context.getUpdatedDeletedMedia(mediumDao: MediumDao): ArrayList {
}
fun Context.deleteDBPath(mediumDao: MediumDao, path: String) {
- mediumDao.deleteMediumPath(path.replaceFirst(recycleBinPath, RECYCLE_BIN))
+ try {
+ mediumDao.deleteMediumPath(path.replaceFirst(recycleBinPath, RECYCLE_BIN))
+ } catch (ignored: Exception) {
+ }
}
fun Context.updateWidgets() {
@@ -686,3 +698,19 @@ fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: L
} catch (ignored: Exception) {
}
}
+
+fun Context.addPathToDB(path: String) {
+ Thread {
+ val type = when {
+ path.isVideoFast() -> TYPE_VIDEOS
+ path.isGif() -> TYPE_GIFS
+ path.isRawFast() -> TYPE_RAWS
+ path.isSvg() -> TYPE_SVGS
+ else -> TYPE_IMAGES
+ }
+
+ val medium = Medium(null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(),
+ File(path).length(), type, 0, false, 0L)
+ galleryDB.MediumDao().insert(medium)
+ }.start()
+}
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 b426c5a61..e07e80657 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
@@ -2,7 +2,7 @@ package com.simplemobiletools.gallery.pro.extensions
import android.media.MediaMetadataRetriever
import com.bumptech.glide.signature.ObjectKey
-import com.simplemobiletools.commons.helpers.OTG_PATH
+import com.simplemobiletools.gallery.pro.helpers.NOMEDIA
import java.io.File
import java.io.IOException
@@ -18,14 +18,19 @@ fun String.isThisOrParentIncluded(includedPaths: MutableSet) = includedP
fun String.isThisOrParentExcluded(excludedPaths: MutableSet) = excludedPaths.any { startsWith(it, true) }
fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPaths: MutableSet, showHidden: Boolean): Boolean {
+ if (isEmpty()) {
+ return false
+ }
+
val file = File(this)
- return if (isEmpty()) {
- false
- } else if (!showHidden && file.isHidden) {
- false
+ if (!showHidden && file.isHidden) {
+ return false
} else if (includedPaths.contains(this)) {
- true
- } else if (!showHidden && file.containsNoMedia()) {
+ return true
+ }
+
+ val containsNoMedia = if (showHidden) false else File(this, NOMEDIA).exists()
+ return if (!showHidden && containsNoMedia) {
false
} else if (excludedPaths.contains(this)) {
false
@@ -34,7 +39,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath
} else if (isThisOrParentExcluded(excludedPaths)) {
false
} else if (!showHidden && file.isDirectory && file.canonicalFile == file.absoluteFile) {
- var containsNoMediaOrDot = file.containsNoMedia() || contains("/.")
+ var containsNoMediaOrDot = containsNoMedia || contains("/.")
if (!containsNoMediaOrDot) {
containsNoMediaOrDot = file.doesThisOrParentHaveNoMedia()
}
@@ -47,7 +52,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath
// recognize /sdcard/DCIM as the same folder as /storage/emulated/0/DCIM
fun String.getDistinctPath(): String {
return try {
- if (startsWith(OTG_PATH)) toLowerCase() else File(this).canonicalPath.toLowerCase()
+ File(this).canonicalPath.toLowerCase()
} catch (e: IOException) {
toLowerCase()
}
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 bb3c38d68..4a4754c94 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
@@ -25,6 +25,7 @@ import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
+import com.bumptech.glide.load.resource.bitmap.Rotate
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
@@ -34,12 +35,14 @@ import com.davemorrissey.labs.subscaleview.ImageRegionDecoder
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.OTG_PATH
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.extensions.*
-import com.simplemobiletools.gallery.pro.helpers.*
+import com.simplemobiletools.gallery.pro.helpers.MEDIUM
+import com.simplemobiletools.gallery.pro.helpers.PATH
+import com.simplemobiletools.gallery.pro.helpers.PicassoDecoder
+import com.simplemobiletools.gallery.pro.helpers.PicassoRegionDecoder
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.svg.SvgSoftwareLayerSetter
import com.squareup.picasso.Callback
@@ -326,11 +329,11 @@ class PhotoFragment : ViewPagerFragment() {
private fun loadGif() {
try {
- val pathToLoad = getPathToLoad(mMedium)
- val source = if (pathToLoad.startsWith("content://") || pathToLoad.startsWith("file://")) {
- InputSource.UriSource(context!!.contentResolver, Uri.parse(pathToLoad))
+ val path = mMedium.path
+ val source = if (path.startsWith("content://") || path.startsWith("file://")) {
+ InputSource.UriSource(context!!.contentResolver, Uri.parse(path))
} else {
- InputSource.FileSource(pathToLoad)
+ InputSource.FileSource(path)
}
mView.apply {
@@ -361,12 +364,12 @@ class PhotoFragment : ViewPagerFragment() {
.fitCenter()
if (mCurrentRotationDegrees != 0) {
- options.transform(GlideRotateTransformation(mCurrentRotationDegrees))
+ options.transform(Rotate(mCurrentRotationDegrees))
options.diskCacheStrategy(DiskCacheStrategy.NONE)
}
Glide.with(context!!)
- .load(getPathToLoad(mMedium))
+ .load(mMedium.path)
.apply(options)
.listener(object : RequestListener {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
@@ -377,6 +380,7 @@ class PhotoFragment : ViewPagerFragment() {
}
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
+ mView.gestures_view.controller.settings.isZoomEnabled = mCurrentRotationDegrees != 0 || context?.config?.allowZoomingImages == false
if (mIsFragmentVisible && addZoomableView) {
scheduleZoomableView()
}
@@ -434,15 +438,16 @@ class PhotoFragment : ViewPagerFragment() {
private fun addZoomableView() {
val rotation = degreesForRotation(mImageOrientation)
- val path = getPathToLoad(mMedium)
mIsSubsamplingVisible = true
+ val config = context!!.config
+ val showHighestQuality = config.showHighestQuality
val bitmapDecoder = object : DecoderFactory {
- override fun make() = PicassoDecoder(path, Picasso.get(), rotation)
+ override fun make() = PicassoDecoder(mMedium.path, Picasso.get(), rotation)
}
val regionDecoder = object : DecoderFactory {
- override fun make() = PicassoRegionDecoder()
+ override fun make() = PicassoRegionDecoder(showHighestQuality)
}
var newOrientation = (rotation + mCurrentRotationDegrees) % 360
@@ -450,18 +455,18 @@ class PhotoFragment : ViewPagerFragment() {
newOrientation += 360
}
- val config = context!!.config
mView.subsampling_view.apply {
- setMaxTileSize(if (config.showHighestQuality) Integer.MAX_VALUE else 4096)
- setMinimumTileDpi(if (config.showHighestQuality) -1 else getMinTileDpi())
+ setMaxTileSize(if (showHighestQuality) Integer.MAX_VALUE else 4096)
+ setMinimumTileDpi(if (showHighestQuality) -1 else getMinTileDpi())
background = ColorDrawable(Color.TRANSPARENT)
bitmapDecoderFactory = bitmapDecoder
regionDecoderFactory = regionDecoder
maxScale = 10f
beVisible()
+ rotationEnabled = config.allowRotatingWithGestures
isOneToOneZoomEnabled = config.allowOneToOneZoom
orientation = newOrientation
- setImage(path)
+ setImage(mMedium.path)
onImageEventListener = object : SubsamplingScaleImageView.OnImageEventListener {
override fun onReady() {
background = ColorDrawable(if (config.blackBackground) Color.BLACK else config.backgroundColor)
@@ -514,6 +519,9 @@ class PhotoFragment : ViewPagerFragment() {
}
mView.panorama_outline.beVisibleIf(mIsPanorama)
+ if (mIsFullscreen) {
+ mView.panorama_outline.alpha = 0f
+ }
}
private fun getImageOrientation(): Int {
@@ -521,12 +529,20 @@ class PhotoFragment : ViewPagerFragment() {
var orient = defaultOrientation
try {
- val pathToLoad = getPathToLoad(mMedium)
- val exif = android.media.ExifInterface(pathToLoad)
- orient = exif.getAttributeInt(android.media.ExifInterface.TAG_ORIENTATION, defaultOrientation)
+ val path = mMedium.path
+ orient = if (path.startsWith("content:/")) {
+ val inputStream = context!!.contentResolver.openInputStream(Uri.parse(path))
+ val exif = ExifInterface()
+ exif.readExif(inputStream, ExifInterface.Options.OPTION_ALL)
+ val tag = exif.getTag(ExifInterface.TAG_ORIENTATION)
+ tag?.getValueAsInt(defaultOrientation) ?: defaultOrientation
+ } else {
+ val exif = android.media.ExifInterface(path)
+ exif.getAttributeInt(android.media.ExifInterface.TAG_ORIENTATION, defaultOrientation)
+ }
- if (orient == defaultOrientation || mMedium.path.startsWith(OTG_PATH)) {
- val uri = if (pathToLoad.startsWith("content:/")) Uri.parse(pathToLoad) else Uri.fromFile(File(pathToLoad))
+ if (orient == defaultOrientation || context!!.isPathOnOTG(mMedium.path)) {
+ val uri = if (path.startsWith("content:/")) Uri.parse(path) else Uri.fromFile(File(path))
val inputStream = context!!.contentResolver.openInputStream(uri)
val exif2 = ExifInterface()
exif2.readExif(inputStream, ExifInterface.Options.OPTION_ALL)
@@ -610,14 +626,20 @@ class PhotoFragment : ViewPagerFragment() {
override fun fullscreenToggled(isFullscreen: Boolean) {
this.mIsFullscreen = isFullscreen
- mView.photo_details.apply {
- if (mStoredShowExtendedDetails && isVisible()) {
- animate().y(getExtendedDetailsY(height))
+ mView.apply {
+ photo_details.apply {
+ if (mStoredShowExtendedDetails && isVisible()) {
+ animate().y(getExtendedDetailsY(height))
- if (mStoredHideExtendedDetails) {
- animate().alpha(if (isFullscreen) 0f else 1f).start()
+ if (mStoredHideExtendedDetails) {
+ animate().alpha(if (isFullscreen) 0f else 1f).start()
+ }
}
}
+
+ if (mIsPanorama) {
+ panorama_outline.animate().alpha(if (isFullscreen) 0f else 1f).start()
+ }
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt
index 2cb3cf893..adfe13075 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt
@@ -4,7 +4,6 @@ import android.provider.MediaStore
import android.view.MotionEvent
import androidx.fragment.app.Fragment
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.OTG_PATH
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
@@ -13,11 +12,11 @@ import java.io.File
abstract class ViewPagerFragment : Fragment() {
var listener: FragmentListener? = null
- protected var mTouchDownTime = 0L
- protected var mTouchDownX = 0f
- protected var mTouchDownY = 0f
- protected var mCloseDownThreshold = 100f
- protected var mIgnoreCloseDown = false
+ private var mTouchDownTime = 0L
+ private var mTouchDownX = 0f
+ private var mTouchDownY = 0f
+ private var mCloseDownThreshold = 100f
+ private var mIgnoreCloseDown = false
abstract fun fullscreenToggled(isFullscreen: Boolean)
@@ -64,7 +63,7 @@ abstract class ViewPagerFragment : Fragment() {
}
if (detailsFlag and EXT_DATE_TAKEN != 0) {
- path.getExifDateTaken(exif).let { if (it.isNotEmpty()) details.appendln(it) }
+ path.getExifDateTaken(exif, context!!).let { if (it.isNotEmpty()) details.appendln(it) }
}
if (detailsFlag and EXT_CAMERA_MODEL != 0) {
@@ -77,8 +76,6 @@ abstract class ViewPagerFragment : Fragment() {
return details.toString().trim()
}
- fun getPathToLoad(medium: Medium) = if (medium.path.startsWith(OTG_PATH)) medium.path.getOTGPublicPath(context!!) else medium.path
-
private fun getFileLastModified(file: File): String {
val projection = arrayOf(MediaStore.Images.Media.DATE_MODIFIED)
val uri = MediaStore.Files.getContentUri("external")
@@ -88,9 +85,9 @@ abstract class ViewPagerFragment : Fragment() {
cursor?.use {
return if (cursor.moveToFirst()) {
val dateModified = cursor.getLongValue(MediaStore.Images.Media.DATE_MODIFIED) * 1000L
- dateModified.formatDate()
+ dateModified.formatDate(context!!)
} else {
- file.lastModified().formatDate()
+ file.lastModified().formatDate(context!!)
}
}
return ""
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 f715686b4..8720bf3a8 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
@@ -182,6 +182,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getInt(SCREEN_ROTATION, ROTATE_BY_SYSTEM_SETTING)
set(screenRotation) = prefs.edit().putInt(SCREEN_ROTATION, screenRotation).apply()
+ var fileLoadingPriority: Int
+ get() = prefs.getInt(FILE_LOADING_PRIORITY, PRIORITY_COMPROMISE)
+ set(fileLoadingPriority) = prefs.edit().putInt(FILE_LOADING_PRIORITY, fileLoadingPriority).apply()
+
var loopVideos: Boolean
get() = prefs.getBoolean(LOOP_VIDEOS, false)
set(loop) = prefs.edit().putBoolean(LOOP_VIDEOS, loop).apply()
@@ -335,10 +339,6 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getInt(EXTENDED_DETAILS, EXT_RESOLUTION or EXT_LAST_MODIFIED or EXT_EXIF_PROPERTIES)
set(extendedDetails) = prefs.edit().putInt(EXTENDED_DETAILS, extendedDetails).apply()
- var doExtraCheck: Boolean
- get() = prefs.getBoolean(DO_EXTRA_CHECK, false)
- set(doExtraCheck) = prefs.edit().putBoolean(DO_EXTRA_CHECK, doExtraCheck).apply()
-
var wasNewAppShown: Boolean
get() = prefs.getBoolean(WAS_NEW_APP_SHOWN, false)
set(wasNewAppShown) = prefs.edit().putBoolean(WAS_NEW_APP_SHOWN, wasNewAppShown).apply()
@@ -456,6 +456,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(ALLOW_ONE_TO_ONE_ZOOM, false)
set(allowOneToOneZoom) = prefs.edit().putBoolean(ALLOW_ONE_TO_ONE_ZOOM, allowOneToOneZoom).apply()
+ var allowRotatingWithGestures: Boolean
+ get() = prefs.getBoolean(ALLOW_ROTATING_WITH_GESTURES, true)
+ set(allowRotatingWithGestures) = prefs.edit().putBoolean(ALLOW_ROTATING_WITH_GESTURES, allowRotatingWithGestures).apply()
+
var lastEditorDrawColor: Int
get() = prefs.getInt(LAST_EDITOR_DRAW_COLOR, primaryColor)
set(lastEditorDrawColor) = prefs.edit().putInt(LAST_EDITOR_DRAW_COLOR, lastEditorDrawColor).apply()
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 d3f5588a8..98eec7dfb 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
@@ -48,10 +48,9 @@ const val SHOW_EXTENDED_DETAILS = "show_extended_details"
const val EXTENDED_DETAILS = "extended_details"
const val HIDE_EXTENDED_DETAILS = "hide_extended_details"
const val ALLOW_INSTANT_CHANGE = "allow_instant_change"
-const val DO_EXTRA_CHECK = "do_extra_check"
const val WAS_NEW_APP_SHOWN = "was_new_app_shown_clock"
const val LAST_FILEPICKER_PATH = "last_filepicker_path"
-const val WAS_OTG_HANDLED = "was_otg_handled"
+const val WAS_OTG_HANDLED = "was_otg_handled_2"
const val TEMP_SKIP_DELETE_CONFIRMATION = "temp_skip_delete_confirmation"
const val BOTTOM_ACTIONS = "bottom_actions"
const val LAST_VIDEO_PATH = "last_video_path"
@@ -75,9 +74,11 @@ const val LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_Y = "last_editor_crop_other_aspect
const val GROUP_DIRECT_SUBFOLDERS = "group_direct_subfolders"
const val SHOW_WIDGET_FOLDER_NAME = "show_widget_folder_name"
const val ALLOW_ONE_TO_ONE_ZOOM = "allow_one_to_one_zoom"
+const val ALLOW_ROTATING_WITH_GESTURES = "allow_rotating_with_gestures"
const val LAST_EDITOR_DRAW_COLOR = "last_editor_draw_color"
const val LAST_EDITOR_BRUSH_SIZE = "last_editor_brush_size"
const val SHOW_NOTCH = "show_notch"
+const val FILE_LOADING_PRIORITY = "file_loading_priority"
// slideshow
const val SLIDESHOW_INTERVAL = "slideshow_interval"
@@ -125,6 +126,11 @@ const val ROTATE_BY_SYSTEM_SETTING = 0
const val ROTATE_BY_DEVICE_ROTATION = 1
const val ROTATE_BY_ASPECT_RATIO = 2
+// file loading priority
+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
@@ -175,6 +181,7 @@ const val BOTTOM_ACTION_TOGGLE_VISIBILITY = 512
const val BOTTOM_ACTION_RENAME = 1024
const val BOTTOM_ACTION_SET_AS = 2048
const val BOTTOM_ACTION_COPY = 4096
+const val BOTTOM_ACTION_MOVE = 8192
const val DEFAULT_BOTTOM_ACTIONS = BOTTOM_ACTION_TOGGLE_FAVORITE or BOTTOM_ACTION_EDIT or BOTTOM_ACTION_SHARE or BOTTOM_ACTION_DELETE
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/GlideRotateTransformation.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/GlideRotateTransformation.kt
deleted file mode 100644
index a0dabc09d..000000000
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/GlideRotateTransformation.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.simplemobiletools.gallery.pro.helpers
-
-import android.graphics.Bitmap
-import android.graphics.Matrix
-import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
-import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
-import java.security.MessageDigest
-
-class GlideRotateTransformation(val rotateRotationAngle: Int) : BitmapTransformation() {
- override fun transform(pool: BitmapPool, bitmap: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
- if (rotateRotationAngle % 360 == 0) {
- return bitmap
- }
-
- val matrix = Matrix()
- matrix.postRotate(rotateRotationAngle.toFloat())
- return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
- }
-
- override fun updateDiskCacheKey(messageDigest: MessageDigest) {
- }
-}
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 a5912edce..785627944 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
@@ -2,7 +2,6 @@ package com.simplemobiletools.gallery.pro.helpers
import android.content.Context
import android.database.Cursor
-import android.net.Uri
import android.provider.MediaStore
import android.text.format.DateFormat
import com.simplemobiletools.commons.extensions.*
@@ -18,23 +17,16 @@ import java.util.*
class MediaFetcher(val context: Context) {
var shouldStop = false
- fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, favoritePaths: ArrayList,
- getVideoDurations: Boolean, sortMedia: Boolean = true): ArrayList {
+ fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperFileSize: Boolean,
+ favoritePaths: ArrayList, getVideoDurations: Boolean, sortMedia: Boolean = true): ArrayList {
val filterMedia = context.config.filterMedia
if (filterMedia == 0) {
return ArrayList()
}
val curMedia = ArrayList()
- if (curPath.startsWith(OTG_PATH, true)) {
- if (context.hasOTGConnected()) {
- val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia, favoritePaths, getVideoDurations)
- curMedia.addAll(newMedia)
- }
- } else {
- val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, favoritePaths, getVideoDurations)
- curMedia.addAll(newMedia)
- }
+ val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations)
+ curMedia.addAll(newMedia)
if (sortMedia) {
sortMedia(curMedia, context.config.getFileSorting(curPath))
@@ -128,14 +120,14 @@ class MediaFetcher(val context: Context) {
val foldersToIgnore = arrayListOf("/storage/emulated/legacy")
val config = context.config
val includedFolders = config.includedFolders
- var foldersToScan = config.everShownFolders.filter { it == FAVORITES || it == RECYCLE_BIN || context.getDoesFilePathExist(it) }.toMutableList() as ArrayList
+ var foldersToScan = config.everShownFolders.filter { it == FAVORITES || it == RECYCLE_BIN || File(it).exists() }.toMutableList() as ArrayList
cursor.use {
if (cursor.moveToFirst()) {
do {
- val path = cursor.getStringValue(MediaStore.Images.Media.DATA).trim()
+ val path = cursor.getStringValue(MediaStore.Images.Media.DATA)
val parentPath = File(path).parent?.trimEnd('/') ?: continue
- if (!includedFolders.contains(parentPath) && !foldersToIgnore.contains(parentPath.toLowerCase())) {
+ if (!includedFolders.contains(parentPath) && !foldersToIgnore.contains(parentPath)) {
foldersToScan.add(parentPath)
}
} while (cursor.moveToNext())
@@ -154,37 +146,30 @@ class MediaFetcher(val context: Context) {
private fun addFolder(curFolders: ArrayList, folder: String) {
curFolders.add(folder)
- if (folder.startsWith(OTG_PATH)) {
- val files = context.getOTGFolderChildren(folder) ?: return
- for (file in files) {
- if (file.isDirectory) {
- val relativePath = file.uri.path.substringAfterLast("${context.config.OTGPartition}:")
- addFolder(curFolders, "$OTG_PATH$relativePath")
- }
- }
- } else {
- val files = File(folder).listFiles() ?: return
- for (file in files) {
- if (file.isDirectory) {
- addFolder(curFolders, file.absolutePath)
- }
+ val files = File(folder).listFiles() ?: return
+ for (file in files) {
+ if (file.isDirectory) {
+ addFolder(curFolders, file.absolutePath)
}
}
}
private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean,
- favoritePaths: ArrayList, getVideoDurations: Boolean): ArrayList {
+ getProperFileSize: Boolean, favoritePaths: ArrayList, getVideoDurations: Boolean): ArrayList {
val media = ArrayList()
- val deletedMedia = if (folder == RECYCLE_BIN) {
+ val isRecycleBin = folder == RECYCLE_BIN
+ val deletedMedia = if (isRecycleBin) {
context.getUpdatedDeletedMedia(context.galleryDB.MediumDao())
} else {
ArrayList()
}
- val doExtraCheck = context.config.doExtraCheck
- val showHidden = context.config.shouldShowHidden
- val dateTakens = if (getProperDateTaken && folder != FAVORITES && folder != RECYCLE_BIN) getFolderDateTakens(folder) else HashMap()
+ val config = context.config
+ val checkProperFileSize = getProperFileSize || config.fileLoadingPriority == PRIORITY_COMPROMISE
+ val checkFileExistence = config.fileLoadingPriority == PRIORITY_VALIDITY
+ val showHidden = config.shouldShowHidden
+ val dateTakens = if (getProperDateTaken && folder != FAVORITES && !isRecycleBin) getFolderDateTakens(folder) else HashMap()
val files = when (folder) {
FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toTypedArray()
@@ -226,11 +211,16 @@ class MediaFetcher(val context: Context) {
if (!showHidden && filename.startsWith('.'))
continue
- val size = file.length()
- if (size <= 0L || (doExtraCheck && !file.exists()))
+ val size = if (checkProperFileSize || checkFileExistence) file.length() else 1L
+ if ((checkProperFileSize || checkFileExistence) && size <= 0L) {
continue
+ }
- if (folder == RECYCLE_BIN) {
+ if (checkFileExistence && !file.exists()) {
+ continue
+ }
+
+ if (isRecycleBin) {
deletedMedia.firstOrNull { it.path == path }?.apply {
media.add(this)
}
@@ -259,71 +249,6 @@ class MediaFetcher(val context: Context) {
return media
}
- private fun getMediaOnOTG(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList,
- getVideoDurations: Boolean): ArrayList {
- val media = ArrayList()
- val files = context.getDocumentFile(folder)?.listFiles() ?: return media
- val doExtraCheck = context.config.doExtraCheck
- val showHidden = context.config.shouldShowHidden
-
- for (file in files) {
- if (shouldStop) {
- break
- }
-
- val filename = file.name ?: continue
- val isImage = filename.isImageFast()
- val isVideo = if (isImage) false else filename.isVideoFast()
- val isGif = if (isImage || isVideo) false else filename.isGif()
- val isRaw = if (isImage || isVideo || isGif) false else filename.isRawFast()
- val isSvg = if (isImage || isVideo || isGif || isRaw) false else filename.isSvg()
-
- if (!isImage && !isVideo && !isGif && !isRaw && !isSvg)
- continue
-
- if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0))
- continue
-
- if (isImage && (isPickVideo || filterMedia and TYPE_IMAGES == 0))
- continue
-
- if (isGif && filterMedia and TYPE_GIFS == 0)
- continue
-
- if (isRaw && filterMedia and TYPE_RAWS == 0)
- continue
-
- if (isSvg && filterMedia and TYPE_SVGS == 0)
- continue
-
- if (!showHidden && filename.startsWith('.'))
- continue
-
- val size = file.length()
- if (size <= 0L || (doExtraCheck && !file.exists()))
- continue
-
- val dateTaken = file.lastModified()
- val dateModified = file.lastModified()
-
- val type = when {
- isVideo -> TYPE_VIDEOS
- isGif -> TYPE_GIFS
- isRaw -> TYPE_RAWS
- isSvg -> TYPE_SVGS
- else -> TYPE_IMAGES
- }
-
- val path = Uri.decode(file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", OTG_PATH))
- val videoDuration = if (getVideoDurations) path.getVideoDuration() else 0
- val isFavorite = favoritePaths.contains(path)
- val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type, videoDuration, isFavorite, 0L)
- media.add(medium)
- }
-
- return media
- }
-
private fun getFolderDateTakens(folder: String): HashMap {
val projection = arrayOf(
MediaStore.Images.Media.DISPLAY_NAME,
@@ -399,7 +324,16 @@ class MediaFetcher(val context: Context) {
}
val sortDescending = currentGrouping and GROUP_DESCENDING != 0
- val sorted = mediumGroups.toSortedMap(if (sortDescending) compareByDescending { it } else compareBy { it })
+ val sorted = if (currentGrouping and GROUP_BY_DATE_TAKEN != 0 || currentGrouping and GROUP_BY_LAST_MODIFIED != 0) {
+ mediumGroups.toSortedMap(if (sortDescending) compareByDescending {
+ it.toLongOrNull() ?: 0L
+ } else {
+ compareBy { it.toLongOrNull() ?: 0L }
+ })
+ } else {
+ mediumGroups.toSortedMap(if (sortDescending) compareByDescending { it } else compareBy { it })
+ }
+
mediumGroups.clear()
for ((key, value) in sorted) {
mediumGroups[key] = value
@@ -438,7 +372,7 @@ class MediaFetcher(val context: Context) {
return if (timestamp.areDigitsOnly()) {
val cal = Calendar.getInstance(Locale.ENGLISH)
cal.timeInMillis = timestamp.toLong()
- return DateFormat.format("dd MMM yyyy", cal).toString()
+ DateFormat.format("dd MMM yyyy", cal).toString()
} else {
""
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/PicassoRegionDecoder.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/PicassoRegionDecoder.kt
index 85b0e1133..7c488b64d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/PicassoRegionDecoder.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/PicassoRegionDecoder.kt
@@ -5,7 +5,7 @@ import android.graphics.*
import android.net.Uri
import com.davemorrissey.labs.subscaleview.ImageRegionDecoder
-class PicassoRegionDecoder : ImageRegionDecoder {
+class PicassoRegionDecoder(val showHighestQuality: Boolean) : ImageRegionDecoder {
private var decoder: BitmapRegionDecoder? = null
private val decoderLock = Any()
@@ -20,7 +20,7 @@ class PicassoRegionDecoder : ImageRegionDecoder {
synchronized(decoderLock) {
val options = BitmapFactory.Options()
options.inSampleSize = sampleSize
- options.inPreferredConfig = Bitmap.Config.RGB_565
+ options.inPreferredConfig = if (showHighestQuality) Bitmap.Config.ARGB_8888 else Bitmap.Config.RGB_565
val bitmap = decoder!!.decodeRegion(rect, options)
return bitmap ?: throw RuntimeException("Region decoder returned null bitmap - image format may not be supported")
}
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 fd320050e..f74af2abc 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
@@ -1,5 +1,6 @@
package com.simplemobiletools.gallery.pro.models
+import android.content.Context
import androidx.room.*
import com.simplemobiletools.commons.extensions.formatDate
import com.simplemobiletools.commons.extensions.formatSize
@@ -29,12 +30,12 @@ data class Directory(
constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, 0, 0)
- fun getBubbleText(sorting: Int) = when {
+ fun getBubbleText(sorting: Int, context: Context) = when {
sorting and SORT_BY_NAME != 0 -> name
sorting and SORT_BY_PATH != 0 -> path
sorting and SORT_BY_SIZE != 0 -> size.formatSize()
- sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate()
- else -> taken.formatDate()
+ sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate(context)
+ else -> taken.formatDate(context)
}
fun areFavorites() = path == FAVORITES
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 e6d95da66..4851de9b0 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
@@ -1,5 +1,6 @@
package com.simplemobiletools.gallery.pro.models
+import android.content.Context
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.Index
@@ -45,12 +46,12 @@ data class Medium(
fun isHidden() = name.startsWith('.')
- fun getBubbleText(sorting: Int) = when {
+ fun getBubbleText(sorting: Int, context: Context) = when {
sorting and SORT_BY_NAME != 0 -> name
sorting and SORT_BY_PATH != 0 -> path
sorting and SORT_BY_SIZE != 0 -> size.formatSize()
- sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate()
- else -> taken.formatDate()
+ sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate(context)
+ else -> taken.formatDate(context)
}
fun getGroupingKey(groupBy: Int): String {
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/receivers/RefreshMediaReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/receivers/RefreshMediaReceiver.kt
index 3e3f35ec9..3aa81b2f5 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/receivers/RefreshMediaReceiver.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/receivers/RefreshMediaReceiver.kt
@@ -3,29 +3,12 @@ package com.simplemobiletools.gallery.pro.receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
-import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.REFRESH_PATH
-import com.simplemobiletools.gallery.pro.extensions.galleryDB
-import com.simplemobiletools.gallery.pro.helpers.*
-import com.simplemobiletools.gallery.pro.models.Medium
-import java.io.File
+import com.simplemobiletools.gallery.pro.extensions.addPathToDB
class RefreshMediaReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val path = intent.getStringExtra(REFRESH_PATH) ?: return
-
- Thread {
- val medium = Medium(null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(),
- File(path).length(), getFileType(path), 0, false, 0L)
- context.galleryDB.MediumDao().insert(medium)
- }.start()
- }
-
- private fun getFileType(path: String) = when {
- path.isVideoFast() -> TYPE_VIDEOS
- path.isGif() -> TYPE_GIFS
- path.isRawFast() -> TYPE_RAWS
- path.isSvg() -> TYPE_SVGS
- else -> TYPE_IMAGES
+ context.addPathToDB(path)
}
}
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index bf10bce55..c0f1c51a9 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -58,6 +58,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/dialog_change_grouping.xml b/app/src/main/res/layout/dialog_change_grouping.xml
index d4e6fc02f..a51c19111 100644
--- a/app/src/main/res/layout/dialog_change_grouping.xml
+++ b/app/src/main/res/layout/dialog_change_grouping.xml
@@ -109,5 +109,14 @@
android:paddingBottom="@dimen/activity_margin"
android:text="@string/use_for_this_folder"/>
+
+
diff --git a/app/src/main/res/layout/dialog_change_sorting.xml b/app/src/main/res/layout/dialog_change_sorting.xml
index 4ac35ce0f..8d3dc7570 100644
--- a/app/src/main/res/layout/dialog_change_sorting.xml
+++ b/app/src/main/res/layout/dialog_change_sorting.xml
@@ -109,5 +109,14 @@
android:paddingBottom="@dimen/activity_margin"
android:text="@string/use_for_this_folder"/>
+
+
diff --git a/app/src/main/res/layout/dialog_manage_bottom_actions.xml b/app/src/main/res/layout/dialog_manage_bottom_actions.xml
index 39fc8555d..fb76d7666 100644
--- a/app/src/main/res/layout/dialog_manage_bottom_actions.xml
+++ b/app/src/main/res/layout/dialog_manage_bottom_actions.xml
@@ -118,5 +118,13 @@
android:paddingBottom="@dimen/activity_margin"
android:text="@string/copy"/>
+
+
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index 5d6ee89c7..15dd5ecfd 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -38,6 +38,14 @@
android:id="@+id/stop_showing_hidden"
android:title="@string/stop_showing_hidden"
app:showAsAction="never"/>
+
+
- Date taken
File type
Extension
+ Please note that grouping and sorting are 2 independent fields
Folder shown on the widget:
@@ -167,7 +168,6 @@
السماح بتغيير الوسائط على الفور من خلال النقر على جوانب الشاشة
Allow deep zooming images
إخفاء التفاصيل الموسعة عند إخفاء شريط الحالة
- قم بإجراء فحص إضافي لتجنب إظهار الملفات التالفة
Show some action buttons at the bottom of the screen
Show the Recycle Bin at the folders screen
Deep zoomable images
@@ -178,6 +178,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
المصغرات
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 5e6338fe5..e858e533a 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -132,6 +132,7 @@
Date taken
File type
Extension
+ Please note that grouping and sorting are 2 independent fields
Folder shown on the widget:
@@ -163,7 +164,6 @@
Allow instantly changing media by clicking on screen sides
Allow deep zooming images
Hide extended details when status bar is hidden
- Do an extra check to avoid showing invalid files
Show some action buttons at the bottom of the screen
Show the Recycle Bin at the folders screen
Deep zoomable images
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Thumbnails
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index ff83931a0..ca3da9ed3 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -132,6 +132,7 @@
Data de presa
Tipus de fitxer
Extensió
+ Tingueu en compte que l\'agrupació i la classificació són 2 camps independents
Carpeta que es mostra a l\'estri:
@@ -163,7 +164,6 @@
Permet canviar els mitjans de manera instantània fent clic als costats de la pantalla
Permet imatges de zoom profund
Amaga els detalls estesos quan la barra d\'estat està amagada
- Fer una verificació addicional per evitar que es mostrin fitxers no vàlids
Mostra alguns botons d\'acció a la part inferior de la pantalla
Mostra la paperera de reciclatge a la pantalla de carpetes
Imatges ampliades a mida
@@ -173,7 +173,11 @@
Permet 1:1 zoom amb dos tocs dobles
Obriu sempre vídeos en una pantalla independent amb nous gestos horitzontals
Mostra una osca si està disponible
- Allow rotating images with gestures
+ Permet girar imatges amb gestos
+ Prioritat de càrrega d\'arxius
+ Velocitat
+ Compromès
+ Eviteu mostrar fitxers no vàlids
Miniatures
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 78c21db3f..73752618b 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -132,6 +132,7 @@
Data pořízení
Typu souboru
Přípony
+ Please note that grouping and sorting are 2 independent fields
Složka zobrazená na widgetu:
@@ -163,7 +164,6 @@
Povolit okamžité přepínání médií kliknutím na okraj obrazovky
Povolit hluboké přibližování obrázků
Skrýt rozšířené vlastnosti pokud je skrytá stavová lišta
- Předejít zobrazování neplatných souborů dodatečnou kontrolou
Zobrazit některé akční tlačítka na spodní straně obrazovky
Zobrazit odpadkový koš na obrazovce se složkami
Hluboce priblížitelné obrázky
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Náhledy
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index d443043f2..747d47b15 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -132,6 +132,7 @@
Dato taget
Filtype
Filudvidelse
+ Please note that grouping and sorting are 2 independent fields
Mappe vist på widget:
@@ -163,7 +164,6 @@
Tillad skift af medie ved klik på skærmens sider
Tillad dyb zooming af billeder
Skjul udvidede oplysninger når statuslinjen er skjult
- Tjek en ekstra gang for at undgå visning af ugyldige filer
Vis handlingsknapper i bunden af skærmen
Vis papirkurven ved mappevisning
Dybt zoombare billeder
@@ -173,7 +173,11 @@
Tillad 1:1 zooming med to dobbelttryk
Always open videos on a separate screen with new horizontal gestures
Vis en notch hvis tilgængelig
- Allow rotating images with gestures
+ Tillad roterende billeder med bevægelser
+ Filindlæsnings prioritet
+ Hastighed
+ Kompromis
+ Undgå at vise ugyldige filer
Miniaturer
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index a41093497..357b0c758 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -132,6 +132,7 @@
Aufnahmedatum
Dateityp (Bilder/Videos)
Dateierweiterung
+ Please note that grouping and sorting are 2 independent fields
Ordner, der auf dem Widget angezeigt wird:
@@ -163,7 +164,6 @@
Beim Tippen auf eine Bildschirmseite sofort zwischen Medien wechseln
Starkes Zoomen zulassen
Dateieigenschaften im Vollbild nicht anzeigen, wenn die Systemleiste versteckt ist
- Zusätzliche Überprüfung, um ungültige Dateien nicht anzuzeigen
Ausgewählte Funktionen am unteren Bildschirmrand anzeigen
Papierkorb auf dem Ordnerbildschirm anzeigen
Stark vergrösserbare Bilder
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Thumbnails
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index ff8a9ffd6..a3199807a 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -132,6 +132,7 @@
Ημερομ. λήψης
Τύπο αρχείου
Επέκταση
+ Σημειώστε ότι ομαδοποίηση και ταξινόμηση είναι 2 ανεξάρτητα πεδία
Εμφάνιση φακέλου στο widget:
@@ -163,17 +164,20 @@
Να επιτρέπεται η άμεση αλλαγή των μέσων με το άγγιγμα στις άκρες της οθόνης
Επιτρέπει βαθύ ζουμ στις εικόνες
Απόκρυψη λεπτομερειών όταν η μπάρα κατάστασης είναι κρυμμένη
- Επιπλέον έλεγχος για την αποφυγή εμφάνισης λανθασμένων αρχείων
Εμφάνιση μερικών κουμπιών λειτουργιών στο κάτω μέρος της οθόνης
Εμφάνιση του κάδου ανακύκλωσης στην οθόνη φακέλων
Βαθιά μεγέθυνση εικόνων
Εμφάνιση εικόνων με την υψηλότερη δυνατή ποιότητα
Εμφάνιση του Κάδου ως τελευταίο στοιχείο στην κύρια οθόνη
Επιτρέψτε το κλείσιμο προβολής πλήρους οθόνης με χειρονομία προς τα κάτω
- Allow 1:1 μεγένθυση με δύο διπλά χτυπήματα
+ Επιτρέπει μεγέθυνση 1:1 με δύο διπλά χτυπήματα
Να ανοίγονται πάντα τα βίντεο σε ξεχωριστή οθόνη με νέες οριζόντιες χειρονομίες
Εμφάνιση μιας εγκοπής αν διατίθεται
Επιτρέπει την περιστροφή εικόνων με χειρονομίες
+ Προτεραιότητα φόρτωσης αρχείου
+ Ταχύτητα
+ Συμβιβασμός
+ Αποφυγή εμφάνισης μη έγκυρων αρχείων
Εικονίδια
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index e3182dbfa..4063bf1ac 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -132,6 +132,7 @@
Data de toma
Tipo de fichero
Extensión
+ Tenga en cuenta que la agrupación y la clasificación son 2 campos independientes
Carpeta mostrada en el widget:
@@ -163,7 +164,6 @@
Permitir el cambio instantáneo de medios haciendo clic en los lados de la pantalla
Permitir zoom profundo
Ocultar detalles ampliados cuando la barra de estado está oculta
- Hacer una comprobación adicional para evitar mostrar archivos inválidos
Mostrar algunos botones de acción en la parte inferior de la pantalla
Mostrar la papelera de reciclaje en la pantalla de carpetas
Imágenes ampliables con zoom
@@ -173,7 +173,11 @@
Permitir zoom 1:1 con dos toques dobles
Siempre abre videos en una pantalla separada con nuevos gestos horizontales
Mostrar una muesca si está disponible
- Allow rotating images with gestures
+ Permite girar con gestos
+ Prioridad de carga de archivos
+ Velocidad
+ Compromiso
+ Evita mostrar archivos inválidos
Miniaturas
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 40871133c..1287b7849 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -132,6 +132,7 @@
Date taken
File type
Extension
+ Please note that grouping and sorting are 2 independent fields
Folder shown on the widget:
@@ -163,7 +164,6 @@
Salli median selaaminen ruudun reunoja koskettamalla
Allow deep zooming images
Piilota yksityiskohtaiset tiedot kun tilapalkki on piilotettu
- Tee ylimääräinen tarkistus rikkinäisten tiedostojen varalta
Show some action buttons at the bottom of the screen
Show the Recycle Bin at the folders screen
Deep zoomable images
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Esikatselukuvat
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 4c584181b..22d0f7647 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -132,6 +132,7 @@
Date de prise de vue
Type de fichier
Extension
+ Please note that grouping and sorting are 2 independent fields
Dossier affiché sur le widget :
@@ -163,7 +164,6 @@
Changement instantané de média en appuyant sur les côtés de l\'écran
Utiliser le zoom maximal des images
Ne pas afficher les informations supplémentaires si la barre d\'état est masquée
- Éviter l\'affichage de fichiers non conformes
Afficher les boutons d\'action
Afficher la corbeille en vue \"Dossier\"
Niveau de zoom maximal des images
@@ -174,6 +174,10 @@
Ouvrez toujours les vidéos sur un écran séparé avec de nouveaux gestes horizontaux.
Afficher un cran si disponible
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Miniatures
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 92294a33f..dbfb316a7 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -132,6 +132,7 @@
Data de captura
Tipo de ficheior
Extensión
+ Please note that grouping and sorting are 2 independent fields
Folder shown on the widget:
@@ -163,7 +164,6 @@
Permitir o cambio instantáneo de medios pulsando nos lados da pantalla
Allow deep zooming images
Agochar detalles extendidos cando a barra de estado está oculta
- Facer unha comprobación extra para evitar mostrar ficheiros non válidos
Show some action buttons at the bottom of the screen
Show the Recycle Bin at the folders screen
Deep zoomable images
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Iconas
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 89e6fc617..4d105c7b1 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -132,6 +132,7 @@
Datum snimanja
Tip datoteke
Vrsta datoteke
+ Please note that grouping and sorting are 2 independent fields
Mapa prikazana na widgetu:
@@ -163,7 +164,6 @@
Dopusti trenutačno mijenjanje medija dodirom na stranice zaslona
Omogućite duboko zumiranje slika
Sakrij proširene pojedinosti kada je traka statusa skrivena
- Napravite dodatnu provjeru da biste izbjegli prikazivanje nevažećih datoteka
Prikaži neke gumbe za radnju pri dnu zaslona
Prikažite koš za smeće na zaslonu mapa
Duboko zumirane slike
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Sličice
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 281b63a58..73b0ae46b 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -133,6 +133,7 @@
Dátum
Fájl típus
Kiterjesztés
+ Please note that grouping and sorting are 2 independent fields
Mappa mutatása a widgeten:
@@ -164,7 +165,6 @@
Engedélyezi a azonnali média váltást a képernyő oldalára kattintva
Engedélyezi a képek mély nagyítását
Bővített részletek elrejtése az állapotsor rejtett állapotában
- Végezzen extra ellenőrzést, hogy elkerülje az érvénytelen fájlok mutatását
Mutassa a művelet gombokat a képernyő alján
Mutassa a Lomtárat a mappák képernyőjén
Mély nagyítású képek
@@ -175,6 +175,10 @@
Mindig külön képernyőn nyissa meg a videókat új vízszintes mozdulattal
Notch mutatása, ha elérhető
Engedélyezi a kép forgatását gesztusokkal
+ Fájl betöltés prioritása
+ Gyors
+ Kiegyensúlyozott
+ Kerülje az érvénytelen fájlok mutatását
Miniatűrök
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 1e1e77184..4f4b3eb88 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -132,6 +132,7 @@
Tanggal diambil
Jenis file
Ekstensi
+ Please note that grouping and sorting are 2 independent fields
Folder shown on the widget:
@@ -163,7 +164,6 @@
Izinkan mengganti media dengan mengklik sisi layar
Izinkan zoom gambar lebih dalam
Sembunyikan detail tambahan ketika status bar disembunyikan
- Lakukan pemeriksaan ulang untuk menghindari file yang tidak valid
Tampilkan beberapa tombol tindakan dibawah layar
Tampilkan Sampah di layar folder
Zoom gambar mendalam
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Thumbnail
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 6abeee390..204d6eab4 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -132,6 +132,7 @@
Data creazione
Tipo di file
Estensione
+ Notare che il raggruppamento e l\'ordinamento sono due campi indipendenti
Cartella mostrata nel widget:
@@ -163,7 +164,6 @@
Cambia media istantaneamente toccando sui lati dello schermo
Permetti zoom immagini profondo
Nascondi i dettagli estesi quando la barra di stato è nascosta
- Fai un controllo ulteriore per evitare di mostrare file non validi
Mostra alcuni pulsanti azione in fondo allo schermo
Mostra il cestino nella schermata delle cartelle
Immagini ingrandibili a fondo
@@ -173,7 +173,11 @@
Permetti l\'ingrandimento 1:1 con un doppio tasto
Apri sempre i video su uno schermo separato con i nuovi movimenti orizzontali
Mostra un notch se disponibile
- Allow rotating images with gestures
+ Permetti la rotazione delle immagini con i gesti
+ Priorità di caricamento file
+ Veloce
+ Compromesso
+ Evita di mostrare file non validi
Anteprime
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index c3406c3f4..a1d0d812c 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -31,7 +31,7 @@
撮影日の値を修正
修正中…
撮影日が正常に修正されました
- Share a resized version
+ リサイズした画像を共有
表示する形式
@@ -39,7 +39,7 @@
ビデオ
GIF
RAW
- SVGs
+ SVG
条件に該当するメディアがありません。
絞り込み条件を変更
@@ -88,8 +88,8 @@
反転
水平方向に反転
垂直方向に反転
- Free
- Other
+ 任意
+ その他
シンプル壁紙
@@ -116,7 +116,7 @@
スライドショーをリピート再生する
スライドショーが終了しました
スライドショーに表示するメディアがありません
- Use crossfade animations
+ クロスフェードアニメーションを使用する
表示形式の変更
@@ -132,25 +132,26 @@
撮影日時
ファイル形式
拡張子
+ Please note that grouping and sorting are 2 independent fields
- Folder shown on the widget:
- Show folder name
+ ウィジェットに表示するフォルダ:
+ フォルダ名を表示
ビデオを自動再生
- Remember last video playback position
+ 動画の最後の再生位置を記憶する
ファイル名の表示を切り替え
ビデオを繰り返し再生
アニメーションGIFを動かす
再生時には明るさを最大にする
サムネイルを正方形に切り取る
- Show video durations
+ 動画の長さを表示
フルスクリーン再生の表示切り替え
システム設定に従う
端末の向きに従う
メディアの縦横比に従う
- メディア表示の背景色を黒にする
+ 全画面表示では背景色を黒にする
サムネイル画面を横方向にスクロール
全画面ではシステムUIを非表示
空になったフォルダは削除する
@@ -163,7 +164,6 @@
端を押してメディアをスライド
深いズームを許可
ステータスバーが非表示の時は詳細を隠す
- 無効なファイルは見せない
画面の下にはアクションを表示
フォルダ画面にごみ箱を表示
画像のズームを深くする
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
サムネイル設定
@@ -218,33 +222,33 @@
- An offline gallery for managing your files without ads, respecting your privacy.
+ 広告なしでプライバシーを尊重する、ファイル管理用オフラインギャラリー。
- A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos.
+ SVG、RAW、パノラマ写真、ビデオなど、さまざまな種類の画像やビデオを表示できる高度にカスタマイズ可能なギャラリー。
- It is open source, contains no ads or unnecessary permissions.
+ オープンソースで、広告も、不要な許可も含まれていません。
- Let\'s list some of its features worth mentioning:
- 1. Search
- 2. Slideshow
- 3. Notch support
- 4. Pinning folders to the top
- 5. Filtering media files by type
- 6. Recycle bin for easy file recovery
- 7. Fullscreen view orientation locking
- 8. Marking favorite files for easy access
- 9. Quick fullscreen media closing with down gesture
- 10. An editor for modifying images and applying filters
- 11. Password protection for protecting hidden items or the whole app
- 12. Changing the thumbnail column count with gestures or menu buttons
- 13. Customizable bottom actions at the fullscreen view for quick access
- 14. Showing extended details over fullscreen media with desired file properties
- 15. Several different ways of sorting or grouping items, both ascending and descending
- 16. Hiding folders (affects other apps too), excluding folders (affects only Simple Gallery)
+ 価値ある機能のいくつかをリストにしましょう:
+ 1.検索
+ 2スライドショー
+ 3.ノッチをサポート
+ 4.フォルダを一番上に固定
+ 5.メディアの種類によるフィルタリング
+ 6.簡単にファイルを復元できるゴミ箱
+ 7.全面表示ロック適応
+ 8.お気に入りファイルのマークで簡単アクセス
+ 9.ダウン・ジェスチャーですばやくフルスクリーンメディアを閉じる
+ 10.フィルタを適用できる画像修正エディタ
+ 11.隠しアイテムやアプリ全体を保護するためのパスワード
+ 12.ジェスチャーまたはメニューボタンでサムネイルの並び方を変更
+ 13.すばやいアクセスが可能な全面表示でカスタマイズ可能な操作ボタン
+ 14.メディアファイルプロパティの詳細をフルスクリーンに表示
+ 15.昇順と降順の両方で、アイテムをソートまたはグループ化するための異なる方法
+ 16.フォルダの非表示(他のアプリにも影響)、フォルダの除外(Simple Galleryのみに影響)
- The fingerprint permission is needed for locking either hidden item visibility, the whole app, or protecting files from being deleted.
+ 隠れアイテムの表示、アプリ全体のロック、またはファイルの削除保護には指紋認証許可が必要です。
- This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
+ このアプリは、大きな一連のアプリの一つです。 他のアプリは https://www.simplemobiletools.com で見つけることができます
Folder shown on the widget:
@@ -163,7 +164,6 @@
측면 클릭으로 미디어 즉시변경
Allow deep zooming images
상태 표시 줄이 숨겨져있을 때 확장 된 세부 정보 숨김
- 잘못된 파일 표시를 방지하기 위해 추가 검사 수행
Show some action buttons at the bottom of the screen
Show the Recycle Bin at the folders screen
Deep zoomable images
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
섬네일
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index baa08b9aa..9f5c62bfe 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -132,6 +132,7 @@
Date taken
File type
Extension
+ Please note that grouping and sorting are 2 independent fields
Folder shown on the widget:
@@ -163,7 +164,6 @@
Leiskite akimirksniu keisti mediją spustelėdami ekrano šonuose
Allow deep zooming images
Slėpti išsamią informaciją, kai būsenos juosta yra paslėpta
- Atlikti papildomą patikrinimą, kad nebūtų rodomos sugadintos bylos
Show some action buttons at the bottom of the screen
Show the Recycle Bin at the folders screen
Deep zoomable images
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Miniatiūros
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 38c7eca4a..1ba3f0202 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -132,6 +132,7 @@
Dato tatt
Filtype
Endelse
+ Please note that grouping and sorting are 2 independent fields
Mappe vist på modulen:
@@ -163,7 +164,6 @@
Tillat å skifte media øyeblikkelig ved å trykke på kanten av skjermen
Tillat dyp bildezooming
Skjul utvidede detaljer når statuslinjen er skjult
- Gjør en ekstra sjekk for å unngå visning av ugyldige filer
Vis noen handlingsknapper nederst på skjermen
Vis papirkurven på mappeskjermen
Dyp zoombare bilder
@@ -173,7 +173,11 @@
Tillat å zoome 1:1 med to dobbeltrykk
Åpne alltid videoer på en separat skjerm med nye horisontale bevegelser
Vis flik hvis tilgjengelig
- Allow rotating images with gestures
+ Tillat rotering av bilder med fingerbevegelser
+ Fillastingsprioritet
+ Hastighet
+ Kompromiss
+ Unngå visning av ugyldige filer
Minibilder
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 216643f05..180f9ac54 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -132,6 +132,7 @@
Datum opname
Bestandstype
Extensie
+ Groeperen en sorteren zijn twee aparte opties
Map tonen in de widget:
@@ -163,7 +164,6 @@
Direct naar vorige/volgende door op de zijkanten van het scherm te tikken
Verder inzoomen mogelijk maken
Uitgebreide informatie niet tonen als de statusbalk is verborgen
- Ongeldige bestanden verbergen
Enkele actieknoppen onder aan het scherm tonen
Prullenbak weergeven in de mapweergave
Afbeeldingen ver inzoomen
@@ -174,6 +174,10 @@
Video\'s altijd in apart scherm met horizontale veeggebaren openen
Inkeping scherm tonen indien aanwezig
Afbeeldingen met veeggebaren draaien
+ Prioriteit bij inladen bestanden
+ Snelheid
+ Compromis
+ Ongeldige bestanden verbergen
Miniatuurvoorbeelden
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index a747af769..90f25dc0f 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -53,7 +53,7 @@
Wykluczenie folderów ukryje je tylko w niniejszej aplikacji, w innych aplikacjach będą one wciąż widoczne.\n\nJeśli chcesz je ukryć także w innych aplikacjach, użyj funkcji ukrywania.
Usuń wszystko
Usunąć wszystkie foldery z listy wykluczonych? Foldery nie zostaną fizycznie usunięte.
- Ukryte foldery
+ Ukryte foldery
Zarządzaj ukrytymi folderami
Zdaje się, że nie masz żadnych folderów z plikiem \'.nomedia\'.
@@ -132,6 +132,7 @@
Daty utworzenia
Typu
Rozszerzenia
+ Please note that grouping and sorting are 2 independent fields
Folder wyświetlany na widżecie:
@@ -162,8 +163,9 @@
Zezwalaj na powiększanie jednym palcem w widoku pełnoekranowym
Zezwalaj na natychmiastową zmianę multimediów po kliknięciu boków ekranu
Zezwalaj na duże powiększanie obrazów
- Ukrywaj dodatkowe szczegóły, gdy pasek stanu jest ukryty
- Dodatkowe sprawdzenie w celu uniknięcia pokazywania niewłaściwych plików
+ Ukrywaj dodatkowe szczegóły, gdy pasek stanu jest ukryty
Pokazuj niektóre przyciski akcji na dole ekranu
Pokazuj kosz w widoku folderów
Duże powiększanie obrazów
@@ -173,7 +175,11 @@
Zezwalaj na powiększanie 1:1 dwoma podwójnymi dotknięciami
Zawsze otwieraj filmy na osobnym ekranie z nowymi poziomymi gestami
Pokazuj wcięcie (jeśli dostępne)
- Allow rotating images with gestures
+ Zezwalaj na obracanie obrazów gestami
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Miniatury
@@ -194,7 +200,7 @@
Jak sprawić, aby album(y) zawsze pojawiał(y) się na górze?
Przytrzymaj album(y) i wybierz ikonę przypięcia w pasku akcji.
Jak mogę przwijać filmy?
- You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.
+ Na dwa sposoby: albo przeciągając poziomo palcem po filmie, albo klikając obecny (przewinięcie do tyłu) lub całkowity czas trwania (do przodu).
Jaka jest różnica między ukryciem, a wykluczeniem folderu?
Wykluczenie działa tylko w obrębie niniejszej aplikacji (wszędzie indziej pliki są normalnie widoczne), ukrywanie - w obrębie całego systemu (nie widać ich nigdzie), dodawany jest wtedy do folderu pusty plik \'.nomedia\', który możesz usunąć w dowolnym menedżerze plików.
Dlaczego pokazują mi się foldery z okładkami do piosenek i tym podobne rzeczy?
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 4f6e9be8a..a30f5e57a 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -132,6 +132,7 @@
Date taken
File type
Extension
+ Please note that grouping and sorting are 2 independent fields
Folder shown on the widget:
@@ -163,7 +164,6 @@
Permitir alternância instantânia de mídia clicando nas laterais da tela
Allow deep zooming images
Ocultar detalhes extendidos quando a barra de status estiver oculta
- Realizar verificação extra para evitar mostrar arquivos inválidos
Show some action buttons at the bottom of the screen
Show the Recycle Bin at the folders screen
Deep zoomable images
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Miniaturas
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index c8f2e996c..54837ced8 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -132,6 +132,7 @@
Data de obtenção
Tipo de ficheiro
Extensão
+ Please note that grouping and sorting are 2 independent fields
Pasta mostrada no widget:
@@ -163,7 +164,6 @@
Permitir troca imediata de ficheiro ao tocar nas margens do ecrã
Permitir ampliação profunda de imagens
Ocultar detalhes extra se a barra de estado estiver oculta
- Dupla verificação para evitar mostrar os ficheiros inválidos
Mostrar alguns botões de ação na base do ecrã
Mostrar reciclagem no ecrã de pastas
Ampliação de imagens
@@ -174,6 +174,10 @@
Abrir vídeos em ecrã distinto com os novos toques horizontais
Mostrar \"notch\", se disponível
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Miniaturas
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 61cf3c7ed..5fa0f2d79 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -132,6 +132,7 @@
Дата съёмки
Тип файла
Расширение
+ Please note that grouping and sorting are 2 independent fields
Папка, отображаемая в виджете:
@@ -163,7 +164,6 @@
Переключение медиафайлов нажатием по краю экрана
Включить полное масштабирование
Скрывать сведения о файле при скрытой строке состояния
- Дополнительная проверка, чтобы избежать показа неподдерживаемых файлов
Показывать кнопки действий в нижней части экрана
Показывать корзину вместе с папками
Масштабирование изображения
@@ -174,6 +174,10 @@
Воспроизводить видео на отдельном экране с управлением позицией горизонтальными жестами
Показывать метку при наличии
Поворачивать изображения жестами
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Миниатюры
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index b3b4dcea2..b872d1bdb 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -132,6 +132,7 @@
Dátumu vytvorenia
Typu súboru
Prípony
+ Prosím vedzte, že radenie a zoskupovanie súborov sú 2 nezávislé hodnoty
Priečinok zobrazený vo widgete:
@@ -163,7 +164,6 @@
Povoliť instantné prepínanie médií kliknutím na okraj obrazovky
Povoliť hlboké približovanie obrázkov
Skryť rozšírené vlastnosti ak je skrytá stavová lišta
- Predísť zobrazovaniu neplatných súborov dodatočnou kontrolou
Zobraziť niektoré akčné tlačidlá na spodku obrazovky
Zobraziť odpadkový kôš na obrazovke s priečinkami
Hlboko priblížiteľné obrázky
@@ -174,6 +174,10 @@
Vždy otvárať videá na vlastnej obrazovke s novými vodorovnými gestami
Zobraziť výrez obrazovky, ak je dostupný
Povoliť otáčanie obrázkov gestami
+ Priorita pri načítavaní súborov
+ Rýchlosť
+ Kompromis
+ Nezobrazovať neplatné súbory
Náhľady
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 5b4d1fdcd..c5c481810 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -132,6 +132,7 @@
Posneto
Tip datoteke
Končnica
+ Please note that grouping and sorting are 2 independent fields
Mapa uporabljena na pripomočku:
@@ -163,7 +164,6 @@
Dovoli takojšnje spremembe medija s klikanjem na robove zaslona
Dovoli globoko povečavo slik
Skrij razširjene podrobnosti, ko je statusna vrstica skrita
- Dvojna kontrola za izogibanje prikazovanja napačnih datotek
Prikaži določene akcijske gumbe na dnu zaslona
Prikaži Koš na zaslonih map
Globoko povečljive slike
@@ -174,6 +174,10 @@
Vedno odpri videoposnetke na ločenem zaslonu z novimi horizontalnimi gestami
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Sličice
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 001067364..934460989 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -132,6 +132,7 @@
Fotodatum
Filtyp
Filnamnstillägg
+ Please note that grouping and sorting are 2 independent fields
Mapp som visas i widgeten:
@@ -163,7 +164,6 @@
Tillåt snabbyte av media genom tryckning på skärmens kanter
Tillåt djupzoomning av bilder
Dölj utökad information när statusfältet är dolt
- Gör en extra kontroll för att hindra ogiltiga filer från att visas
Visa några åtgärdsknappar längst ned på skärmen
Visa Papperskorgen i mappvyn
Djupt zoombara bilder
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Miniatyrer
diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml
index 54e50f08a..9703f1cb6 100644
--- a/app/src/main/res/values-sw600dp/dimens.xml
+++ b/app/src/main/res/values-sw600dp/dimens.xml
@@ -4,5 +4,5 @@
120dp
30dp
38dp
- 60dp
+ 70dp
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index fe4750726..6af3f35cc 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -31,7 +31,7 @@
Çekilen tarih değerini düzelt
Düzeltiliyor…
Tarihler başarıyla düzeltildi
- Share a resized version
+ Yeniden boyutlandırılmış sürümü paylaş
Medyayı filtrele
@@ -89,7 +89,7 @@
Yatay olarak çevir
Dikey olarak çevir
Serbest
- Other
+ Diğer
Basit Duvar Kağıdı
@@ -116,7 +116,7 @@
Slayt gösterisini tekrarla
Slayt gösterisi sona erdi
Slayt gösterisi için medya bulunamadı
- Use crossfade animations
+ Çapraz geçiş animasyonlarını kullan
Görünüm türünü değiştir
@@ -132,10 +132,11 @@
Çekildiği tarih
Dosya türü
Uzantı
+ Please note that grouping and sorting are 2 independent fields
- Folder shown on the widget:
- Show folder name
+ Widget\'ta gösterilen klasör:
+ Klasör adını göster
Videoları otomatik oynat
@@ -145,7 +146,7 @@
Küçük resimlerdeki GIF\'leri hareketlendir
Tam ekran medya görüntülerken maksimum parlaklık
Küçük resimleri karelere kırp
- Show video durations
+ Video sürelerini göster
Tam ekran medyayı döndür
Sistem ayarları
Cihaz yönü
@@ -163,17 +164,20 @@
Ekran kenarlarına tıklayarak anında medya değiştirmeye izin ver
Derin yakınlaştırma resimlerine izin ver
Durum çubuğu gizlendiğinde genişletilmiş ayrıntıları gizle
- Geçersiz dosyaları göstermemek için ekstra kontrol yap
Ekranın alt kısmındaki bazı eylem düğmelerini göster
Geri dönüşüm kutusu\'nu klasörler ekranında gösterme
Derin yakınlaştırılabilir resimler
Resimleri mümkün olan en yüksek kalitede göster
Geri dönüşüm kutusu\'nu ana ekranda son öğe olarak göster
Tam ekran görünümünü aşağı hareketi ile kapatmaya izin ver
- Allow 1:1 zooming in with two double taps
- Always open videos on a separate screen with new horizontal gestures
- Show a notch if available
- Allow rotating images with gestures
+ İki çift dokunuşla 1:1 yakınlaştırmaya izin ver
+ Videoları yeni yatay hareketlerle daima ayrı bir ekranda aç
+ Varsa bir çentik göster
+ Hareketlerle resimlerin döndürülmesine izin ver
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Küçük resimler
@@ -195,7 +199,7 @@
Bir albümün her zaman en üstte görünmesini nasıl sağlayabilirim?
İstediğiniz albüme uzunca basabilir ve eylem menüsündeki Sabitle simgesini seçebilirsiniz. Birden çok klasörü de sabitleyebilirsiniz, sabitlenmiş öğeler varsayılan sıralama yöntemine göre sıralanır.
Videoları nasıl hızlıca ileri sarabilirim?
- You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar, that will move the video either backward, or forward.
+ Parmağınızı video oynatıcı üzerinde yatay olarak sürükleyebilir veya videoyu ileri veya geri hareket ettirecek arama çubuğunun yanındaki geçerli veya maksimum süre metinlerine tıklayabilirsiniz.
Klasörün gizlenmesi ve hariç tutulması arasındaki fark nedir?
Hariç tut, klasörü yalnızca Basit Galeri\'de görüntülemeyi engellerken, Gizle sistem genelinde çalışır ve klasörü diğer galerilerden de gizler. Verilen klasörde boş bir \".nomedia\" dosyası oluşturarak çalışır, daha sonra herhangi bir dosya yöneticisi ile kaldırabilirsiniz.
Neden albüm resimlerini içeren klasörler görünüyor?
@@ -218,7 +222,7 @@
- An offline gallery for managing your files without ads, respecting your privacy.
+ Dosyalarınızı reklamsız yöneten, gizliliğinizi önemseyen bir çevrimdışı galeri.
SVG\'ler, RAW\'lar, panoramik fotoğraflar ve videolar dahil olmak üzere birçok farklı resim ve video türünü gösterebilen son derece özelleştirilebilir bir galeri.
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index d849a6641..b28573bc0 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -132,6 +132,7 @@
датою зйомки
типом файлу
розширенням
+ Зверніть увагу, що групування і сортування - це два окремих поля
Тека, що відображається на віджеті:
@@ -163,7 +164,6 @@
Дозволити миттєво змінювати медіафайл натисканням на сторони екрану
Дозволити глибоке масштабування зображень
Приховати розширені подробиці, коли рядок стану прихований
- Робити додаткову перевірку для запобігання відображенню недійсних файлів
Показати деякі кнопки дій внизу екрану
Показувати \"Кошик\" на головному екрані
Глибокомасштабовані зображення
@@ -172,8 +172,12 @@
Дозволити закриття повноекранного перегляду свайпом згори вниз
Дозволити масштабування до 1:1 подвійним тапом
Завжди відкривати відео на окремому екрані з новими горизонтальними жестами
- Show a notch if available
- Allow rotating images with gestures
+ Показувати мітку, якщо доступна
+ Дозволити обертання зображень жестами
+ Пріоритет завантаження файлів
+ Швидкість
+ Компроміс
+ Запобігати показу пошкоджених файлів
Ескізи
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 8cec1ae5b..7301ecc57 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -132,6 +132,7 @@
拍摄时间
文件类型
扩展
+ Please note that grouping and sorting are 2 independent fields
要在小部件上显示的文件夹:
@@ -163,7 +164,6 @@
通过单击屏幕边缘来切换媒体
允许深度放大图像
当状态栏隐藏时隐藏扩展详情
- 额外检查以避免显示无效的文件
显示底栏
在文件夹界面显示回收站
深度放大图像
@@ -174,6 +174,10 @@
使用新的水平手势在独立页面播放视频
显示留海(如果可用)
允许使用手势旋转图像
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
缩略图
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 86da41b35..d8e7d5c62 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -132,6 +132,7 @@
拍照日期
檔案類型
副檔名
+ Please note that grouping and sorting are 2 independent fields
在小工具顯示資料夾:
@@ -163,7 +164,6 @@
允許點擊螢幕邊緣來快速切換媒體檔案
允許深度縮放圖片
狀態欄隱藏時,同時隱藏詳細資訊
- 進行額外檢查,避免顯示無效的檔案
在螢幕底部顯示一些操作按鈕
在資料夾畫面顯示回收桶
可深度縮放的圖片
@@ -174,6 +174,10 @@
總是用新的水平手勢在獨立畫面開啟影片
如果可以,顯示瀏海螢幕
允許用手勢來旋轉圖片
+ 檔案讀取優先權
+ 速度
+ 折衷
+ 避免顯示無效的檔案
縮圖
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index d9854752f..4fb4f60fd 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -6,7 +6,7 @@
22dp
26dp
96dp
- 60dp
+ 70dp
60dp
60dp
50dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 4c227ae82..8b4f43898 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -132,6 +132,7 @@
Date taken
File type
Extension
+ Please note that grouping and sorting are 2 independent fields
Folder shown on the widget:
@@ -163,7 +164,6 @@
Allow instantly changing media by clicking on screen sides
Allow deep zooming images
Hide extended details when status bar is hidden
- Do an extra check to avoid showing invalid files
Show some action buttons at the bottom of the screen
Show the Recycle Bin at the folders screen
Deep zoomable images
@@ -174,6 +174,10 @@
Always open videos on a separate screen with new horizontal gestures
Show a notch if available
Allow rotating images with gestures
+ File loading priority
+ Speed
+ Compromise
+ Avoid showing invalid files
Thumbnails
diff --git a/build.gradle b/build.gradle
index 0be76662a..413108702 100644
--- a/build.gradle
+++ b/build.gradle
@@ -9,7 +9,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.3.1'
+ classpath 'com.android.tools.build:gradle:3.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png
index b72439b3f..37f2f2345 100644
Binary files a/fastlane/metadata/android/en-US/images/featureGraphic.png and b/fastlane/metadata/android/en-US/images/featureGraphic.png 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 a17c6e5e9..e5700f943 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 ac60bce67..0743a5f27 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