Merge pull request #71 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2020-11-04 18:04:27 +03:00 committed by GitHub
commit b41e6497ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
138 changed files with 1549 additions and 1007 deletions

View file

@ -1,6 +1,114 @@
Changelog
==========
Version 6.17.1 *(2020-11-03)*
----------------------------
* Reverting to the previous UI of the main screen, but keep rounded corners at list view
* Some UI and stability improvements
Version 6.17.0 *(2020-11-02)*
----------------------------
* Redesigning the main folders screen, try making it moderner (!)
* Fix some glitches with deep zoomable fullscreen images not loading in well
* Couple other UX, stability and translation improvements
Version 6.16.5 *(2020-10-28)*
----------------------------
* Added some hidden folder handling related improvements
* Fixed saving files on the SD card after editing
* Couple other UX, translation and performance improvements
Version 6.16.4 *(2020-10-24)*
----------------------------
* Fixed an editor glitch occurring if the file path contained spaces
* Added some stability improvements
Version 6.16.3 *(2020-10-16)*
----------------------------
* Updated the photo editor to fix some issues, mostly related to Android 11
* Make sure file moving doesn't block the UI in any case
Version 6.16.2 *(2020-10-10)*
----------------------------
* Fix sorting by Date Taken
* Properly display some wrongly named WebP files
Version 6.16.1 *(2020-09-27)*
----------------------------
* Fixed a bug with some folders not being recognized
* Improved thumbnail loading performance in some cases
Version 6.16.0 *(2020-09-25)*
----------------------------
* Adding support for animated WebP files
* Fixed a permissions glitch after upgrading to Android 11
* Added many performance related improvements
Version 6.15.6 *(2020-09-22)*
----------------------------
* Fixed the file loading performance in some cases
* Fixed some photo editor related glitches
* Fixed the Use English language settings toggle
Version 6.15.5 *(2020-09-16)*
----------------------------
* Properly fetch the latest available Last Modified of files
Version 6.15.4 *(2020-09-16)*
----------------------------
* Improved file loading performance
Version 6.15.3 *(2020-09-09)*
----------------------------
* Improved file loading performance in some cases
* Some UX, translation and stability improvements
Version 6.15.2 *(2020-06-17)*
----------------------------
* Fixed a glitch at caching fullscreen images
* Properly recognize a new type of panoramic images
Version 6.15.1 *(2020-06-12)*
----------------------------
* Fixed a glitch at caching fullscreen images
* Improved batch renaming with patterns
Version 6.15.0 *(2020-06-07)*
----------------------------
* Rescan the internal storage from time to time, look for new folders containing media
* Improve the Search user experience, do not reset it at opening an item
* Fixed some editor glitches
* Speed up fullscreen image loading
Version 6.14.10 *(2020-05-29)*
----------------------------
* Updated the image editor, fix a glitch with black preview
* Show Portrait images by default on Android 10
* Use a nicer icon on older devices
* Some translation and stability improvements
Version 6.14.9 *(2020-05-18)*
----------------------------
* Fixing some glitches with hidden folders not being shown when appropriate
* Added some stability and translation improvements
Version 6.14.8 *(2020-05-05)*
----------------------------

View file

@ -17,9 +17,8 @@ android {
applicationId "com.simplemobiletools.gallery.pro"
minSdkVersion 21
targetSdkVersion 29
versionCode 309
versionName "6.14.8"
multiDexEnabled true
versionCode 326
versionName "6.17.1"
setProperty("archivesBaseName", "gallery-$versionCode")
vectorDrawables.useSupportLibrary = true
}
@ -78,12 +77,11 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:5.28.4'
implementation 'com.simplemobiletools:commons:5.31.19'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6'
implementation 'com.google.vr:sdk-panowidget:1.180.0'
implementation 'com.google.vr:sdk-videowidget:1.180.0'
@ -92,7 +90,9 @@ dependencies {
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.caverock:androidsvg-aar:1.3'
implementation 'com.github.tibbi:gestureviews:512f929d82'
implementation 'com.github.tibbi:subsampling-scale-image-view:381878c078'
implementation 'com.github.tibbi:subsampling-scale-image-view:81c021514c'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation 'com.github.penfeizhou.android.animation:awebp:2.5.1'
kapt 'com.github.bumptech.glide:compiler:4.10.0'

View file

@ -5,7 +5,12 @@
package="com.simplemobiletools.gallery.pro"
android:installLocation="auto">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- override the android:maxSdkVersion="28" from PhotoEditorSDK with some higher number -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="40"
tools:replace="android:maxSdkVersion" />
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission

View file

@ -1,10 +1,10 @@
package com.simplemobiletools.gallery.pro
import androidx.multidex.MultiDexApplication
import android.app.Application
import com.github.ajalt.reprint.core.Reprint
import com.simplemobiletools.commons.extensions.checkUseEnglish
class App : MultiDexApplication() {
class App : Application() {
override fun onCreate() {
super.onCreate()
checkUseEnglish()

View file

@ -39,6 +39,7 @@ import com.simplemobiletools.gallery.pro.dialogs.OtherAspectRatioDialog
import com.simplemobiletools.gallery.pro.dialogs.ResizeDialog
import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.copyNonDimensionAttributesTo
import com.simplemobiletools.gallery.pro.extensions.fixDateTaken
import com.simplemobiletools.gallery.pro.extensions.openEditor
import com.simplemobiletools.gallery.pro.helpers.*
@ -196,47 +197,47 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
editor_draw_canvas.beGone()
val options = RequestOptions()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
Glide.with(this)
.asBitmap()
.load(uri)
.apply(options)
.listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
if (uri != originalUri) {
uri = originalUri
Handler().post {
loadDefaultImageView()
}
.asBitmap()
.load(uri)
.apply(options)
.listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
if (uri != originalUri) {
uri = originalUri
Handler().post {
loadDefaultImageView()
}
return false
}
return false
}
override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
val currentFilter = getFiltersAdapter()?.getCurrentFilter()
if (filterInitialBitmap == null) {
loadCropImageView()
bottomCropRotateClicked()
}
override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
val currentFilter = getFiltersAdapter()?.getCurrentFilter()
if (filterInitialBitmap == null) {
loadCropImageView()
bottomCropRotateClicked()
if (filterInitialBitmap != null && currentFilter != null && currentFilter.filter.name != getString(R.string.none)) {
default_image_view.onGlobalLayout {
applyFilter(currentFilter)
}
if (filterInitialBitmap != null && currentFilter != null && currentFilter.filter.name != getString(R.string.none)) {
default_image_view.onGlobalLayout {
applyFilter(currentFilter)
}
} else {
filterInitialBitmap = bitmap
}
if (isCropIntent) {
bottom_primary_filter.beGone()
bottom_primary_draw.beGone()
}
return false
} else {
filterInitialBitmap = bitmap
}
}).into(default_image_view)
if (isCropIntent) {
bottom_primary_filter.beGone()
bottom_primary_draw.beGone()
}
return false
}
}).into(default_image_view)
}
private fun loadCropImageView() {
@ -275,17 +276,17 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
val size = Point()
windowManager.defaultDisplay.getSize(size)
val options = RequestOptions()
.format(DecodeFormat.PREFER_ARGB_8888)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.fitCenter()
.format(DecodeFormat.PREFER_ARGB_8888)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.fitCenter()
try {
val builder = Glide.with(applicationContext)
.asBitmap()
.load(uri)
.apply(options)
.into(editor_draw_canvas.width, editor_draw_canvas.height)
.asBitmap()
.load(uri)
.apply(options)
.into(editor_draw_canvas.width, editor_draw_canvas.height)
val bitmap = builder.get()
runOnUiThread {
@ -304,16 +305,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
@TargetApi(Build.VERSION_CODES.N)
private fun saveImage() {
var inputStream: InputStream? = null
try {
if (isNougatPlus()) {
inputStream = contentResolver.openInputStream(uri!!)
oldExif = ExifInterface(inputStream!!)
}
} catch (e: Exception) {
} finally {
inputStream?.close()
}
setOldExif()
if (crop_image_view.isVisible()) {
crop_image_view.getCroppedImageAsync()
@ -354,6 +346,20 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun setOldExif() {
var inputStream: InputStream? = null
try {
if (isNougatPlus()) {
inputStream = contentResolver.openInputStream(uri!!)
oldExif = ExifInterface(inputStream!!)
}
} catch (e: Exception) {
} finally {
inputStream?.close()
}
}
private fun shareImage() {
ensureBackgroundThread {
when {
@ -591,17 +597,17 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
val bitmap = try {
Glide.with(this)
.asBitmap()
.load(uri).listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
showErrorToast(e.toString())
return false
}
.asBitmap()
.load(uri).listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
showErrorToast(e.toString())
return false
}
override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean) = false
})
.submit(thumbnailSize, thumbnailSize)
.get()
override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean) = false
})
.submit(thumbnailSize, thumbnailSize)
.get()
} catch (e: GlideException) {
showErrorToast(e)
finish()
@ -742,6 +748,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) {
if (result.error == null) {
setOldExif()
val bitmap = result.bitmap
if (isSharingBitmap) {
isSharingBitmap = false
@ -862,7 +870,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
try {
if (isNougatPlus()) {
val newExif = ExifInterface(file.absolutePath)
oldExif?.copyTo(newExif, false)
oldExif?.copyNonDimensionAttributesTo(newExif)
}
} catch (e: Exception) {
}

View file

@ -23,7 +23,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.dialogs.NewAppsIconsDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
@ -84,7 +83,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private var mStoredCropThumbnails = true
private var mStoredScrollHorizontally = true
private var mStoredShowMediaCount = true
private var mStoredShowInfoBubble = true
private var mStoredTextColor = 0
private var mStoredPrimaryColor = 0
@ -155,12 +153,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
finish()
}
}
// notify some users about the Dialer, SMS Messenger and Voice Recorder apps
if (!config.wasMessengerRecorderShown && config.appRunCount > 35) {
NewAppsIconsDialog(this)
config.wasMessengerRecorderShown = true
}
}
override fun onStart() {
@ -204,28 +196,28 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
directories_horizontal_fastscroller.updateBubbleColors()
directories_vertical_fastscroller.updateBubbleColors()
directories_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
directories_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
directories_refresh_layout.isEnabled = config.enablePullToRefresh
invalidateOptionsMenu()
directories_empty_placeholder.setTextColor(config.textColor)
directories_empty_placeholder_2.setTextColor(getAdjustedPrimaryColor())
directories_switch_searching.setTextColor(getAdjustedPrimaryColor())
directories_switch_searching.underlineText()
if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
handleAppPasswordProtection {
mWasProtectionHandled = it
if (it) {
mIsPasswordProtectionPending = false
tryLoadGallery()
} else {
finish()
if (!mIsSearchOpen) {
invalidateOptionsMenu()
if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
handleAppPasswordProtection {
mWasProtectionHandled = it
if (it) {
mIsPasswordProtectionPending = false
tryLoadGallery()
} else {
finish()
}
}
} else {
tryLoadGallery()
}
} else {
tryLoadGallery()
}
}
@ -239,7 +231,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
override fun onStop() {
super.onStop()
mSearchMenuItem?.collapseActionView()
if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
mTempShowHiddenHandler.postDelayed({
@ -342,7 +333,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
mStoredCropThumbnails = cropThumbnails
mStoredScrollHorizontally = scrollHorizontally
mStoredShowMediaCount = showMediaCount
mStoredShowInfoBubble = showInfoBubble
mStoredTextColor = textColor
mStoredPrimaryColor = primaryColor
}
@ -439,22 +429,27 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun tryLoadGallery() {
if (hasPermission(PERMISSION_WRITE_STORAGE)) {
if (!config.wasUpgradedFromFreeShown && isPackageInstalled("com.simplemobiletools.gallery")) {
ConfirmationDialog(this, "", R.string.upgraded_from_free, R.string.ok, 0) {}
config.wasUpgradedFromFreeShown = true
}
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
if (!config.wasUpgradedFromFreeShown && isPackageInstalled("com.simplemobiletools.gallery")) {
ConfirmationDialog(this, "", R.string.upgraded_from_free, R.string.ok, 0) {}
config.wasUpgradedFromFreeShown = true
}
checkOTGPath()
checkDefaultSpamFolders()
checkOTGPath()
checkDefaultSpamFolders()
if (config.showAll) {
showAllMedia()
if (config.showAll) {
showAllMedia()
} else {
getDirectories()
}
setupLayoutManager()
} else {
getDirectories()
toast(R.string.no_storage_permissions)
finish()
}
setupLayoutManager()
}
}
@ -638,6 +633,21 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
layoutManager.spanCount = config.dirColumnCnt
}
private fun setupListLayoutManager() {
val layoutManager = directories_grid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL
directories_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val smallMargin = resources.getDimension(R.dimen.small_margin).toInt()
(directories_grid.layoutParams as RelativeLayout.LayoutParams).apply {
topMargin = smallMargin
bottomMargin = smallMargin
}
mZoomListener = null
}
private fun measureRecyclerViewContent(directories: ArrayList<Directory>) {
directories_grid.onGlobalLayout {
if (config.scrollHorizontally) {
@ -687,21 +697,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
private fun setupListLayoutManager() {
val layoutManager = directories_grid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL
directories_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val smallMargin = resources.getDimension(R.dimen.small_margin).toInt()
(directories_grid.layoutParams as RelativeLayout.LayoutParams).apply {
topMargin = smallMargin
bottomMargin = smallMargin
}
mZoomListener = null
}
private fun toggleRecycleBin(show: Boolean) {
config.showRecycleBinAtFolders = show
invalidateOptionsMenu()
@ -907,10 +902,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val hiddenString = getString(R.string.hidden)
val albumCovers = config.parseAlbumCovers()
val includedFolders = config.includedFolders
val noMediaFolders = getNoMediaFoldersSync()
val tempFolderPath = config.tempFolderPath
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
val favoritePaths = getFavoritePaths()
val dirPathsToRemove = ArrayList<String>()
val lastModifieds = if (isRPlus()) mLastMediaFetcher!!.getLastModifieds() else HashMap()
val dateTakens = mLastMediaFetcher!!.getDateTakens()
try {
for (directory in dirs) {
@ -930,14 +928,16 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val curMedia = mLastMediaFetcher!!.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
val curMedia = mLastMediaFetcher!!.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified,
getProperFileSize, favoritePaths, false, lastModifieds, dateTakens)
val newDir = if (curMedia.isEmpty()) {
if (directory.path != tempFolderPath) {
dirPathsToRemove.add(directory.path)
}
directory
} else {
createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
}
// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed
@ -969,14 +969,19 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}.start()
}
getCachedMedia(directory.path, getVideosOnly, getImagesOnly) {
it.forEach {
if (!curMedia.contains(it)) {
val path = (it as? Medium)?.path
if (path != null) {
deleteDBPath(path)
if (!directory.isRecycleBin()) {
getCachedMedia(directory.path, getVideosOnly, getImagesOnly) {
val mediaToDelete = ArrayList<Medium>()
it.forEach {
if (!curMedia.contains(it)) {
val medium = it as? Medium
val path = medium?.path
if (path != null) {
mediaToDelete.add(medium)
}
}
}
mediaDB.deleteMedia(*mediaToDelete.toTypedArray())
}
}
}
@ -1022,7 +1027,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val newMedia = mLastMediaFetcher!!.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
val newMedia = mLastMediaFetcher!!.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified,
getProperFileSize, favoritePaths, false, lastModifieds, dateTakens)
if (newMedia.isEmpty()) {
continue
}
@ -1036,7 +1043,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
dirs.add(newDir)
setupAdapter(dirs)
@ -1077,6 +1084,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}.mapTo(everShownFolders) { it.path }
try {
// scan the internal storage from time to time for new folders
if (config.appRunCount == 1 || config.appRunCount % 30 == 0) {
everShownFolders.addAll(getFoldersWithMedia(config.internalStoragePath))
}
// catch some extreme exceptions like too many everShownFolders for storing, shouldnt really happen
config.everShownFolders = everShownFolders
} catch (e: Exception) {
@ -1171,12 +1183,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
directories_horizontal_fastscroller.beVisibleIf(allowHorizontalScroll)
if (allowHorizontalScroll) {
directories_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
directories_horizontal_fastscroller.setViews(directories_grid, directories_refresh_layout) {
directories_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it))
}
} else {
directories_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
directories_vertical_fastscroller.setViews(directories_grid, directories_refresh_layout) {
directories_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it))
}
@ -1326,6 +1336,27 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
private fun getFoldersWithMedia(path: String): HashSet<String> {
val folders = HashSet<String>()
try {
val files = File(path).listFiles()
if (files != null) {
files.sortBy { !it.isDirectory }
for (file in files) {
if (file.isDirectory && !file.startsWith("${config.internalStoragePath}/Android")) {
folders.addAll(getFoldersWithMedia(file.absolutePath))
} else if (file.isFile && file.isMediaFile()) {
folders.add(file.parent ?: "")
break
}
}
}
} catch (ignored: Exception) {
}
return folders
}
override fun refreshItems() {
getDirectories()
}

View file

@ -24,10 +24,7 @@ import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.REQUEST_EDIT_IMAGE
import com.simplemobiletools.commons.helpers.SORT_BY_RANDOM
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.commons.views.MyRecyclerView
@ -76,7 +73,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private var mStoredAnimateGifs = true
private var mStoredCropThumbnails = true
private var mStoredScrollHorizontally = true
private var mStoredShowInfoBubble = true
private var mStoredShowFileTypes = true
private var mStoredTextColor = 0
private var mStoredPrimaryColor = 0
@ -159,13 +155,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
media_horizontal_fastscroller.updateBubbleColors()
media_vertical_fastscroller.updateBubbleColors()
media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_refresh_layout.isEnabled = config.enablePullToRefresh
invalidateOptionsMenu()
media_empty_text_placeholder.setTextColor(config.textColor)
media_empty_text_placeholder_2.setTextColor(getAdjustedPrimaryColor())
if (!mIsSearchOpen) {
invalidateOptionsMenu()
}
if (mMedia.isEmpty() || config.getFolderSorting(mPath) and SORT_BY_RANDOM == 0) {
if (shouldSkipAuthentication()) {
tryLoadGallery()
@ -195,7 +192,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
override fun onStop() {
super.onStop()
mSearchMenuItem?.collapseActionView()
if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
mTempShowHiddenHandler.postDelayed({
@ -292,7 +288,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mStoredAnimateGifs = animateGifs
mStoredCropThumbnails = cropThumbnails
mStoredScrollHorizontally = scrollHorizontally
mStoredShowInfoBubble = showInfoBubble
mStoredShowFileTypes = showThumbnailFileTypes
mStoredTextColor = textColor
mStoredPrimaryColor = primaryColor
@ -393,7 +388,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
initZoomListener()
val fastscroller = if (config.scrollHorizontally) media_horizontal_fastscroller else media_vertical_fastscroller
MediaAdapter(this, mMedia.clone() as ArrayList<ThumbnailItem>, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent,
mAllowPickingMultiple, mPath, media_grid, fastscroller) {
mAllowPickingMultiple, mPath, media_grid, fastscroller) {
if (it is Medium && !isFinishing) {
itemClicked(it.path)
}
@ -424,12 +419,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val sorting = config.getFolderSorting(if (mShowAll) SHOW_ALL else mPath)
if (allowHorizontalScroll) {
media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid, media_refresh_layout) {
media_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
} else {
media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid, media_refresh_layout) {
media_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
@ -799,24 +792,24 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val ratio = wantedWidth.toFloat() / wantedHeight
val options = RequestOptions()
.override((wantedWidth * ratio).toInt(), wantedHeight)
.fitCenter()
.override((wantedWidth * ratio).toInt(), wantedHeight)
.fitCenter()
Glide.with(this)
.asBitmap()
.load(File(path))
.apply(options)
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
try {
WallpaperManager.getInstance(applicationContext).setBitmap(resource)
setResult(Activity.RESULT_OK)
} catch (ignored: IOException) {
}
finish()
.asBitmap()
.load(File(path))
.apply(options)
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
try {
WallpaperManager.getInstance(applicationContext).setBitmap(resource)
setResult(Activity.RESULT_OK)
} catch (ignored: IOException) {
}
})
finish()
}
})
} else if (mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent) {
Intent().apply {
data = Uri.parse(path)
@ -872,12 +865,12 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mLatestMediaDateId = getLatestMediaByDateId()
if (!isFromCache) {
val mediaToInsert = (mMedia).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium }
try {
Thread {
Thread {
try {
mediaDB.insertAll(mediaToInsert)
}.start()
} catch (e: Exception) {
}
} catch (e: Exception) {
}
}.start()
}
}

View file

@ -13,6 +13,7 @@ import androidx.core.view.MenuItemCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
@ -218,12 +219,10 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
val sorting = config.getFolderSorting(SHOW_ALL)
if (allowHorizontalScroll) {
media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid) {
media_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
} else {
media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid) {
media_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}

View file

@ -70,7 +70,6 @@ class SettingsActivity : SimpleActivity() {
setupThumbnailFileTypes()
setupShowMediaCount()
setupKeepLastModified()
setupShowInfoBubble()
setupEnablePullToRefresh()
setupAllowZoomingImages()
setupShowHighestQuality()
@ -428,14 +427,6 @@ class SettingsActivity : SimpleActivity() {
}
}
private fun setupShowInfoBubble() {
settings_show_info_bubble.isChecked = config.showInfoBubble
settings_show_info_bubble_holder.setOnClickListener {
settings_show_info_bubble.toggle()
config.showInfoBubble = settings_show_info_bubble.isChecked
}
}
private fun setupEnablePullToRefresh() {
settings_enable_pull_to_refresh.isChecked = config.enablePullToRefresh
settings_enable_pull_to_refresh_holder.setOnClickListener {
@ -650,7 +641,6 @@ class SettingsActivity : SimpleActivity() {
put(CROP_THUMBNAILS, config.cropThumbnails)
put(SHOW_THUMBNAIL_VIDEO_DURATION, config.showThumbnailVideoDuration)
put(SHOW_MEDIA_COUNT, config.showMediaCount)
put(SHOW_INFO_BUBBLE, config.showInfoBubble)
put(SCROLL_HORIZONTALLY, config.scrollHorizontally)
put(ENABLE_PULL_TO_REFRESH, config.enablePullToRefresh)
put(MAX_BRIGHTNESS, config.maxBrightness)
@ -786,7 +776,6 @@ class SettingsActivity : SimpleActivity() {
CROP_THUMBNAILS -> config.cropThumbnails = value.toBoolean()
SHOW_THUMBNAIL_VIDEO_DURATION -> config.showThumbnailVideoDuration = value.toBoolean()
SHOW_MEDIA_COUNT -> config.showMediaCount = value.toBoolean()
SHOW_INFO_BUBBLE -> config.showInfoBubble = value.toBoolean()
SCROLL_HORIZONTALLY -> config.scrollHorizontally = value.toBoolean()
ENABLE_PULL_TO_REFRESH -> config.enablePullToRefresh = value.toBoolean()
MAX_BRIGHTNESS -> config.maxBrightness = value.toBoolean()

View file

@ -187,11 +187,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 && visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0
findItem(R.id.menu_change_orientation).icon = resources.getDrawable(getChangeOrientationIcon())
findItem(R.id.menu_rotate).setShowAsAction(
if (rotationDegrees != 0) {
MenuItem.SHOW_AS_ACTION_ALWAYS
} else {
MenuItem.SHOW_AS_ACTION_IF_ROOM
})
if (rotationDegrees != 0) {
MenuItem.SHOW_AS_ACTION_ALWAYS
} else {
MenuItem.SHOW_AS_ACTION_IF_ROOM
})
}
if (visibleBottomActions != 0) {
@ -718,10 +718,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
val shortcut = ShortcutInfo.Builder(this, path)
.setShortLabel(medium.name)
.setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
.setIntent(intent)
.build()
.setShortLabel(medium.name)
.setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
.setIntent(intent)
.build()
manager.requestPinShortcut(shortcut, null)
}
@ -915,27 +915,27 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
val options = RequestOptions()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
Glide.with(this)
.asBitmap()
.load(path)
.apply(options)
.listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
showErrorToast(e?.localizedMessage ?: "")
return false
.asBitmap()
.load(path)
.apply(options)
.listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
showErrorToast(e?.localizedMessage ?: "")
return false
}
override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
if (bitmap != null) {
printHelper.printBitmap(path.getFilenameFromPath(), bitmap)
}
override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
if (bitmap != null) {
printHelper.printBitmap(path.getFilenameFromPath(), bitmap)
}
return false
}
}).submit(requestedWidth, requestedHeight)
return false
}
}).submit(requestedWidth, requestedHeight)
} catch (e: Exception) {
}
}
@ -986,7 +986,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (isNougatPlus()) {
val newExif = ExifInterface(file.absolutePath)
oldExif?.copyTo(newExif, false)
oldExif?.copyNonDimensionAttributesTo(newExif)
}
} catch (e: Exception) {
}
@ -1261,8 +1261,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (bottom_actions.isVisible()) {
bottom_actions.animate().alpha(newAlpha).start()
arrayOf(bottom_favorite, bottom_edit, bottom_share, bottom_delete, bottom_rotate, bottom_properties, bottom_change_orientation,
bottom_slideshow, bottom_show_on_map, bottom_toggle_file_visibility, bottom_rename, bottom_set_as, bottom_copy, bottom_move,
bottom_resize).forEach {
bottom_slideshow, bottom_show_on_map, bottom_toggle_file_visibility, bottom_rename, bottom_set_as, bottom_copy, bottom_move,
bottom_resize).forEach {
it.isClickable = !mIsFullScreen
}
}

View file

@ -15,6 +15,7 @@ import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.dialogs.PickDirectoryDialog
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.MyWidgetProvider
import com.simplemobiletools.gallery.pro.helpers.ROUNDED_CORNERS_NONE
import com.simplemobiletools.gallery.pro.models.Directory
import com.simplemobiletools.gallery.pro.models.Widget
import kotlinx.android.synthetic.main.activity_widget_config.*
@ -166,7 +167,7 @@ class WidgetConfigureActivity : SimpleActivity() {
val path = directoryDao.getDirectoryThumbnail(folderPath)
if (path != null) {
runOnUiThread {
loadJpg(path, config_image, config.cropThumbnails)
loadJpg(path, config_image, config.cropThumbnails, ROUNDED_CORNERS_NONE)
}
}
}

View file

@ -15,9 +15,7 @@ import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.*
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.SHOW_ALL_TABS
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
@ -37,7 +35,6 @@ import kotlinx.android.synthetic.main.directory_item_grid.view.dir_lock
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_name
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_pin
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_thumbnail
import kotlinx.android.synthetic.main.directory_item_grid.view.photo_cnt
import kotlinx.android.synthetic.main.directory_item_list.view.*
import java.io.File
@ -304,7 +301,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
val includedFolders = activity.config.includedFolders
val hidden = activity.getString(R.string.hidden)
dirs.forEach {
it.name = activity.checkAppendingHidden(it.path, hidden, includedFolders)
it.name = activity.checkAppendingHidden(it.path, hidden, includedFolders, ArrayList())
}
listener?.updateDirectories(dirs.toMutableList() as ArrayList)
activity.runOnUiThread {
@ -478,10 +475,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
intent.putExtra(DIRECTORY, path)
val shortcut = ShortcutInfo.Builder(activity, path)
.setShortLabel(dir.name)
.setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
.setIntent(intent)
.build()
.setShortLabel(dir.name)
.setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
.setIntent(intent)
.build()
manager.requestPinShortcut(shortcut, null)
}
@ -686,7 +683,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
dir_lock.applyColorFilter(config.backgroundColor.getContrastColor())
} else {
dir_lock.beGone()
activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails)
val roundedCorners = if (isListViewType) ROUNDED_CORNERS_SMALL else ROUNDED_CORNERS_NONE
activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners)
}
dir_pin.beVisibleIf(pinnedFolders.contains(directory.path))

View file

@ -18,6 +18,8 @@ import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.FAVORITES
import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.commons.models.FileDirItem
@ -229,7 +231,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
}
}
} else {
RenameDialog(activity, getSelectedPaths()) {
RenameDialog(activity, getSelectedPaths(), true) {
enableInstantLoad()
listener?.refreshItems()
finishActMode()
@ -369,10 +371,10 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
}
val shortcut = ShortcutInfo.Builder(activity, path)
.setShortLabel(path.getFilenameFromPath())
.setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
.setIntent(intent)
.build()
.setShortLabel(path.getFilenameFromPath())
.setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
.setIntent(intent)
.build()
manager.requestPinShortcut(shortcut, null)
}
@ -540,15 +542,16 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
path = path.getOTGPublicPath(context)
}
val roundedCorners = if (isListViewType) ROUNDED_CORNERS_SMALL else ROUNDED_CORNERS_NONE
if (loadImageInstantly) {
activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, rotatedImagePaths)
activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, rotatedImagePaths)
} else {
medium_thumbnail.setImageDrawable(null)
medium_thumbnail.isHorizontalScrolling = scrollHorizontally
delayHandler.postDelayed({
val isVisible = visibleItemPaths.contains(medium.path)
if (isVisible) {
activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, rotatedImagePaths)
activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, rotatedImagePaths)
}
}, IMAGE_LOAD_DELAY)
}

View file

@ -2,9 +2,7 @@ package com.simplemobiletools.gallery.pro.asynctasks
import android.content.Context
import android.os.AsyncTask
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_TAKEN
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.getFavoritePaths
import com.simplemobiletools.gallery.pro.helpers.*
@ -32,19 +30,25 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage
val getProperFileSize = fileSorting and SORT_BY_SIZE != 0
val favoritePaths = context.getFavoritePaths()
val getVideoDurations = context.config.showThumbnailVideoDuration
val lastModifieds = if (isRPlus() && getProperLastModified) mediaFetcher.getLastModifieds() else HashMap()
val dateTakens = if (getProperDateTaken) mediaFetcher.getDateTakens() else HashMap()
val media = if (showAll) {
val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES && !context.config.isFolderProtected(it) }
val media = ArrayList<Medium>()
foldersToScan.forEach {
val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize,
favoritePaths, getVideoDurations, lastModifieds, dateTakens)
media.addAll(newMedia)
}
mediaFetcher.sortMedia(media, context.config.getFolderSorting(SHOW_ALL))
media
} else {
mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths,
getVideoDurations, lastModifieds, dateTakens)
}
return mediaFetcher.groupMedia(media, pathToUse)
}

View file

@ -9,7 +9,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
import com.simplemobiletools.gallery.pro.interfaces.*
import com.simplemobiletools.gallery.pro.models.*
@Database(entities = [Directory::class, Medium::class, Widget::class, DateTaken::class, Favorite::class], version = 8)
@Database(entities = [Directory::class, Medium::class, Widget::class, DateTaken::class, Favorite::class], version = 9)
abstract class GalleryDatabase : RoomDatabase() {
abstract fun DirectoryDao(): DirectoryDao
@ -30,12 +30,13 @@ abstract class GalleryDatabase : RoomDatabase() {
synchronized(GalleryDatabase::class) {
if (db == null) {
db = Room.databaseBuilder(context.applicationContext, GalleryDatabase::class.java, "gallery.db")
.fallbackToDestructiveMigration()
.addMigrations(MIGRATION_4_5)
.addMigrations(MIGRATION_5_6)
.addMigrations(MIGRATION_6_7)
.addMigrations(MIGRATION_7_8)
.build()
.fallbackToDestructiveMigration()
.addMigrations(MIGRATION_4_5)
.addMigrations(MIGRATION_5_6)
.addMigrations(MIGRATION_6_7)
.addMigrations(MIGRATION_7_8)
.addMigrations(MIGRATION_8_9)
.build()
}
}
}
@ -74,5 +75,11 @@ abstract class GalleryDatabase : RoomDatabase() {
database.execSQL("ALTER TABLE directories ADD COLUMN sort_value TEXT default '' NOT NULL")
}
}
private val MIGRATION_8_9 = object : Migration(8, 9) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE date_takens ADD COLUMN last_modified INTEGER default 0 NOT NULL")
}
}
}
}

View file

@ -5,11 +5,11 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_LIST
import kotlinx.android.synthetic.main.dialog_change_view_type.view.*
class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView: Boolean, val path: String = "", val callback: () -> Unit) {

View file

@ -6,11 +6,11 @@ import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.DirectoryAdapter
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.gallery.pro.models.Directory
import kotlinx.android.synthetic.main.dialog_directory_picker.view.*
@ -134,12 +134,10 @@ class PickDirectoryDialog(val activity: BaseSimpleActivity, val sourcePath: Stri
directories_horizontal_fastscroller.beVisibleIf(scrollHorizontally)
if (scrollHorizontally) {
directories_horizontal_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
directories_horizontal_fastscroller.setViews(directories_grid) {
directories_horizontal_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting, activity, dateFormat, timeFormat))
}
} else {
directories_vertical_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
directories_vertical_fastscroller.setViews(directories_grid) {
directories_vertical_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting, activity, dateFormat, timeFormat))
}

View file

@ -7,6 +7,7 @@ import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getTimeFormat
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.MediaAdapter
@ -14,7 +15,6 @@ import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.getCachedMedia
import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import kotlinx.android.synthetic.main.dialog_medium_picker.view.*
@ -33,12 +33,12 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
}
dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setNeutralButton(R.string.other_folder) { dialogInterface, i -> showOtherFolder() }
.create().apply {
activity.setupDialogStuff(view, this, R.string.select_photo)
}
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setNeutralButton(R.string.other_folder) { dialogInterface, i -> showOtherFolder() }
.create().apply {
activity.setupDialogStuff(view, this, R.string.select_photo)
}
activity.getCachedMedia(path) {
val media = it.filter { it is Medium } as ArrayList
@ -87,13 +87,11 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
media_horizontal_fastscroller.beVisibleIf(scrollHorizontally)
if (scrollHorizontally) {
media_horizontal_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid) {
val medium = (media[it] as? Medium)
media_horizontal_fastscroller.updateBubbleText(medium?.getBubbleText(sorting, activity, dateFormat, timeFormat) ?: "")
}
} else {
media_vertical_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid) {
val medium = (media[it] as? Medium)
media_vertical_fastscroller.updateBubbleText(medium?.getBubbleText(sorting, activity, dateFormat, timeFormat) ?: "")

View file

@ -3,6 +3,7 @@ package com.simplemobiletools.gallery.pro.extensions
import android.annotation.TargetApi
import android.app.Activity
import android.content.ContentProviderOperation
import android.content.ContentValues
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
@ -13,6 +14,7 @@ import android.media.ExifInterface
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import android.provider.MediaStore.Files
import android.provider.MediaStore.Images
import android.util.DisplayMetrics
import android.view.View
@ -81,7 +83,8 @@ fun Activity.launchCamera() {
fun SimpleActivity.launchAbout() {
val licenses = LICENSE_GLIDE or LICENSE_CROPPER or LICENSE_RTL or LICENSE_SUBSAMPLING or LICENSE_PATTERN or LICENSE_REPRINT or LICENSE_GIF_DRAWABLE or
LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_FILTERS or LICENSE_GESTURE_VIEWS
LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_FILTERS or LICENSE_GESTURE_VIEWS or
LICENSE_APNG
val faqItems = arrayListOf(
FAQItem(R.string.faq_5_title_commons, R.string.faq_5_text_commons),
@ -101,7 +104,8 @@ fun SimpleActivity.launchAbout() {
FAQItem(R.string.faq_15_title, R.string.faq_15_text),
FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons),
FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons),
FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons))
FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons),
FAQItem(R.string.faq_9_title_commons, R.string.faq_9_text_commons))
startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true)
}
@ -146,9 +150,8 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
val fileDocument = getDocumentFile(path)
if (fileDocument?.exists() == true && fileDocument.isDirectory) {
fileDocument.createFile("", NOMEDIA)
applicationContext.scanPathRecursively(file.absolutePath) {
callback()
}
addNoMediaIntoMediaStore(file.absolutePath)
callback()
} else {
toast(R.string.unknown_error_occurred)
callback()
@ -157,7 +160,7 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
} else {
try {
if (file.createNewFile()) {
rescanFolderMedia(file.absolutePath)
addNoMediaIntoMediaStore(file.absolutePath)
} else {
toast(R.string.unknown_error_occurred)
}
@ -168,6 +171,19 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
}
}
fun BaseSimpleActivity.addNoMediaIntoMediaStore(path: String) {
try {
val content = ContentValues().apply {
put(Files.FileColumns.TITLE, NOMEDIA)
put(Files.FileColumns.DATA, path)
put(Files.FileColumns.MEDIA_TYPE, Files.FileColumns.MEDIA_TYPE_NONE)
}
contentResolver.insert(Files.getContentUri("external"), content)
} catch (e: Exception) {
showErrorToast(e)
}
}
fun BaseSimpleActivity.removeNoMedia(path: String, callback: (() -> Unit)? = null) {
val file = File(path, NOMEDIA)
if (!getDoesFilePathExist(file.absolutePath)) {
@ -450,7 +466,7 @@ fun Activity.fixDateTaken(paths: ArrayList<String>, showToasts: Boolean, hasResc
mediaDB.updateFavoriteDateTaken(path, timestamp)
didUpdateFile = true
val dateTaken = DateTaken(null, path, path.getFilenameFromPath(), path.getParentPath(), timestamp, (System.currentTimeMillis() / 1000).toInt())
val dateTaken = DateTaken(null, path, path.getFilenameFromPath(), path.getParentPath(), timestamp, (System.currentTimeMillis() / 1000).toInt(), File(path).lastModified())
dateTakens.add(dateTaken)
if (!hasRescanned && getFileDateTaken(path) == 0L) {
pathsToRescan.add(path)

View file

@ -14,6 +14,8 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.Priority
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.extensions.*
@ -36,6 +38,8 @@ import java.util.HashSet
import java.util.LinkedHashSet
import kotlin.Comparator
import kotlin.collections.ArrayList
import kotlin.collections.HashMap
import kotlin.collections.set
val Context.audioManager get() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
@ -302,35 +306,40 @@ fun Context.updateSubfolderCounts(children: ArrayList<Directory>, parentDirs: Ar
fun Context.getNoMediaFolders(callback: (folders: ArrayList<String>) -> Unit) {
ensureBackgroundThread {
val folders = ArrayList<String>()
val uri = Files.getContentUri("external")
val projection = arrayOf(Files.FileColumns.DATA)
val selection = "${Files.FileColumns.MEDIA_TYPE} = ? AND ${Files.FileColumns.TITLE} LIKE ?"
val selectionArgs = arrayOf(Files.FileColumns.MEDIA_TYPE_NONE.toString(), "%$NOMEDIA%")
val sortOrder = "${Files.FileColumns.DATE_MODIFIED} DESC"
val OTGPath = config.OTGPath
var cursor: Cursor? = null
try {
cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
if (cursor?.moveToFirst() == true) {
do {
val path = cursor.getStringValue(Files.FileColumns.DATA) ?: continue
val noMediaFile = File(path)
if (getDoesFilePathExist(noMediaFile.absolutePath, OTGPath) && noMediaFile.name == NOMEDIA) {
folders.add("${noMediaFile.parent}/")
}
} while (cursor.moveToNext())
}
} finally {
cursor?.close()
}
callback(folders)
callback(getNoMediaFoldersSync())
}
}
fun Context.getNoMediaFoldersSync(): ArrayList<String> {
val folders = ArrayList<String>()
val uri = Files.getContentUri("external")
val projection = arrayOf(Files.FileColumns.DATA)
val selection = "${Files.FileColumns.MEDIA_TYPE} = ? AND ${Files.FileColumns.TITLE} LIKE ?"
val selectionArgs = arrayOf(Files.FileColumns.MEDIA_TYPE_NONE.toString(), "%$NOMEDIA%")
val sortOrder = "${Files.FileColumns.DATE_MODIFIED} DESC"
val OTGPath = config.OTGPath
var cursor: Cursor? = null
try {
cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
if (cursor?.moveToFirst() == true) {
do {
val path = cursor.getStringValue(Files.FileColumns.DATA) ?: continue
val noMediaFile = File(path)
if (getDoesFilePathExist(noMediaFile.absolutePath, OTGPath) && noMediaFile.name == NOMEDIA) {
folders.add(noMediaFile.parent)
}
} while (cursor.moveToNext())
}
} catch (ignored: Exception) {
} finally {
cursor?.close()
}
return folders
}
fun Context.rescanFolderMedia(path: String) {
ensureBackgroundThread {
rescanFolderMediaSync(path)
@ -368,9 +377,9 @@ fun Context.storeDirectoryItems(items: ArrayList<Directory>) {
}
}
fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: MutableSet<String>): String {
fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: MutableSet<String>, noMediaFolders: ArrayList<String>): String {
val dirName = getFolderNameFromPath(path)
return if (path.doesThisOrParentHaveNoMedia() && !path.isThisOrParentIncluded(includedFolders)) {
return if (path.doesThisOrParentHaveNoMedia(noMediaFolders) && !path.isThisOrParentIncluded(includedFolders)) {
"$dirName $hidden"
} else {
dirName
@ -389,17 +398,17 @@ fun Context.getFolderNameFromPath(path: String): String {
}
fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean,
skipMemoryCacheAtPaths: ArrayList<String>? = null) {
roundCorners: Int, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
target.isHorizontalScrolling = horizontalScroll
if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS || type == TYPE_PORTRAITS) {
if (type == TYPE_IMAGES && path.isPng()) {
loadPng(path, target, cropThumbnails, skipMemoryCacheAtPaths)
loadPng(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
} else {
loadJpg(path, target, cropThumbnails, skipMemoryCacheAtPaths)
loadJpg(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
}
} else if (type == TYPE_GIFS) {
if (!animateGifs) {
loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths)
loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
return
}
@ -410,12 +419,12 @@ fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizo
target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER
} catch (e: Exception) {
loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths)
loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
} catch (e: OutOfMemoryError) {
loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths)
loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
}
} else if (type == TYPE_SVGS) {
loadSVG(path, target, cropThumbnails)
loadSVG(path, target, cropThumbnails, roundCorners)
}
}
@ -440,7 +449,7 @@ fun Context.getPathLocation(path: String): Int {
}
}
fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
val options = RequestOptions()
.signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
@ -448,57 +457,83 @@ fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boo
.priority(Priority.LOW)
.format(DecodeFormat.PREFER_ARGB_8888)
val builder = Glide.with(applicationContext)
if (cropThumbnails) options.centerCrop() else options.fitCenter()
var builder = Glide.with(applicationContext)
.asBitmap()
.load(path)
.apply(options)
if (cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options).into(target)
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
builder.into(target)
}
fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
val options = RequestOptions()
.signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
.priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
val builder = Glide.with(applicationContext)
if (cropThumbnails) options.centerCrop() else options.fitCenter()
var builder = Glide.with(applicationContext)
.load(path)
if (cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options)
.apply(options)
.transition(DrawableTransitionOptions.withCrossFade())
.into(target)
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
builder.into(target)
}
fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
val options = RequestOptions()
.signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
.priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
val builder = Glide.with(applicationContext)
if (cropThumbnails) options.centerCrop() else options.fitCenter()
var builder = Glide.with(applicationContext)
.asBitmap() // make sure the GIF wont animate
.load(path)
.apply(options)
if (cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options)
.into(target)
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
builder.into(target)
}
fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean) {
fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int) {
target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER
val options = RequestOptions().signature(path.getFileSignature())
Glide.with(applicationContext)
var builder = Glide.with(applicationContext)
.`as`(PictureDrawable::class.java)
.listener(SvgSoftwareLayerSetter())
.load(path)
.apply(options)
.transition(DrawableTransitionOptions.withCrossFade())
.into(target)
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
builder.into(target)
}
fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, callback: (ArrayList<Directory>) -> Unit) {
@ -516,7 +551,14 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
val shouldShowHidden = config.shouldShowHidden || forceShowHidden
val excludedPaths = config.excludedFolders
val includedPaths = config.includedFolders
var filteredDirectories = directories.filter { it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, this) } as ArrayList<Directory>
val noMediaFolders = getNoMediaFoldersSync()
val folderNoMediaStatuses = HashMap<String, Boolean>()
var filteredDirectories = directories.filter {
it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNoMediaStatuses, noMediaFolders) { path, hasNoMedia ->
folderNoMediaStatuses[path] = hasNoMedia
}
} as ArrayList<Directory>
val filterMedia = config.filterMedia
filteredDirectories = (when {
@ -534,7 +576,7 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
val hiddenString = resources.getString(R.string.hidden)
filteredDirectories.forEach {
it.name = if (it.path.doesThisOrParentHaveNoMedia() && !it.path.isThisOrParentIncluded(includedPaths)) {
it.name = if (it.path.doesThisOrParentHaveNoMedia(noMediaFolders) && !it.path.isThisOrParentIncluded(includedPaths)) {
"${it.name.removeSuffix(hiddenString).trim()} $hiddenString"
} else {
it.name.removeSuffix(hiddenString).trim()
@ -800,7 +842,7 @@ fun Context.addPathToDB(path: String) {
}
fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList<Medium>, albumCovers: ArrayList<AlbumCover>, hiddenString: String,
includedFolders: MutableSet<String>, getProperFileSize: Boolean): Directory {
includedFolders: MutableSet<String>, getProperFileSize: Boolean, noMediaFolders: ArrayList<String>): Directory {
val OTGPath = config.OTGPath
val grouped = MediaFetcher(this).groupMedia(curMedia, path)
var thumbnail: String? = null
@ -824,7 +866,7 @@ fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList<Medium>,
val defaultMedium = Medium(0, "", "", "", 0L, 0L, 0L, 0, 0, false, 0L)
val firstItem = curMedia.firstOrNull() ?: defaultMedium
val lastItem = curMedia.lastOrNull() ?: defaultMedium
val dirName = checkAppendingHidden(path, hiddenString, includedFolders)
val dirName = checkAppendingHidden(path, hiddenString, includedFolders, noMediaFolders)
val lastModified = if (isSortingAscending) Math.min(firstItem.modified, lastItem.modified) else Math.max(firstItem.modified, lastItem.modified)
val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)
val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L
@ -866,6 +908,7 @@ fun Context.updateDirectoryPath(path: String) {
val hiddenString = getString(R.string.hidden)
val albumCovers = config.parseAlbumCovers()
val includedFolders = config.includedFolders
val noMediaFolders = getNoMediaFoldersSync()
val sorting = config.getFolderSorting(path)
val grouping = config.getFolderGrouping(path)
@ -880,9 +923,13 @@ fun Context.updateDirectoryPath(path: String) {
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
val lastModifieds = if (isRPlus() && getProperLastModified) mediaFetcher.getFolderLastModifieds(path) else HashMap()
val dateTakens = mediaFetcher.getFolderDateTakens(path)
val favoritePaths = getFavoritePaths()
val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize,
favoritePaths, false, lastModifieds, dateTakens)
val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
updateDBDirectory(directory)
}

View file

@ -0,0 +1,57 @@
package com.simplemobiletools.gallery.pro.extensions
import android.media.ExifInterface
import java.lang.reflect.Field
import java.lang.reflect.Modifier
fun ExifInterface.copyNonDimensionAttributesTo(destination: ExifInterface) {
val attributes = ExifInterfaceAttributes.AllNonDimensionAttributes
attributes.forEach {
val value = getAttribute(it)
if (value != null) {
destination.setAttribute(it, value)
}
}
try {
destination.saveAttributes()
} catch (ignored: Exception) {
}
}
private class ExifInterfaceAttributes {
companion object {
val AllNonDimensionAttributes = getAllNonDimensionExifAttributes()
private fun getAllNonDimensionExifAttributes(): List<String> {
val tagFields = ExifInterface::class.java.fields.filter { field -> isExif(field) }
val excludeAttributes = arrayListOf(
ExifInterface.TAG_IMAGE_LENGTH,
ExifInterface.TAG_IMAGE_WIDTH,
ExifInterface.TAG_PIXEL_X_DIMENSION,
ExifInterface.TAG_PIXEL_Y_DIMENSION,
ExifInterface.TAG_THUMBNAIL_IMAGE_LENGTH,
ExifInterface.TAG_THUMBNAIL_IMAGE_WIDTH,
ExifInterface.TAG_ORIENTATION)
return tagFields
.map { tagField -> tagField.get(null) as String }
.filter { x -> !excludeAttributes.contains(x) }
.distinct()
}
private fun isExif(field: Field): Boolean {
return field.type == String::class.java &&
isPublicStaticFinal(field.modifiers) &&
field.name.startsWith("TAG_")
}
private const val publicStaticFinal = Modifier.PUBLIC or Modifier.STATIC or Modifier.FINAL
private fun isPublicStaticFinal(modifiers: Int): Boolean {
return modifiers and publicStaticFinal > 0
}
}
}

View file

@ -1,9 +1,7 @@
package com.simplemobiletools.gallery.pro.extensions
import android.content.Context
import android.os.Environment
import com.simplemobiletools.commons.extensions.containsNoMedia
import com.simplemobiletools.commons.extensions.doesParentHaveNoMedia
import com.simplemobiletools.commons.helpers.NOMEDIA
import java.io.File
import java.io.IOException
@ -11,13 +9,17 @@ fun String.isThisOrParentIncluded(includedPaths: MutableSet<String>) = includedP
fun String.isThisOrParentExcluded(excludedPaths: MutableSet<String>) = excludedPaths.any { equals(it, true) } || excludedPaths.any { "$this/".startsWith("$it/", true) }
fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean, context: Context): Boolean {
// cache which folders contain .nomedia files to avoid checking them over and over again
fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean,
folderNoMediaStatuses: HashMap<String, Boolean>, noMediaFolders: ArrayList<String> = ArrayList(),
callback: (path: String, hasNoMedia: Boolean) -> Unit): Boolean {
if (isEmpty()) {
return false
}
val file = File(this)
if (file.name.startsWith("img_", true)) {
val filename = file.name
if (filename.startsWith("img_", true) && file.isDirectory) {
val files = file.list()
if (files != null) {
if (files.any { it.contains("burst", true) }) {
@ -26,7 +28,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPath
}
}
if (!showHidden && file.isHidden) {
if (!showHidden && filename.startsWith('.')) {
return false
} else if (includedPaths.contains(this)) {
return true
@ -35,7 +37,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPath
val containsNoMedia = if (showHidden) {
false
} else {
file.containsNoMedia()
noMediaFolders.contains(this) || File(this, NOMEDIA).exists()
}
return if (!showHidden && containsNoMedia) {
@ -46,10 +48,27 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPath
true
} else if (isThisOrParentExcluded(excludedPaths)) {
false
} else if (!showHidden && file.isDirectory && file.canonicalFile == file.absoluteFile) {
} else if (!showHidden) {
var containsNoMediaOrDot = containsNoMedia || contains("/.")
if (!containsNoMediaOrDot) {
containsNoMediaOrDot = file.doesParentHaveNoMedia()
var curPath = this
for (i in 0 until count { it == '/' } - 1) {
curPath = curPath.substringBeforeLast('/')
val pathToCheck = "$curPath/${NOMEDIA}"
if (folderNoMediaStatuses.contains(pathToCheck)) {
if (folderNoMediaStatuses[pathToCheck] == true) {
containsNoMediaOrDot = true
break
}
} else {
val noMediaExists = noMediaFolders.contains(pathToCheck) || File(pathToCheck).exists()
callback(pathToCheck, noMediaExists)
if (noMediaExists) {
containsNoMediaOrDot = true
break
}
}
}
}
!containsNoMediaOrDot
} else {

View file

@ -36,6 +36,7 @@ import com.davemorrissey.labs.subscaleview.DecoderFactory
import com.davemorrissey.labs.subscaleview.ImageDecoder
import com.davemorrissey.labs.subscaleview.ImageRegionDecoder
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.github.penfeizhou.animation.webp.WebPDrawable
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
@ -43,7 +44,9 @@ import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.PanoramaPhotoActivity
import com.simplemobiletools.gallery.pro.activities.PhotoActivity
import com.simplemobiletools.gallery.pro.adapters.PortraitPhotosAdapter
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.saveRotatedImageToFile
import com.simplemobiletools.gallery.pro.extensions.sendFakeClick
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.svg.SvgSoftwareLayerSetter
@ -66,8 +69,8 @@ class PhotoFragment : ViewPagerFragment() {
// devices with good displays, but the rest of the hardware not good enough for them
private val WEIRD_DEVICES = arrayListOf(
"motorola xt1685",
"google nexus 5x"
"motorola xt1685",
"google nexus 5x"
)
var mCurrentRotationDegrees = 0
@ -286,7 +289,7 @@ class PhotoFragment : ViewPagerFragment() {
super.setMenuVisibility(menuVisible)
mIsFragmentVisible = menuVisible
if (mWasInit) {
if (!mMedium.isGIF()) {
if (!mMedium.isGIF() && !mMedium.isWebP()) {
photoFragmentVisibilityChanged(menuVisible)
}
}
@ -379,49 +382,64 @@ class PhotoFragment : ViewPagerFragment() {
private fun loadSVG() {
Glide.with(context!!)
.`as`(PictureDrawable::class.java)
.listener(SvgSoftwareLayerSetter())
.load(mMedium.path)
.into(mView.gestures_view)
.`as`(PictureDrawable::class.java)
.listener(SvgSoftwareLayerSetter())
.load(mMedium.path)
.into(mView.gestures_view)
}
private fun loadBitmap(addZoomableView: Boolean = true) {
if (context == null) {
return
}
val path = getFilePathToShow()
if (path.isWebP()) {
val drawable = WebPDrawable.fromFile(path)
if (drawable.intrinsicWidth == 0) {
loadWithGlide(path, addZoomableView)
} else {
drawable.setLoopLimit(0)
mView.gestures_view.setImageDrawable(drawable)
}
} else {
loadWithGlide(path, addZoomableView)
}
}
private fun loadWithGlide(path: String, addZoomableView: Boolean) {
val priority = if (mIsFragmentVisible) Priority.IMMEDIATE else Priority.NORMAL
val options = RequestOptions()
.signature(getFilePathToShow().getFileSignature())
.format(DecodeFormat.PREFER_ARGB_8888)
.priority(priority)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.fitCenter()
.signature(getFilePathToShow().getFileSignature())
.format(DecodeFormat.PREFER_ARGB_8888)
.priority(priority)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.fitCenter()
if (mCurrentRotationDegrees != 0) {
options.transform(Rotate(mCurrentRotationDegrees))
options.diskCacheStrategy(DiskCacheStrategy.NONE)
}
if (context == null) {
return
}
Glide.with(context!!)
.load(getFilePathToShow())
.apply(options)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
if (activity != null && !activity!!.isDestroyed && !activity!!.isFinishing) {
tryLoadingWithPicasso(addZoomableView)
}
return false
.load(path)
.apply(options)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
if (activity != null && !activity!!.isDestroyed && !activity!!.isFinishing) {
tryLoadingWithPicasso(addZoomableView)
}
return false
}
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
mView.gestures_view.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || context?.config?.allowZoomingImages == false
if (mIsFragmentVisible && addZoomableView) {
scheduleZoomableView()
}
return false
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
mView.gestures_view.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || context?.config?.allowZoomingImages == false
if (mIsFragmentVisible && addZoomableView) {
scheduleZoomableView()
}
}).into(mView.gestures_view)
return false
}
}).into(mView.gestures_view)
}
private fun tryLoadingWithPicasso(addZoomableView: Boolean) {
@ -430,10 +448,10 @@ class PhotoFragment : ViewPagerFragment() {
try {
val picasso = Picasso.get()
.load(pathToLoad)
.centerInside()
.stableKey(mMedium.path.getFileKey())
.resize(mScreenWidth, mScreenHeight)
.load(pathToLoad)
.centerInside()
.stableKey(mMedium.path.getFileKey())
.resize(mScreenWidth, mScreenHeight)
if (mCurrentRotationDegrees != 0) {
picasso.rotate(mCurrentRotationDegrees.toFloat())
@ -599,7 +617,7 @@ class PhotoFragment : ViewPagerFragment() {
val minTileDpi = if (showHighestQuality) -1 else getMinTileDpi()
val bitmapDecoder = object : DecoderFactory<ImageDecoder> {
override fun make() = MyGlideImageDecoder(rotation)
override fun make() = MyGlideImageDecoder(rotation, mMedium.getSignature())
}
val regionDecoder = object : DecoderFactory<ImageRegionDecoder> {
@ -670,7 +688,8 @@ class PhotoFragment : ViewPagerFragment() {
val imageParser = JpegImageParser().getXmpXml(ByteSourceInputStream(inputStream, mMedium.name), HashMap<String, Any>())
imageParser.contains("GPano:UsePanoramaViewer=\"True\"", true) ||
imageParser.contains("<GPano:UsePanoramaViewer>True</GPano:UsePanoramaViewer>", true) ||
imageParser.contains("GPano:FullPanoWidthPixels=")
imageParser.contains("GPano:FullPanoWidthPixels=") ||
imageParser.contains("GPano:ProjectionType>Equirectangular")
} catch (e: Exception) {
false
} catch (e: OutOfMemoryError) {

View file

@ -8,6 +8,7 @@ import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.helpers.BaseConfig
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.models.AlbumCover
import java.util.*
@ -405,8 +406,10 @@ class Config(context: Context) : BaseConfig(context) {
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath,
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath,
"${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath}/Screenshots",
"internalStoragePath/WhatsApp/Media/WhatsApp Images",
"internalStoragePath/WhatsApp/Media/WhatsApp Video"
"$internalStoragePath/WhatsApp/Media/WhatsApp Images",
"$internalStoragePath/WhatsApp/Media/WhatsApp Images/Sent",
"$internalStoragePath/WhatsApp/Media/WhatsApp Video",
"$internalStoragePath/WhatsApp/Media/WhatsApp Video/Sent",
)
var showRecycleBinAtFolders: Boolean

View file

@ -1,7 +1,7 @@
package com.simplemobiletools.gallery.pro.helpers
import com.simplemobiletools.commons.helpers.MONTH_SECONDS
import com.simplemobiletools.commons.helpers.isPiePlus
import com.simplemobiletools.commons.helpers.isQPlus
// shared preferences
const val DIRECTORY_SORT_ORDER = "directory_sort_order"
@ -102,7 +102,6 @@ const val SLIDESHOW_ANIMATION_NONE = 0
const val SLIDESHOW_ANIMATION_SLIDE = 1
const val SLIDESHOW_ANIMATION_FADE = 2
const val FAVORITES = "favorites"
const val RECYCLE_BIN = "recycle_bin"
const val SHOW_FAVORITES = "show_favorites"
const val SHOW_RECYCLE_BIN = "show_recycle_bin"
@ -145,10 +144,6 @@ const val PRIORITY_SPEED = 0
const val PRIORITY_COMPROMISE = 1
const val PRIORITY_VALIDITY = 2
// view types
const val VIEW_TYPE_GRID = 1
const val VIEW_TYPE_LIST = 2
// extended details values
const val EXT_NAME = 1
const val EXT_PATH = 2
@ -225,3 +220,7 @@ const val LOW_TILE_DPI = 160
const val NORMAL_TILE_DPI = 220
const val WEIRD_TILE_DPI = 240
const val HIGH_TILE_DPI = 280
const val ROUNDED_CORNERS_NONE = 1
const val ROUNDED_CORNERS_SMALL = 2
const val ROUNDED_CORNERS_BIG = 3

View file

@ -22,7 +22,8 @@ class MediaFetcher(val context: Context) {
var shouldStop = false
fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean,
getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean): ArrayList<Medium> {
getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean,
lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long>): ArrayList<Medium> {
val filterMedia = context.config.filterMedia
if (filterMedia == 0) {
return ArrayList()
@ -35,7 +36,8 @@ class MediaFetcher(val context: Context) {
curMedia.addAll(newMedia)
}
} else {
val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperLastModified, getProperFileSize,
favoritePaths, getVideoDurations, lastModifieds, dateTakens)
curMedia.addAll(newMedia)
}
@ -66,7 +68,26 @@ class MediaFetcher(val context: Context) {
val shouldShowHidden = config.shouldShowHidden
val excludedPaths = config.excludedFolders
val includedPaths = config.includedFolders
folders.filter { it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, context) }.toMutableList() as ArrayList<String>
val folderNomediaStatuses = HashMap<String, Boolean>()
val distinctPathsMap = HashMap<String, String>()
val distinctPaths = folders.distinctBy {
when {
distinctPathsMap.containsKey(it) -> distinctPathsMap[it]
else -> {
val distinct = it.getDistinctPath()
distinctPathsMap[it.getParentPath()] = distinct.getParentPath()
distinct
}
}
}
val noMediaFolders = context.getNoMediaFoldersSync()
distinctPaths.filter {
it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNomediaStatuses, noMediaFolders) { path, hasNoMedia ->
folderNomediaStatuses[path] = hasNoMedia
}
}.toMutableList() as ArrayList<String>
} catch (e: Exception) {
ArrayList()
}
@ -190,10 +211,7 @@ class MediaFetcher(val context: Context) {
addFolder(foldersToScan, it)
}
val showHidden = config.shouldShowHidden
val excludedFolders = config.excludedFolders
return foldersToScan.distinctBy { it.getDistinctPath() }
.filter { it.shouldFolderBeVisible(excludedFolders, includedFolders, showHidden, context) }.toMutableSet() as LinkedHashSet<String>
return foldersToScan.toMutableSet() as LinkedHashSet<String>
}
private fun addFolder(curFolders: HashSet<String>, folder: String) {
@ -207,7 +225,8 @@ class MediaFetcher(val context: Context) {
}
private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean,
getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean): ArrayList<Medium> {
getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>,
getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long>): ArrayList<Medium> {
val media = ArrayList<Medium>()
val isRecycleBin = folder == RECYCLE_BIN
val deletedMedia = if (isRecycleBin) {
@ -221,7 +240,7 @@ class MediaFetcher(val context: Context) {
val checkFileExistence = config.fileLoadingPriority == PRIORITY_VALIDITY
val showHidden = config.shouldShowHidden
val showPortraits = filterMedia and TYPE_PORTRAITS != 0
val dateTakens = if (getProperDateTaken && !isRecycleBin) getFolderDateTakens(folder) else HashMap()
val fileSizes = if (checkProperFileSize || checkFileExistence) getFolderSizes(folder) else HashMap()
val files = when (folder) {
FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toMutableList() as ArrayList<File>
@ -278,7 +297,15 @@ class MediaFetcher(val context: Context) {
if (!showHidden && filename.startsWith('.'))
continue
val size = if (checkProperFileSize || checkFileExistence) file.length() else 1L
var size = 0L
if (checkProperFileSize || checkFileExistence) {
var newSize = fileSizes.remove(path)
if (newSize == null) {
newSize = file.length()
}
size = newSize
}
if ((checkProperFileSize || checkFileExistence) && size <= 0L) {
continue
}
@ -292,7 +319,19 @@ class MediaFetcher(val context: Context) {
media.add(this)
}
} else {
val lastModified = if (getProperLastModified) file.lastModified() else 0L
var lastModified = 0L
if (getProperLastModified) {
if (isRPlus()) {
var newLastModified = lastModifieds.remove(path)
if (newLastModified == null) {
newLastModified = file.lastModified()
}
lastModified = newLastModified
} else {
lastModified = file.lastModified()
}
}
var dateTaken = lastModified
val videoDuration = if (getVideoDurations && isVideo) context.getDuration(path) ?: 0 else 0
@ -392,7 +431,7 @@ class MediaFetcher(val context: Context) {
return media
}
private fun getFolderDateTakens(folder: String): HashMap<String, Long> {
fun getFolderDateTakens(folder: String): HashMap<String, Long> {
val dateTakens = HashMap<String, Long>()
if (folder != FAVORITES) {
val projection = arrayOf(
@ -404,19 +443,14 @@ class MediaFetcher(val context: Context) {
val selection = "${Images.Media.DATA} LIKE ? AND ${Images.Media.DATA} NOT LIKE ?"
val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
cursor?.use {
if (cursor.moveToFirst()) {
do {
try {
val dateTaken = cursor.getLongValue(Images.Media.DATE_TAKEN)
if (dateTaken != 0L) {
val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
dateTakens["$folder/$name"] = dateTaken
}
} catch (e: Exception) {
}
} while (cursor.moveToNext())
context.queryCursor(uri, projection, selection, selectionArgs) { cursor ->
try {
val dateTaken = cursor.getLongValue(Images.Media.DATE_TAKEN)
if (dateTaken != 0L) {
val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
dateTakens["$folder/$name"] = dateTaken
}
} catch (e: Exception) {
}
}
}
@ -434,6 +468,118 @@ class MediaFetcher(val context: Context) {
return dateTakens
}
fun getDateTakens(): HashMap<String, Long> {
val dateTakens = HashMap<String, Long>()
val projection = arrayOf(
Images.Media.DATA,
Images.Media.DATE_TAKEN
)
val uri = Files.getContentUri("external")
try {
context.queryCursor(uri, projection) { cursor ->
try {
val dateTaken = cursor.getLongValue(Images.Media.DATE_TAKEN)
if (dateTaken != 0L) {
val path = cursor.getStringValue(Images.Media.DATA)
dateTakens[path] = dateTaken
}
} catch (e: Exception) {
}
}
val dateTakenValues = context.dateTakensDB.getAllDateTakens()
dateTakenValues.forEach {
dateTakens[it.fullPath] = it.taken
}
} catch (e: Exception) {
}
return dateTakens
}
fun getFolderLastModifieds(folder: String): HashMap<String, Long> {
val lastModifieds = HashMap<String, Long>()
if (folder != FAVORITES) {
val projection = arrayOf(
Images.Media.DISPLAY_NAME,
Images.Media.DATE_MODIFIED
)
val uri = Files.getContentUri("external")
val selection = "${Images.Media.DATA} LIKE ? AND ${Images.Media.DATA} NOT LIKE ?"
val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
context.queryCursor(uri, projection, selection, selectionArgs) { cursor ->
try {
val lastModified = cursor.getLongValue(Images.Media.DATE_MODIFIED) * 1000
if (lastModified != 0L) {
val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
lastModifieds["$folder/$name"] = lastModified
}
} catch (e: Exception) {
}
}
}
return lastModifieds
}
fun getLastModifieds(): HashMap<String, Long> {
val lastModifieds = HashMap<String, Long>()
val projection = arrayOf(
Images.Media.DATA,
Images.Media.DATE_MODIFIED
)
val uri = Files.getContentUri("external")
try {
context.queryCursor(uri, projection) { cursor ->
try {
val lastModified = cursor.getLongValue(Images.Media.DATE_MODIFIED) * 1000
if (lastModified != 0L) {
val path = cursor.getStringValue(Images.Media.DATA)
lastModifieds[path] = lastModified
}
} catch (e: Exception) {
}
}
} catch (e: Exception) {
}
return lastModifieds
}
private fun getFolderSizes(folder: String): HashMap<String, Long> {
val sizes = HashMap<String, Long>()
if (folder != FAVORITES) {
val projection = arrayOf(
Images.Media.DISPLAY_NAME,
Images.Media.SIZE
)
val uri = Files.getContentUri("external")
val selection = "${Images.Media.DATA} LIKE ? AND ${Images.Media.DATA} NOT LIKE ?"
val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
context.queryCursor(uri, projection, selection, selectionArgs) { cursor ->
try {
val size = cursor.getLongValue(Images.Media.SIZE)
if (size != 0L) {
val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
sizes["$folder/$name"] = size
}
} catch (e: Exception) {
}
}
}
return sizes
}
fun sortMedia(media: ArrayList<Medium>, sorting: Int) {
if (sorting and SORT_BY_RANDOM != 0) {
media.shuffle()

View file

@ -5,25 +5,25 @@ import android.graphics.Bitmap
import android.net.Uri
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.signature.ObjectKey
import com.davemorrissey.labs.subscaleview.ImageDecoder
class MyGlideImageDecoder(val degrees: Int) : ImageDecoder {
class MyGlideImageDecoder(val degrees: Int, val signature: ObjectKey) : ImageDecoder {
override fun decode(context: Context, uri: Uri): Bitmap {
val options = RequestOptions()
.format(DecodeFormat.PREFER_ARGB_8888)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.fitCenter()
.format(DecodeFormat.PREFER_ARGB_8888)
.signature(signature)
.fitCenter()
val builder = Glide.with(context)
.asBitmap()
.load(uri)
.apply(options)
.transform(RotateTransformation(-degrees))
.into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.asBitmap()
.load(uri.toString().substringAfter("file://"))
.apply(options)
.transform(RotateTransformation(-degrees))
.into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
return builder.get()
}

View file

@ -11,9 +11,9 @@ interface DateTakensDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(dateTakens: List<DateTaken>)
@Query("SELECT full_path, filename, parent_path, date_taken, last_fixed FROM date_takens WHERE parent_path = :path COLLATE NOCASE")
@Query("SELECT full_path, filename, parent_path, date_taken, last_fixed, last_modified FROM date_takens WHERE parent_path = :path COLLATE NOCASE")
fun getDateTakensFromPath(path: String): List<DateTaken>
@Query("SELECT full_path, filename, parent_path, date_taken, last_fixed FROM date_takens")
@Query("SELECT full_path, filename, parent_path, date_taken, last_fixed, last_modified FROM date_takens")
fun getAllDateTakens(): List<DateTaken>
}

View file

@ -9,9 +9,10 @@ import androidx.room.PrimaryKey
// It is used at sorting files by date taken, checking EXIF file by file would be way too slow
@Entity(tableName = "date_takens", indices = [Index(value = ["full_path"], unique = true)])
data class DateTaken(
@PrimaryKey(autoGenerate = true) var id: Int?,
@ColumnInfo(name = "full_path") var fullPath: String,
@ColumnInfo(name = "filename") var filename: String,
@ColumnInfo(name = "parent_path") var parentPath: String,
@ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "last_fixed") var lastFixed: Int)
@PrimaryKey(autoGenerate = true) var id: Int?,
@ColumnInfo(name = "full_path") var fullPath: String,
@ColumnInfo(name = "filename") var filename: String,
@ColumnInfo(name = "parent_path") var parentPath: String,
@ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "last_fixed") var lastFixed: Int,
@ColumnInfo(name = "last_modified") var lastModified: Long)

View file

@ -4,11 +4,7 @@ import android.content.Context
import androidx.room.*
import com.simplemobiletools.commons.extensions.formatDate
import com.simplemobiletools.commons.extensions.formatSize
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_BY_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_PATH
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import com.simplemobiletools.gallery.pro.helpers.FAVORITES
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.pro.helpers.RECYCLE_BIN
@Entity(tableName = "directories", indices = [Index(value = ["path"], unique = true)])

View file

@ -5,9 +5,11 @@ import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.Index
import androidx.room.PrimaryKey
import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.extensions.formatDate
import com.simplemobiletools.commons.extensions.formatSize
import com.simplemobiletools.commons.extensions.getFilenameExtension
import com.simplemobiletools.commons.extensions.isWebP
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_BY_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_PATH
@ -18,22 +20,24 @@ import java.util.*
@Entity(tableName = "media", indices = [(Index(value = ["full_path"], unique = true))])
data class Medium(
@PrimaryKey(autoGenerate = true) var id: Long?,
@ColumnInfo(name = "filename") var name: String,
@ColumnInfo(name = "full_path") var path: String,
@ColumnInfo(name = "parent_path") var parentPath: String,
@ColumnInfo(name = "last_modified") val modified: Long,
@ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "size") val size: Long,
@ColumnInfo(name = "type") val type: Int,
@ColumnInfo(name = "video_duration") val videoDuration: Int,
@ColumnInfo(name = "is_favorite") var isFavorite: Boolean,
@ColumnInfo(name = "deleted_ts") var deletedTS: Long) : Serializable, ThumbnailItem() {
@PrimaryKey(autoGenerate = true) var id: Long?,
@ColumnInfo(name = "filename") var name: String,
@ColumnInfo(name = "full_path") var path: String,
@ColumnInfo(name = "parent_path") var parentPath: String,
@ColumnInfo(name = "last_modified") val modified: Long,
@ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "size") val size: Long,
@ColumnInfo(name = "type") val type: Int,
@ColumnInfo(name = "video_duration") val videoDuration: Int,
@ColumnInfo(name = "is_favorite") var isFavorite: Boolean,
@ColumnInfo(name = "deleted_ts") var deletedTS: Long) : Serializable, ThumbnailItem() {
companion object {
private const val serialVersionUID = -6553149366975655L
}
fun isWebP() = name.isWebP()
fun isGIF() = type == TYPE_GIFS
fun isImage() = type == TYPE_IMAGES
@ -86,4 +90,6 @@ data class Medium(
return calendar.timeInMillis.toString()
}
fun getSignature() = ObjectKey("$path-$modified-$size")
}

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/small_margin" />
<solid android:color="@color/gradient_grey_start" />
</shape>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/directories_refresh_layout"
android:layout_width="match_parent"
@ -19,22 +18,22 @@
android:gravity="center"
android:padding="@dimen/activity_margin"
android:text="@string/switch_to_file_search"
android:visibility="gone"/>
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/directories_empty_placeholder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/directories_switch_searching"
android:gravity="center_horizontal"
android:alpha="0.8"
android:textStyle="italic"
android:gravity="center_horizontal"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:text="@string/no_media_with_filters"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/directories_empty_placeholder_2"
@ -46,7 +45,7 @@
android:padding="@dimen/activity_margin"
android:text="@string/change_filters_underlined"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/directories_grid"
@ -55,7 +54,7 @@
android:layout_below="@+id/directories_switch_searching"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager"
app:spanCount="@integer/directory_columns_vertical_scroll"/>
app:spanCount="@integer/directory_columns_vertical_scroll" />
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/directories_vertical_fastscroller"
@ -66,7 +65,7 @@
android:paddingStart="@dimen/normal_margin"
android:visibility="gone">
<include layout="@layout/fastscroller_handle_vertical"/>
<include layout="@layout/fastscroller_handle_vertical" />
</com.simplemobiletools.commons.views.FastScroller>
@ -79,7 +78,7 @@
android:paddingTop="@dimen/normal_margin"
android:visibility="gone">
<include layout="@layout/fastscroller_handle_horizontal"/>
<include layout="@layout/fastscroller_handle_horizontal" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>

View file

@ -468,29 +468,6 @@
android:textAllCaps="true"
android:textSize="@dimen/smaller_text_size" />
<RelativeLayout
android:id="@+id/settings_show_info_bubble_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_info_bubble"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_info_bubble"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_scroll_horizontally_holder"
android:layout_width="match_parent"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dir_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -11,7 +10,7 @@
<com.simplemobiletools.gallery.pro.views.MySquareImageView
android:id="@+id/dir_thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent" />
<ImageView
android:id="@+id/dir_lock"
@ -26,7 +25,7 @@
android:contentDescription="@string/lock_folder"
android:padding="@dimen/lock_padding"
android:src="@drawable/ic_lock_vector"
android:visibility="gone"/>
android:visibility="gone" />
<ImageView
android:id="@+id/dir_check"
@ -40,7 +39,7 @@
android:contentDescription="@null"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_check_vector"
android:visibility="gone"/>
android:visibility="gone" />
<ImageView
android:id="@+id/dir_pin"
@ -53,7 +52,7 @@
android:contentDescription="@string/pin"
android:padding="@dimen/small_margin"
android:src="@drawable/ic_pin"
android:visibility="gone"/>
android:visibility="gone" />
<ImageView
android:id="@+id/dir_shadow_holder"
@ -63,7 +62,7 @@
android:layout_alignEnd="@+id/dir_bottom_holder"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient_background"
android:contentDescription="@null"/>
android:contentDescription="@null" />
<LinearLayout
android:id="@+id/dir_bottom_holder"
@ -89,14 +88,14 @@
android:shadowColor="@color/default_background_color"
android:shadowRadius="4"
android:textColor="@android:color/white"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<TextView
android:id="@+id/photo_cnt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
</LinearLayout>
@ -111,6 +110,6 @@
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_sd_card_vector"
android:visibility="gone"/>
android:visibility="gone" />
</RelativeLayout>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/photo_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -9,7 +9,7 @@
<com.alexvasilkov.gestures.GestureImageView
android:id="@+id/gestures_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent" />
<com.alexvasilkov.gestures.GestureFrameLayout
android:id="@+id/gif_view_frame"
@ -22,7 +22,7 @@
android:id="@+id/gif_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter"/>
android:scaleType="fitCenter" />
</com.alexvasilkov.gestures.GestureFrameLayout>
@ -30,17 +30,17 @@
android:id="@+id/subsampling_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
android:visibility="gone" />
<ImageView
android:id="@+id/panorama_outline"
android:layout_width="@dimen/play_outline_size_big"
android:layout_height="@dimen/play_outline_size_big"
android:layout_centerInParent="true"
android:padding="20dp"
android:contentDescription="@null"
android:padding="20dp"
android:src="@drawable/ic_panorama_outline"
android:visibility="gone"/>
android:visibility="gone" />
<TextView
android:id="@+id/photo_details"
@ -49,18 +49,18 @@
android:layout_alignParentStart="true"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginRight="@dimen/small_margin"
android:background="@color/gradient_grey_start"
android:background="@drawable/extended_details_background"
android:padding="@dimen/small_margin"
android:textColor="@color/theme_dark_text_color"
android:textSize="@dimen/smaller_text_size"
android:visibility="gone"
tools:text="My image\nAnother line"/>
tools:text="My image\nAnother line" />
<com.simplemobiletools.gallery.pro.views.MediaSideScroll
android:id="@+id/photo_brightness_controller"
android:layout_width="@dimen/media_side_slider_width"
android:layout_height="match_parent"
android:layout_alignParentStart="true"/>
android:layout_alignParentStart="true" />
<TextView
android:id="@+id/slide_info"
@ -77,7 +77,7 @@
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:textColor="@android:color/white"
android:textSize="@dimen/extra_big_text_size"/>
android:textSize="@dimen/extra_big_text_size" />
<RelativeLayout
android:id="@+id/photo_portrait_stripe_wrapper"
@ -99,12 +99,12 @@
<com.simplemobiletools.gallery.pro.views.InstantItemSwitch
android:id="@+id/instant_prev_item"
android:layout_width="1dp"
android:layout_height="match_parent"/>
android:layout_height="match_parent" />
<com.simplemobiletools.gallery.pro.views.InstantItemSwitch
android:id="@+id/instant_next_item"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"/>
android:layout_alignParentEnd="true" />
</RelativeLayout>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/video_holder"
android:layout_width="match_parent"
@ -9,7 +8,7 @@
<ImageView
android:id="@+id/video_preview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent" />
<com.alexvasilkov.gestures.GestureFrameLayout
android:id="@+id/video_surface_frame"
@ -20,7 +19,7 @@
android:id="@+id/video_surface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
android:layout_centerInParent="true" />
</com.alexvasilkov.gestures.GestureFrameLayout>
@ -28,12 +27,12 @@
android:id="@+id/video_volume_controller"
android:layout_width="@dimen/media_side_slider_width"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"/>
android:layout_alignParentEnd="true" />
<com.simplemobiletools.gallery.pro.views.MediaSideScroll
android:id="@+id/video_brightness_controller"
android:layout_width="@dimen/media_side_slider_width"
android:layout_height="match_parent"/>
android:layout_height="match_parent" />
<ImageView
android:id="@+id/video_play_outline"
@ -41,7 +40,7 @@
android:layout_height="@dimen/play_outline_size_big"
android:layout_centerInParent="true"
android:padding="20dp"
android:src="@drawable/ic_play_outline_vector"/>
android:src="@drawable/ic_play_outline_vector" />
<ImageView
android:id="@+id/panorama_outline"
@ -50,7 +49,7 @@
android:layout_centerInParent="true"
android:padding="20dp"
android:src="@drawable/ic_panorama_outline"
android:visibility="gone"/>
android:visibility="gone" />
<TextView
android:id="@+id/video_details"
@ -59,14 +58,14 @@
android:layout_alignParentStart="true"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginRight="@dimen/small_margin"
android:background="@color/gradient_grey_start"
android:background="@drawable/extended_details_background"
android:padding="@dimen/small_margin"
android:textColor="@color/theme_dark_text_color"
android:textSize="@dimen/smaller_text_size"
android:visibility="gone"
tools:text="My video\nAnother line"/>
tools:text="My video\nAnother line" />
<include layout="@layout/bottom_video_time_holder"/>
<include layout="@layout/bottom_video_time_holder" />
<TextView
android:id="@+id/slide_info"
@ -83,6 +82,6 @@
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:textColor="@android:color/white"
android:textSize="@dimen/extra_big_text_size"/>
android:textSize="@dimen/extra_big_text_size" />
</RelativeLayout>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

View file

@ -15,10 +15,6 @@
<string name="other_folder">مجلد آخر</string>
<string name="show_on_map">عرض علي الخريطة</string>
<string name="unknown_location">موقع غير معروف</string>
<string name="increase_column_count">زيادة عدد الأعمدة</string>
<string name="reduce_column_count">تقليل عدد الأعمدة</string>
<string name="change_cover_image">تغيير صورة الغلاف</string>
<string name="select_photo">تحديد صورة</string>
<string name="volume">الصوت</string>
<string name="brightness">السطوع</string>
<string name="lock_orientation">قفل الاتجاه</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">لم يتم العثور علي أي وسائط لعرض الشرائح</string>
<!-- View types -->
<string name="change_view_type">تغيير نوع العرض</string>
<string name="grid">الشبكة</string>
<string name="list">القائمة</string>
<string name="group_direct_subfolders">تجميع المجلدات الفرعية مباشرة</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">تجنب إظهار الملفات غير الصالحة</string>
<string name="show_image_file_types">إظهار أنواع ملفات الصور</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">الصور المصغرة</string>
@ -315,7 +315,7 @@
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">المعرض البسيط الـ Pro - محرر ومدير الصور</string>
<string name="app_title">المعرض البسيط (Pro) - محرر ومدير الصور</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">أستعرض ذكرياتك دون أي انقطاع مع معرض الصور والفيديو هذا</string>
<string name="app_long_description">

View file

@ -15,10 +15,6 @@
<string name="other_folder">Other folder</string>
<string name="show_on_map">Show on map</string>
<string name="unknown_location">Unknown location</string>
<string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce column count</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<string name="lock_orientation">Lock orientation</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- View types -->
<string name="change_view_type">Change view type</string>
<string name="grid">Grid</string>
<string name="list">List</string>
<string name="group_direct_subfolders">Group direct subfolders</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Thumbnails</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Un altre carpeta</string>
<string name="show_on_map">Mostrar al mapa</string>
<string name="unknown_location">Ubicació desconeguda</string>
<string name="increase_column_count">Augmentar el número de columnes</string>
<string name="reduce_column_count">Reduir el número de columnes</string>
<string name="change_cover_image">Canviar imatge de portada</string>
<string name="select_photo">Sel·leccionar imatge</string>
<string name="volume">Volum</string>
<string name="brightness">Brillantor</string>
<string name="lock_orientation">Bloquejar orientació</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">No shan trobat mitjans per a la presentació de diapositives</string>
<!-- View types -->
<string name="change_view_type">Canviar el tipus de vista</string>
<string name="grid">Reixeta</string>
<string name="list">Llista</string>
<string name="group_direct_subfolders">Agrupar carpetes directes</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Compromès</string>
<string name="avoid_showing_invalid_files">Eviteu mostrar fitxers no vàlids</string>
<string name="show_image_file_types">Mostra els tipus de fitxers d\imatges</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Permet fer zoom als vídeos amb dos cops</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatures</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Jiná složka</string>
<string name="show_on_map">Zobrazit na mapě</string>
<string name="unknown_location">Neznámá poloha</string>
<string name="increase_column_count">Zvýšit počet sloupců</string>
<string name="reduce_column_count">Snížit počet sloupců</string>
<string name="change_cover_image">Změnit obal alba</string>
<string name="select_photo">Vybrat fotografii</string>
<string name="volume">Hlasitost</string>
<string name="brightness">Jas</string>
<string name="lock_orientation">Uzamknout orientaci</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Nebyla nalezena žádná média pro prezentaci</string>
<!-- View types -->
<string name="change_view_type">Změnit typ zobrazení</string>
<string name="grid">Mřížka</string>
<string name="list">Seznam</string>
<string name="group_direct_subfolders">Sloučit přímé podsložky</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Nezobrazovat neplatné soubory</string>
<string name="show_image_file_types">Zobrazit typ obrázkových souborů</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Náhledy</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Anden mappe</string>
<string name="show_on_map">Vis på kort</string>
<string name="unknown_location">Ukendt placering</string>
<string name="increase_column_count">Flere kolonner</string>
<string name="reduce_column_count">Færre kolonner</string>
<string name="change_cover_image">Skift cover-billede</string>
<string name="select_photo">Vælg billede</string>
<string name="volume">Lydstyrke</string>
<string name="brightness">Lysstyrke</string>
<string name="lock_orientation">Lås orientering</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Der blev ikke funket nogen mediefiler til slideshowet</string>
<!-- View types -->
<string name="change_view_type">Skift visning</string>
<string name="grid">Gitter</string>
<string name="list">Liste</string>
<string name="group_direct_subfolders">Gruppér direkte undermapper</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Undgå at vise ugyldige filer</string>
<string name="show_image_file_types">Vis billeders filtyper</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniaturer</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Ordner wählen</string>
<string name="show_on_map">Auf Karte zeigen</string>
<string name="unknown_location">Unbekannter Pfad</string>
<string name="increase_column_count">Kacheln verkleinern</string>
<string name="reduce_column_count">Kacheln vergrößern</string>
<string name="change_cover_image">Coverbild ändern</string>
<string name="select_photo">Auswählen</string>
<string name="volume">Lautstärke</string>
<string name="brightness">Helligkeit</string>
<string name="lock_orientation">Bildausrichtung sperren</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Keine Medien für Diashow gefunden</string>
<!-- View types -->
<string name="change_view_type">Darstellung ändern</string>
<string name="grid">Gitternetz</string>
<string name="list">Liste</string>
<string name="group_direct_subfolders">Direkte Unterordner gruppieren</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Das Anzeigen von ungültigen Dateien vermeiden</string>
<string name="show_image_file_types">Bilddateitypen anzeigen</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Thumbnails</string>
@ -318,7 +318,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Schlichte Galerie Pro - Foto Manager &amp; Editor</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Bewahre deine Andenken ohne Unterbrechungen mit dieser Foto- und Videogalerie</string>
<string name="app_short_description">Einfache und übersichtliche Galerie zur Verwaltung von Alben, Fotos, Videos</string>
<string name="app_long_description">
Schlichte Galerie Pro ist eine stark individualisierbare Offline Galerie. Ordne &amp; bearbeite deine Fotos, stelle gelöschte Fotos mit Hilfe des Papierkorbs wieder her, schütze &amp; verstecke Dateien und zeige eine Vielzahl von Bilder- &amp; Videoformaten an, unter anderem RAW, SVG und viele mehr.

View file

@ -15,10 +15,6 @@
<string name="other_folder">Άλλος φάκελος</string>
<string name="show_on_map">Εμφάνιση στο χάρτη</string>
<string name="unknown_location">Άγνωστη τοποθεσία</string>
<string name="increase_column_count">Αύξηση αριθμού στηλών</string>
<string name="reduce_column_count">Μείωση αριθμού στηλών</string>
<string name="change_cover_image">Αλλαγή εξώφυλλου φακέλου</string>
<string name="select_photo">Επιλογή φωτογραφίας</string>
<string name="volume">Ένταση</string>
<string name="brightness">Φωτεινότητα</string>
<string name="lock_orientation">Κλείδωμα προσανατολισμού</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Δεν βρέθηκαν πολυμέσα για την εμφάνιση διαφανειών</string>
<!-- View types -->
<string name="change_view_type">Αλλαγή τύπου εμφάνισης</string>
<string name="grid">Πλέγμα</string>
<string name="list">Λίστα</string>
<string name="group_direct_subfolders">Ομαδοποίηση υποφακέλων</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Συμβιβασμός</string>
<string name="avoid_showing_invalid_files">Αποφυγή εμφάνισης μη έγκυρων αρχείων</string>
<string name="show_image_file_types">Εμφάνιση τύπου αρχείου εικόνας</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Επιτρέπει την μεγέθυνση βίντεο με διπλό πάτημα</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Εικονίδια</string>
@ -318,9 +318,9 @@
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">ΑΠΛΗ ΣΥΛΛΟΓΗ Pro - Διαχείριση &amp; Επεξεργασία</string>
<string name="app_title">Απλή Συλλογή Pro - Διαχείριση &amp; Επεξεργασία</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Περιηγηθείτε στις αναμνήσεις σας χωρίς διακοπές με αυτήν τη συλλογή φωτό &amp; βίντεο</string>
<string name="app_short_description">Μια premium εφαρμογή διαχείρισης/επεξεργασίας φωτο βίντεο GIF χωρίς διαφημήσεις</string>
<string name="app_long_description">
Η Απλή Συλλογή Pro είναι χωρίς σύνδεση και εξαιρετικά προσαρμόσιμη. Οργανώστε και επεξεργαστείτε τις φωτογραφίες σας, ανακτήσετε διαγραμμένα αρχεία απο τον κάδο ανακύκλωσης, προστατεύσετε και αποκρύψτε αρχεία, προβάλετε πλήθος διαφορετικών φωτογραφιών και μορφών βίντεο, συμπεριλαμβανομένων των RAW, SVG και πολλών άλλων.
@ -356,7 +356,7 @@
<b>ΥΠΟΣΤΗΡΙΞΗ ΠΟΛΛΩΝ ΤΥΠΩΝ ΑΡΧΕΙΩΝ</b>
Σε αντίθεση με κάποιες άλλες εφαρμογές η Απλή Συλλογή Pro υποστηρίζει ένα τεράστιο φάσμα διαφορετικών τύπων αρχείων, όπως JPEG, PNG, MP4, MKV, RAW, SVG, Πανοραμικές φωτογραφίες, βίντεο πανοραμικών και πολλά άλλα.
<b>ΠΟΛΥ ΠΡΟΣΑΡΜΟΣΙΜΟΣ ΔΙΑΧΕΙΡΙΣΤΗΣ ΣΥΛΛΟΓΗΣ</b>
<b>ΠΟΛΥ ΠΡΟΣΑΡΜΟΣΙΜΟΣ ΔΙΑΧΕΙΡΙΣΤΗΣ</b>
Από το UI στα κουμπιά λειτουργιών στην κάτω γραμμή εργαλείων, η Απλή Συλλογή Pro είναι ιδιαίτερα προσαρμόσιμη και λειτουργεί όπως εσείς θέλετε. Καμιά άλλη εφαρμογή δεν έχει τέτοια ευελιξία! Χάρη στον ανοιχτό κώδικα, είναι επίσης διαθέσιμη σε 32 γλώσσες!
<b>ΕΠΑΝΑΦΟΡΑ ΔΙΑΓΡΑΜΜΕΝΩΝ ΦΩΤΟ ΚΑΙ ΒΙΝΤΕΟ</b>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Otra carpeta</string>
<string name="show_on_map">Mostrar en el mapa</string>
<string name="unknown_location">Ubicación desconocida</string>
<string name="increase_column_count">Aumentar el número de columnas</string>
<string name="reduce_column_count">Reducir el número de columnas</string>
<string name="change_cover_image">Cambiar imagen de portada</string>
<string name="select_photo">Seleccionar imagen</string>
<string name="volume">Volumen</string>
<string name="brightness">Brillo</string>
<string name="lock_orientation">Bloquear orientación</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">No se han encontrado medios para la presentación de diapositivas</string>
<!-- View types -->
<string name="change_view_type">Cambiar tipo de vista</string>
<string name="grid">Cuadrícula</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Agrupar subcarpetas directas</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Compromiso</string>
<string name="avoid_showing_invalid_files">Evita mostrar archivos inválidos</string>
<string name="show_image_file_types">Mostrar tipos de archivo de imagen</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Permitir hacer zoom en videos con doble toque</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniaturas</string>
@ -319,7 +319,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro - Gestor y editor de fotos</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Explore sus recuerdos sin interrupciones con esta galeria de foto y vídeo</string>
<string name="app_short_description">Galería rápida y segura para gestión profesional de fotos, vídeos y los GIFs</string>
<string name="app_long_description">
Simple Gallery Pro es una galería altamente personalizable disponible sin conexión. Organiza y edita tus fotos, recupera archivos eliminados con la papelera de reciclaje, protege y oculta archivos y mira una gran variedad de diferentes formatos de fotos y videos incluyendo RAW, SVG y muchos más.

View file

@ -15,10 +15,6 @@
<string name="other_folder">Muu kansio</string>
<string name="show_on_map">Näytä kartalla</string>
<string name="unknown_location">Tuntematon sijainti</string>
<string name="increase_column_count">Lisää sarakkeita</string>
<string name="reduce_column_count">Vähennä sarakkeita</string>
<string name="change_cover_image">Vaihda kansikuva</string>
<string name="select_photo">Valitse kuva</string>
<string name="volume">Äänenvoimakkuus</string>
<string name="brightness">Kirkkaus</string>
<string name="lock_orientation">Lukitse näytönkierto</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Mediaa diaesitykseen ei löytynyt</string>
<!-- View types -->
<string name="change_view_type">Vaihda näkymää</string>
<string name="grid">Ruudukko</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Group direct subfolders</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Esikatselukuvat</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Autre dossier</string>
<string name="show_on_map">Afficher sur la carte</string>
<string name="unknown_location">Position inconnue</string>
<string name="increase_column_count">Ajouter une colonne</string>
<string name="reduce_column_count">Supprimer une colonne</string>
<string name="change_cover_image">Changer l\'image du dossier</string>
<string name="select_photo">Choisir une image</string>
<string name="volume">Volume</string>
<string name="brightness">Luminosité</string>
<string name="lock_orientation">Verrouiller la rotation</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Aucun média trouvé pour le diaporama</string>
<!-- View types -->
<string name="change_view_type">Changer de mode d\'affichage</string>
<string name="grid">Grille</string>
<string name="list">Liste</string>
<string name="group_direct_subfolders">Mode sous-dossiers</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Compromis</string>
<string name="avoid_showing_invalid_files">Éviter l\'affichage de fichiers invalides</string>
<string name="show_image_file_types">Afficher les types d\'image</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Zoomer les vidéos par un double appui</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatures</string>

View file

@ -11,18 +11,14 @@
<string name="pin_to_the_top">Fixar arriba</string>
<string name="show_all">Mostrar o contido de todos os cartafoles</string>
<string name="all_folders">Todos os cartafoles</string>
<string name="folder_view">Mudar a vista por cartafol</string>
<string name="folder_view">Mudar á vista por cartafol</string>
<string name="other_folder">Outro cartafol</string>
<string name="show_on_map">Mostrar no mapa</string>
<string name="unknown_location">Localización descoñecida</string>
<string name="increase_column_count">Aumente o número de columnas</string>
<string name="reduce_column_count">Reduza o número de columnas</string>
<string name="change_cover_image">Cambiar a imaxe de portada</string>
<string name="select_photo">Escolla foto</string>
<string name="volume">Volume</string>
<string name="brightness">Brillo</string>
<string name="lock_orientation">Fixar orientación</string>
<string name="unlock_orientation">Desbloquear orientación</string>
<string name="unlock_orientation"> Non fixar orientación</string>
<string name="change_orientation">Cambiar orientación</string>
<string name="force_portrait">Forzar retrato</string>
<string name="force_landscape">Forzar paisaxe</string>
@ -31,9 +27,9 @@
<string name="fixing">Arranxando…</string>
<string name="dates_fixed_successfully">Datas arranxadas con éxito</string>
<string name="no_date_takens_found">Non se atoparon valores de Datas de Captura</string>
<string name="share_resized">Comparta unha versión reducida</string>
<string name="upgraded_from_free">Ola,\n\nsemella que actualizou desde a vella aplicación gratuita. Pode desinstalar a versión vella, que ten un botón \'Upgrade to Pro\' enriba da pantalla de configuración.\n\nSo terá os elementos borrados da Papeleira de reciclaxe, os elementos favoritos sen marcar e tamén terá que reiniciar os Axustes.\n\nGrazas!</string>
<string name="switch_to_file_search">Cambiar á procura de ficheiros en todolos cartafoles visibles.</string>
<string name="share_resized">Comparte unha versión reducida</string>
<string name="upgraded_from_free">Ola,\n\nsemella que actualizaches desde o vello aplicativo gratuito. Podes desinstalar a versión vella, que ten un botón \'Mellorar a Pro\' enriba da pantalla de configuración.\n\nSo terás os elementos borrados da Papeleira de reciclaxe, os elementos favoritos sen marcar e tamén terás que reiniciar os Axustes.\n\nGrazas!</string>
<string name="switch_to_file_search">Cambiar á procura de ficheiros en todos os cartafoles visibles.</string>
<!-- Filter -->
<string name="filter_media">Filtrar medios</string>
@ -43,29 +39,29 @@
<string name="raw_images">Imaxes RAW</string>
<string name="svgs">SVGs</string>
<string name="portraits">Retratos</string>
<string name="no_media_with_filters">Non se atoparon medios dos indicados polo filtro.</string>
<string name="no_media_with_filters">Non se atopou multimedia do tipo indicado polo filtro.</string>
<string name="change_filters_underlined"><u>Cambiar filtro</u></string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Esta función oculta o cartafol engadindolle ficheiro \'.nomedia\', tamén ocultará os subcartafoles. Pode velos pulsando a opción \'Mostrar elementos ocultos\' nos Axustes. Continuar?</string>
<string name="hide_folder_description">Esta función oculta o cartafol engadíndolle ficheiro \'.nomedia\', tamén ocultará os subcartafoles. Podes velos pulsando a opción \'Mostrar elementos ocultos\' nos Axustes. Continuar?</string>
<string name="exclude">Excluír</string>
<string name="excluded_folders">Cartafoles excluídos</string>
<string name="manage_excluded_folders">Xestionar cartafoles excluídos</string>
<string name="exclude_folder_description">Esto ocultará a selección xunto cos seus subcartafoles son en Simple Gallery. Pode xestionar os cartafoles ocultos en Axustes.</string>
<string name="exclude_folder_description">Isto ocultará a selección xunto cos seus subcartafoles só en Simple Gallery. Podes xestionar os cartafoles ocultos en Axustes.</string>
<string name="exclude_folder_parent">Excluír o cartafol pai no seu lugar?</string>
<string name="excluded_activity_placeholder">Excluír un cartafol xunto cos subcartafoles só terá efecto en Simple Gallery, seguirán sendo visibles en outros aplicativos.\n\nSi tamén quere excluílos en outros aplicativos, utilice a opción Agochar.</string>
<string name="excluded_activity_placeholder">Excluír un cartafol xunto cos subcartafoles só terá efecto en Simple Gallery, seguirán sendo visibles noutros aplicativos.\n\nSe tamén queres excluílos noutros aplicativos, utiliza a opción Agochar.</string>
<string name="remove_all">Eliminar todos</string>
<string name="remove_all_description">Eliminar todos os cartafoles da lista de excluídos? Esto non borrará os cartafoles.</string>
<string name="remove_all_description">Eliminar todos os cartafoles da lista de excluídos? Isto non borrará os cartafoles.</string>
<string name="hidden_folders">Cartafoles ocultos</string>
<string name="manage_hidden_folders">Xestionar cartafoles ocultos</string>
<string name="hidden_folders_placeholder">Semella que non ten ningún cartafol oculto con un ficheiro \".nomedia\".</string>
<string name="hidden_folders_placeholder">Semella que non tes ningún cartafol oculto cun ficheiro \".nomedia\".</string>
<!-- Include folders -->
<string name="include_folders">Cartafoles incluídos</string>
<string name="manage_included_folders">Xestionar cartafoles incluídos</string>
<string name="add_folder">Engadir cartafol</string>
<string name="included_activity_placeholder">Si ten algún cartafol con medios, mais non foi recoñecido polo aplicativo, pódeo engadir manualmente.\n\nEngadindo aquí elementos non eliminará outros.</string>
<string name="no_media_add_included">Non se atopou ningún ficheiro audiovisual. Pode solucionalo engadindo manualmente algúns cartafoles con eses ficheiros.</string>
<string name="included_activity_placeholder">Se tes algún cartafol con medios, mais non foi recoñecido polo aplicativo, pódelo engadir manualmente.\n\nEngadindo aquí elementos non eliminarás outros.</string>
<string name="no_media_add_included">Non se atopou ningún ficheiro multimedia. Podes solucionalo engadindo manualmente algúns cartafoles con eses ficheiros.</string>
<!-- Resizing -->
<string name="resize">Redimensionar</string>
@ -73,19 +69,19 @@
<string name="width">Ancho</string>
<string name="height">Alto</string>
<string name="keep_aspect_ratio">Manter proporcións</string>
<string name="invalid_values">Por favor introduza unha resolución válida</string>
<string name="invalid_values">Por favor escribe unha resolución válida</string>
<!-- Editor -->
<string name="editor">Editor</string>
<string name="rotate">Rotar</string>
<string name="invalid_image_path">Ruta a imaxe non válida</string>
<string name="invalid_image_path">Ruta á imaxe non válida</string>
<string name="image_editing_failed">Fallo na edición da imaxe</string>
<string name="image_editing_cancelled">Cancelouse a edición da imaxe</string>
<string name="file_edited_successfully">Ficheiro editado con éxito</string>
<string name="file_edited_successfully">Ficheiro editado correctamente</string>
<string name="edit_image_with">Editar imaxe con:</string>
<string name="no_editor_found">Non se atopou ningún editor</string>
<string name="unknown_file_location">Localización do ficheiro descoñecida</string>
<string name="error_saving_file">Non se puido sobreescribir o ficheiro</string>
<string name="error_saving_file">Non se puido sobrescribir o ficheiro</string>
<string name="rotate_left">Rotar a esquerda</string>
<string name="rotate_right">Rotar a dereita</string>
<string name="rotate_one_eighty">Rotar 180º</string>
@ -118,16 +114,13 @@
<string name="move_backwards">Mover atrás</string>
<string name="loop_slideshow">Reproducir en bucle</string>
<string name="animation">Animación</string>
<string name="no_animation">Nengún</string>
<string name="no_animation">Ningún</string>
<string name="fade">Esvaecemento</string>
<string name="slide">Deslizamento</string>
<string name="slideshow_ended">Rematou a presentación</string>
<string name="no_media_for_slideshow">Non se atoparon medios para a presentación</string>
<string name="no_media_for_slideshow">Non se atopou multimedia para a presentación</string>
<!-- View types -->
<string name="change_view_type">Cambiar o tipo de vista</string>
<string name="grid">Grella</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Agrupar subcartafoles directos</string>
<!-- Grouping at media thumbnails -->
@ -142,60 +135,67 @@
<string name="by_date_taken_monthly">Data de captura (mensual)</string>
<string name="by_file_type">Tipo de ficheiro</string>
<string name="by_extension">Extensión</string>
<string name="grouping_and_sorting">Por favor, teña en conta que agrupar e ordenar son dous campos diferentes</string>
<string name="grouping_and_sorting">Por favor, ten en conta que agrupar e ordenar son dous campos diferentes</string>
<!-- Widgets -->
<string name="folder_on_widget">Cartafol a mostrar no widget:</string>
<string name="show_folder_name">Amosar nome de cartafol</string>
<string name="show_folder_name">Mostrar nome de cartafol</string>
<!-- Settings -->
<string name="autoplay_videos">Reproducir vídeos automticamente</string>
<string name="autoplay_videos">Reproducir vídeos automáticamente</string>
<string name="remember_last_video_position">Lembrar a posición do vídeo na última vez</string>
<string name="toggle_filename">Mudar a visibilidade do ficheiro</string>
<string name="loop_videos">videos en bucle</string>
<string name="loop_videos">eos en bucle</string>
<string name="animate_gifs">Animar os GIFs na icona</string>
<string name="max_brightness">Brillo ao máximo cando mire medios</string>
<string name="crop_thumbnails">Recortar iconas a cadrados</string>
<string name="show_thumbnail_video_duration">Amosar a duración dos vídeos</string>
<string name="show_thumbnail_video_duration">Mostrar a duración dos vídeos</string>
<string name="screen_rotation_by">Rotar medios a pantalla completa a</string>
<string name="screen_rotation_system_setting">Axuste do sistema</string>
<string name="screen_rotation_system_setting">Axuste ao sistema</string>
<string name="screen_rotation_device_rotation">Rotación do dispositivo</string>
<string name="screen_rotation_aspect_ratio">Relación de aspecto</string>
<string name="black_background_at_fullscreen">Fondo negro e barra de estado en reprodución a pantalla completa</string>
<string name="scroll_thumbnails_horizontally">Desplazar iconas horizontalmente</string>
<string name="scroll_thumbnails_horizontally">Desprazar iconas horizontalmente</string>
<string name="hide_system_ui_at_fullscreen">Agochar controis do sistema cando visualice a pantalla completa</string>
<string name="delete_empty_folders">Borrar cartafoles baldeiros cando elmine o seu contido</string>
<string name="delete_empty_folders">Borrar cartafoles baleiros cando elmine oseu contido</string>
<string name="allow_photo_gestures">Permitir controlar o brillo da foto con xestos verticais</string>
<string name="allow_video_gestures">Permitir controlar o volume do vídeo e o brillo con xestos verticáis</string>
<string name="allow_video_gestures">Permitir controlar o volume do vídeo e o brillo con xestos verticais</string>
<string name="show_media_count">Mostrar a conta de medios do cartafol na vista principal</string>
<string name="show_extended_details">Mostrar información pormenorizada sobre medios a pantalla completa</string>
<string name="manage_extended_details">Xestionar información polo miúdo</string>
<string name="one_finger_zoom">Permitir zoom con un dedo a pantalla completa</string>
<string name="allow_instant_change">Permitir o cambio instantáneo de medios pulsando nos lados da pantalla</string>
<string name="one_finger_zoom">Permitir zoom cun dedo a pantalla completa</string>
<string name="allow_instant_change">Permitir o cambio instantáneo de medios premendo os lados da pantalla</string>
<string name="allow_deep_zooming_images">Permitir ampliar moito as imaxes</string>
<string name="hide_extended_details">Agochar detalles extendidos cando a barra de estado está oculta</string>
<string name="show_at_bottom">Mostrar botóns para accións na parte baixa da pantalla</string>
<string name="show_recycle_bin">Mostrar a Papeleira de Reciclaxe na pantalla de cartafoles</string>
<string name="show_recycle_bin">Mostrar a Papeleira na pantalla de cartafoles</string>
<string name="deep_zoomable_images">Imaxes con moita ampliación</string>
<string name="show_highest_quality">Mostrar imaxes na súa máxima calidade</string>
<string name="show_recycle_bin_last">Mostrar a Papeleira de Reciclaxe como no derradeiro posto da pantalla principal</string>
<string name="show_recycle_bin_last">Mostrar a Papeleira no derradeiro posto da pantalla principal</string>
<string name="allow_down_gesture">Permitir pechar a visualización en pantalla completa deslizando cara abaixo</string>
<string name="allow_one_to_one_zoom">Permitir ampliar a 1:1 con dous toques</string>
<string name="open_videos_on_separate_screen">Abrir sempre os vídeos nunha pantalla diferente con novos xestos horizontais</string>
<string name="show_notch">Mostrar unha marca se a houbera</string>
<string name="show_notch">Mostrar unha marca se a houbese</string>
<string name="allow_rotating_gestures">Permitir rotar unha imaxe con xestos</string>
<string name="file_loading_priority">Prioridade de carga de ficheiro</string>
<string name="speed">Velocidade</string>
<string name="compromise">Compromiso</string>
<string name="avoid_showing_invalid_files">Non mostrar ficheiros inválidos</string>
<string name="avoid_showing_invalid_files">Non mostrar ficheiros non válidos</string>
<string name="show_image_file_types">Mostrar tipos de ficheiros de imaxe</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Permitir zoom nos vídeos co dobre-toque sobre eles</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Iconas</string>
<string name="fullscreen_media">Medios a pantalla completa</string>
<string name="extended_details">Detalles ampliados</string>
<string name="bottom_actions">Actions do fondo</string>
<string name="bottom_actions">Accións do fondo</string>
<!-- Bottom actions -->
<string name="manage_bottom_actions">Xestionar accións visibles do fondo</string>
@ -208,7 +208,7 @@
<string name="pesdk_transform_button_squareCrop">Cadrado</string>
<string name="pesdk_transform_title_name">Transformar</string>
<string name="pesdk_filter_title_name">Filtrar</string>
<string name="pesdk_filter_asset_none">Nengún</string>
<string name="pesdk_filter_asset_none">Ningún</string>
<string name="pesdk_adjustments_title_name">Axustar</string>
<string name="pesdk_adjustments_button_shadowTool">Sombras</string>
<string name="pesdk_adjustments_button_exposureTool">Exposición</string>
@ -223,8 +223,8 @@
<string name="pesdk_adjustments_button_temperatureTool">Temperatura</string>
<string name="pesdk_adjustments_button_sharpnessTool">Nitidez</string>
<string name="pesdk_adjustments_button_reset">Reiniciar</string>
<string name="pesdk_focus_title_name">Foco</string>
<string name="pesdk_focus_title_disabled">Nengún</string>
<string name="pesdk_focus_title_name">Enfoque</string>
<string name="pesdk_focus_title_disabled">Ningún</string>
<string name="pesdk_focus_button_radial">Radial</string>
<string name="pesdk_focus_button_linear">Lineal</string>
<string name="pesdk_focus_button_mirrored">Reflectir</string>
@ -238,21 +238,21 @@
<string name="pesdk_text_button_straighten">Endereitar</string>
<string name="pesdk_text_button_font">Fonte</string>
<string name="pesdk_text_button_color">Cor</string>
<string name="pesdk_text_button_backgroundColor">Color Fondo</string>
<string name="pesdk_text_button_alignment">Aliñamento</string>
<string name="pesdk_text_button_bringToFront">Á Front</string>
<string name="pesdk_text_button_backgroundColor">Cor Fondo</string>
<string name="pesdk_text_button_alignment">Alineamento</string>
<string name="pesdk_text_button_bringToFront">Á Fronte</string>
<string name="pesdk_text_button_delete">Borrar</string>
<string name="pesdk_text_text_editTextPlaceholder">Seu texto</string>
<string name="pesdk_text_text_editTextPlaceholder">O teu texto</string>
<string name="pesdk_brush_title_name">Pincel</string>
<string name="pesdk_brush_button_color">Cor</string>
<string name="pesdk_brush_button_size">Tamaño</string>
<string name="pesdk_brush_button_hardness">Dureza</string>
<string name="pesdk_brush_button_bringToFront">Á Front</string>
<string name="pesdk_brush_button_bringToFront">Á Fronte</string>
<string name="pesdk_brush_button_delete">Borrar</string>
<string name="pesdk_brush_title_brushColor">Cor do Pincel</string>
<string name="pesdk_editor_title_name">Editor</string>
<string name="pesdk_editor_title_closeEditorAlert">Pechar o Editor?</string>
<string name="pesdk_editor_text_closeEditorAlert">Ten a certeza de desbotar a imaxe?</string>
<string name="pesdk_editor_text_closeEditorAlert">Tes a certeza de desbotar a imaxe?</string>
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Si</string>
<string name="pesdk_editor_button_closeEditorAlertCancelation">Non</string>
<string name="pesdk_editor_cancel">Cancelar</string>
@ -280,94 +280,93 @@
<string name="pesdk_common_title_yellowColor">Amarelo</string>
<string name="pesdk_common_title_oliveColor">Verde oliva</string>
<string name="pesdk_common_title_greenColor">Verde</string>
<string name="pesdk_common_title_aquamarinColor">Aquamarin</string>
<string name="pesdk_common_title_pipettableColor">Pipettable color</string>
<string name="pesdk_common_title_aquamarinColor">Augamariña</string>
<string name="pesdk_common_title_pipettableColor">Escoller coa pipeta</string>
<!-- FAQ -->
<string name="faq_1_title">Cómo podo facer que Simple Gallery sexa a galería por omisión no dispositivo?</string>
<string name="faq_1_text">Primeiro debe atopar a galería por omsión actual na sección de App nos axustes do dispositivo, buscar un botón que diga algo como \"Abrir por omisión\", pulsalo e despois seleccionar \"Limpar por omisión\".
A próxima vez que intente abrir unha imaxe ou vídeo aparecerá un selector de aplicativos onde pode escoller Simple Gallery e facela o aplicativo por omisión.</string>
<string name="faq_2_title">Asegurei o aplicativo con un contrasinal, pero esquecino. Qué podo facer?</string>
<string name="faq_2_text">Pode solucionado de dous xeitos. Ou ben reinstalar o aplicativo ou buscar o aplicativo nos axustes do dispositivo e escoller \"Limpar datos\". Restablecerá todos os seus axustes, mais non eliminará ficheiros de medios.</string>
<string name="faq_3_title">Cómo podo facer que un álbume apareza sempre arriba de todo?</string>
<string name="faq_3_text">Pode manter premido o álbume e escoller a icona de Fixar no menú de accións, esto fixarao arriba. Pode fixar varios cartafoles tambén, os elementos fixados estarán ordenados polo criterio por omisión.</string>
<string name="faq_4_title">Cómo podo aumentar a velocidade de reprodución de vídeo?</string>
<string name="faq_1_title">Como podo facer que Simple Gallery sexa a galería por defecto no meu dispositivo?</string>
<string name="faq_1_text">Primeiro debes atopar a galería por omisión actual na sección de App nos axustes do dispositivo, buscar un botón que diga algo como \"Abrir por omisión\", pulsalo e despois seleccionar \"Limpar por omisión\".
A próxima vez que intentes abrir unha imaxe ou vídeo aparecerá un selector de aplicativos onde podes escoller Simple Gallery e facela a aplicativo por defecto/n.</string>
<string name="faq_2_title">Asegurei o aplicativo cun contrasinal, pero esquecino. Que podo facer?</string>
<string name="faq_2_text">Pode solucionado de dous xeitos. Ou ben reinstalar o aplicativo ou buscar o aplicativo os axustes do dispositivo e escoller \"Limpar datos\". Restablecerá todos os seus axustes, mais non eliminará ficheiros de medios.</string>
<string name="faq_3_title">Como podo facer que un álbum apareza sempre arriba de todo?</string>
<string name="faq_3_text">Pode manter premido o álbum e escoller a icona de Fixar no menú de accións, isto fixarao arriba. Pode fixar varios cartafoles tamén, os elementos fixados estarán ordenados polo criterio por omisión.</string>
<string name="faq_4_title">Como podo aumentar a velocidade de reprodución do vídeo?</string>
<string name="faq_4_text">Pode facelo tocando dúas veces o lateral da pantalla, ou tocando os textos de duración máxima ou actual preto da barra de avance. Se activa abrir os vídeos nunha pantalla separada, tamén pode usar xestos horizontais.</string>
<string name="faq_5_title">Cal é a diferenza entre agochar e excluír un cartafol?</string>
<string name="faq_5_text">A Exclusión prevén que se mostre o cartafol só en Simple Gallery, mentras Agochar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Esto funciona creando un ficheiro baldeiro de nome \".nomedia\" no cartafol, que tamén pode quitar con calquer xestor de ficheiros. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads.</string>
<string name="faq_6_title">Por qué aparecen cartafoles de música con portadas ou pegatinas?</string>
<string name="faq_5_text">A exclusión prevén que se mostre o cartafol só en Simple Gallery, mentras Agochar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Esto funciona creando un ficheiro baldeiro de nome \".nomedia\" no cartafol, que tamén pode quitar con calquera xestor de ficheiros.Teña en conta que algúns dispositivos non permiten cartafoles agochados como Cámara, Capturas de pantalla e Descargas.</string>
<string name="faq_6_title">Por que aparecen cartafoles de música con portadas ou pegatinas?</string>
<string name="faq_6_text">Pode acontecer que vexa que aparecen álbumes raros. Pode excluílos con facilidade mantendo premidos e escollendo Excluír. No seguinte diálogo pode escoller o cartafol pai, esto probablemente agoche outros álbumes relacionados.</string>
<string name="faq_7_title">Un cartafol con imaxes non aparece, qué podo facer? </string>
<string name="faq_7_text">Esto pode acontecer por varias razóns, pero é doado resolvelo. Vaia a Axustes -> xestionar cartafoles incluídos, escolle o Máis e navegar ate o cartafol requerido.</string>
<string name="faq_8_title">E qué pasa si só quero que sexan visibles certos cartafoles</string>
<string name="faq_8_text">Engadir un cartafol a Cartafoles incluídos non exclúe nada de xeito automático. O que pode facer é ir a Axustes -> Xestionar cartafoles incluídos, excluír o cartafol root \"/\", e despóis engadir os cartafoles desexados con Axustes -> Xestionar Cartafoles Incluídos.
Esto fará visibles só aos cartafoles escollidos, como tanto excluír e incluír son recursivos e si está excluído e logo incluído, será mostrado.</string>
<string name="faq_10_title">Podo recortar imaxes con esta aplicación?</string>
<string name="faq_7_title">Un cartafol con imaxes non aparece, que podo facer? </string>
<string name="faq_7_text">Isto pode acontecer por varias razóns, pero é doado resolvelo. Vaia a Axustes -> xestionar cartafoles incluídos, escolle o Máis e navegar ate o cartafol requerido.</string>
<string name="faq_8_title">E que pasa se só quero que sexan visibles certos cartafoles</string>
<string name="faq_8_text">Engadir un cartafol a Cartafoles incluídos non exclúe nada de xeito automático. O que pode facer é ir a Axustes -> Xestionar cartafoles incluídos, excluír o cartafol root \"/\", e despois engadir os cartafoles desexados con Axustes -> Xestionar Cartafoles Incluídos.
Isto fará visibles só aos cartafoles escollidos, como tanto excluír e incluír son recursivos e si está excluído e logo incluído, será mostrado.</string>
<string name="faq_10_title">Podo recortar imaxes con este aplciativo?</string>
<string name="faq_10_text">Si, pode recortar imaxes no editor, arrastrando as esquinas das imaxes. Pode chegar ao editor tanto presionando na imaxe durante un anaco e seleccionando Editar, ou seleccionando Editar dende a vista de pantalla completa.</string>
<string name="faq_11_title">Podo agrupar as iconas de algún xeito?</string>
<string name="faq_11_title">Podo agrupar as iconas dalgún xeito?</string>
<string name="faq_11_text">Claro, use no menu \"Agrupar por\" na vista de iconas. Pode facelo por múltiples criterios, incluindo a data de captura. Se usa a función \"Mostrar o contido dos cartafoles\", tamén pode agruparlos por cartafoles.</string>
<string name="faq_12_title">Semella que Ordenar por Data non está a funcionar, como o amaño?</string>
<string name="faq_12_text">Seguramente foi causa de copiar os ficheiros de algures. Pode amañalo seleccionando as iconas e \"Arranxar o valor da Data de Captura\".</string>
<string name="faq_12_text">Seguramente foi causa de copiar os ficheiros de algures. Podes amañalo seleccionando as iconas e \"Arranxar o valor da Data de Captura\".</string>
<string name="faq_13_title">Vexo bandas de cor nas imaxes. Como podo mellorar a súa calidade?</string>
<string name="faq_13_text">A solución actual de mostra das imaxes funciona ben na maioría dos casos, pero se desexa unha calidade maior, active \"Mostrar imaxes na máxima calidade posible\" na configuración, na sección \"Imaxes con moita ampliación\".</string>
<string name="faq_14_title">Teño un ficheiro ou cartafol oculto. Como o amoso?</string>
<string name="faq_14_title">Teño un ficheiro ou cartafol oculto. Como o amoso?</string>
<string name="faq_14_text">Pode ou ben activar \"Mostrar temporalmente ficheiros agochados\" no menu principal, ou activar \"Amosar obxectos ocultos\" na configuración. Se quere amosalo sempre, pode presionar uns intres e seleccionar \"Amosar\". Os cartafoles agóchanse engadindo un ficheiro oculto \".nomedia\" no seu interior; tamén pode borrar ese ficheiro con calquera xestor de ficheiros.</string>
<string name="faq_15_title">Por que consume tanto espacio esta aplicación?</string>
<string name="faq_15_text">Os ficheiros temporais poden chegar aos 250MB e server para cargar máis rápido. Se a aplicación está a consumir máis espazo, o máis probable é que teña ficheiros nam Papeleira de Reciclaxe. Estes ficheiros contan no tamaño da aplicación. Pode baleirala abríndoa e borrando os ficheiros, ou dende a configuración. Cada ficheiro da Papeleira bórrase automáticamente tras 30 días.</string>
<string name="faq_15_title">Por que consume tanto espacio este aplicativo?</string>
<string name="faq_15_text">Os ficheiros temporais poden chegar aos 250MB e server para cargar máis rápido. Se o aplicativo está a a consumir máis espazo, o máis probable é que teña ficheiros na Papeleira de Reciclaxe.Estes ficheiros contan no tamaño da aplicación.Podes baleirala abríndoa e borrando os ficheiros, ou desde a configuración.Cada ficheiro da Papeleira bórrase automáticamente tras 30 días.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro - Photo Manager &amp; Editor</string>
<string name="app_title">Simple Gallery Pro - Xestor e Editor de fotos</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Browse your memories without any interruptions with this photo and video gallery</string>
<string name="app_short_description">Busca nos recordos sen interrupcións na galería de fotos e vídeo</string>
<string name="app_long_description">
Simple Gallery Pro is a highly customizable offline gallery. Organize &amp; edit your photos, recover deleted files with the recycle bin, protect &amp; hide files and view a huge variety of different photo &amp; video formats including RAW, SVG and much more.
Simple Gallery Pro unha galería altamente personalizable. Organiza &amp; edita as túas fotos, recupera ficheiros borrados desde a papeleira, protexe &amp; oculta ficheiros e visualiza gran número de formatos de fotos &amp; vídeo incluíndo RAW, SVG e moitos máis.
The app contains no ads and unnecessary permissions. As the app doesnt require internet access either, your privacy is protected.
O app non ten publicidade nin permisos innesarios. Como tampouco require acceso a internet, a túa privacidade está protexida.
-------------------------------------------------
<b>SIMPLE GALLERY PRO FEATURES</b>
<b>SIMPLE GALLERY PRO Características</b>
-------------------------------------------------
Offline gallery with no ads or popups
Simple gallery photo editor crop, rotate, resize, draw, filters &amp; more
• No internet access needed, giving you more privacy and security
• No unnecessary permissions required
Quickly search images, videos &amp; files
Open &amp; view many different photo and video types (RAW, SVG, panoramic etc)
A variety of intuitive gestures to easily edit &amp; organize files
Lots of ways to filter, group &amp; sort files
Customize the appearance of Simple Gallery Pro
Available in 32 languages
• Mark files as favorites for quick access
• Protect your photos &amp; videos with a pattern, pin or fingerprint
• Use pin, pattern &amp; fingerprint to protect the app launch or specific functions too
• Recover deleted photos &amp; videos from the recycle bin
Toggle visibility of files to hide photos &amp; videos
• Create a customizable slideshow of your files
View detailed information of your files (resolution, EXIF values etc)
• Simple Gallery Pro is open source
and much much more!
Galería sen conexión a internet, publicidade nin ventás emerxentes
Editor de fotos Simple gallery recorta, rota, cambia tamaño, debuxa, fitros, e máis
• Non precisa acceso a internet, dándoche máis seguridade e privacidade
• Non pide permisos innecesarios
Busca rápida de ficheiros de foto e vídeo
Abre e visualiza gran cantidade de formatos (RAW, SVG, panoramic etc)
Xestos intuitivos para editar e organizar os ficheiros
Múltiples filtros, agrupamento e orde dos ficheiros
Personaliza o aspecto de Simple Gallery Pro
Dispoñible en 32 idiomas
• Marca ficheiros como favoritos para acceso rápido
• Protexe fotos e vídeos cun patrón, PIN ou impresión dixital
• Usa PIN, patrón e impresión dixital para protexer a apertura do app ou indicar funcións específicas
• Recupera fotos e vídeos borrados desde a papeleira
Cambia a visibilidade dos ficheiros para ocultar fotos e vídeos
• Crea presentacións personalizadas cos teus ficheiros
Mira a información detalladas dos ficheiros (resolución, valores EXIF etc)
• Simple Gallery Pro é código aberto
e moito máis!
<b>PHOTO GALLERY EDITOR</b>
Simple Gallery Pro makes it easy to edit your pictures on the fly. Crop, flip, rotate and resize your pictures. If youre feeling a little more creative you can add filters and draw on your pictures!
Simple Gallery Pro permite editar as fotos no momento. Recorta, voltea, rota e redimensiona as túas fotos. Se te sintes inspirado tamén pode engadir filtros e debuxar nas imaxes!
<b>SUPPORT FOR MANY FILE TYPES</b>
Unlike some other gallery viewers &amp; photo organizers, Simple Gallery Pro supports a huge range of different file types including JPEG, PNG, MP4, MKV, RAW, SVG, Panoramic photos, Panoramic videos and many more.
<b>SOPORTA MOITOS TIPOS DE FICHEIROS</b>
Simple Gallery Pro soporta gran variedade de formatos como JPEG, PNG, MP4, MKV, RAW, SVG, Panoramicas, Vídeos panorámicos e moito máis. Non como outros.
<b>HIGHLY CUSTOMIZABLE GALLERY MANAGER</b>
From the UI to the function buttons on the bottom toolbar, Simple Gallery Pro is highly customizable and works the way you want it to. No other gallery manager has this kind of flexibility! Thanks to being open source, were also available in 32 languages!
<b>XESTOR DE FOTOS MOI PERSONALIZABLE</b>
Desde a interface ata a función dos botóns da barra de ferramentas, Simply Gallery Pro é moi personalizable e funciona do xeito que ti queres. Ningún outro xestor de galerías ten esta flexibilidade! Ao ser código aberto, está dipoñible en 32 idiomas!
<b>RECOVER DELETED PHOTOS &amp; VIDEOS</b>
Accidentally deleted a precious photo or video? Dont worry! Simple Gallery Pro features a handy recycle bin where you can recover deleted photos &amp; videos easily.
<b>RECUPERA FOTOS &amp; VIDEOS ELIMINADOS</b>
Borraches sen querer unha foto ou vídeo? Non te apenes! Simple Gallery Pro ten unha función para recuperar facilmente vídeos e fotos borrados.
<b>PROTECT &amp; HIDE PHOTOS, VIDEOS &amp; FILES</b>
Using pin, pattern or your devices fingerprint scanner you can protect and hide photos, videos &amp; entire albums. You can protect the app itself or place locks on specific functions of the app. For example, you cant delete a file without a fingerprint scan, helping to protect your files from accidental deletion.
<b>PROTEXE &amp; OCULTA FOTOS, VIDEOS &amp; FICHEIROS</b>
Usando un prendedor, patrón ou a impresión dixital no escáner do dispositivo podes protexer e agochar fotos, vídeos e álbumes enteiros. Podes protexer a app ou establecer funcións específicas no app. Por exemplo, que non poidas eliminar un ficheiro sen o escáner da impresión dixital, axudándoche a protexer o borrado accidental.
<b>Check out the full suite of Simple Tools here:</b>
<b>Aquí tes todas as Simple Tools:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Gallery Pro:</b>
<b>Sitio web de Simple Gallery Pro:</b>
https://www.simplemobiletools.com/gallery
<b>Facebook:</b>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Ostale mape</string>
<string name="show_on_map">Prikaži na karti</string>
<string name="unknown_location">Nepoznata lokacija</string>
<string name="increase_column_count">Povećaj broj stupaca</string>
<string name="reduce_column_count">Smanji broj stupaca</string>
<string name="change_cover_image">Promjeni naslovnu sliku</string>
<string name="select_photo">Odaberi sliku</string>
<string name="volume">Glasnoća</string>
<string name="brightness">Svjetlina</string>
<string name="lock_orientation">Zaključaj orijentaciju slike</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Nema datoteka za dijaprojekciju</string>
<!-- View types -->
<string name="change_view_type">Promijeni vrstu prikaza</string>
<string name="grid">Mreža</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Group direct subfolders</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Sličice</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Egyéb mappa</string>
<string name="show_on_map">Mutassa a térképen</string>
<string name="unknown_location">Ismeretlen helyszín</string>
<string name="increase_column_count">Növelje az oszlopok számát</string>
<string name="reduce_column_count">Csökkentse az oszlopok számát</string>
<string name="change_cover_image">Borítókép változtatása</string>
<string name="select_photo">Válasszon fotót</string>
<string name="volume">Hangerő</string>
<string name="brightness">Fényesség</string>
<string name="lock_orientation">Tájolás zárolása</string>
@ -30,7 +26,7 @@
<string name="fix_date_taken">Dátum javítása</string>
<string name="fixing">Javítás...</string>
<string name="dates_fixed_successfully">Sikeres dátum javítás</string>
<string name="no_date_takens_found">No Date Taken values have been found</string>
<string name="no_date_takens_found">Nem találhatók Dátum értékek</string>
<string name="share_resized">Átméretezett verzió megosztása</string>
<string name="upgraded_from_free">Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks!</string>
<string name="switch_to_file_search">Váltás a fájlkeresésre az összes látható mappában</string>
@ -42,7 +38,7 @@
<string name="gifs">GIF</string>
<string name="raw_images">RAW kép</string>
<string name="svgs">SVG</string>
<string name="portraits">Portraits</string>
<string name="portraits">Portrék</string>
<string name="no_media_with_filters">A kiválasztott szűrők nem találtak médiafájlokat.</string>
<string name="change_filters_underlined"><u>Szűrők változtatása</u></string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">A diavetítéshez nem található média</string>
<!-- View types -->
<string name="change_view_type">Nézet típus változtatása</string>
<string name="grid">Rács</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Közvetlen almappa csoport</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Kiegyensúlyozott</string>
<string name="avoid_showing_invalid_files">Kerülje az érvénytelen fájlok mutatását</string>
<string name="show_image_file_types">Mutassa a kép fájl típusokat</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">A videók nagyításának engedélyezése dupla koppintással</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatűrök</string>
@ -206,27 +206,27 @@
<string name="pesdk_transform_button_freeCrop">Egyéni</string>
<string name="pesdk_transform_button_resetCrop">Alaphelyzetbe</string>
<string name="pesdk_transform_button_squareCrop">Négyzet</string>
<string name="pesdk_transform_title_name">Transform</string>
<string name="pesdk_transform_title_name">Átalakítás</string>
<string name="pesdk_filter_title_name">Szűrő</string>
<string name="pesdk_filter_asset_none">Nincs</string>
<string name="pesdk_adjustments_title_name">Beállít</string>
<string name="pesdk_adjustments_button_shadowTool">Árnyékok</string>
<string name="pesdk_adjustments_button_exposureTool">Exposure</string>
<string name="pesdk_adjustments_button_highlightTool">Highlights</string>
<string name="pesdk_adjustments_button_exposureTool">Kitettség</string>
<string name="pesdk_adjustments_button_highlightTool">Kiemelések</string>
<string name="pesdk_adjustments_button_brightnessTool">Fényerő</string>
<string name="pesdk_adjustments_button_contrastTool">Kontraszt</string>
<string name="pesdk_adjustments_button_saturationTool">Színtelítettség</string>
<string name="pesdk_adjustments_button_clarityTool">Világosság</string>
<string name="pesdk_adjustments_button_gammaTool">Gamma</string>
<string name="pesdk_adjustments_button_blacksTool">Blacks</string>
<string name="pesdk_adjustments_button_whitesTool">Whites</string>
<string name="pesdk_adjustments_button_blacksTool">Feketék</string>
<string name="pesdk_adjustments_button_whitesTool">Fehérek</string>
<string name="pesdk_adjustments_button_temperatureTool">Színhőmérséklet</string>
<string name="pesdk_adjustments_button_sharpnessTool">Élesség</string>
<string name="pesdk_adjustments_button_reset">Alaphelyzetbe</string>
<string name="pesdk_focus_title_name">Fókusz</string>
<string name="pesdk_focus_title_disabled">Nincs</string>
<string name="pesdk_focus_button_radial">Radial</string>
<string name="pesdk_focus_button_linear">Linear</string>
<string name="pesdk_focus_button_radial">Sugárirányú</string>
<string name="pesdk_focus_button_linear">Lineáris</string>
<string name="pesdk_focus_button_mirrored">Tükrözött</string>
<string name="pesdk_focus_button_gaussian">Gaussian</string>
<string name="pesdk_text_title_name">Szöveg</string>
@ -235,7 +235,7 @@
<string name="pesdk_text_title_font">Betűtípus</string>
<string name="pesdk_text_button_add">Hozzáadás</string>
<string name="pesdk_text_button_edit">Szerkesztés</string>
<string name="pesdk_text_button_straighten">Straighten</string>
<string name="pesdk_text_button_straighten">Egyenesített</string>
<string name="pesdk_text_button_font">Betűtípus</string>
<string name="pesdk_text_button_color">Szín</string>
<string name="pesdk_text_button_backgroundColor">Háttérszín</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Folder lainnya</string>
<string name="show_on_map">Tampilkan di peta</string>
<string name="unknown_location">Lokasi tidak diketahui</string>
<string name="increase_column_count">Tambah jumlah kolom</string>
<string name="reduce_column_count">Kurangi jumlah kolom</string>
<string name="change_cover_image">Ubah gambar kover</string>
<string name="select_photo">Pilih foto</string>
<string name="volume">Volume</string>
<string name="brightness">Kecerahan</string>
<string name="lock_orientation">Kunci orientasi</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Tidak ditemukan media untuk slideshow</string>
<!-- View types -->
<string name="change_view_type">Ubah tampilan</string>
<string name="grid">Kotak</string>
<string name="list">Daftar</string>
<string name="group_direct_subfolders">Kelompokkan subfolder langsung</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Hindari menampilkan berkas yang tidak valid</string>
<string name="show_image_file_types">Tampilkan tipe berkas gambar</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Thumbnail</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Folder lainnya</string>
<string name="show_on_map">Tampilkan di peta</string>
<string name="unknown_location">Lokasi tidak diketahui</string>
<string name="increase_column_count">Tambah jumlah kolom</string>
<string name="reduce_column_count">Kurangi jumlah kolom</string>
<string name="change_cover_image">Ubah gambar kover</string>
<string name="select_photo">Pilih foto</string>
<string name="volume">Volume</string>
<string name="brightness">Kecerahan</string>
<string name="lock_orientation">Kunci orientasi</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Tidak ditemukan media untuk slideshow</string>
<!-- View types -->
<string name="change_view_type">Ubah tampilan</string>
<string name="grid">Kotak</string>
<string name="list">Daftar</string>
<string name="group_direct_subfolders">Kelompokkan subfolder langsung</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Hindari menampilkan berkas yang tidak valid</string>
<string name="show_image_file_types">Tampilkan tipe berkas gambar</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Thumbnail</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Altra cartella</string>
<string name="show_on_map">Mostra sulla mappa</string>
<string name="unknown_location">Posizione sconosciuta</string>
<string name="increase_column_count">Aumenta numero colonne</string>
<string name="reduce_column_count">Riduci numero colonne</string>
<string name="change_cover_image">Cambia immagine copertina</string>
<string name="select_photo">Seleziona foto</string>
<string name="volume">Volume</string>
<string name="brightness">Luminosità</string>
<string name="lock_orientation">Blocca orientamento</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Nessun file trovato per la presentazione</string>
<!-- View types -->
<string name="change_view_type">Cambia modalità visualizzazione</string>
<string name="grid">Griglia</string>
<string name="list">Elenco</string>
<string name="group_direct_subfolders">Raggruppa sottocartelle dirette</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Compromesso</string>
<string name="avoid_showing_invalid_files">Evita di mostrare file non validi</string>
<string name="show_image_file_types">Mostra i tipi di file immagine</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Permetti l\'ingrandimento dei video con un doppio tocco</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Anteprime</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">その他のフォルダ</string>
<string name="show_on_map">地図上で表示</string>
<string name="unknown_location">位置情報がありません</string>
<string name="increase_column_count">列数を増やす</string>
<string name="reduce_column_count">列数を減らす</string>
<string name="change_cover_image">カバー画像を変更</string>
<string name="select_photo">写真を選択</string>
<string name="volume">音量</string>
<string name="brightness">明るさ</string>
<string name="lock_orientation">画面の向きを固定する</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">スライドショーに表示するメディアがありません</string>
<!-- View types -->
<string name="change_view_type">表示形式の変更</string>
<string name="grid">グリッド</string>
<string name="list">リスト</string>
<string name="group_direct_subfolders">サブフォルダでグループ化</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">サムネイル設定</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">다른 폴더</string>
<string name="show_on_map">지도에서 보기</string>
<string name="unknown_location">위치정보 없음</string>
<string name="increase_column_count">섬네일크기 축소</string>
<string name="reduce_column_count">섬네일크기 확대</string>
<string name="change_cover_image">커버 사진 변경</string>
<string name="select_photo">사진 선택</string>
<string name="volume">볼륨</string>
<string name="brightness">밝기</string>
<string name="lock_orientation">화면 회전 잠금</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">슬라이드 쇼를 표시할 사진이 없습니다.</string>
<!-- View types -->
<string name="change_view_type">보기 방식 변경</string>
<string name="grid">타일</string>
<string name="list">목록</string>
<string name="group_direct_subfolders">상위 폴더 표시</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">잘못된 파일 보이지 않기</string>
<string name="show_image_file_types">사진 파일 종류 표시</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">섬네일</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Kitas aplankas</string>
<string name="show_on_map">Rodyti žemėlapyje</string>
<string name="unknown_location">Nežinoma vieta</string>
<string name="increase_column_count">Padidinti stulpelių skaičių</string>
<string name="reduce_column_count">Sumažinti stulpelių skaičių</string>
<string name="change_cover_image">Pakeisti viršelio atvaizdą</string>
<string name="select_photo">Pasirinkti nuotrauką</string>
<string name="volume">Garsas</string>
<string name="brightness">Ryškumas</string>
<string name="lock_orientation">Užrakinti orientaciją</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Nerasta medijos skaidrių demonstracijai</string>
<!-- View types -->
<string name="change_view_type">Keisti peržiūros tipą</string>
<string name="grid">Tinklelis</string>
<string name="list">Sąrašas</string>
<string name="group_direct_subfolders">Group direct subfolders</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatiūros</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Annen mappe</string>
<string name="show_on_map">Vis på kart</string>
<string name="unknown_location">Ukjent plassering</string>
<string name="increase_column_count">Øk antall kolonner</string>
<string name="reduce_column_count">Reduser antall kolonner</string>
<string name="change_cover_image">Endre omslagsbilde</string>
<string name="select_photo">Velg foto</string>
<string name="volume">Volum</string>
<string name="brightness">Lysstyrke</string>
<string name="lock_orientation">Lås skjermorientering</string>
@ -30,7 +26,7 @@
<string name="fix_date_taken">Korriger Dato tatt-verdi</string>
<string name="fixing">Korrigerer…</string>
<string name="dates_fixed_successfully">Datoer er korrigerte</string>
<string name="no_date_takens_found">No Date Taken values have been found</string>
<string name="no_date_takens_found">Ingen verdier for Dato tatt er funnet</string>
<string name="share_resized">Del versjon med endret størrelse</string>
<string name="upgraded_from_free">Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks!</string>
<string name="switch_to_file_search">Skift til filsøk i alle synlige mapper</string>
@ -80,7 +76,7 @@
<string name="rotate">Roter</string>
<string name="invalid_image_path">Ugyldig bildebane</string>
<string name="image_editing_failed">Bilderedigering feilet</string>
<string name="image_editing_cancelled">Image editing cancelled</string>
<string name="image_editing_cancelled">Bilderedigering avbrutt</string>
<string name="file_edited_successfully">Fil vellykket redigert</string>
<string name="edit_image_with">Rediger bilde med:</string>
<string name="no_editor_found">Ingen bilderedigeringsapp funnet</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Ingen media for lysbildeshowet er funnet</string>
<!-- View types -->
<string name="change_view_type">Endre visningstype</string>
<string name="grid">Rutenett</string>
<string name="list">Liste</string>
<string name="group_direct_subfolders">Grupper direkte undermapper</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Kompromiss</string>
<string name="avoid_showing_invalid_files">Unngå visning av ugyldige filer</string>
<string name="show_image_file_types">Vis bildefiltyper</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Tillat zooming av videoer ved å dobbelttrykke dem</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Minibilder</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">अन्य फोल्डर</string>
<string name="show_on_map">नक्सामा देखाउनुहोस</string>
<string name="unknown_location">थाहानभएको ठाउ</string>
<string name="increase_column_count">कोलम सङ्खा बढाउनुहोस</string>
<string name="reduce_column_count">कोलम सङ्खा घटाउनुहोस</string>
<string name="change_cover_image">कभर तस्बिर परिवर्तन गर्नुहोस</string>
<string name="select_photo">फोटो चयन गर्नुहोस</string>
<string name="volume">भोलुम</string>
<string name="brightness">उज्यालोपन</string>
<string name="lock_orientation">Lock orientation</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- View types -->
<string name="change_view_type">भ्यू प्रकार परिवर्तन गर्नुहोस</string>
<string name="grid">कोठे</string>
<string name="list">सुची</string>
<string name="group_direct_subfolders">Group direct subfolders</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="show_image_file_types">तस्बिरको फाईल किसिम देखाउनुहोस</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Thumbnails</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Andere map</string>
<string name="show_on_map">Op kaart tonen</string>
<string name="unknown_location">Locatie onbekend</string>
<string name="increase_column_count">Meer kolommen</string>
<string name="reduce_column_count">Minder kolommen</string>
<string name="change_cover_image">Afbeelding omslag wijzigen</string>
<string name="select_photo">Foto selecteren</string>
<string name="volume">Volume</string>
<string name="brightness">Helderheid</string>
<string name="lock_orientation">Schermoriëntatie vergrendelen</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Geen media gevonden voor diavoorstelling</string>
<!-- View types -->
<string name="change_view_type">Weergave</string>
<string name="grid">Raster</string>
<string name="list">Lijst</string>
<string name="group_direct_subfolders">Directe submappen groeperen</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Compromis</string>
<string name="avoid_showing_invalid_files">Ongeldige bestanden verbergen</string>
<string name="show_image_file_types">Bestandstypen tonen</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Bij video\'s inzoomen met dubbelklikken</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatuurvoorbeelden</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Inny folder</string>
<string name="show_on_map">Pokaż na mapie</string>
<string name="unknown_location">Nieznana lokalizacja</string>
<string name="increase_column_count">Zwiększ liczbę kolumn</string>
<string name="reduce_column_count">Zmniejsz liczbę kolumn</string>
<string name="change_cover_image">Zmień okładkę</string>
<string name="select_photo">Wybierz obraz</string>
<string name="volume">Głośność</string>
<string name="brightness">Jasność</string>
<string name="lock_orientation">Zablokuj orientację ekranu</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Nie znalazłem multimediów do pokazu slajdów</string>
<!-- View types -->
<string name="change_view_type">Zmień typ widoku</string>
<string name="grid">Siatka</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Grupuj bezpośrednie podfoldery</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Unikaj pokazywania niewłaściwych plików</string>
<string name="show_image_file_types">Pokazuj rozszerzenia zdjęć</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatury</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Outra pasta</string>
<string name="show_on_map">Exibir no mapa</string>
<string name="unknown_location">Localização desconhecida</string>
<string name="increase_column_count">Aumentar número de colunas</string>
<string name="reduce_column_count">Reduzir número de colunas</string>
<string name="change_cover_image">Trocar imagem de capa</string>
<string name="select_photo">Selecionar foto</string>
<string name="volume">Volume</string>
<string name="brightness">Brilho</string>
<string name="lock_orientation">Travar orientação</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Nenhuma mídia encontrada para a apresentação</string>
<!-- View types -->
<string name="change_view_type">Alterar modo de visualização</string>
<string name="grid">Grade</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Agrupar subpastas diretas</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Meio termo</string>
<string name="avoid_showing_invalid_files">Evitar a exibição de arquivos inválidos</string>
<string name="show_image_file_types">Exibir tipos de arquivo de imagem</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Permitir zoom de vídeos com um toque duplo neles</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniaturas</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Outra pasta</string>
<string name="show_on_map">Mostrar no mapa</string>
<string name="unknown_location">Localização desconhecida</string>
<string name="increase_column_count">Aumentar número de colunas</string>
<string name="reduce_column_count">Diminuir número de colunas</string>
<string name="change_cover_image">Alterar imagem de capa</string>
<string name="select_photo">Selecionar foto</string>
<string name="volume">Volume</string>
<string name="brightness">Brilho</string>
<string name="lock_orientation">Bloquear orientação</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Não foram encontrados ficheiros para a apresentação</string>
<!-- View types -->
<string name="change_view_type">Tipo de exibição</string>
<string name="grid">Grelha</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Agrupar sub-pastas</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Qualidade</string>
<string name="avoid_showing_invalid_files">Não mostrar ficheiros inválidos</string>
<string name="show_image_file_types">Mostrar o tipo de imagem</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Permitir ampliação de vídeos com dois toques</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniaturas</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Выбор папки</string>
<string name="show_on_map">Показать место съёмки</string>
<string name="unknown_location">Место съёмки не указано</string>
<string name="increase_column_count">Добавить столбец</string>
<string name="reduce_column_count">Убрать столбец</string>
<string name="change_cover_image">Изменить обложку</string>
<string name="select_photo">Выбрать изображение</string>
<string name="volume">Громкость</string>
<string name="brightness">Яркость</string>
<string name="lock_orientation">Заблокировать ориентацию</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Не найдено медиафайлов для слайдшоу</string>
<!-- View types -->
<string name="change_view_type">Вид</string>
<string name="grid">Сетка</string>
<string name="list">Список</string>
<string name="group_direct_subfolders">Объединять вложенные папки</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Пропускать файлы с ошибками</string>
<string name="show_image_file_types">Показывать типы файлов изображений</string>
<string name="allow_zooming_videos">Масштабировать видео двойным нажатием по нему</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Миниатюры</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Iný priečinok</string>
<string name="show_on_map">Zobraziť na mape</string>
<string name="unknown_location">Neznáma poloha</string>
<string name="increase_column_count">Zvýšiť počet stĺpcov</string>
<string name="reduce_column_count">Znížiť počet stĺpcov</string>
<string name="change_cover_image">Zmeniť obal albumu</string>
<string name="select_photo">Zvoliť foto</string>
<string name="volume">Hlasitosť</string>
<string name="brightness">Jas</string>
<string name="lock_orientation">Uzamknúť otočenie obrazovky</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Pre prezentáciu sa nenašli žiadne vhodné súbory</string>
<!-- View types -->
<string name="change_view_type">Zmeniť typ zobrazenia</string>
<string name="grid">Mriežka</string>
<string name="list">Zoznam</string>
<string name="group_direct_subfolders">Zlúčiť priame podpriečinky</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Nezobrazovať neplatné súbory</string>
<string name="show_image_file_types">Zobraziť typ obrázkových súborov</string>
<string name="allow_zooming_videos">Povoliť približovanie videí dvojitým ťuknutím</string>
<string name="folder_thumbnail_style">Štýl miniatúr priečinkov</string>
<string name="show_file_count_line">Zobraziť počet súborov na samostatnom riadku</string>
<string name="show_file_count_brackets">Zobraziť počet súborov v zátvorkách</string>
<string name="show_file_count_none">Nezobrazovať počet súborov</string>
<string name="limit_folder_title">Obmedziť názov priečinka na 1 riadok</string>
<string name="square">Štvorec</string>
<string name="rounded_corners">Zaoblené rohy</string>
<!-- Setting sections -->
<string name="thumbnails">Náhľady</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Druga mapa</string>
<string name="show_on_map">Prikaži na zemljevidu</string>
<string name="unknown_location">Neznana lokacija</string>
<string name="increase_column_count">Povečaj število stolpcev</string>
<string name="reduce_column_count">Zmanjšaj število stolpcev</string>
<string name="change_cover_image">Spremeni naslovno fotografijo</string>
<string name="select_photo">Izberi fotografijo</string>
<string name="volume">Glasnost</string>
<string name="brightness">Svetlost</string>
<string name="lock_orientation">Zakleni usmerjenost</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Ne najdem datotek za diaprojekcijo</string>
<!-- View types -->
<string name="change_view_type">Spremeni tip pogleda</string>
<string name="grid">Mreža</string>
<string name="list">Seznam</string>
<string name="group_direct_subfolders">Združi neposredne podmape</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Izogni se prikazovanju napačnih datotek</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Sličice</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Друга фасцикла</string>
<string name="show_on_map">Прикажи на мапи</string>
<string name="unknown_location">Непозната локација</string>
<string name="increase_column_count">Повећај број колона</string>
<string name="reduce_column_count">Смањи број колона</string>
<string name="change_cover_image">Промени насловну слику</string>
<string name="select_photo">Изабери фотографију</string>
<string name="volume">Јачина звука</string>
<string name="brightness">Осветљење</string>
<string name="lock_orientation">Закључај оријентацију</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Нису пронађени медији за слајдшоу</string>
<!-- View types -->
<string name="change_view_type">Промени тип прегледа</string>
<string name="grid">Мрежа</string>
<string name="list">Листа</string>
<string name="group_direct_subfolders">Групирај директне подфасцикле</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Не приказуј оштећене датотеке</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Сличице</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Annan mapp</string>
<string name="show_on_map">Visa på karta</string>
<string name="unknown_location">Okänd plats</string>
<string name="increase_column_count">Öka antalet kolumner</string>
<string name="reduce_column_count">Minska antalet kolumner</string>
<string name="change_cover_image">Byt omslagsbild</string>
<string name="select_photo">Välj foto</string>
<string name="volume">Volym</string>
<string name="brightness">Ljusstyrka</string>
<string name="lock_orientation">Aktivera rotationslås</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Ingen media hittades för bildspelet</string>
<!-- View types -->
<string name="change_view_type">Ändra vy</string>
<string name="grid">Rutnät</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Gruppera direkta undermappar</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatyrer</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Diğer klasör</string>
<string name="show_on_map">Haritada göster</string>
<string name="unknown_location">Bilinmeyen konum</string>
<string name="increase_column_count">Sütun sayısını artır</string>
<string name="reduce_column_count">Sütun sayısını azalt</string>
<string name="change_cover_image">Kapak resmini değiştir</string>
<string name="select_photo">Fotoğraf seç</string>
<string name="volume">Ses</string>
<string name="brightness">Parlaklık</string>
<string name="lock_orientation">Yönü kilitle</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Slayt gösterisi için medya bulunamadı</string>
<!-- View types -->
<string name="change_view_type">Görünüm türünü değiştir</string>
<string name="grid">Izgara</string>
<string name="list">Liste</string>
<string name="group_direct_subfolders">Doğrudan alt klasörleri gruplandır</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">Ödünsüz</string>
<string name="avoid_showing_invalid_files">Geçersiz dosyaları göstermekten kaçın</string>
<string name="show_image_file_types">Resim dosyası türlerini göster</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">Videoları iki kez dokunarak yakınlaştırmaya izin ver</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Küçük resimler</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Інша тека</string>
<string name="show_on_map">Показати на мапі</string>
<string name="unknown_location">Невідоме розташування</string>
<string name="increase_column_count">Збільшити кількість колонок</string>
<string name="reduce_column_count">Зменшити кількість колонок</string>
<string name="change_cover_image">Змінити обкладинку</string>
<string name="select_photo">Вибрати фото</string>
<string name="volume">Об\'єм</string>
<string name="brightness">Яскравість</string>
<string name="lock_orientation">Закріпити орієнтацію</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Не знайдено медіафайлів для показу у слайдшоу</string>
<!-- View types -->
<string name="change_view_type">Змінити тип перегляду</string>
<string name="grid">Сітка</string>
<string name="list">Список</string>
<string name="group_direct_subfolders">Групувати безпосередні підтеки</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Запобігати показу пошкоджених файлів</string>
<string name="show_image_file_types">Показувати типи файлів зображень</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Ескізи</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Thư mục khác</string>
<string name="show_on_map">Hiển thị trên bản đồ</string>
<string name="unknown_location">Vị trí không xác định</string>
<string name="increase_column_count">Tăng số lượng cột</string>
<string name="reduce_column_count">Giảm số lượng cột</string>
<string name="change_cover_image">Thay đổi ảnh bìa</string>
<string name="select_photo">Chọn ảnh</string>
<string name="volume">Âm lượng</string>
<string name="brightness">Độ sáng</string>
<string name="lock_orientation">Khóa xoay màn hình</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">Không có tập tin phương tiện cho trình chiếu được tìm thấy</string>
<!-- View types -->
<string name="change_view_type">Thay đổi kiểu xem</string>
<string name="grid">Lưới</string>
<string name="list">Danh sách</string>
<string name="group_direct_subfolders">Nhóm thư mục con trực tiếp</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Tránh hiển thị các tệp không hợp lệ</string>
<string name="show_image_file_types">Hiển thị các loại tệp hình ảnh</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Hình thu nhỏ</string>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">图库</string>
<string name="app_name">图库</string>
<string name="app_launcher_name">图库</string>
<string name="edit">编辑</string>
<string name="open_camera">打开相机</string>
@ -15,10 +15,6 @@
<string name="other_folder">其他文件夹</string>
<string name="show_on_map">在地图上显示</string>
<string name="unknown_location">未知位置</string>
<string name="increase_column_count">显示更多项目</string>
<string name="reduce_column_count">显示更少项目</string>
<string name="change_cover_image">更换封面图片</string>
<string name="select_photo">选择图片</string>
<string name="volume">音量</string>
<string name="brightness">亮度</string>
<string name="lock_orientation">锁定屏幕方向</string>
@ -32,7 +28,7 @@
<string name="dates_fixed_successfully">日期修复成功</string>
<string name="no_date_takens_found">没有找到拍摄日期</string>
<string name="share_resized">调整尺寸并分享</string>
<string name="upgraded_from_free">嘿,\n\n你似乎已经从旧的免费版应用升级。你现在可以卸载旧版本,在该版本的应用设置顶部有一个“升级到专业版”按钮。\n\n此操作会删除回收站项目取消标记收藏项目并重置应用设置。\n\n谢谢</string>
<string name="upgraded_from_free">嘿,\n\n您似乎已经从旧的免费版应用升级。您现在可以卸载旧版本,在该版本的应用设置顶部有一个“升级到专业版”按钮。\n\n此操作会删除回收站项目取消标记收藏项目并重置应用设置。\n\n谢谢</string>
<string name="switch_to_file_search">切换文件搜索范围为所有可见的文件夹</string>
<!-- Filter -->
@ -51,14 +47,14 @@
<string name="exclude">排除</string>
<string name="excluded_folders">排除的文件夹</string>
<string name="manage_excluded_folders">管理排除的文件夹</string>
<string name="exclude_folder_description">该操作仅会在“简图库”中排除显示选定的文件夹及其子文件夹。您可以在设置中管理排除的文件夹。</string>
<string name="exclude_folder_description">该操作仅会在“简图库”中排除显示选定的文件夹及其子文件夹。您可以在设置中管理排除的文件夹。</string>
<string name="exclude_folder_parent">是否排除父文件夹?</string>
<string name="excluded_activity_placeholder">此目录及其子目录中的媒体将不会在“简图库”中显示,但是其它应用可以访问。如果您想对其它应用隐藏,请使用隐藏功能。</string>
<string name="excluded_activity_placeholder">此目录及其子目录中的媒体将不会在“简图库”中显示,但是其它应用可以访问。如果您想对其它应用隐藏,请使用隐藏功能。</string>
<string name="remove_all">全部移除</string>
<string name="remove_all_description">是否移除排除列表中的所有项目?此操作不会删除文件夹本身。</string>
<string name="hidden_folders">隐藏的文件夹</string>
<string name="manage_hidden_folders">管理隐藏的文件夹</string>
<string name="hidden_folders_placeholder">看起来没有任何使用“.nomedia”文件隐藏的目录。</string>
<string name="hidden_folders_placeholder">看起来没有任何使用“.nomedia”文件隐藏的目录。</string>
<!-- Include folders -->
<string name="include_folders">包含的文件夹</string>
@ -96,7 +92,7 @@
<string name="other_aspect_ratio">其他</string> <!-- available as an option: 1:1, 4:3, 16:9, free, other -->
<!-- Set wallpaper -->
<string name="simple_wallpaper">壁纸</string>
<string name="simple_wallpaper">壁纸</string>
<string name="set_as_wallpaper">设置为壁纸</string>
<string name="set_as_wallpaper_failed">设置壁纸失败</string>
<string name="set_as_wallpaper_with">设置壁纸方式:</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">没有找到可播放幻灯片媒体文件</string>
<!-- View types -->
<string name="change_view_type">更改视图类型</string>
<string name="grid">网格</string>
<string name="list">列表</string>
<string name="group_direct_subfolders">直接分组文件夹</string>
<!-- Grouping at media thumbnails -->
@ -189,7 +182,14 @@
<string name="compromise">折中</string>
<string name="avoid_showing_invalid_files">避免显示无效的文件</string>
<string name="show_image_file_types">显示图片文件类型</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="allow_zooming_videos">允许双击来放大视频</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">缩略图</string>
@ -242,7 +242,7 @@
<string name="pesdk_text_button_alignment">对齐</string>
<string name="pesdk_text_button_bringToFront">移到最上层</string>
<string name="pesdk_text_button_delete">删除</string>
<string name="pesdk_text_text_editTextPlaceholder">的文字</string>
<string name="pesdk_text_text_editTextPlaceholder">的文字</string>
<string name="pesdk_brush_title_name">笔刷</string>
<string name="pesdk_brush_button_color">颜色</string>
<string name="pesdk_brush_button_size">尺寸</string>
@ -284,24 +284,24 @@
<string name="pesdk_common_title_pipettableColor">取色器</string>
<!-- FAQ -->
<string name="faq_1_title">如何把简图库设置为设备的默认图库?</string>
<string name="faq_1_text">首先,你需要在设备设置的“应用”菜单中找到你当前的默认图库,找到并点击“默认打开”按钮,然后点击“清除默认值”。下次当你再次打开图片或视频时,你应该会看到一个应用程序选择器,请在这里选择“简约图库”并将其设为默认应用程序。</string>
<string name="faq_1_title">如何把简图库设置为设备的默认图库?</string>
<string name="faq_1_text">首先,您需要在设备设置的“应用”菜单中找到您当前的默认图库,找到并点击“默认打开”按钮,然后点击“清除默认值”。下次当您再次打开图片或视频时,您应该会看到一个应用程序选择器,请在这里选择“简易图库”并将其设为默认应用程序。</string>
<string name="faq_2_title">我用密码锁定了本应用,但我忘记了密码。该怎么办?</string>
<string name="faq_2_text">有两种方法。你可以重新安装本应用,也可以在设置中清除此应用的数据,这将会会重置你的所有设置,但不会删除任何媒体文件。</string>
<string name="faq_2_text">有两种方法。您可以重新安装本应用,也可以在设置中清除此应用的数据,这将会会重置您的所有设置,但不会删除任何媒体文件。</string>
<string name="faq_3_title">如何让某个相册始终显示在最上面?</string>
<string name="faq_3_text">可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。也可以固定多个文件夹,固定项目将按照默认排序方法排序。</string>
<string name="faq_3_text">可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。也可以固定多个文件夹,固定项目将按照默认排序方法排序。</string>
<string name="faq_4_title">如何快进/快退视频?</string>
<string name="faq_4_text">您可以双击屏幕边缘或点击搜索栏附近的当前或总时长的文字。 如果您在应用设置中启用了在独立页面播放视频,则也可以使用水平手势。</string>
<string name="faq_5_title">文件夹的隐藏和排除有什么区别?</string>
<string name="faq_5_text">排除功能只是防止其在简图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件可以使用任何文件管理器删除它。请注意,某些设备不允许隐藏\"Camera\"\"Screenshots\"和\"Downloads\"等文件夹。</string>
<string name="faq_5_text">排除功能只是防止其在简图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件可以使用任何文件管理器删除它。请注意,某些设备不允许隐藏\"Camera\"\"Screenshots\"和\"Downloads\"等文件夹。</string>
<string name="faq_6_title">为什么会出现音乐艺术家封面或贴纸文件夹?</string>
<string name="faq_6_text">你可能会看到一些不寻常的相册出现。你可以通过长按它们并选择“排除”来排除它们。在之后的对话框中,你可以选择父文件夹,这样也许就会阻止其他相关的相册出现。</string>
<string name="faq_6_text">您可能会看到一些不寻常的相册出现。您可以通过长按它们并选择“排除”来排除它们。在之后的对话框中,您可以选择父文件夹,这样也许就会阻止其他相关的相册出现。</string>
<string name="faq_7_title">有的图片文件夹没有显示,怎么回事?</string>
<string name="faq_7_text">原因可能有很多,但解决方法很简单。只需进入设置 -> 管理包含目录,点击+号并选择到所需的文件夹。</string>
<string name="faq_8_title">如果我只想显示几个特定的文件夹,该如何操作?</string>
<string name="faq_8_text">在包含目录中添加文件夹不会自动排除其他的内容。可以做的:进入设置 -> 管理排除目录,排除根目录\"/\",然后在设置 -> 管理包含目录中添加所需的文件夹。这样就只显示选定的文件夹了,由于排除和包含都是递归的,所以排除并包含的文件夹是会显示的。</string>
<string name="faq_8_text">在包含目录中添加文件夹不会自动排除其他的内容。可以做的:进入设置 -> 管理排除目录,排除根目录\"/\",然后在设置 -> 管理包含目录中添加所需的文件夹。这样就只显示选定的文件夹了,由于排除和包含都是递归的,所以排除并包含的文件夹是会显示的。</string>
<string name="faq_10_title">可以裁剪图片吗?</string>
<string name="faq_10_text">当然,通过长按图片缩略图并选择编辑,或在全屏视图中选择编辑来打开编辑器。可以通过拖动图片边角来剪裁图像。</string>
<string name="faq_10_text">当然,通过长按图片缩略图并选择编辑,或在全屏视图中选择编辑来打开编辑器。可以通过拖动图片边角来剪裁图像。</string>
<string name="faq_11_title">我能将媒体文件缩略图分组吗?</string>
<string name="faq_11_text">当然,只需在缩略图视图中使用\"分组依据\"菜单项即可。您可以依据多个条件对文件进行分组,包括拍摄日期。如果您使用了\"显示所有文件夹内容\"功能,则可以按文件夹对它们进行分组。</string>
<string name="faq_12_title">按拍摄日期排序似乎有异常,我该如何解决?</string>
@ -309,26 +309,26 @@
<string name="faq_13_title">我看到图像上有一些色带。如何提高提高质量?</string>
<string name="faq_13_text">目前显示图像的方案在绝大多数情况下都能正常工作,如果您想要更好的图像质量,您可以在设置中启用\"以最高质量显示图像\"。</string>
<string name="faq_14_title">我隐藏了某个文件/文件夹。如何取消隐藏?</string>
<string name="faq_14_text">您可以点击主界面上的\"暂时显示隐藏的项目\"选项,或在设置中开启\"显示隐藏的项目\"。 如果想取消隐藏它,长按它并选择\"取消隐藏\"即可。 我们是通过向文件夹中添加\".nomedia\"文件来隐藏文件夹的,使用文件管理器删除该文件也可以取消隐藏。</string>
<string name="faq_14_text">您可以点击主界面上的\"暂时显示隐藏的项目\"选项,或在设置中开启\"显示隐藏的项目\"。 如果想取消隐藏它,长按它并选择\"取消隐藏\"即可。 我们是通过向文件夹中添加\".nomedia\"文件来隐藏文件夹的,使用文件管理器删除该文件也可以取消隐藏。</string>
<string name="faq_15_title">为什么应用占用了这么多的空间?</string>
<string name="faq_15_text">应用缓存最多可达250MB这样可以使图像加载更快。如果应用占用了更多空间则很可能是因为回收站中有项目。这些文件被计入应用程序大小。您可以打开回收站并删除所有文件或从应用设置中清除回收站。回收站中的内容会在30天后自动删除。</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">图库 Pro - 图片管理 &amp; 编辑</string>
<string name="app_title">图库 Pro - 图片管理 &amp; 编辑</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">使用此照片和视频库来毫无阻碍地浏览您的回忆</string>
<string name="app_long_description">
约图库 Pro 是一个高度可定制的图库。管理并编辑你的照片从回收站中恢复已删除的照片保护并隐藏文件查看RAWSVG等等多种照片和视频格式。
易图库 Pro 是一个高度可定制的图库。管理并编辑您的照片从回收站中恢复已删除的照片保护并隐藏文件查看RAWSVG等等多种照片和视频格式。
该应用不包含广告和不必要的权限。我们保护您的隐私,因为该应用不需要联网权限。
-------------------------------------------------
<b>图库 Pro 特性</b>
<b>图库 Pro 特性</b>
-------------------------------------------------
• 完全离线,没有广告或弹出窗口
• 简图库图片编辑器 裁剪,旋转,调整大小,绘制,滤镜等等
• 简图库图片编辑器 裁剪,旋转,调整大小,绘制,滤镜等等
• 无需联网权限,为您提供更多的隐私和安全
• 没有不必要的权限
• 快速搜索图像,视频和文件
@ -343,29 +343,29 @@
• 从回收站中恢复已删除的照片和视频
• 支持隐藏照片和视频
• 为您的文件创建一个可自定义的幻灯片
• 查看文件的详细信息分辨率EXIF值等等
• 查看文件的详细信息分辨率EXIF 值等等)
• 该应用是开源的
… 还有很多很多!
<b>图库照片编辑</b>
图库 Pro 可以轻松地动态编辑图片。支持裁剪、翻转、旋转、或是调整图片大小。如果您希望更有创意的话,可以添加滤镜,或是直接在图片上绘制!
图库 Pro 可以轻松地动态编辑图片。支持裁剪、翻转、旋转、或是调整图片大小。如果您希望更有创意的话,可以添加滤镜,或是直接在图片上绘制!
<b>支持多种文件类型</b>
与其他一些图库应用不同,简图库 Pro 支持多种文件类型包括JPEGPNGMP4MKVRAWSVG全景照片全景视频等等。
与其他一些图库应用不同,简图库 Pro 支持多种文件类型包括JPEGPNGMP4MKVRAWSVG全景照片全景视频等等。
<b>高度可定制的图库</b>
从UI到底部工具栏上的功能按钮图库 Pro 可高度自定义并按您的要求工作。其他图库应用可没有这种灵活性!由于该应用是开源的,所以我们还提供 32 种语言!
从UI到底部工具栏上的功能按钮图库 Pro 可高度自定义并按您的要求工作。其他图库应用可没有这种灵活性!由于该应用是开源的,所以我们还提供 32 种语言!
<b>恢复已删除的照片和视频</b>
意外删除了珍贵的照片或视频?别担心!简图库 Pro 具有方便的回收站,您可以方便地恢复已删除的照片和视频。
意外删除了珍贵的照片或视频?别担心!简图库 Pro 具有方便的回收站,您可以方便地恢复已删除的照片和视频。
<b>保护并隐藏照片、视频和文件</b>
使用密码、图案或指纹保护和隐藏照片、视频、或是整个相册。您也可以保护应用自身或禁用一些特定功能。 例如,只有指纹验证通过才可以删除文件,从而有效地防止您的文件被意外删除。
<b>查看简约系列的所有应用:</b>
<b>于此查看简易工具系列全套:</b>
https://www.simplemobiletools.com
<b>图库 Pro 的独立网站:</b>
<b>图库 Pro 的独立网站:</b>
https://www.simplemobiletools.com/gallery
<b>Facebook:</b>

View file

@ -190,6 +190,13 @@
<string name="avoid_showing_invalid_files">避免顯示無效的檔案</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">縮圖</string>

View file

@ -15,10 +15,6 @@
<string name="other_folder">其他資料夾</string>
<string name="show_on_map">在地圖上顯示</string>
<string name="unknown_location">未知的位置</string>
<string name="increase_column_count">增加欄數</string>
<string name="reduce_column_count">減少欄數</string>
<string name="change_cover_image">更換封面圖片</string>
<string name="select_photo">選擇相片</string>
<string name="volume">音量</string>
<string name="brightness">亮度</string>
<string name="lock_orientation">鎖定方向</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">找不到投影片的媒體檔案</string>
<!-- View types -->
<string name="change_view_type">改變瀏覽類型</string>
<string name="grid">格狀</string>
<string name="list">列表</string>
<string name="group_direct_subfolders">歸類子資料夾</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">避免顯示無效的檔案</string>
<string name="show_image_file_types">顯示圖片檔案類型</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">縮圖</string>

View file

@ -22,5 +22,5 @@
<dimen name="default_status_action_height">86dp</dimen>
<dimen name="widget_initial_size">110dp</dimen>
<dimen name="full_brush_size">40dp</dimen>
<dimen name="lock_padding">40dp</dimen>
<dimen name="lock_padding">30dp</dimen>
</resources>

View file

@ -15,10 +15,6 @@
<string name="other_folder">Other folder</string>
<string name="show_on_map">Show on map</string>
<string name="unknown_location">Unknown location</string>
<string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce column count</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<string name="lock_orientation">Lock orientation</string>
@ -125,9 +121,6 @@
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- View types -->
<string name="change_view_type">Change view type</string>
<string name="grid">Grid</string>
<string name="list">List</string>
<string name="group_direct_subfolders">Group direct subfolders</string>
<!-- Grouping at media thumbnails -->
@ -190,6 +183,13 @@
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="show_image_file_types">Show image file types</string>
<string name="allow_zooming_videos">Allow zooming videos with double tapping them</string>
<string name="folder_thumbnail_style">Folder thumbnail style</string>
<string name="show_file_count_line">Show file count on a separate line</string>
<string name="show_file_count_brackets">Show file count in brackets</string>
<string name="show_file_count_none">Do not show file count</string>
<string name="limit_folder_title">Limit folder title to 1 line</string>
<string name="square">Square</string>
<string name="rounded_corners">Rounded corners</string>
<!-- Setting sections -->
<string name="thumbnails">Thumbnails</string>
@ -319,7 +319,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro - Photo Manager &amp; Editor</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Browse your memories without any interruptions with this photo and video gallery</string>
<string name="app_short_description">A premium app for managing and editing your photos, videos, GIFs without ads</string>
<string name="app_long_description">
Simple Gallery Pro is a highly customizable offline gallery. Organize &amp; edit your photos, recover deleted files with the recycle bin, protect &amp; hide files and view a huge variety of different photo &amp; video formats including RAW, SVG and much more.

View file

@ -8,27 +8,26 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import androidx.core.util.Pair
import com.simplemobiletools.commons.asynctasks.CopyMoveTask
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.CONFLICT_OVERWRITE
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.REAL_FILE_PATH
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.commons.interfaces.CopyMoveListener
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.fixDateTaken
import com.simplemobiletools.gallery.pro.extensions.tryDeleteFileDirItem
import ly.img.android.pesdk.PhotoEditorSettingsList
import ly.img.android.pesdk.assets.filter.basic.FilterPackBasic
import ly.img.android.pesdk.assets.font.basic.FontPackBasic
import ly.img.android.pesdk.backend.model.config.CropAspectAsset
import ly.img.android.pesdk.backend.model.constant.ImageExportFormat
import ly.img.android.pesdk.backend.model.constant.OutputMode
import ly.img.android.pesdk.backend.model.state.BrushSettings
import ly.img.android.pesdk.backend.model.state.LoadSettings
import ly.img.android.pesdk.backend.model.state.PhotoEditorSaveSettings
import ly.img.android.pesdk.backend.model.state.SaveSettings
import ly.img.android.pesdk.backend.model.state.manager.SettingsList
import ly.img.android.pesdk.ui.activity.PhotoEditorBuilder
import ly.img.android.pesdk.ui.model.state.*
@ -37,16 +36,14 @@ import ly.img.android.pesdk.ui.panels.item.ToggleAspectItem
import ly.img.android.pesdk.ui.panels.item.ToolItem
import java.io.File
import java.io.InputStream
import kotlin.collections.set
import java.io.OutputStream
class NewEditActivity : SimpleActivity() {
private val PESDK_EDIT_IMAGE = 1
private val SETTINGS_LIST = "SETTINGS_LIST"
private val RESULT_IMAGE_PATH = "RESULT_IMAGE_PATH"
private val SOURCE_URI = "SOURCE_URI"
private val RESULT_URI = "RESULT_URI"
private var sourceFileLastModified = 0L
private var destinationFilePath = ""
private var cacheImagePathFromEditor = "" // delete the file stored at the internal app cache storage (the editor saves it there) in case moving to the selected location fails
private var sourceImageUri: Uri? = null
private var oldExif: ExifInterface? = null
private lateinit var uri: Uri
@ -108,8 +105,8 @@ class NewEditActivity : SimpleActivity() {
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (requestCode == PESDK_EDIT_IMAGE) {
val extras = resultData?.extras
cacheImagePathFromEditor = extras?.getString(RESULT_IMAGE_PATH, "") ?: ""
val resultPath = extras?.get(RESULT_URI)?.toString() ?: ""
val sourcePath = Uri.decode(extras?.get(SOURCE_URI)?.toString() ?: "")
val settings = extras?.getParcelable<SettingsList>(SETTINGS_LIST)
if (settings != null) {
val brush = settings.getSettingsModel(BrushSettings::class.java)
@ -118,45 +115,69 @@ class NewEditActivity : SimpleActivity() {
config.editorBrushSize = brush.brushSize
}
if (resultCode != Activity.RESULT_OK || sourceImageUri == null || sourceImageUri.toString().isEmpty() || cacheImagePathFromEditor.isEmpty() || sourceImageUri.toString() == cacheImagePathFromEditor) {
if (resultCode != Activity.RESULT_OK || resultPath.isEmpty()) {
toast(R.string.image_editing_cancelled)
finish()
} else {
// the image is stored at the internal app storage first, for example /data/user/0/com.simplemobiletools.gallery.pro/cache/editor/IMG_20191207_183023.jpg
// first we rename it to the desired name, then move
val sourceString = Uri.decode(sourceImageUri.toString())?.toString() ?: ""
val source = if (sourceString.isEmpty() || sourceString.startsWith("content")) {
val source = if (sourcePath.isEmpty() || sourcePath.startsWith("content")) {
internalStoragePath
} else {
sourceString.substringAfter("file://")
}
if (source == cacheImagePathFromEditor) {
finish()
return
sourcePath.substringAfter("file://")
}
SaveAsDialog(this, source, true, cancelCallback = {
toast(R.string.image_editing_failed)
finish()
}, callback = {
destinationFilePath = it
val destinationFilePath = it
handleSAFDialog(destinationFilePath) {
if (it) {
storeOldExif(source)
sourceFileLastModified = File(source).lastModified()
val newFile = File("${cacheImagePathFromEditor.getParentPath()}/${destinationFilePath.getFilenameFromPath()}")
File(cacheImagePathFromEditor).renameTo(newFile)
val sourceFile = FileDirItem(newFile.absolutePath, newFile.name)
ensureBackgroundThread {
storeOldExif(source)
sourceFileLastModified = File(source).lastModified()
val conflictResolutions = LinkedHashMap<String, Int>()
conflictResolutions[destinationFilePath] = CONFLICT_OVERWRITE
handleFileOverwriting(destinationFilePath) {
var inputStream: InputStream? = null
var outputStream: OutputStream? = null
try {
inputStream = contentResolver.openInputStream(Uri.parse(resultPath))
outputStream = getFileOutputStreamSync(destinationFilePath, destinationFilePath.getMimeType())
inputStream!!.copyTo(outputStream!!)
outputStream.flush()
inputStream.close()
outputStream.close()
val pair = Pair(arrayListOf(sourceFile), destinationFilePath.getParentPath())
CopyMoveTask(this, false, true, conflictResolutions, editCopyMoveListener, true).execute(pair)
try {
if (isNougatPlus()) {
val newExif = ExifInterface(destinationFilePath)
oldExif?.copyTo(newExif, false)
}
} catch (ignored: Exception) {
}
if (config.keepLastModified) {
// add 1 s to the last modified time to properly update the thumbnail
updateLastModified(destinationFilePath, sourceFileLastModified + 1000)
}
val paths = arrayListOf(destinationFilePath)
rescanPaths(arrayListOf(destinationFilePath)) {
fixDateTaken(paths, false)
}
setResult(Activity.RESULT_OK, intent)
toast(R.string.file_edited_successfully)
finish()
} catch (e: Exception) {
showErrorToast(e)
} finally {
inputStream?.close()
outputStream?.close()
}
}
}
} else {
toast(R.string.image_editing_failed)
File(cacheImagePathFromEditor).delete()
finish()
}
}
@ -180,43 +201,25 @@ class NewEditActivity : SimpleActivity() {
}
}
private val editCopyMoveListener = object : CopyMoveListener {
override fun copySucceeded(copyOnly: Boolean, copiedAll: Boolean, destinationPath: String) {
try {
if (isNougatPlus()) {
val newExif = ExifInterface(destinationFilePath)
oldExif?.copyTo(newExif, false)
// in case the user wants to overwrite the original file and it is on an SD card, delete it manually. Else the system just appends (1)
private fun handleFileOverwriting(path: String, callback: () -> Unit) {
if (getDoesFilePathExist(path) && isPathOnSD(path)) {
val fileDirItem = FileDirItem(path, path.getFilenameFromPath())
tryDeleteFileDirItem(fileDirItem, false, true) { success ->
if (success) {
callback()
} else {
toast(R.string.unknown_error_occurred)
finish()
}
} catch (ignored: Exception) {
}
if (config.keepLastModified) {
// add 1 s to the last modified time to properly update the thumbnail
updateLastModified(destinationFilePath, sourceFileLastModified + 1000)
}
val paths = arrayListOf(destinationFilePath)
rescanPaths(paths) {
fixDateTaken(paths, false)
}
setResult(Activity.RESULT_OK, intent)
toast(R.string.file_edited_successfully)
finish()
}
override fun copyFailed() {
toast(R.string.unknown_error_occurred)
File(cacheImagePathFromEditor).delete()
finish()
} else {
callback()
}
}
private fun openEditor(inputImage: Uri) {
sourceImageUri = inputImage
val filename = inputImage.toString().getFilenameFromPath()
val settingsList = createPesdkSettingsList(filename)
val settingsList = createPesdkSettingsList()
settingsList.configure<LoadSettings> {
it.source = inputImage
@ -225,11 +228,11 @@ class NewEditActivity : SimpleActivity() {
settingsList[LoadSettings::class].source = inputImage
PhotoEditorBuilder(this)
.setSettingsList(settingsList)
.startActivityForResult(this, PESDK_EDIT_IMAGE)
.setSettingsList(settingsList)
.startActivityForResult(this, PESDK_EDIT_IMAGE)
}
private fun createPesdkSettingsList(filename: String): PhotoEditorSettingsList {
private fun createPesdkSettingsList(): PhotoEditorSettingsList {
val settingsList = PhotoEditorSettingsList().apply {
configure<UiConfigFilter> {
it.setFilterList(FilterPackBasic.getFilterPack())
@ -285,9 +288,9 @@ class NewEditActivity : SimpleActivity() {
getSettingsModel(UiConfigTheme::class.java).theme = R.style.Imgly_Theme_NoFullscreen
configure<PhotoEditorSaveSettings> {
it.exportFormat = SaveSettings.FORMAT.AUTO
it.setOutputFilePath("$cacheDir/editor/$filename")
it.savePolicy = SaveSettings.SavePolicy.RETURN_SOURCE_OR_CREATE_OUTPUT_IF_NECESSARY
it.setExportFormat(ImageExportFormat.AUTO)
it.setOutputToTemp()
it.outputMode = OutputMode.EXPORT_IF_NECESSARY
}
}

Some files were not shown because too many files have changed in this diff Show more