mirror of
https://github.com/FossifyOrg/Gallery.git
synced 2024-11-23 04:57:59 +01:00
commit
cd0e08a273
89 changed files with 1126 additions and 751 deletions
45
CHANGELOG.md
45
CHANGELOG.md
|
@ -1,6 +1,51 @@
|
|||
Changelog
|
||||
==========
|
||||
|
||||
Version 6.12.5 *(2020-02-12)*
|
||||
----------------------------
|
||||
|
||||
* Fixed some sorting related glitches
|
||||
* Keep the old last modified value at file editing
|
||||
|
||||
Version 6.12.4 *(2020-02-11)*
|
||||
----------------------------
|
||||
|
||||
* Fixed some folder sorting related glitches
|
||||
|
||||
Version 6.12.3 *(2020-02-10)*
|
||||
----------------------------
|
||||
|
||||
* Fixed image disappearing at using the Editor
|
||||
* Properly copy over EXIF values after editing an image
|
||||
|
||||
Version 6.12.2 *(2020-02-10)*
|
||||
----------------------------
|
||||
|
||||
* Fixed some sorting and thumbnail related issues
|
||||
|
||||
Version 6.12.1 *(2020-02-10)*
|
||||
----------------------------
|
||||
|
||||
* Improved the performance of the initial screen loading
|
||||
* Fixed some editor related glitches
|
||||
|
||||
Version 6.12.0 *(2020-01-28)*
|
||||
----------------------------
|
||||
|
||||
* Properly handle sorting by date taken after using "Fix Date Taken values" on the wrong files
|
||||
* Fixed some issues at copying files, when the source was on an SD card
|
||||
* Change the way Favorite items are stored, to avoid accidental removal
|
||||
* Improved video looping (by ForgottenUmbrella)
|
||||
* Recognize a new type of panoramic photos
|
||||
* Properly remember last video playback position if the video is paused on exit
|
||||
* Properly color the top status bar icons at using light primary colors
|
||||
* Other UX and translation improvements
|
||||
|
||||
Version 6.11.8 *(2020-01-19)*
|
||||
----------------------------
|
||||
|
||||
* Reverted Glide to fix some crashes
|
||||
|
||||
Version 6.11.7 *(2020-01-16)*
|
||||
----------------------------
|
||||
|
||||
|
|
|
@ -17,8 +17,8 @@ android {
|
|||
applicationId "com.simplemobiletools.gallery.pro"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 28
|
||||
versionCode 287
|
||||
versionName "6.11.7"
|
||||
versionCode 294
|
||||
versionName "6.12.5"
|
||||
multiDexEnabled true
|
||||
setProperty("archivesBaseName", "gallery")
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
|
@ -69,11 +69,11 @@ android {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'com.simplemobiletools:commons:5.21.24'
|
||||
implementation 'com.simplemobiletools:commons:5.22.10'
|
||||
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.18'
|
||||
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
|
||||
implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6'
|
||||
implementation 'com.google.vr:sdk-panowidget:1.180.0'
|
||||
|
@ -81,10 +81,10 @@ dependencies {
|
|||
implementation 'org.apache.sanselan:sanselan:0.97-incubator'
|
||||
implementation 'com.squareup.picasso:picasso:2.71828'
|
||||
implementation 'com.caverock:androidsvg-aar:1.3'
|
||||
implementation 'com.github.tibbi:gestureviews:8dccb8450b'
|
||||
implementation 'com.github.tibbi:gestureviews:512f929d82'
|
||||
implementation 'com.github.tibbi:subsampling-scale-image-view:d404e74e39'
|
||||
|
||||
kapt 'com.github.bumptech.glide:compiler:4.11.0'
|
||||
kapt 'com.github.bumptech.glide:compiler:4.10.0'
|
||||
|
||||
kapt 'androidx.room:room-compiler:2.2.2'
|
||||
implementation 'androidx.room:room-runtime:2.2.2'
|
||||
|
@ -92,31 +92,28 @@ dependencies {
|
|||
}
|
||||
|
||||
// Apply the PESDKPlugin
|
||||
apply plugin: 'ly.img.android.pesdk'
|
||||
apply plugin: 'ly.img.android.sdk'
|
||||
|
||||
pesdkConfig {
|
||||
licencePath 'pesdk_license'
|
||||
imglyConfig {
|
||||
pesdk {
|
||||
enabled true
|
||||
licencePath 'pesdk_license'
|
||||
}
|
||||
|
||||
supportLibVersion "28.0.0"
|
||||
|
||||
modules {
|
||||
include 'ly.img.android.pesdk.operation:text'
|
||||
include 'ly.img.android.pesdk.operation:focus'
|
||||
include 'ly.img.android.pesdk.operation:brush'
|
||||
include 'ly.img.android.pesdk.operation:filter'
|
||||
include 'ly.img.android.pesdk.operation:adjustment'
|
||||
include 'ui:core'
|
||||
include 'ui:text'
|
||||
include 'ui:focus'
|
||||
include 'ui:brush'
|
||||
include 'ui:filter'
|
||||
include 'ui:transform'
|
||||
include 'ui:adjustment'
|
||||
|
||||
include 'ly.img.android.pesdk.ui.mobile_ui:core'
|
||||
include 'ly.img.android.pesdk.ui.mobile_ui:text'
|
||||
include 'ly.img.android.pesdk.ui.mobile_ui:focus'
|
||||
include 'ly.img.android.pesdk.ui.mobile_ui:brush'
|
||||
include 'ly.img.android.pesdk.ui.mobile_ui:filter'
|
||||
include 'ly.img.android.pesdk.ui.mobile_ui:transform'
|
||||
include 'ly.img.android.pesdk.ui.mobile_ui:adjustment'
|
||||
include 'backend:serializer'
|
||||
|
||||
include 'ly.img.android.pesdk:serializer'
|
||||
|
||||
include 'ly.img.android.pesdk.assets:font-basic'
|
||||
include 'ly.img.android.pesdk.assets:filter-basic'
|
||||
include 'assets:font-basic'
|
||||
include 'assets:filter-basic'
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,9 +36,7 @@ import com.simplemobiletools.gallery.pro.dialogs.ChangeViewTypeDialog
|
|||
import com.simplemobiletools.gallery.pro.dialogs.FilterMediaDialog
|
||||
import com.simplemobiletools.gallery.pro.extensions.*
|
||||
import com.simplemobiletools.gallery.pro.helpers.*
|
||||
import com.simplemobiletools.gallery.pro.interfaces.DirectoryDao
|
||||
import com.simplemobiletools.gallery.pro.interfaces.DirectoryOperationsListener
|
||||
import com.simplemobiletools.gallery.pro.interfaces.MediumDao
|
||||
import com.simplemobiletools.gallery.pro.jobs.NewPhotoFetcher
|
||||
import com.simplemobiletools.gallery.pro.models.Directory
|
||||
import com.simplemobiletools.gallery.pro.models.Medium
|
||||
|
@ -75,6 +73,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
private var mTempShowHiddenHandler = Handler()
|
||||
private var mZoomListener: MyRecyclerView.MyZoomListener? = null
|
||||
private var mSearchMenuItem: MenuItem? = null
|
||||
private var mLastMediaFetcher: MediaFetcher? = null
|
||||
private var mDirs = ArrayList<Directory>()
|
||||
|
||||
private var mStoredAnimateGifs = true
|
||||
|
@ -85,17 +84,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
private var mStoredTextColor = 0
|
||||
private var mStoredPrimaryColor = 0
|
||||
|
||||
private lateinit var mMediumDao: MediumDao
|
||||
private lateinit var mDirectoryDao: DirectoryDao
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_main)
|
||||
appLaunched(BuildConfig.APPLICATION_ID)
|
||||
|
||||
mMediumDao = galleryDB.MediumDao()
|
||||
mDirectoryDao = galleryDB.DirectoryDao()
|
||||
|
||||
if (savedInstanceState == null) {
|
||||
config.temporarilyShowHidden = false
|
||||
config.tempSkipDeleteConfirmation = false
|
||||
|
@ -253,6 +246,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
unregisterFileUpdateListener()
|
||||
|
||||
if (!config.showAll) {
|
||||
mLastMediaFetcher?.shouldStop = true
|
||||
GalleryDatabase.destroyInstance()
|
||||
}
|
||||
}
|
||||
|
@ -464,7 +458,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
val getImagesOnly = mIsPickImageIntent || mIsGetImageContentIntent
|
||||
val getVideosOnly = mIsPickVideoIntent || mIsGetVideoContentIntent
|
||||
|
||||
getCachedDirectories(getVideosOnly, getImagesOnly, mDirectoryDao) {
|
||||
getCachedDirectories(getVideosOnly, getImagesOnly) {
|
||||
gotDirectories(addTempFolderIfNeeded(it))
|
||||
}
|
||||
}
|
||||
|
@ -478,7 +472,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
private fun showSortingDialog() {
|
||||
ChangeSortingDialog(this, true, false) {
|
||||
directories_grid.adapter = null
|
||||
if (config.directorySorting and SORT_BY_DATE_MODIFIED > 0 || config.directorySorting and SORT_BY_DATE_TAKEN > 0) {
|
||||
if (config.directorySorting and SORT_BY_DATE_MODIFIED != 0 || config.directorySorting and SORT_BY_DATE_TAKEN != 0) {
|
||||
getDirectories()
|
||||
} else {
|
||||
ensureBackgroundThread {
|
||||
|
@ -569,7 +563,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
val pathsToDelete = ArrayList<String>()
|
||||
itemsToDelete.mapTo(pathsToDelete) { it.path }
|
||||
|
||||
movePathsInRecycleBin(pathsToDelete, mMediumDao) {
|
||||
movePathsInRecycleBin(pathsToDelete) {
|
||||
if (it) {
|
||||
deleteFilteredFileDirItems(itemsToDelete, folders)
|
||||
} else {
|
||||
|
@ -590,7 +584,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
ensureBackgroundThread {
|
||||
folders.filter { !getDoesFilePathExist(it.absolutePath, OTGPath) }.forEach {
|
||||
mDirectoryDao.deleteDirPath(it.absolutePath)
|
||||
directoryDao.deleteDirPath(it.absolutePath)
|
||||
}
|
||||
|
||||
if (config.deleteEmptyFolders) {
|
||||
|
@ -889,33 +883,44 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
// cached folders have been loaded, recheck folders one by one starting with the first displayed
|
||||
val mediaFetcher = MediaFetcher(applicationContext)
|
||||
mLastMediaFetcher?.shouldStop = true
|
||||
mLastMediaFetcher = MediaFetcher(applicationContext)
|
||||
val getImagesOnly = mIsPickImageIntent || mIsGetImageContentIntent
|
||||
val getVideosOnly = mIsPickVideoIntent || mIsGetVideoContentIntent
|
||||
val hiddenString = getString(R.string.hidden)
|
||||
val albumCovers = config.parseAlbumCovers()
|
||||
val includedFolders = config.includedFolders
|
||||
val tempFolderPath = config.tempFolderPath
|
||||
val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|
||||
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
|
||||
val favoritePaths = getFavoritePaths()
|
||||
val dirPathsToRemove = ArrayList<String>()
|
||||
|
||||
try {
|
||||
for (directory in dirs) {
|
||||
if (mShouldStopFetching) {
|
||||
if (mShouldStopFetching || isDestroyed || isFinishing) {
|
||||
return
|
||||
}
|
||||
|
||||
val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperFileSize, favoritePaths, false)
|
||||
val sorting = config.getFileSorting(directory.path)
|
||||
val grouping = config.getFolderGrouping(directory.path)
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
|
||||
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
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 newDir = if (curMedia.isEmpty()) {
|
||||
if (directory.path != tempFolderPath) {
|
||||
dirPathsToRemove.add(directory.path)
|
||||
}
|
||||
directory
|
||||
} else {
|
||||
createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize)
|
||||
createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
|
||||
}
|
||||
|
||||
// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed
|
||||
|
@ -931,21 +936,22 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
taken = newDir.taken
|
||||
this@apply.size = newDir.size
|
||||
types = newDir.types
|
||||
sortValue = getDirectorySortingValue(curMedia, path, name, size)
|
||||
}
|
||||
|
||||
setupAdapter(dirs)
|
||||
|
||||
// update directories and media files in the local db, delete invalid items
|
||||
updateDBDirectory(directory, mDirectoryDao)
|
||||
updateDBDirectory(directory)
|
||||
if (!directory.isRecycleBin()) {
|
||||
mMediumDao.insertAll(curMedia)
|
||||
mediaDB.insertAll(curMedia)
|
||||
}
|
||||
getCachedMedia(directory.path, getVideosOnly, getImagesOnly, mMediumDao) {
|
||||
getCachedMedia(directory.path, getVideosOnly, getImagesOnly) {
|
||||
it.forEach {
|
||||
if (!curMedia.contains(it)) {
|
||||
val path = (it as? Medium)?.path
|
||||
if (path != null) {
|
||||
deleteDBPath(mMediumDao, path)
|
||||
deleteDBPath(path)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -955,7 +961,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
if (dirPathsToRemove.isNotEmpty()) {
|
||||
val dirsToRemove = dirs.filter { dirPathsToRemove.contains(it.path) }
|
||||
dirsToRemove.forEach {
|
||||
mDirectoryDao.deleteDirPath(it.path)
|
||||
directoryDao.deleteDirPath(it.path)
|
||||
}
|
||||
dirs.removeAll(dirsToRemove)
|
||||
setupAdapter(dirs)
|
||||
|
@ -963,7 +969,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
} catch (ignored: Exception) {
|
||||
}
|
||||
|
||||
val foldersToScan = mediaFetcher.getFoldersToScan()
|
||||
val foldersToScan = mLastMediaFetcher!!.getFoldersToScan()
|
||||
foldersToScan.add(FAVORITES)
|
||||
if (config.showRecycleBinAtFolders) {
|
||||
foldersToScan.add(RECYCLE_BIN)
|
||||
|
@ -977,11 +983,23 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
// check the remaining folders which were not cached at all yet
|
||||
for (folder in foldersToScan) {
|
||||
if (mShouldStopFetching) {
|
||||
if (mShouldStopFetching || isDestroyed || isFinishing) {
|
||||
return
|
||||
}
|
||||
|
||||
val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperFileSize, favoritePaths, false)
|
||||
val sorting = config.getFileSorting(folder)
|
||||
val grouping = config.getFolderGrouping(folder)
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
|
||||
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
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)
|
||||
if (newMedia.isEmpty()) {
|
||||
continue
|
||||
}
|
||||
|
@ -995,13 +1013,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
}
|
||||
|
||||
val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize)
|
||||
val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
|
||||
dirs.add(newDir)
|
||||
setupAdapter(dirs)
|
||||
try {
|
||||
mDirectoryDao.insert(newDir)
|
||||
directoryDao.insert(newDir)
|
||||
if (folder != RECYCLE_BIN) {
|
||||
mMediumDao.insertAll(newMedia)
|
||||
mediaDB.insertAll(newMedia)
|
||||
}
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
|
@ -1156,7 +1174,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
if (config.useRecycleBin) {
|
||||
try {
|
||||
val binFolder = dirs.firstOrNull { it.path == RECYCLE_BIN }
|
||||
if (binFolder != null && mMediumDao.getDeletedMedia().isEmpty()) {
|
||||
if (binFolder != null && mediaDB.getDeletedMedia().isEmpty()) {
|
||||
invalidDirs.add(binFolder)
|
||||
}
|
||||
} catch (ignored: Exception) {
|
||||
|
@ -1168,7 +1186,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
setupAdapter(dirs)
|
||||
invalidDirs.forEach {
|
||||
try {
|
||||
mDirectoryDao.deleteDirPath(it.path)
|
||||
directoryDao.deleteDirPath(it.path)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
|
@ -1218,7 +1236,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
Handler().postDelayed({
|
||||
ensureBackgroundThread {
|
||||
try {
|
||||
mMediumDao.deleteOldRecycleBinItems(System.currentTimeMillis() - MONTH_MILLISECONDS)
|
||||
mediaDB.deleteOldRecycleBinItems(System.currentTimeMillis() - MONTH_MILLISECONDS)
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
}
|
||||
|
@ -1283,7 +1301,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
override fun updateDirectories(directories: ArrayList<Directory>) {
|
||||
ensureBackgroundThread {
|
||||
storeDirectoryItems(directories, mDirectoryDao)
|
||||
storeDirectoryItems(directories)
|
||||
removeInvalidDBDirectories()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,9 +39,7 @@ import com.simplemobiletools.gallery.pro.databases.GalleryDatabase
|
|||
import com.simplemobiletools.gallery.pro.dialogs.*
|
||||
import com.simplemobiletools.gallery.pro.extensions.*
|
||||
import com.simplemobiletools.gallery.pro.helpers.*
|
||||
import com.simplemobiletools.gallery.pro.interfaces.DirectoryDao
|
||||
import com.simplemobiletools.gallery.pro.interfaces.MediaOperationsListener
|
||||
import com.simplemobiletools.gallery.pro.interfaces.MediumDao
|
||||
import com.simplemobiletools.gallery.pro.models.Medium
|
||||
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
|
||||
import com.simplemobiletools.gallery.pro.models.ThumbnailSection
|
||||
|
@ -78,9 +76,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
private var mStoredTextColor = 0
|
||||
private var mStoredPrimaryColor = 0
|
||||
|
||||
private lateinit var mMediumDao: MediumDao
|
||||
private lateinit var mDirectoryDao: DirectoryDao
|
||||
|
||||
companion object {
|
||||
var mMedia = ArrayList<ThumbnailItem>()
|
||||
}
|
||||
|
@ -89,9 +84,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_media)
|
||||
|
||||
mMediumDao = galleryDB.MediumDao()
|
||||
mDirectoryDao = galleryDB.DirectoryDao()
|
||||
|
||||
intent.apply {
|
||||
mIsGetImageIntent = getBooleanExtra(GET_IMAGE_INTENT, false)
|
||||
mIsGetVideoIntent = getBooleanExtra(GET_VIDEO_INTENT, false)
|
||||
|
@ -495,9 +487,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
|
||||
private fun restoreAllFiles() {
|
||||
val paths = mMedia.filter { it is Medium }.map { (it as Medium).path } as ArrayList<String>
|
||||
restoreRecycleBinPaths(paths, mMediumDao) {
|
||||
restoreRecycleBinPaths(paths) {
|
||||
ensureBackgroundThread {
|
||||
mDirectoryDao.deleteDirPath(RECYCLE_BIN)
|
||||
directoryDao.deleteDirPath(RECYCLE_BIN)
|
||||
}
|
||||
finish()
|
||||
}
|
||||
|
@ -584,7 +576,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
if (mLoadedInitialPhotos) {
|
||||
startAsyncTask()
|
||||
} else {
|
||||
getCachedMedia(mPath, mIsGetVideoIntent, mIsGetImageIntent, mMediumDao) {
|
||||
getCachedMedia(mPath, mIsGetVideoIntent, mIsGetImageIntent) {
|
||||
if (it.isEmpty()) {
|
||||
runOnUiThread {
|
||||
media_refresh_layout.isRefreshing = true
|
||||
|
@ -608,7 +600,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
try {
|
||||
gotMedia(newMedia, false)
|
||||
oldMedia.filter { !newMedia.contains(it) }.mapNotNull { it as? Medium }.filter { !getDoesFilePathExist(it.path) }.forEach {
|
||||
mMediumDao.deleteMediumPath(it.path)
|
||||
mediaDB.deleteMediumPath(it.path)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
|
@ -627,7 +619,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
|
||||
if (mPath == FAVORITES) {
|
||||
ensureBackgroundThread {
|
||||
mDirectoryDao.deleteDirPath(FAVORITES)
|
||||
directoryDao.deleteDirPath(FAVORITES)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -641,7 +633,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
private fun deleteDBDirectory() {
|
||||
ensureBackgroundThread {
|
||||
try {
|
||||
mDirectoryDao.deleteDirPath(mPath)
|
||||
directoryDao.deleteDirPath(mPath)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
|
@ -897,7 +889,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
if (!isFromCache) {
|
||||
val mediaToInsert = (mMedia).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium }
|
||||
try {
|
||||
mMediumDao.insertAll(mediaToInsert)
|
||||
mediaDB.insertAll(mediaToInsert)
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
}
|
||||
|
@ -913,7 +905,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
val movingItems = resources.getQuantityString(R.plurals.moving_items_into_bin, filtered.size, filtered.size)
|
||||
toast(movingItems)
|
||||
|
||||
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>, mMediumDao) {
|
||||
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>) {
|
||||
if (it) {
|
||||
deleteFilteredFiles(filtered)
|
||||
} else {
|
||||
|
@ -940,7 +932,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
val useRecycleBin = config.useRecycleBin
|
||||
filtered.forEach {
|
||||
if (it.path.startsWith(recycleBinPath) || !useRecycleBin) {
|
||||
deleteDBPath(mMediumDao, it.path)
|
||||
deleteDBPath(it.path)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
package com.simplemobiletools.gallery.pro.activities
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.media.ExifInterface
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.provider.MediaStore
|
||||
import androidx.core.util.Pair
|
||||
|
@ -11,18 +14,21 @@ 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.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 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.state.BrushSettings
|
||||
import ly.img.android.pesdk.backend.model.state.EditorLoadSettings
|
||||
import ly.img.android.pesdk.backend.model.state.EditorSaveSettings
|
||||
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.*
|
||||
|
@ -30,8 +36,7 @@ import ly.img.android.pesdk.ui.panels.item.CropAspectItem
|
|||
import ly.img.android.pesdk.ui.panels.item.ToggleAspectItem
|
||||
import ly.img.android.pesdk.ui.panels.item.ToolItem
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
import kotlin.collections.LinkedHashMap
|
||||
import java.io.InputStream
|
||||
import kotlin.collections.set
|
||||
|
||||
class NewEditActivity : SimpleActivity() {
|
||||
|
@ -40,8 +45,9 @@ class NewEditActivity : SimpleActivity() {
|
|||
private val RESULT_IMAGE_PATH = "RESULT_IMAGE_PATH"
|
||||
private var sourceFileLastModified = 0L
|
||||
private var destinationFilePath = ""
|
||||
private var imagePathFromEditor = "" // delete the file stored at the internal app storage (the editor saves it there) in case moving to the selected location fails
|
||||
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
|
||||
private lateinit var saveUri: Uri
|
||||
|
@ -102,7 +108,7 @@ class NewEditActivity : SimpleActivity() {
|
|||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||
if (requestCode == PESDK_EDIT_IMAGE) {
|
||||
val extras = resultData?.extras
|
||||
imagePathFromEditor = extras?.getString(RESULT_IMAGE_PATH, "") ?: ""
|
||||
cacheImagePathFromEditor = extras?.getString(RESULT_IMAGE_PATH, "") ?: ""
|
||||
|
||||
val settings = extras?.getParcelable<SettingsList>(SETTINGS_LIST)
|
||||
if (settings != null) {
|
||||
|
@ -112,11 +118,11 @@ class NewEditActivity : SimpleActivity() {
|
|||
config.editorBrushSize = brush.brushSize
|
||||
}
|
||||
|
||||
if (resultCode != Activity.RESULT_OK || sourceImageUri == null || sourceImageUri.toString().isEmpty() || imagePathFromEditor.isEmpty() || sourceImageUri.toString() == imagePathFromEditor) {
|
||||
if (resultCode != Activity.RESULT_OK || sourceImageUri == null || sourceImageUri.toString().isEmpty() || cacheImagePathFromEditor.isEmpty() || sourceImageUri.toString() == cacheImagePathFromEditor) {
|
||||
toast(R.string.image_editing_failed)
|
||||
finish()
|
||||
} else {
|
||||
// the image is stored at the internal app storage first, for example /data/user/0/com.simplemobiletools.gallery.pro/files/editor/IMG_20191207_183023.jpg
|
||||
// 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")) {
|
||||
|
@ -125,6 +131,11 @@ class NewEditActivity : SimpleActivity() {
|
|||
sourceString.substringAfter("file://")
|
||||
}
|
||||
|
||||
if (source == cacheImagePathFromEditor) {
|
||||
finish()
|
||||
return
|
||||
}
|
||||
|
||||
SaveAsDialog(this, source, true, cancelCallback = {
|
||||
toast(R.string.image_editing_failed)
|
||||
finish()
|
||||
|
@ -132,9 +143,10 @@ class NewEditActivity : SimpleActivity() {
|
|||
destinationFilePath = it
|
||||
handleSAFDialog(destinationFilePath) {
|
||||
if (it) {
|
||||
storeOldExif(source)
|
||||
sourceFileLastModified = File(source).lastModified()
|
||||
val newFile = File("${imagePathFromEditor.getParentPath()}/${destinationFilePath.getFilenameFromPath()}")
|
||||
File(imagePathFromEditor).renameTo(newFile)
|
||||
val newFile = File("${cacheImagePathFromEditor.getParentPath()}/${destinationFilePath.getFilenameFromPath()}")
|
||||
File(cacheImagePathFromEditor).renameTo(newFile)
|
||||
val sourceFile = FileDirItem(newFile.absolutePath, newFile.name)
|
||||
|
||||
val conflictResolutions = LinkedHashMap<String, Int>()
|
||||
|
@ -144,7 +156,7 @@ class NewEditActivity : SimpleActivity() {
|
|||
CopyMoveTask(this, false, true, conflictResolutions, editCopyMoveListener, true).execute(pair)
|
||||
} else {
|
||||
toast(R.string.image_editing_failed)
|
||||
File(imagePathFromEditor).delete()
|
||||
File(cacheImagePathFromEditor).delete()
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
@ -154,8 +166,30 @@ class NewEditActivity : SimpleActivity() {
|
|||
super.onActivityResult(requestCode, resultCode, resultData)
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
private fun storeOldExif(sourcePath: String) {
|
||||
var inputStream: InputStream? = null
|
||||
try {
|
||||
if (isNougatPlus()) {
|
||||
inputStream = contentResolver.openInputStream(Uri.fromFile(File(sourcePath)))
|
||||
oldExif = ExifInterface(inputStream!!)
|
||||
}
|
||||
} catch (ignored: Exception) {
|
||||
} finally {
|
||||
inputStream?.close()
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
|
||||
if (config.keepLastModified) {
|
||||
// add 1 s to the last modified time to properly update the thumbnail
|
||||
updateLastModified(destinationFilePath, sourceFileLastModified + 1000)
|
||||
|
@ -173,7 +207,7 @@ class NewEditActivity : SimpleActivity() {
|
|||
|
||||
override fun copyFailed() {
|
||||
toast(R.string.unknown_error_occurred)
|
||||
File(imagePathFromEditor).delete()
|
||||
File(cacheImagePathFromEditor).delete()
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
@ -181,75 +215,82 @@ class NewEditActivity : SimpleActivity() {
|
|||
private fun openEditor(inputImage: Uri) {
|
||||
sourceImageUri = inputImage
|
||||
val filename = inputImage.toString().getFilenameFromPath()
|
||||
|
||||
val settingsList = createPesdkSettingsList(filename)
|
||||
|
||||
settingsList.getSettingsModel(EditorLoadSettings::class.java).imageSource = sourceImageUri
|
||||
settingsList.configure<LoadSettings> {
|
||||
it.source = inputImage
|
||||
}
|
||||
|
||||
settingsList[LoadSettings::class].source = inputImage
|
||||
|
||||
PhotoEditorBuilder(this)
|
||||
.setSettingsList(settingsList)
|
||||
.startActivityForResult(this, PESDK_EDIT_IMAGE)
|
||||
}
|
||||
|
||||
private fun createPesdkSettingsList(filename: String): SettingsList {
|
||||
val settingsList = SettingsList()
|
||||
settingsList.config.getAssetMap(CropAspectAsset::class.java).apply {
|
||||
add(CropAspectAsset("my_crop_1_2", 1, 2, false))
|
||||
add(CropAspectAsset("my_crop_2_1", 2, 1, false))
|
||||
add(CropAspectAsset("my_crop_19_9", 19, 9, false))
|
||||
add(CropAspectAsset("my_crop_9_19", 9, 19, false))
|
||||
add(CropAspectAsset("my_crop_5_4", 5, 4, false))
|
||||
add(CropAspectAsset("my_crop_4_5", 4, 5, false))
|
||||
add(CropAspectAsset("my_crop_37_18", 37, 18, false))
|
||||
add(CropAspectAsset("my_crop_18_37", 18, 37, false))
|
||||
add(CropAspectAsset("my_crop_16_10", 16, 10, false))
|
||||
add(CropAspectAsset("my_crop_10_16", 10, 16, false))
|
||||
private fun createPesdkSettingsList(filename: String): PhotoEditorSettingsList {
|
||||
val settingsList = PhotoEditorSettingsList().apply {
|
||||
configure<UiConfigFilter> {
|
||||
it.setFilterList(FilterPackBasic.getFilterPack())
|
||||
}
|
||||
|
||||
configure<UiConfigText> {
|
||||
it.setFontList(FontPackBasic.getFontPack())
|
||||
}
|
||||
|
||||
config.getAssetMap(CropAspectAsset::class.java).apply {
|
||||
add(CropAspectAsset("my_crop_1_2", 1, 2, false))
|
||||
add(CropAspectAsset("my_crop_2_1", 2, 1, false))
|
||||
add(CropAspectAsset("my_crop_19_9", 19, 9, false))
|
||||
add(CropAspectAsset("my_crop_9_19", 9, 19, false))
|
||||
add(CropAspectAsset("my_crop_5_4", 5, 4, false))
|
||||
add(CropAspectAsset("my_crop_4_5", 4, 5, false))
|
||||
add(CropAspectAsset("my_crop_37_18", 37, 18, false))
|
||||
add(CropAspectAsset("my_crop_18_37", 18, 37, false))
|
||||
add(CropAspectAsset("my_crop_16_10", 16, 10, false))
|
||||
add(CropAspectAsset("my_crop_10_16", 10, 16, false))
|
||||
}
|
||||
|
||||
getSettingsModel(UiConfigAspect::class.java).aspectList.apply {
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_2_1"), CropAspectItem("my_crop_1_2")))
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_19_9"), CropAspectItem("my_crop_9_19")))
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_5_4"), CropAspectItem("my_crop_4_5")))
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_37_18"), CropAspectItem("my_crop_18_37")))
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_16_10"), CropAspectItem("my_crop_10_16")))
|
||||
}
|
||||
|
||||
getSettingsModel(BrushSettings::class.java).apply {
|
||||
brushColor = applicationContext.config.editorBrushColor
|
||||
brushHardness = applicationContext.config.editorBrushHardness
|
||||
brushSize = applicationContext.config.editorBrushSize
|
||||
}
|
||||
|
||||
// do not use Text Design, it takes up too much space
|
||||
val tools = getSettingsModel(UiConfigMainMenu::class.java).toolList
|
||||
val newTools = tools.filterNot {
|
||||
it.name!!.isEmpty()
|
||||
}.toMutableList() as ArrayList<ToolItem>
|
||||
|
||||
// move Focus at the end, as it is the least used
|
||||
// on some devices it is not obvious that the toolbar can be scrolled horizontally, so move the best ones at the beginning to make them visible
|
||||
val focus = newTools.firstOrNull { it.name == getString(R.string.pesdk_focus_title_name) }
|
||||
if (focus != null) {
|
||||
newTools.remove(focus)
|
||||
newTools.add(focus)
|
||||
}
|
||||
|
||||
getSettingsModel(UiConfigMainMenu::class.java).setToolList(newTools)
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
settingsList.getSettingsModel(UiConfigAspect::class.java).aspectList.apply {
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_2_1"), CropAspectItem("my_crop_1_2")))
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_19_9"), CropAspectItem("my_crop_9_19")))
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_5_4"), CropAspectItem("my_crop_4_5")))
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_37_18"), CropAspectItem("my_crop_18_37")))
|
||||
add(ToggleAspectItem(CropAspectItem("my_crop_16_10"), CropAspectItem("my_crop_10_16")))
|
||||
}
|
||||
|
||||
settingsList.getSettingsModel(UiConfigFilter::class.java).setFilterList(
|
||||
FilterPackBasic.getFilterPack()
|
||||
)
|
||||
|
||||
settingsList.getSettingsModel(UiConfigText::class.java).setFontList(
|
||||
FontPackBasic.getFontPack()
|
||||
)
|
||||
|
||||
settingsList.getSettingsModel(BrushSettings::class.java).apply {
|
||||
brushColor = config.editorBrushColor
|
||||
brushHardness = config.editorBrushHardness
|
||||
brushSize = config.editorBrushSize
|
||||
}
|
||||
|
||||
// do not use Text Design, it takes up too much space
|
||||
val tools = settingsList.getSettingsModel(UiConfigMainMenu::class.java).toolList
|
||||
val newTools = tools.filterNot {
|
||||
it.name!!.isEmpty()
|
||||
}.toMutableList() as ArrayList<ToolItem>
|
||||
|
||||
// move Focus to the end, as it is the least used
|
||||
// on some devices it is not obvious that the toolbar can be scrolled horizontally, so move the best ones to the start to make them visible
|
||||
val focus = newTools.firstOrNull { it.name == getString(R.string.pesdk_focus_title_name) }
|
||||
if (focus != null) {
|
||||
newTools.remove(focus)
|
||||
newTools.add(focus)
|
||||
}
|
||||
|
||||
settingsList.getSettingsModel(UiConfigMainMenu::class.java).setToolList(newTools)
|
||||
|
||||
settingsList.getSettingsModel(UiConfigTheme::class.java).theme = R.style.Imgly_Theme_NoFullscreen
|
||||
|
||||
settingsList.getSettingsModel(EditorSaveSettings::class.java)
|
||||
.setExportFormat(EditorSaveSettings.FORMAT.AUTO)
|
||||
.setOutputFilePath("$filesDir/editor/$filename")
|
||||
.savePolicy = EditorSaveSettings.SavePolicy.RETURN_SOURCE_OR_CREATE_OUTPUT_IF_NECESSARY
|
||||
|
||||
return settingsList
|
||||
}
|
||||
}
|
||||
|
|
|
@ -315,7 +315,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
|
|||
val movingItems = resources.getQuantityString(R.plurals.moving_items_into_bin, filtered.size, filtered.size)
|
||||
toast(movingItems)
|
||||
|
||||
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>, galleryDB.MediumDao()) {
|
||||
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>) {
|
||||
if (it) {
|
||||
deleteFilteredFiles(filtered)
|
||||
} else {
|
||||
|
@ -342,7 +342,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
|
|||
val useRecycleBin = config.useRecycleBin
|
||||
filtered.forEach {
|
||||
if (it.path.startsWith(recycleBinPath) || !useRecycleBin) {
|
||||
deleteDBPath(galleryDB.MediumDao(), it.path)
|
||||
deleteDBPath(it.path)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,10 +13,7 @@ import com.simplemobiletools.commons.models.RadioItem
|
|||
import com.simplemobiletools.gallery.pro.R
|
||||
import com.simplemobiletools.gallery.pro.dialogs.ManageBottomActionsDialog
|
||||
import com.simplemobiletools.gallery.pro.dialogs.ManageExtendedDetailsDialog
|
||||
import com.simplemobiletools.gallery.pro.extensions.config
|
||||
import com.simplemobiletools.gallery.pro.extensions.emptyTheRecycleBin
|
||||
import com.simplemobiletools.gallery.pro.extensions.galleryDB
|
||||
import com.simplemobiletools.gallery.pro.extensions.showRecycleBinEmptyingDialog
|
||||
import com.simplemobiletools.gallery.pro.extensions.*
|
||||
import com.simplemobiletools.gallery.pro.helpers.*
|
||||
import com.simplemobiletools.gallery.pro.models.AlbumCover
|
||||
import kotlinx.android.synthetic.main.activity_settings.*
|
||||
|
@ -593,7 +590,7 @@ class SettingsActivity : SimpleActivity() {
|
|||
private fun setupEmptyRecycleBin() {
|
||||
ensureBackgroundThread {
|
||||
try {
|
||||
mRecycleBinContentSize = galleryDB.MediumDao().getDeletedMedia().sumByLong { it.size }
|
||||
mRecycleBinContentSize = mediaDB.getDeletedMedia().sumByLong { it.size }
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
runOnUiThread {
|
||||
|
|
|
@ -2,9 +2,42 @@ package com.simplemobiletools.gallery.pro.activities
|
|||
|
||||
import android.content.Intent
|
||||
import com.simplemobiletools.commons.activities.BaseSplashActivity
|
||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||
import com.simplemobiletools.gallery.pro.extensions.config
|
||||
import com.simplemobiletools.gallery.pro.extensions.favoritesDB
|
||||
import com.simplemobiletools.gallery.pro.extensions.getFavoriteFromPath
|
||||
import com.simplemobiletools.gallery.pro.extensions.mediaDB
|
||||
import com.simplemobiletools.gallery.pro.models.Favorite
|
||||
|
||||
class SplashActivity : BaseSplashActivity() {
|
||||
override fun initActivity() {
|
||||
|
||||
// check if previously selected favorite items have been properly migrated into the new Favorites table
|
||||
if (config.wereFavoritesMigrated) {
|
||||
launchActivity()
|
||||
} else {
|
||||
if (config.appRunCount == 0) {
|
||||
config.wereFavoritesMigrated = true
|
||||
launchActivity()
|
||||
} else {
|
||||
config.wereFavoritesMigrated = true
|
||||
ensureBackgroundThread {
|
||||
val favorites = ArrayList<Favorite>()
|
||||
val favoritePaths = mediaDB.getFavorites().map { it.path }.toMutableList() as ArrayList<String>
|
||||
favoritePaths.forEach {
|
||||
favorites.add(getFavoriteFromPath(it))
|
||||
}
|
||||
favoritesDB.insertAll(favorites)
|
||||
|
||||
runOnUiThread {
|
||||
launchActivity()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun launchActivity() {
|
||||
startActivity(Intent(this, MainActivity::class.java))
|
||||
finish()
|
||||
}
|
||||
|
|
|
@ -163,6 +163,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
video_duration.setOnClickListener { skip(true) }
|
||||
video_toggle_play_pause.setOnClickListener { togglePlayPause() }
|
||||
video_surface_frame.setOnClickListener { toggleFullscreen() }
|
||||
video_surface_frame.controller.settings.swallowDoubleTaps = true
|
||||
|
||||
video_next_file.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false))
|
||||
video_next_file.setOnClickListener { handleNextFile() }
|
||||
|
@ -170,8 +171,20 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
video_prev_file.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false))
|
||||
video_prev_file.setOnClickListener { handlePrevFile() }
|
||||
|
||||
|
||||
val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
|
||||
override fun onDoubleTap(e: MotionEvent?): Boolean {
|
||||
if (e != null) {
|
||||
handleDoubleTap(e.rawX)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
})
|
||||
|
||||
video_surface_frame.setOnTouchListener { view, event ->
|
||||
handleEvent(event)
|
||||
gestureDetector.onTouchEvent(event)
|
||||
false
|
||||
}
|
||||
|
||||
|
@ -179,13 +192,17 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
video_surface.surfaceTextureListener = this
|
||||
|
||||
if (config.allowVideoGestures) {
|
||||
video_brightness_controller.initialize(this, slide_info, true, video_player_holder) { x, y ->
|
||||
video_brightness_controller.initialize(this, slide_info, true, video_player_holder, singleTap = { x, y ->
|
||||
toggleFullscreen()
|
||||
}
|
||||
}, doubleTap = { x, y ->
|
||||
doSkip(false)
|
||||
})
|
||||
|
||||
video_volume_controller.initialize(this, slide_info, false, video_player_holder) { x, y ->
|
||||
video_volume_controller.initialize(this, slide_info, false, video_player_holder, singleTap = { x, y ->
|
||||
toggleFullscreen()
|
||||
}
|
||||
}, doubleTap = { x, y ->
|
||||
doSkip(true)
|
||||
})
|
||||
} else {
|
||||
video_brightness_controller.beGone()
|
||||
video_volume_controller.beGone()
|
||||
|
@ -214,6 +231,9 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
mExoPlayer = ExoPlayerFactory.newSimpleInstance(applicationContext).apply {
|
||||
seekParameters = SeekParameters.CLOSEST_SYNC
|
||||
audioStreamType = C.STREAM_TYPE_MUSIC
|
||||
if (config.loopVideos) {
|
||||
repeatMode = Player.REPEAT_MODE_ONE
|
||||
}
|
||||
prepare(audioSource)
|
||||
}
|
||||
initExoPlayerListeners()
|
||||
|
@ -231,7 +251,13 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
|
||||
override fun onLoadingChanged(isLoading: Boolean) {}
|
||||
|
||||
override fun onPositionDiscontinuity(reason: Int) {}
|
||||
override fun onPositionDiscontinuity(reason: Int) {
|
||||
// Reset progress views when video loops.
|
||||
if (reason == Player.DISCONTINUITY_REASON_PERIOD_TRANSITION) {
|
||||
video_seekbar.progress = 0
|
||||
video_curr_time.text = 0.getFormattedDuration()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onRepeatModeChanged(repeatMode: Int) {}
|
||||
|
||||
|
@ -278,6 +304,15 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
}
|
||||
}
|
||||
|
||||
private fun handleDoubleTap(x: Float) {
|
||||
val instantWidth = mScreenWidth / 7
|
||||
when {
|
||||
x <= instantWidth -> doSkip(false)
|
||||
x >= mScreenWidth - instantWidth -> doSkip(true)
|
||||
else -> togglePlayPause()
|
||||
}
|
||||
}
|
||||
|
||||
private fun resumeVideo() {
|
||||
video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline)
|
||||
if (mExoPlayer == null) {
|
||||
|
@ -338,13 +373,9 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
|
||||
clearLastVideoSavedProgress()
|
||||
mCurrTime = (mExoPlayer!!.duration / 1000).toInt()
|
||||
if (config.loopVideos) {
|
||||
resumeVideo()
|
||||
} else {
|
||||
video_seekbar.progress = video_seekbar.max
|
||||
video_curr_time.text = mDuration.getFormattedDuration()
|
||||
pauseVideo()
|
||||
}
|
||||
video_seekbar.progress = video_seekbar.max
|
||||
video_curr_time.text = mDuration.getFormattedDuration()
|
||||
pauseVideo()
|
||||
}
|
||||
|
||||
private fun didVideoEnd(): Boolean {
|
||||
|
@ -466,15 +497,16 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
}
|
||||
|
||||
private fun skip(forward: Boolean) {
|
||||
if (mExoPlayer == null) {
|
||||
return
|
||||
if (mExoPlayer != null) {
|
||||
doSkip(forward)
|
||||
}
|
||||
}
|
||||
|
||||
private fun doSkip(forward: Boolean) {
|
||||
val curr = mExoPlayer!!.currentPosition
|
||||
val twoPercents = Math.max((mExoPlayer!!.duration / 50).toInt(), MIN_SKIP_LENGTH)
|
||||
val newProgress = if (forward) curr + twoPercents else curr - twoPercents
|
||||
val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
|
||||
val roundProgress = Math.round(newProgress / 1000f)
|
||||
val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt(), roundProgress), 0)
|
||||
val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
|
||||
setPosition(limitedProgress)
|
||||
if (!mIsPlaying) {
|
||||
togglePlayPause()
|
||||
|
|
|
@ -364,8 +364,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
|
||||
if (intent.action == "com.android.camera.action.REVIEW") {
|
||||
ensureBackgroundThread {
|
||||
val mediumDao = galleryDB.MediumDao()
|
||||
if (mediumDao.getMediaFromPath(mPath).isEmpty()) {
|
||||
if (mediaDB.getMediaFromPath(mPath).isEmpty()) {
|
||||
val type = when {
|
||||
mPath.isVideoFast() -> TYPE_VIDEOS
|
||||
mPath.isGif() -> TYPE_GIFS
|
||||
|
@ -375,11 +374,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
else -> TYPE_IMAGES
|
||||
}
|
||||
|
||||
val isFavorite = mediumDao.isFavorite(mPath)
|
||||
val isFavorite = favoritesDB.isFavorite(mPath)
|
||||
val duration = if (type == TYPE_VIDEOS) mPath.getVideoDuration() else 0
|
||||
val ts = System.currentTimeMillis()
|
||||
val medium = Medium(null, mPath.getFilenameFromPath(), mPath, mPath.getParentPath(), ts, ts, File(mPath).length(), type, duration, isFavorite, 0)
|
||||
mediumDao.insert(medium)
|
||||
mediaDB.insert(medium)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -864,7 +863,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
val medium = getCurrentMedium() ?: return
|
||||
medium.isFavorite = !medium.isFavorite
|
||||
ensureBackgroundThread {
|
||||
galleryDB.MediumDao().updateFavorite(medium.path, medium.isFavorite)
|
||||
updateFavorite(medium.path, medium.isFavorite)
|
||||
if (medium.isFavorite) {
|
||||
mFavoritePaths.add(medium.path)
|
||||
} else {
|
||||
|
|
|
@ -163,7 +163,7 @@ class WidgetConfigureActivity : SimpleActivity() {
|
|||
}
|
||||
|
||||
ensureBackgroundThread {
|
||||
val path = directoryDB.getDirectoryThumbnail(folderPath)
|
||||
val path = directoryDao.getDirectoryThumbnail(folderPath)
|
||||
if (path != null) {
|
||||
runOnUiThread {
|
||||
loadJpg(path, config_image, config.cropThumbnails)
|
||||
|
|
|
@ -198,7 +198,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
|
|||
updateDirs(dirs)
|
||||
ensureBackgroundThread {
|
||||
try {
|
||||
activity.galleryDB.DirectoryDao().updateDirectoryAfterRename(firstDir.tmb, firstDir.name, firstDir.path, sourcePath)
|
||||
activity.directoryDao.updateDirectoryAfterRename(firstDir.tmb, firstDir.name, firstDir.path, sourcePath)
|
||||
listener?.refreshItems()
|
||||
} catch (e: Exception) {
|
||||
activity.showErrorToast(e)
|
||||
|
@ -555,7 +555,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
|
|||
tryEmptyRecycleBin(false)
|
||||
} else {
|
||||
ensureBackgroundThread {
|
||||
activity.galleryDB.MediumDao().clearFavorites()
|
||||
activity.mediaDB.clearFavorites()
|
||||
activity.favoritesDB.clearFavorites()
|
||||
listener?.refreshItems()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -266,10 +266,9 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
|
|||
|
||||
private fun toggleFavorites(add: Boolean) {
|
||||
ensureBackgroundThread {
|
||||
val mediumDao = activity.galleryDB.MediumDao()
|
||||
getSelectedItems().forEach {
|
||||
it.isFavorite = add
|
||||
mediumDao.updateFavorite(it.path, add)
|
||||
activity.updateFavorite(it.path, add)
|
||||
}
|
||||
activity.runOnUiThread {
|
||||
listener?.refreshItems()
|
||||
|
|
|
@ -2,6 +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.gallery.pro.extensions.config
|
||||
|
@ -18,22 +19,31 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage
|
|||
|
||||
override fun doInBackground(vararg params: Void): ArrayList<ThumbnailItem> {
|
||||
val pathToUse = if (showAll) SHOW_ALL else mPath
|
||||
val getProperDateTaken = context.config.getFileSorting(pathToUse) and SORT_BY_DATE_TAKEN != 0 || context.config.getFolderGrouping(pathToUse) and GROUP_BY_DATE_TAKEN_DAILY != 0
|
||||
val getProperFileSize = context.config.getFileSorting(pathToUse) and SORT_BY_SIZE != 0
|
||||
val folderGrouping = context.config.getFolderGrouping(pathToUse)
|
||||
val fileSorting = context.config.getFileSorting(pathToUse)
|
||||
val getProperDateTaken = fileSorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
folderGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
|
||||
folderGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
|
||||
val getProperLastModified = fileSorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
folderGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
|
||||
folderGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
|
||||
|
||||
val getProperFileSize = fileSorting and SORT_BY_SIZE != 0
|
||||
val favoritePaths = context.getFavoritePaths()
|
||||
val getVideoDurations = context.config.showThumbnailVideoDuration
|
||||
val media = if (showAll) {
|
||||
val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES && !context.config.isFolderProtected(it) }
|
||||
val media = ArrayList<Medium>()
|
||||
foldersToScan.forEach {
|
||||
val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations, false)
|
||||
val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
|
||||
media.addAll(newMedia)
|
||||
}
|
||||
|
||||
mediaFetcher.sortMedia(media, context.config.getFileSorting(SHOW_ALL))
|
||||
media
|
||||
} else {
|
||||
mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations)
|
||||
mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
|
||||
}
|
||||
return mediaFetcher.groupMedia(media, pathToUse)
|
||||
}
|
||||
|
|
|
@ -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 = 7)
|
||||
@Database(entities = [Directory::class, Medium::class, Widget::class, DateTaken::class, Favorite::class], version = 8)
|
||||
abstract class GalleryDatabase : RoomDatabase() {
|
||||
|
||||
abstract fun DirectoryDao(): DirectoryDao
|
||||
|
@ -18,9 +18,9 @@ abstract class GalleryDatabase : RoomDatabase() {
|
|||
|
||||
abstract fun WidgetsDao(): WidgetsDao
|
||||
|
||||
abstract fun DateTakensDAO(): DateTakensDAO
|
||||
abstract fun DateTakensDao(): DateTakensDao
|
||||
|
||||
abstract fun FavoritesDAO(): FavoritesDAO
|
||||
abstract fun FavoritesDao(): FavoritesDao
|
||||
|
||||
companion object {
|
||||
private var db: GalleryDatabase? = null
|
||||
|
@ -34,6 +34,7 @@ abstract class GalleryDatabase : RoomDatabase() {
|
|||
.addMigrations(MIGRATION_4_5)
|
||||
.addMigrations(MIGRATION_5_6)
|
||||
.addMigrations(MIGRATION_6_7)
|
||||
.addMigrations(MIGRATION_7_8)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
@ -61,11 +62,17 @@ abstract class GalleryDatabase : RoomDatabase() {
|
|||
private val MIGRATION_6_7 = object : Migration(6, 7) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS `date_takens` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `full_path` TEXT NOT NULL, `filename` TEXT NOT NULL, `parent_path` TEXT NOT NULL, `date_taken` INTEGER NOT NULL, `last_fixed` INTEGER NOT NULL)")
|
||||
database.execSQL("CREATE UNIQUE INDEX `index_date_takens_full_path` ON `date_takens` (`full_path`)")
|
||||
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS `favorites` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `full_path` TEXT NOT NULL, `filename` TEXT NOT NULL, `parent_path` TEXT NOT NULL)")
|
||||
|
||||
database.execSQL("CREATE UNIQUE INDEX `index_date_takens_full_path` ON `date_takens` (`full_path`)")
|
||||
database.execSQL("CREATE UNIQUE INDEX `index_favorites_full_path` ON `favorites` (`full_path`)")
|
||||
}
|
||||
}
|
||||
|
||||
private val MIGRATION_7_8 = object : Migration(7, 8) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE directories ADD COLUMN sort_value TEXT default '' NOT NULL")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ import com.simplemobiletools.gallery.pro.R
|
|||
import com.simplemobiletools.gallery.pro.activities.SimpleActivity
|
||||
import com.simplemobiletools.gallery.pro.dialogs.PickDirectoryDialog
|
||||
import com.simplemobiletools.gallery.pro.helpers.RECYCLE_BIN
|
||||
import com.simplemobiletools.gallery.pro.interfaces.MediumDao
|
||||
import com.simplemobiletools.gallery.pro.models.DateTaken
|
||||
import com.squareup.picasso.Picasso
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
|
@ -223,7 +223,7 @@ fun BaseSimpleActivity.tryDeleteFileDirItem(fileDirItem: FileDirItem, allowDelet
|
|||
deleteFile(fileDirItem, allowDeleteFolder) {
|
||||
if (deleteFromDatabase) {
|
||||
ensureBackgroundThread {
|
||||
deleteDBPath(galleryDB.MediumDao(), fileDirItem.path)
|
||||
deleteDBPath(fileDirItem.path)
|
||||
runOnUiThread {
|
||||
callback?.invoke(it)
|
||||
}
|
||||
|
@ -234,7 +234,7 @@ fun BaseSimpleActivity.tryDeleteFileDirItem(fileDirItem: FileDirItem, allowDelet
|
|||
}
|
||||
}
|
||||
|
||||
fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList<String>, mediumDao: MediumDao = galleryDB.MediumDao(), callback: ((wasSuccess: Boolean) -> Unit)?) {
|
||||
fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList<String>, callback: ((wasSuccess: Boolean) -> Unit)?) {
|
||||
ensureBackgroundThread {
|
||||
var pathsCnt = paths.size
|
||||
val OTGPath = config.OTGPath
|
||||
|
@ -261,7 +261,7 @@ fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList<String>, mediumDao
|
|||
out?.flush()
|
||||
|
||||
if (fileDocument?.getItemSize(true) == copiedSize && getDoesFilePathExist(destination)) {
|
||||
mediumDao.updateDeleted("$RECYCLE_BIN$source", System.currentTimeMillis(), source)
|
||||
mediaDB.updateDeleted("$RECYCLE_BIN$source", System.currentTimeMillis(), source)
|
||||
pathsCnt--
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
|
@ -277,7 +277,7 @@ fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList<String>, mediumDao
|
|||
val lastModified = file.lastModified()
|
||||
try {
|
||||
if (file.copyRecursively(internalFile, true)) {
|
||||
mediumDao.updateDeleted("$RECYCLE_BIN$source", System.currentTimeMillis(), source)
|
||||
mediaDB.updateDeleted("$RECYCLE_BIN$source", System.currentTimeMillis(), source)
|
||||
pathsCnt--
|
||||
|
||||
if (config.keepLastModified) {
|
||||
|
@ -295,10 +295,10 @@ fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList<String>, mediumDao
|
|||
}
|
||||
|
||||
fun BaseSimpleActivity.restoreRecycleBinPath(path: String, callback: () -> Unit) {
|
||||
restoreRecycleBinPaths(arrayListOf(path), galleryDB.MediumDao(), callback)
|
||||
restoreRecycleBinPaths(arrayListOf(path), callback)
|
||||
}
|
||||
|
||||
fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList<String>, mediumDao: MediumDao = galleryDB.MediumDao(), callback: () -> Unit) {
|
||||
fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList<String>, callback: () -> Unit) {
|
||||
ensureBackgroundThread {
|
||||
val newPaths = ArrayList<String>()
|
||||
for (source in paths) {
|
||||
|
@ -328,7 +328,7 @@ fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList<String>, mediumDa
|
|||
out?.flush()
|
||||
|
||||
if (File(source).length() == copiedSize) {
|
||||
mediumDao.updateDeleted(destination.removePrefix(recycleBinPath), 0, "$RECYCLE_BIN$destination")
|
||||
mediaDB.updateDeleted(destination.removePrefix(recycleBinPath), 0, "$RECYCLE_BIN$destination")
|
||||
}
|
||||
newPaths.add(destination)
|
||||
|
||||
|
@ -357,8 +357,8 @@ fun BaseSimpleActivity.emptyTheRecycleBin(callback: (() -> Unit)? = null) {
|
|||
ensureBackgroundThread {
|
||||
try {
|
||||
recycleBin.deleteRecursively()
|
||||
galleryDB.MediumDao().clearRecycleBin()
|
||||
galleryDB.DirectoryDao().deleteRecycleBin()
|
||||
mediaDB.clearRecycleBin()
|
||||
directoryDao.deleteRecycleBin()
|
||||
toast(R.string.recycle_bin_emptied)
|
||||
callback?.invoke()
|
||||
} catch (e: Exception) {
|
||||
|
@ -413,9 +413,10 @@ fun Activity.fixDateTaken(paths: ArrayList<String>, showToasts: Boolean, hasResc
|
|||
try {
|
||||
var didUpdateFile = false
|
||||
val operations = ArrayList<ContentProviderOperation>()
|
||||
val mediumDao = galleryDB.MediumDao()
|
||||
|
||||
ensureBackgroundThread {
|
||||
val dateTakens = ArrayList<DateTaken>()
|
||||
|
||||
for (path in paths) {
|
||||
val dateTime = ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL)
|
||||
?: ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME) ?: continue
|
||||
|
@ -442,9 +443,11 @@ fun Activity.fixDateTaken(paths: ArrayList<String>, showToasts: Boolean, hasResc
|
|||
operations.clear()
|
||||
}
|
||||
|
||||
mediumDao.updateFavoriteDateTaken(path, timestamp)
|
||||
mediaDB.updateFavoriteDateTaken(path, timestamp)
|
||||
didUpdateFile = true
|
||||
|
||||
val dateTaken = DateTaken(null, path, path.getFilenameFromPath(), path.getParentPath(), timestamp, (System.currentTimeMillis() / 1000).toInt())
|
||||
dateTakens.add(dateTaken)
|
||||
if (!hasRescanned && getFileDateTaken(path) == 0L) {
|
||||
pathsToRescan.add(path)
|
||||
}
|
||||
|
@ -456,6 +459,10 @@ fun Activity.fixDateTaken(paths: ArrayList<String>, showToasts: Boolean, hasResc
|
|||
}
|
||||
|
||||
if (hasRescanned || pathsToRescan.isEmpty()) {
|
||||
if (dateTakens.isNotEmpty()) {
|
||||
dateTakensDB.insertAll(dateTakens)
|
||||
}
|
||||
|
||||
runOnUiThread {
|
||||
if (showToasts) {
|
||||
toast(if (didUpdateFile) R.string.dates_fixed_successfully else R.string.unknown_error_occurred)
|
||||
|
|
|
@ -25,13 +25,8 @@ import com.simplemobiletools.gallery.pro.activities.SettingsActivity
|
|||
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
|
||||
import com.simplemobiletools.gallery.pro.databases.GalleryDatabase
|
||||
import com.simplemobiletools.gallery.pro.helpers.*
|
||||
import com.simplemobiletools.gallery.pro.interfaces.DirectoryDao
|
||||
import com.simplemobiletools.gallery.pro.interfaces.MediumDao
|
||||
import com.simplemobiletools.gallery.pro.interfaces.WidgetsDao
|
||||
import com.simplemobiletools.gallery.pro.models.AlbumCover
|
||||
import com.simplemobiletools.gallery.pro.models.Directory
|
||||
import com.simplemobiletools.gallery.pro.models.Medium
|
||||
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
|
||||
import com.simplemobiletools.gallery.pro.interfaces.*
|
||||
import com.simplemobiletools.gallery.pro.models.*
|
||||
import com.simplemobiletools.gallery.pro.svg.SvgSoftwareLayerSetter
|
||||
import com.simplemobiletools.gallery.pro.views.MySquareImageView
|
||||
import pl.droidsonroids.gif.GifDrawable
|
||||
|
@ -113,11 +108,15 @@ fun Context.launchSettings() {
|
|||
|
||||
val Context.config: Config get() = Config.newInstance(applicationContext)
|
||||
|
||||
val Context.galleryDB: GalleryDatabase get() = GalleryDatabase.getInstance(applicationContext)
|
||||
|
||||
val Context.widgetsDB: WidgetsDao get() = GalleryDatabase.getInstance(applicationContext).WidgetsDao()
|
||||
|
||||
val Context.directoryDB: DirectoryDao get() = GalleryDatabase.getInstance(applicationContext).DirectoryDao()
|
||||
val Context.mediaDB: MediumDao get() = GalleryDatabase.getInstance(applicationContext).MediumDao()
|
||||
|
||||
val Context.directoryDao: DirectoryDao get() = GalleryDatabase.getInstance(applicationContext).DirectoryDao()
|
||||
|
||||
val Context.favoritesDB: FavoritesDao get() = GalleryDatabase.getInstance(applicationContext).FavoritesDao()
|
||||
|
||||
val Context.dateTakensDB: DateTakensDao get() = GalleryDatabase.getInstance(applicationContext).DateTakensDao()
|
||||
|
||||
val Context.recycleBin: File get() = filesDir
|
||||
|
||||
|
@ -166,25 +165,26 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
|
|||
dirs.sortWith(Comparator { o1, o2 ->
|
||||
o1 as Directory
|
||||
o2 as Directory
|
||||
|
||||
var result = when {
|
||||
sorting and SORT_BY_NAME != 0 -> {
|
||||
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
|
||||
AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase())
|
||||
AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase())
|
||||
} else {
|
||||
o1.name.toLowerCase().compareTo(o2.name.toLowerCase())
|
||||
o1.sortValue.toLowerCase().compareTo(o2.sortValue.toLowerCase())
|
||||
}
|
||||
}
|
||||
sorting and SORT_BY_PATH != 0 -> {
|
||||
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
|
||||
AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
|
||||
AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase())
|
||||
} else {
|
||||
o1.path.toLowerCase().compareTo(o2.path.toLowerCase())
|
||||
o1.sortValue.toLowerCase().compareTo(o2.sortValue.toLowerCase())
|
||||
}
|
||||
}
|
||||
sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
|
||||
sorting and SORT_BY_SIZE != 0 -> o1.size.compareTo(o2.size)
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 -> o1.modified.compareTo(o2.modified)
|
||||
else -> o1.taken.compareTo(o2.taken)
|
||||
sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase())
|
||||
sorting and SORT_BY_SIZE != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
|
||||
else -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
|
||||
}
|
||||
|
||||
if (sorting and SORT_DESCENDING != 0) {
|
||||
|
@ -253,7 +253,7 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
|
|||
val parent = File(path).parent
|
||||
if (parent != null && !folders.contains(parent) && dirs.none { it.path == parent }) {
|
||||
currentPaths.add(parent)
|
||||
val isSortingAscending = config.sorting and SORT_DESCENDING == 0
|
||||
val isSortingAscending = config.sorting.isSortingAscending()
|
||||
val subDirs = dirs.filter { File(it.path).parent.equals(File(path).parent, true) } as ArrayList<Directory>
|
||||
if (subDirs.isNotEmpty()) {
|
||||
val lastModified = if (isSortingAscending) {
|
||||
|
@ -282,7 +282,8 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
|
|||
dateTaken,
|
||||
subDirs.sumByLong { it.size },
|
||||
getPathLocation(parent),
|
||||
mediaTypes)
|
||||
mediaTypes,
|
||||
"")
|
||||
|
||||
directory.containsMediaFilesDirectly = false
|
||||
dirs.add(directory)
|
||||
|
@ -400,16 +401,15 @@ fun Context.rescanFolderMediaSync(path: String) {
|
|||
GetMediaAsynctask(applicationContext, path, false, false, false) {
|
||||
ensureBackgroundThread {
|
||||
val newMedia = it
|
||||
val mediumDao = galleryDB.MediumDao()
|
||||
val media = newMedia.filter { it is Medium } as ArrayList<Medium>
|
||||
try {
|
||||
mediumDao.insertAll(media)
|
||||
mediaDB.insertAll(media)
|
||||
|
||||
cached.forEach {
|
||||
if (!newMedia.contains(it)) {
|
||||
val mediumPath = (it as? Medium)?.path
|
||||
if (mediumPath != null) {
|
||||
deleteDBPath(mediumDao, mediumPath)
|
||||
deleteDBPath(mediumPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -420,7 +420,7 @@ fun Context.rescanFolderMediaSync(path: String) {
|
|||
}
|
||||
}
|
||||
|
||||
fun Context.storeDirectoryItems(items: ArrayList<Directory>, directoryDao: DirectoryDao) {
|
||||
fun Context.storeDirectoryItems(items: ArrayList<Directory>) {
|
||||
ensureBackgroundThread {
|
||||
directoryDao.insertAll(items)
|
||||
}
|
||||
|
@ -481,7 +481,7 @@ fun Context.addTempFolderIfNeeded(dirs: ArrayList<Directory>): ArrayList<Directo
|
|||
val tempFolderPath = config.tempFolderPath
|
||||
return if (tempFolderPath.isNotEmpty()) {
|
||||
val directories = ArrayList<Directory>()
|
||||
val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0)
|
||||
val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0, "")
|
||||
directories.add(newFolder)
|
||||
directories.addAll(dirs)
|
||||
directories
|
||||
|
@ -559,7 +559,7 @@ fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boo
|
|||
.into(target)
|
||||
}
|
||||
|
||||
fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, directoryDao: DirectoryDao = galleryDB.DirectoryDao(), forceShowHidden: Boolean = false, callback: (ArrayList<Directory>) -> Unit) {
|
||||
fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, callback: (ArrayList<Directory>) -> Unit) {
|
||||
ensureBackgroundThread {
|
||||
val directories = try {
|
||||
directoryDao.getAll() as ArrayList<Directory>
|
||||
|
@ -602,22 +602,21 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
|
|||
val clone = filteredDirectories.clone() as ArrayList<Directory>
|
||||
callback(clone.distinctBy { it.path.getDistinctPath() } as ArrayList<Directory>)
|
||||
|
||||
removeInvalidDBDirectories(filteredDirectories, directoryDao)
|
||||
removeInvalidDBDirectories(filteredDirectories)
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, mediumDao: MediumDao = galleryDB.MediumDao(),
|
||||
callback: (ArrayList<ThumbnailItem>) -> Unit) {
|
||||
fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList<ThumbnailItem>) -> Unit) {
|
||||
ensureBackgroundThread {
|
||||
val mediaFetcher = MediaFetcher(this)
|
||||
val foldersToScan = if (path.isEmpty()) mediaFetcher.getFoldersToScan() else arrayListOf(path)
|
||||
var media = ArrayList<Medium>()
|
||||
if (path == FAVORITES) {
|
||||
media.addAll(mediumDao.getFavorites())
|
||||
media.addAll(mediaDB.getFavorites())
|
||||
}
|
||||
|
||||
if (path == RECYCLE_BIN) {
|
||||
media.addAll(getUpdatedDeletedMedia(mediumDao))
|
||||
media.addAll(getUpdatedDeletedMedia())
|
||||
}
|
||||
|
||||
if (config.filterMedia and TYPE_PORTRAITS != 0) {
|
||||
|
@ -634,7 +633,7 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
|
|||
val shouldShowHidden = config.shouldShowHidden
|
||||
foldersToScan.filter { path.isNotEmpty() || !config.isFolderProtected(it) }.forEach {
|
||||
try {
|
||||
val currMedia = mediumDao.getMediaFromPath(it)
|
||||
val currMedia = mediaDB.getMediaFromPath(it)
|
||||
media.addAll(currMedia)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
|
@ -667,7 +666,7 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
|
|||
val mediaToDelete = ArrayList<Medium>()
|
||||
media.filter { !getDoesFilePathExist(it.path, OTGPath) }.forEach {
|
||||
if (it.path.startsWith(recycleBinPath)) {
|
||||
deleteDBPath(mediumDao, it.path)
|
||||
deleteDBPath(it.path)
|
||||
} else {
|
||||
mediaToDelete.add(it)
|
||||
}
|
||||
|
@ -675,14 +674,18 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
|
|||
|
||||
try {
|
||||
if (mediaToDelete.isNotEmpty()) {
|
||||
mediumDao.deleteMedia(*mediaToDelete.toTypedArray())
|
||||
mediaDB.deleteMedia(*mediaToDelete.toTypedArray())
|
||||
|
||||
mediaToDelete.filter { it.isFavorite }.forEach {
|
||||
favoritesDB.deleteFavoritePath(it.path)
|
||||
}
|
||||
}
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.removeInvalidDBDirectories(dirs: ArrayList<Directory>? = null, directoryDao: DirectoryDao = galleryDB.DirectoryDao()) {
|
||||
fun Context.removeInvalidDBDirectories(dirs: ArrayList<Directory>? = null) {
|
||||
val dirsToCheck = dirs ?: directoryDao.getAll()
|
||||
val OTGPath = config.OTGPath
|
||||
dirsToCheck.filter { !it.areFavorites() && !it.isRecycleBin() && !getDoesFilePathExist(it.path, OTGPath) && it.path != config.tempFolderPath }.forEach {
|
||||
|
@ -697,14 +700,15 @@ fun Context.updateDBMediaPath(oldPath: String, newPath: String) {
|
|||
val newFilename = newPath.getFilenameFromPath()
|
||||
val newParentPath = newPath.getParentPath()
|
||||
try {
|
||||
galleryDB.MediumDao().updateMedium(oldPath, newParentPath, newFilename, newPath)
|
||||
mediaDB.updateMedium(newFilename, newPath, newParentPath, oldPath)
|
||||
favoritesDB.updateFavorite(newFilename, newPath, newParentPath, oldPath)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.updateDBDirectory(directory: Directory, directoryDao: DirectoryDao) {
|
||||
fun Context.updateDBDirectory(directory: Directory) {
|
||||
try {
|
||||
directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types)
|
||||
directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types, directory.sortValue)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
|
@ -715,16 +719,26 @@ fun Context.getOTGFolderChildrenNames(path: String) = getOTGFolderChildren(path)
|
|||
|
||||
fun Context.getFavoritePaths(): ArrayList<String> {
|
||||
return try {
|
||||
galleryDB.MediumDao().getFavoritePaths() as ArrayList<String>
|
||||
favoritesDB.getValidFavoritePaths() as ArrayList<String>
|
||||
} catch (e: Exception) {
|
||||
ArrayList()
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.getFavoriteFromPath(path: String) = Favorite(null, path, path.getFilenameFromPath(), path.getParentPath())
|
||||
|
||||
fun Context.updateFavorite(path: String, isFavorite: Boolean) {
|
||||
if (isFavorite) {
|
||||
favoritesDB.insert(getFavoriteFromPath(path))
|
||||
} else {
|
||||
favoritesDB.deleteFavoritePath(path)
|
||||
}
|
||||
}
|
||||
|
||||
// remove the "recycle_bin" from the file path prefix, replace it with real bin path /data/user...
|
||||
fun Context.getUpdatedDeletedMedia(mediumDao: MediumDao): ArrayList<Medium> {
|
||||
fun Context.getUpdatedDeletedMedia(): ArrayList<Medium> {
|
||||
val media = try {
|
||||
mediumDao.getDeletedMedia() as ArrayList<Medium>
|
||||
mediaDB.getDeletedMedia() as ArrayList<Medium>
|
||||
} catch (ignored: Exception) {
|
||||
ArrayList<Medium>()
|
||||
}
|
||||
|
@ -735,9 +749,14 @@ fun Context.getUpdatedDeletedMedia(mediumDao: MediumDao): ArrayList<Medium> {
|
|||
return media
|
||||
}
|
||||
|
||||
fun Context.deleteDBPath(mediumDao: MediumDao, path: String) {
|
||||
fun Context.deleteDBPath(path: String) {
|
||||
deleteMediumWithPath(path.replaceFirst(recycleBinPath, RECYCLE_BIN))
|
||||
}
|
||||
|
||||
fun Context.deleteMediumWithPath(path: String) {
|
||||
try {
|
||||
mediumDao.deleteMediumPath(path.replaceFirst(recycleBinPath, RECYCLE_BIN))
|
||||
mediaDB.deleteMediumPath(path)
|
||||
favoritesDB.deleteFavoritePath(path)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
|
@ -826,32 +845,39 @@ fun Context.addPathToDB(path: String) {
|
|||
}
|
||||
|
||||
try {
|
||||
val mediumDao = galleryDB.MediumDao()
|
||||
val isFavorite = mediumDao.isFavorite(path)
|
||||
val isFavorite = favoritesDB.isFavorite(path)
|
||||
val videoDuration = if (type == TYPE_VIDEOS) path.getVideoDuration() else 0
|
||||
val medium = Medium(null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(),
|
||||
File(path).length(), type, videoDuration, isFavorite, 0L)
|
||||
|
||||
mediumDao.insert(medium)
|
||||
mediaDB.insert(medium)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList<Medium>, albumCovers: ArrayList<AlbumCover>, hiddenString: String,
|
||||
includedFolders: MutableSet<String>, isSortingAscending: Boolean, getProperFileSize: Boolean): Directory {
|
||||
includedFolders: MutableSet<String>, getProperFileSize: Boolean): Directory {
|
||||
val OTGPath = config.OTGPath
|
||||
var thumbnail = curMedia.firstOrNull { getDoesFilePathExist(it.path, OTGPath) }?.path ?: ""
|
||||
val grouped = MediaFetcher(this).groupMedia(curMedia, path)
|
||||
var thumbnail: String? = null
|
||||
|
||||
albumCovers.forEach {
|
||||
if (it.path == path && getDoesFilePathExist(it.tmb, OTGPath)) {
|
||||
thumbnail = it.tmb
|
||||
}
|
||||
}
|
||||
|
||||
if (config.OTGPath.isNotEmpty() && thumbnail.startsWith(config.OTGPath)) {
|
||||
thumbnail = thumbnail.getOTGPublicPath(applicationContext)
|
||||
if (thumbnail == null) {
|
||||
val sortedMedia = grouped.filter { it is Medium }.toMutableList() as ArrayList<Medium>
|
||||
thumbnail = sortedMedia.firstOrNull { getDoesFilePathExist(it.path, OTGPath) }?.path ?: ""
|
||||
}
|
||||
|
||||
if (config.OTGPath.isNotEmpty() && thumbnail!!.startsWith(config.OTGPath)) {
|
||||
thumbnail = thumbnail!!.getOTGPublicPath(applicationContext)
|
||||
}
|
||||
|
||||
val isSortingAscending = config.directorySorting.isSortingAscending()
|
||||
val defaultMedium = Medium(0, "", "", "", 0L, 0L, 0L, 0, 0, false, 0L)
|
||||
val firstItem = curMedia.firstOrNull() ?: defaultMedium
|
||||
val lastItem = curMedia.lastOrNull() ?: defaultMedium
|
||||
|
@ -860,7 +886,34 @@ fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList<Medium>,
|
|||
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
|
||||
val mediaTypes = curMedia.getDirMediaTypes()
|
||||
return Directory(null, path, thumbnail, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes)
|
||||
val sortValue = getDirectorySortingValue(curMedia, path, dirName, size)
|
||||
return Directory(null, path, thumbnail!!, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes, sortValue)
|
||||
}
|
||||
|
||||
fun Context.getDirectorySortingValue(media: ArrayList<Medium>, path: String, name: String, size: Long): String {
|
||||
val sorting = config.directorySorting
|
||||
val sorted = when {
|
||||
sorting and SORT_BY_NAME != 0 -> return name
|
||||
sorting and SORT_BY_PATH != 0 -> return path
|
||||
sorting and SORT_BY_SIZE != 0 -> return size.toString()
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 -> media.sortedBy { it.modified }
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 -> media.sortedBy { it.taken }
|
||||
else -> media
|
||||
}
|
||||
|
||||
val relevantMedium = if (sorting.isSortingAscending()) {
|
||||
sorted.firstOrNull() ?: return ""
|
||||
} else {
|
||||
sorted.lastOrNull() ?: return ""
|
||||
}
|
||||
|
||||
val result: Any = when {
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 -> relevantMedium.modified
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 -> relevantMedium.taken
|
||||
else -> 0
|
||||
}
|
||||
|
||||
return result.toString()
|
||||
}
|
||||
|
||||
fun Context.updateDirectoryPath(path: String) {
|
||||
|
@ -870,13 +923,24 @@ fun Context.updateDirectoryPath(path: String) {
|
|||
val hiddenString = getString(R.string.hidden)
|
||||
val albumCovers = config.parseAlbumCovers()
|
||||
val includedFolders = config.includedFolders
|
||||
val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|
||||
|
||||
val sorting = config.getFileSorting(path)
|
||||
val grouping = config.getFolderGrouping(path)
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
|
||||
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
|
||||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
|
||||
|
||||
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
|
||||
val favoritePaths = getFavoritePaths()
|
||||
val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperFileSize, favoritePaths, false)
|
||||
val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize)
|
||||
updateDBDirectory(directory, galleryDB.DirectoryDao())
|
||||
val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
|
||||
val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
|
||||
updateDBDirectory(directory)
|
||||
}
|
||||
|
||||
fun Context.getFileDateTaken(path: String): Long {
|
||||
|
@ -902,5 +966,3 @@ fun Context.getFileDateTaken(path: String): Long {
|
|||
|
||||
return 0L
|
||||
}
|
||||
|
||||
fun Context.isChromebook() = packageManager.hasSystemFeature("org.chromium.arc.device_management")
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
package com.simplemobiletools.gallery.pro.extensions
|
||||
|
||||
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
|
||||
|
||||
fun Int.isSortingAscending() = this and SORT_DESCENDING == 0
|
|
@ -111,7 +111,7 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
instant_prev_item.parentView = container
|
||||
instant_next_item.parentView = container
|
||||
|
||||
photo_brightness_controller.initialize(activity!!, slide_info, true, container) { x, y ->
|
||||
photo_brightness_controller.initialize(activity!!, slide_info, true, container, singleTap = { x, y ->
|
||||
mView.apply {
|
||||
if (subsampling_view.isVisible()) {
|
||||
subsampling_view.sendFakeClick(x, y)
|
||||
|
@ -119,7 +119,7 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
gestures_view.sendFakeClick(x, y)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
if (context.config.allowDownGesture) {
|
||||
gif_view.setOnTouchListener { v, event ->
|
||||
|
@ -657,7 +657,9 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
mIsPanorama = try {
|
||||
val inputStream = if (mMedium.path.startsWith("content:/")) context!!.contentResolver.openInputStream(Uri.parse(mMedium.path)) else File(mMedium.path).inputStream()
|
||||
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:UsePanoramaViewer=\"True\"", true) ||
|
||||
imageParser.contains("<GPano:UsePanoramaViewer>True</GPano:UsePanoramaViewer>", true) ||
|
||||
imageParser.contains("GPano:FullPanoWidthPixels=")
|
||||
} catch (e: Exception) {
|
||||
false
|
||||
} catch (e: OutOfMemoryError) {
|
||||
|
@ -765,9 +767,8 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
}
|
||||
|
||||
private fun updateInstantSwitchWidths() {
|
||||
val newWidth = resources.getDimension(R.dimen.instant_change_bar_width) + if (activity?.portrait == false) activity!!.navigationBarWidth else 0
|
||||
mView.instant_prev_item.layoutParams.width = newWidth.toInt()
|
||||
mView.instant_next_item.layoutParams.width = newWidth.toInt()
|
||||
mView.instant_prev_item.layoutParams.width = mScreenWidth / 7
|
||||
mView.instant_next_item.layoutParams.width = mScreenWidth / 7
|
||||
}
|
||||
|
||||
override fun fullscreenToggled(isFullscreen: Boolean) {
|
||||
|
|
|
@ -81,14 +81,13 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mMedium = arguments!!.getSerializable(MEDIUM) as Medium
|
||||
mConfig = context!!.config
|
||||
mView = inflater.inflate(R.layout.pager_video_item, container, false).apply {
|
||||
instant_prev_item.setOnClickListener { listener?.goToPrevItem() }
|
||||
instant_next_item.setOnClickListener { listener?.goToNextItem() }
|
||||
panorama_outline.setOnClickListener { openPanorama() }
|
||||
video_curr_time.setOnClickListener { skip(false) }
|
||||
video_duration.setOnClickListener { skip(true) }
|
||||
video_holder.setOnClickListener { toggleFullscreen() }
|
||||
video_preview.setOnClickListener { toggleFullscreen() }
|
||||
video_surface_frame.setOnClickListener { toggleFullscreen() }
|
||||
video_surface_frame.controller.settings.swallowDoubleTaps = true
|
||||
|
||||
video_play_outline.setOnClickListener {
|
||||
if (mConfig.openVideosOnSeparateScreen) {
|
||||
launchVideoPlayer()
|
||||
|
@ -114,6 +113,33 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mTextureView = video_surface
|
||||
mTextureView.surfaceTextureListener = this@VideoFragment
|
||||
|
||||
val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
|
||||
override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
|
||||
if (!mConfig.allowInstantChange) {
|
||||
toggleFullscreen()
|
||||
return true
|
||||
}
|
||||
|
||||
val viewWidth = width
|
||||
val instantWidth = viewWidth / 7
|
||||
val clickedX = e?.rawX ?: 0f
|
||||
when {
|
||||
clickedX <= instantWidth -> listener?.goToPrevItem()
|
||||
clickedX >= viewWidth - instantWidth -> listener?.goToNextItem()
|
||||
else -> toggleFullscreen()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onDoubleTap(e: MotionEvent?): Boolean {
|
||||
if (e != null) {
|
||||
handleDoubleTap(e.rawX)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
})
|
||||
|
||||
if (mConfig.allowDownGesture) {
|
||||
video_preview.setOnTouchListener { view, event ->
|
||||
handleEvent(event)
|
||||
|
@ -124,8 +150,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
if (video_surface_frame.controller.state.zoom == 1f) {
|
||||
handleEvent(event)
|
||||
}
|
||||
|
||||
gestureDetector.onTouchEvent(event)
|
||||
false
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -171,13 +200,25 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
setVideoSize()
|
||||
|
||||
mView.apply {
|
||||
mBrightnessSideScroll.initialize(activity!!, slide_info, true, container) { x, y ->
|
||||
video_holder.performClick()
|
||||
}
|
||||
mBrightnessSideScroll.initialize(activity!!, slide_info, true, container, singleTap = { x, y ->
|
||||
if (mConfig.allowInstantChange) {
|
||||
listener?.goToPrevItem()
|
||||
} else {
|
||||
toggleFullscreen()
|
||||
}
|
||||
}, doubleTap = { x, y ->
|
||||
doSkip(false)
|
||||
})
|
||||
|
||||
mVolumeSideScroll.initialize(activity!!, slide_info, false, container) { x, y ->
|
||||
video_holder.performClick()
|
||||
}
|
||||
mVolumeSideScroll.initialize(activity!!, slide_info, false, container, singleTap = { x, y ->
|
||||
if (mConfig.allowInstantChange) {
|
||||
listener?.goToNextItem()
|
||||
} else {
|
||||
toggleFullscreen()
|
||||
}
|
||||
}, doubleTap = { x, y ->
|
||||
doSkip(true)
|
||||
})
|
||||
|
||||
video_surface.onGlobalLayout {
|
||||
if (mIsFragmentVisible && mConfig.autoplayVideos && !mConfig.openVideosOnSeparateScreen) {
|
||||
|
@ -192,7 +233,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
restoreLastVideoSavedPosition()
|
||||
}
|
||||
|
||||
updateInstantSwitchWidths()
|
||||
return mView
|
||||
}
|
||||
|
||||
|
@ -201,17 +241,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mConfig = context!!.config // make sure we get a new config, in case the user changed something in the app settings
|
||||
activity!!.updateTextColors(mView.video_holder)
|
||||
val allowVideoGestures = mConfig.allowVideoGestures
|
||||
val allowInstantChange = mConfig.allowInstantChange
|
||||
mTextureView.beGoneIf(mConfig.openVideosOnSeparateScreen || mIsPanorama)
|
||||
mView.apply {
|
||||
video_surface_frame.beGoneIf(mTextureView.isGone())
|
||||
mView.video_surface_frame.beGoneIf(mTextureView.isGone())
|
||||
|
||||
video_volume_controller.beVisibleIf(allowVideoGestures && !mIsPanorama)
|
||||
video_brightness_controller.beVisibleIf(allowVideoGestures && !mIsPanorama)
|
||||
|
||||
instant_prev_item.beVisibleIf(allowInstantChange)
|
||||
instant_next_item.beVisibleIf(allowInstantChange)
|
||||
}
|
||||
mVolumeSideScroll.beVisibleIf(allowVideoGestures && !mIsPanorama)
|
||||
mBrightnessSideScroll.beVisibleIf(allowVideoGestures && !mIsPanorama)
|
||||
|
||||
checkExtendedDetails()
|
||||
initTimeHolder()
|
||||
|
@ -251,7 +285,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
setVideoSize()
|
||||
initTimeHolder()
|
||||
checkExtendedDetails()
|
||||
updateInstantSwitchWidths()
|
||||
mView.video_surface_frame.onGlobalLayout {
|
||||
mView.video_surface_frame.controller.resetState()
|
||||
}
|
||||
|
@ -273,8 +306,12 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
|
||||
private fun saveVideoProgress() {
|
||||
if (!videoEnded() && mExoPlayer != null) {
|
||||
mConfig.saveLastVideoPosition(mMedium.path, mExoPlayer!!.currentPosition.toInt() / 1000)
|
||||
if (!videoEnded()) {
|
||||
if (mExoPlayer != null) {
|
||||
mConfig.saveLastVideoPosition(mMedium.path, mExoPlayer!!.currentPosition.toInt() / 1000)
|
||||
} else {
|
||||
mConfig.saveLastVideoPosition(mMedium.path, mPositionAtPause.toInt() / 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -313,6 +350,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
|
||||
mExoPlayer = ExoPlayerFactory.newSimpleInstance(context)
|
||||
mExoPlayer!!.seekParameters = SeekParameters.CLOSEST_SYNC
|
||||
if (mConfig.loopVideos) {
|
||||
mExoPlayer?.repeatMode = Player.REPEAT_MODE_ONE
|
||||
}
|
||||
|
||||
val isContentUri = mMedium.path.startsWith("content://")
|
||||
val uri = if (isContentUri) Uri.parse(mMedium.path) else Uri.fromFile(File(mMedium.path))
|
||||
|
@ -346,7 +386,13 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
|
||||
override fun onLoadingChanged(isLoading: Boolean) {}
|
||||
|
||||
override fun onPositionDiscontinuity(reason: Int) {}
|
||||
override fun onPositionDiscontinuity(reason: Int) {
|
||||
// Reset progress views when video loops.
|
||||
if (reason == Player.DISCONTINUITY_REASON_PERIOD_TRANSITION) {
|
||||
mSeekBar.progress = 0
|
||||
mCurrTimeView.text = 0.getFormattedDuration()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onRepeatModeChanged(repeatMode: Int) {}
|
||||
|
||||
|
@ -381,6 +427,16 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
listener?.fragmentClicked()
|
||||
}
|
||||
|
||||
private fun handleDoubleTap(x: Float) {
|
||||
val viewWidth = mView.width
|
||||
val instantWidth = viewWidth / 7
|
||||
when {
|
||||
x <= instantWidth -> doSkip(false)
|
||||
x >= viewWidth - instantWidth -> doSkip(true)
|
||||
else -> togglePlayPause()
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkExtendedDetails() {
|
||||
if (mConfig.showExtendedDetails) {
|
||||
mView.video_details.apply {
|
||||
|
@ -440,12 +496,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
}
|
||||
|
||||
private fun updateInstantSwitchWidths() {
|
||||
val newWidth = resources.getDimension(R.dimen.instant_change_bar_width) + if (activity?.portrait == false) activity!!.navigationBarWidth else 0
|
||||
mView.instant_prev_item.layoutParams.width = newWidth.toInt()
|
||||
mView.instant_next_item.layoutParams.width = newWidth.toInt()
|
||||
}
|
||||
|
||||
override fun fullscreenToggled(isFullscreen: Boolean) {
|
||||
mIsFullscreen = isFullscreen
|
||||
val newAlpha = if (isFullscreen) 0f else 1f
|
||||
|
@ -492,11 +542,14 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
|
||||
mPositionAtPause = 0L
|
||||
doSkip(forward)
|
||||
}
|
||||
|
||||
private fun doSkip(forward: Boolean) {
|
||||
val curr = mExoPlayer!!.currentPosition
|
||||
val twoPercents = Math.max((mExoPlayer!!.duration / 50).toInt(), MIN_SKIP_LENGTH)
|
||||
val newProgress = if (forward) curr + twoPercents else curr - twoPercents
|
||||
val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
|
||||
val roundProgress = Math.round(newProgress / 1000f)
|
||||
val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt(), roundProgress), 0)
|
||||
val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
|
||||
setPosition(limitedProgress)
|
||||
if (!mIsPlaying) {
|
||||
togglePlayPause()
|
||||
|
@ -668,13 +721,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
|
||||
mCurrTime = (mExoPlayer!!.duration / 1000).toInt()
|
||||
if (listener?.videoEnded() == false && mConfig.loopVideos) {
|
||||
playVideo()
|
||||
} else {
|
||||
mSeekBar.progress = mSeekBar.max
|
||||
mCurrTimeView.text = mDuration.getFormattedDuration()
|
||||
pauseVideo()
|
||||
}
|
||||
mSeekBar.progress = mSeekBar.max
|
||||
mCurrTimeView.text = mDuration.getFormattedDuration()
|
||||
pauseVideo()
|
||||
}
|
||||
|
||||
private fun cleanup() {
|
||||
|
|
|
@ -494,4 +494,8 @@ class Config(context: Context) : BaseConfig(context) {
|
|||
var editorBrushSize: Float
|
||||
get() = prefs.getFloat(EDITOR_BRUSH_SIZE, 0.05f)
|
||||
set(editorBrushSize) = prefs.edit().putFloat(EDITOR_BRUSH_SIZE, editorBrushSize).apply()
|
||||
|
||||
var wereFavoritesMigrated: Boolean
|
||||
get() = prefs.getBoolean(WERE_FAVORITES_MIGRATED, false)
|
||||
set(wereFavoritesMigrated) = prefs.edit().putBoolean(WERE_FAVORITES_MIGRATED, wereFavoritesMigrated).apply()
|
||||
}
|
||||
|
|
|
@ -80,6 +80,7 @@ const val SHOW_THUMBNAIL_FILE_TYPES = "show_thumbnail_file_types"
|
|||
const val EDITOR_BRUSH_COLOR = "editor_brush_color"
|
||||
const val EDITOR_BRUSH_HARDNESS = "editor_brush_hardness"
|
||||
const val EDITOR_BRUSH_SIZE = "editor_brush_size"
|
||||
const val WERE_FAVORITES_MIGRATED = "were_favorites_migrated"
|
||||
|
||||
// slideshow
|
||||
const val SLIDESHOW_INTERVAL = "slideshow_interval"
|
||||
|
@ -117,6 +118,7 @@ const val MONTH_MILLISECONDS = MONTH_SECONDS * 1000L
|
|||
const val MIN_SKIP_LENGTH = 2000
|
||||
const val HIDE_SYSTEM_UI_DELAY = 500L
|
||||
const val MAX_PRINT_SIDE_SIZE = 4096
|
||||
const val FAST_FORWARD_VIDEO_MS = 10000
|
||||
|
||||
const val DIRECTORY = "directory"
|
||||
const val MEDIUM = "medium"
|
||||
|
|
|
@ -20,8 +20,8 @@ import java.util.*
|
|||
class MediaFetcher(val context: Context) {
|
||||
var shouldStop = false
|
||||
|
||||
fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperFileSize: Boolean,
|
||||
favoritePaths: ArrayList<String>, getVideoDurations: Boolean, sortMedia: Boolean = true): ArrayList<Medium> {
|
||||
fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean,
|
||||
getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean): ArrayList<Medium> {
|
||||
val filterMedia = context.config.filterMedia
|
||||
if (filterMedia == 0) {
|
||||
return ArrayList()
|
||||
|
@ -34,13 +34,11 @@ class MediaFetcher(val context: Context) {
|
|||
curMedia.addAll(newMedia)
|
||||
}
|
||||
} else {
|
||||
val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations)
|
||||
val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
|
||||
curMedia.addAll(newMedia)
|
||||
}
|
||||
|
||||
if (sortMedia) {
|
||||
sortMedia(curMedia, context.config.getFileSorting(curPath))
|
||||
}
|
||||
sortMedia(curMedia, context.config.getFileSorting(curPath))
|
||||
|
||||
return curMedia
|
||||
}
|
||||
|
@ -212,11 +210,11 @@ class MediaFetcher(val context: Context) {
|
|||
}
|
||||
|
||||
private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean,
|
||||
getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean): ArrayList<Medium> {
|
||||
getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean): ArrayList<Medium> {
|
||||
val media = ArrayList<Medium>()
|
||||
val isRecycleBin = folder == RECYCLE_BIN
|
||||
val deletedMedia = if (isRecycleBin) {
|
||||
context.getUpdatedDeletedMedia(context.galleryDB.MediumDao())
|
||||
context.getUpdatedDeletedMedia()
|
||||
} else {
|
||||
ArrayList()
|
||||
}
|
||||
|
@ -226,7 +224,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 && folder != FAVORITES && !isRecycleBin) getFolderDateTakens(folder) else HashMap()
|
||||
val dateTakens = if (getProperDateTaken && !isRecycleBin) getFolderDateTakens(folder) else HashMap()
|
||||
|
||||
val files = when (folder) {
|
||||
FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toMutableList() as ArrayList<File>
|
||||
|
@ -297,12 +295,20 @@ class MediaFetcher(val context: Context) {
|
|||
media.add(this)
|
||||
}
|
||||
} else {
|
||||
val lastModified = file.lastModified()
|
||||
val lastModified = if (getProperLastModified) file.lastModified() else 0L
|
||||
var dateTaken = lastModified
|
||||
val videoDuration = if (getVideoDurations && isVideo) path.getVideoDuration() else 0
|
||||
|
||||
if (getProperDateTaken) {
|
||||
dateTaken = dateTakens.remove(filename) ?: lastModified
|
||||
var newDateTaken = dateTakens.remove(path)
|
||||
if (newDateTaken == null) {
|
||||
newDateTaken = if (getProperLastModified) {
|
||||
lastModified
|
||||
} else {
|
||||
file.lastModified()
|
||||
}
|
||||
}
|
||||
dateTaken = newDateTaken
|
||||
}
|
||||
|
||||
val type = when {
|
||||
|
@ -390,32 +396,44 @@ class MediaFetcher(val context: Context) {
|
|||
}
|
||||
|
||||
private fun getFolderDateTakens(folder: String): HashMap<String, Long> {
|
||||
val projection = arrayOf(
|
||||
MediaStore.Images.Media.DISPLAY_NAME,
|
||||
MediaStore.Images.Media.DATE_TAKEN
|
||||
)
|
||||
|
||||
val uri = MediaStore.Files.getContentUri("external")
|
||||
val selection = "${MediaStore.Images.Media.DATA} LIKE ? AND ${MediaStore.Images.Media.DATA} NOT LIKE ?"
|
||||
val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
|
||||
|
||||
val dateTakens = HashMap<String, Long>()
|
||||
val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
|
||||
cursor?.use {
|
||||
if (cursor.moveToFirst()) {
|
||||
do {
|
||||
try {
|
||||
val dateTaken = cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN)
|
||||
if (dateTaken != 0L) {
|
||||
val path = cursor.getStringValue(MediaStore.Images.Media.DISPLAY_NAME)
|
||||
dateTakens[path] = dateTaken
|
||||
if (folder != FAVORITES) {
|
||||
val projection = arrayOf(
|
||||
MediaStore.Images.Media.DISPLAY_NAME,
|
||||
MediaStore.Images.Media.DATE_TAKEN
|
||||
)
|
||||
|
||||
val uri = MediaStore.Files.getContentUri("external")
|
||||
val selection = "${MediaStore.Images.Media.DATA} LIKE ? AND ${MediaStore.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(MediaStore.Images.Media.DATE_TAKEN)
|
||||
if (dateTaken != 0L) {
|
||||
val name = cursor.getStringValue(MediaStore.Images.Media.DISPLAY_NAME)
|
||||
dateTakens["$folder/$name"] = dateTaken
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
} while (cursor.moveToNext())
|
||||
} while (cursor.moveToNext())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val dateTakenValues = if (folder == FAVORITES) {
|
||||
context.dateTakensDB.getAllDateTakens()
|
||||
} else {
|
||||
context.dateTakensDB.getDateTakensFromPath(folder)
|
||||
}
|
||||
|
||||
dateTakenValues.forEach {
|
||||
dateTakens[it.fullPath] = it.taken
|
||||
}
|
||||
|
||||
return dateTakens
|
||||
}
|
||||
|
||||
|
@ -456,7 +474,6 @@ class MediaFetcher(val context: Context) {
|
|||
}
|
||||
|
||||
fun groupMedia(media: ArrayList<Medium>, path: String): ArrayList<ThumbnailItem> {
|
||||
val mediumGroups = LinkedHashMap<String, ArrayList<Medium>>()
|
||||
val pathToCheck = if (path.isEmpty()) SHOW_ALL else path
|
||||
val currentGrouping = context.config.getFolderGrouping(pathToCheck)
|
||||
if (currentGrouping and GROUP_BY_NONE != 0) {
|
||||
|
@ -469,6 +486,7 @@ class MediaFetcher(val context: Context) {
|
|||
return thumbnailItems
|
||||
}
|
||||
|
||||
val mediumGroups = LinkedHashMap<String, ArrayList<Medium>>()
|
||||
media.forEach {
|
||||
val key = it.getGroupingKey(currentGrouping)
|
||||
if (!mediumGroups.containsKey(key)) {
|
||||
|
|
|
@ -18,7 +18,7 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
|||
import com.simplemobiletools.gallery.pro.R
|
||||
import com.simplemobiletools.gallery.pro.activities.MediaActivity
|
||||
import com.simplemobiletools.gallery.pro.extensions.config
|
||||
import com.simplemobiletools.gallery.pro.extensions.directoryDB
|
||||
import com.simplemobiletools.gallery.pro.extensions.directoryDao
|
||||
import com.simplemobiletools.gallery.pro.extensions.getFolderNameFromPath
|
||||
import com.simplemobiletools.gallery.pro.extensions.widgetsDB
|
||||
import com.simplemobiletools.gallery.pro.models.Widget
|
||||
|
@ -45,7 +45,7 @@ class MyWidgetProvider : AppWidgetProvider() {
|
|||
setText(R.id.widget_folder_name, context.getFolderNameFromPath(it.folderPath))
|
||||
}
|
||||
|
||||
val path = context.directoryDB.getDirectoryThumbnail(it.folderPath) ?: return@forEach
|
||||
val path = context.directoryDao.getDirectoryThumbnail(it.folderPath) ?: return@forEach
|
||||
val options = RequestOptions()
|
||||
.signature(path.getFileSignature())
|
||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
package com.simplemobiletools.gallery.pro.interfaces
|
||||
|
||||
import androidx.room.Dao
|
||||
|
||||
@Dao
|
||||
interface DateTakensDAO {
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.simplemobiletools.gallery.pro.interfaces
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import com.simplemobiletools.gallery.pro.models.DateTaken
|
||||
|
||||
@Dao
|
||||
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")
|
||||
fun getDateTakensFromPath(path: String): List<DateTaken>
|
||||
|
||||
@Query("SELECT full_path, filename, parent_path, date_taken, last_fixed FROM date_takens")
|
||||
fun getAllDateTakens(): List<DateTaken>
|
||||
}
|
|
@ -9,7 +9,7 @@ import com.simplemobiletools.gallery.pro.models.Directory
|
|||
|
||||
@Dao
|
||||
interface DirectoryDao {
|
||||
@Query("SELECT path, thumbnail, filename, media_count, last_modified, date_taken, size, location, media_types FROM directories")
|
||||
@Query("SELECT path, thumbnail, filename, media_count, last_modified, date_taken, size, location, media_types, sort_value FROM directories")
|
||||
fun getAll(): List<Directory>
|
||||
|
||||
@Insert(onConflict = REPLACE)
|
||||
|
@ -21,8 +21,8 @@ interface DirectoryDao {
|
|||
@Query("DELETE FROM directories WHERE path = :path COLLATE NOCASE")
|
||||
fun deleteDirPath(path: String)
|
||||
|
||||
@Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes WHERE path = :path COLLATE NOCASE")
|
||||
fun updateDirectory(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int)
|
||||
@Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes, sort_value = :sortValue WHERE path = :path COLLATE NOCASE")
|
||||
fun updateDirectory(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int, sortValue: String)
|
||||
|
||||
@Query("UPDATE directories SET thumbnail = :thumbnail, filename = :name, path = :newPath WHERE path = :oldPath COLLATE NOCASE")
|
||||
fun updateDirectoryAfterRename(thumbnail: String, name: String, newPath: String, oldPath: String)
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
package com.simplemobiletools.gallery.pro.interfaces
|
||||
|
||||
import androidx.room.Dao
|
||||
|
||||
@Dao
|
||||
interface FavoritesDAO {
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package com.simplemobiletools.gallery.pro.interfaces
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import com.simplemobiletools.gallery.pro.models.Favorite
|
||||
|
||||
@Dao
|
||||
interface FavoritesDao {
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
fun insert(favorite: Favorite)
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
fun insertAll(favorites: List<Favorite>)
|
||||
|
||||
@Query("SELECT favorites.full_path FROM favorites INNER JOIN media ON favorites.full_path = media.full_path WHERE media.deleted_ts = 0")
|
||||
fun getValidFavoritePaths(): List<String>
|
||||
|
||||
@Query("SELECT id FROM favorites WHERE full_path = :path COLLATE NOCASE")
|
||||
fun isFavorite(path: String): Boolean
|
||||
|
||||
@Query("UPDATE OR REPLACE favorites SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath COLLATE NOCASE")
|
||||
fun updateFavorite(newFilename: String, newFullPath: String, newParentPath: String, oldPath: String)
|
||||
|
||||
@Query("DELETE FROM favorites WHERE full_path = :path COLLATE NOCASE")
|
||||
fun deleteFavoritePath(path: String)
|
||||
|
||||
@Query("DELETE FROM favorites")
|
||||
fun clearFavorites()
|
||||
}
|
|
@ -15,15 +15,9 @@ interface MediumDao {
|
|||
@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts FROM media WHERE deleted_ts = 0 AND is_favorite = 1")
|
||||
fun getFavorites(): List<Medium>
|
||||
|
||||
@Query("SELECT full_path FROM media WHERE deleted_ts = 0 AND is_favorite = 1")
|
||||
fun getFavoritePaths(): List<String>
|
||||
|
||||
@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts FROM media WHERE deleted_ts != 0")
|
||||
fun getDeletedMedia(): List<Medium>
|
||||
|
||||
@Query("SELECT is_favorite FROM media WHERE full_path = :path COLLATE NOCASE")
|
||||
fun isFavorite(path: String): Boolean
|
||||
|
||||
@Insert(onConflict = REPLACE)
|
||||
fun insert(medium: Medium)
|
||||
|
||||
|
@ -40,10 +34,7 @@ interface MediumDao {
|
|||
fun deleteOldRecycleBinItems(timestmap: Long)
|
||||
|
||||
@Query("UPDATE OR REPLACE media SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath COLLATE NOCASE")
|
||||
fun updateMedium(oldPath: String, newParentPath: String, newFilename: String, newFullPath: String)
|
||||
|
||||
@Query("UPDATE media SET is_favorite = :isFavorite WHERE full_path = :path COLLATE NOCASE")
|
||||
fun updateFavorite(path: String, isFavorite: Boolean)
|
||||
fun updateMedium(newFilename: String, newFullPath: String, newParentPath: String, oldPath: String)
|
||||
|
||||
@Query("UPDATE OR REPLACE media SET full_path = :newPath, deleted_ts = :deletedTS WHERE full_path = :oldPath COLLATE NOCASE")
|
||||
fun updateDeleted(newPath: String, deletedTS: Long, oldPath: String)
|
||||
|
@ -51,9 +42,9 @@ interface MediumDao {
|
|||
@Query("UPDATE media SET date_taken = :dateTaken WHERE full_path = :path COLLATE NOCASE")
|
||||
fun updateFavoriteDateTaken(path: String, dateTaken: Long)
|
||||
|
||||
@Query("DELETE FROM media WHERE deleted_ts != 0")
|
||||
fun clearRecycleBin()
|
||||
|
||||
@Query("UPDATE media SET is_favorite = 0")
|
||||
fun clearFavorites()
|
||||
|
||||
@Query("DELETE FROM media WHERE deleted_ts != 0")
|
||||
fun clearRecycleBin()
|
||||
}
|
||||
|
|
|
@ -23,13 +23,14 @@ data class Directory(
|
|||
@ColumnInfo(name = "size") var size: Long,
|
||||
@ColumnInfo(name = "location") var location: Int,
|
||||
@ColumnInfo(name = "media_types") var types: Int,
|
||||
@ColumnInfo(name = "sort_value") var sortValue: String,
|
||||
|
||||
// used with "Group direct subfolders" enabled
|
||||
@Ignore var subfoldersCount: Int = 0,
|
||||
@Ignore var subfoldersMediaCount: Int = 0,
|
||||
@Ignore var containsMediaFilesDirectly: Boolean = true) {
|
||||
|
||||
constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, 0, 0)
|
||||
constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, "", 0, 0)
|
||||
|
||||
fun getBubbleText(sorting: Int, context: Context) = when {
|
||||
sorting and SORT_BY_NAME != 0 -> name
|
||||
|
|
|
@ -6,6 +6,7 @@ import android.media.AudioManager
|
|||
import android.os.Handler
|
||||
import android.provider.Settings
|
||||
import android.util.AttributeSet
|
||||
import android.view.GestureDetector
|
||||
import android.view.MotionEvent
|
||||
import android.view.ViewGroup
|
||||
import android.widget.RelativeLayout
|
||||
|
@ -13,8 +14,6 @@ import android.widget.TextView
|
|||
import com.simplemobiletools.commons.extensions.onGlobalLayout
|
||||
import com.simplemobiletools.gallery.pro.R
|
||||
import com.simplemobiletools.gallery.pro.extensions.audioManager
|
||||
import com.simplemobiletools.gallery.pro.helpers.CLICK_MAX_DISTANCE
|
||||
import com.simplemobiletools.gallery.pro.helpers.CLICK_MAX_DURATION
|
||||
import com.simplemobiletools.gallery.pro.helpers.DRAG_THRESHOLD
|
||||
|
||||
// allow horizontal swipes through the layout, else it can cause glitches at zoomed in images
|
||||
|
@ -35,14 +34,17 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
private var mSlideInfoFadeHandler = Handler()
|
||||
private var mParentView: ViewGroup? = null
|
||||
private var activity: Activity? = null
|
||||
private var doubleTap: ((Float, Float) -> Unit)? = null
|
||||
|
||||
private lateinit var slideInfoView: TextView
|
||||
private lateinit var callback: (Float, Float) -> Unit
|
||||
private lateinit var singleTap: (Float, Float) -> Unit
|
||||
|
||||
fun initialize(activity: Activity, slideInfoView: TextView, isBrightness: Boolean, parentView: ViewGroup?, callback: (x: Float, y: Float) -> Unit) {
|
||||
fun initialize(activity: Activity, slideInfoView: TextView, isBrightness: Boolean, parentView: ViewGroup?, singleTap: (x: Float, y: Float) -> Unit,
|
||||
doubleTap: ((x: Float, y: Float) -> Unit)? = null) {
|
||||
this.activity = activity
|
||||
this.slideInfoView = slideInfoView
|
||||
this.callback = callback
|
||||
this.singleTap = singleTap
|
||||
this.doubleTap = doubleTap
|
||||
mParentView = parentView
|
||||
mIsBrightnessScroll = isBrightness
|
||||
mSlideInfoText = activity.getString(if (isBrightness) R.string.brightness else R.string.volume)
|
||||
|
@ -51,6 +53,22 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
}
|
||||
}
|
||||
|
||||
private val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
|
||||
override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
|
||||
if (e != null) {
|
||||
singleTap(e.rawX, e.rawY)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onDoubleTap(e: MotionEvent?): Boolean {
|
||||
if (e != null && doubleTap != null) {
|
||||
doubleTap!!.invoke(e.rawX, e.rawY)
|
||||
}
|
||||
return true
|
||||
}
|
||||
})
|
||||
|
||||
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
|
||||
if (mPassTouches) {
|
||||
if (ev.actionMasked == MotionEvent.ACTION_DOWN) {
|
||||
|
@ -66,6 +84,7 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
return false
|
||||
}
|
||||
|
||||
gestureDetector.onTouchEvent(event)
|
||||
when (event.actionMasked) {
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
mTouchDownX = event.x
|
||||
|
@ -107,12 +126,6 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
mLastTouchY = event.y
|
||||
}
|
||||
MotionEvent.ACTION_UP -> {
|
||||
val diffX = mTouchDownX - event.x
|
||||
val diffY = mTouchDownY - event.y
|
||||
if (Math.abs(diffX) < CLICK_MAX_DISTANCE && Math.abs(diffY) < CLICK_MAX_DISTANCE && System.currentTimeMillis() - mTouchDownTime < CLICK_MAX_DURATION) {
|
||||
callback(event.rawX, event.rawY)
|
||||
}
|
||||
|
||||
if (mIsBrightnessScroll) {
|
||||
mTouchDownValue = mTempBrightness
|
||||
}
|
||||
|
|
|
@ -95,6 +95,8 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_toStartOf="@+id/settings_file_loading_priority"
|
||||
android:ellipsize="end"
|
||||
android:lines="1"
|
||||
android:paddingLeft="@dimen/medium_margin"
|
||||
android:paddingRight="@dimen/medium_margin"
|
||||
android:text="@string/file_loading_priority"/>
|
||||
|
|
|
@ -98,12 +98,12 @@
|
|||
|
||||
<com.simplemobiletools.gallery.pro.views.InstantItemSwitch
|
||||
android:id="@+id/instant_prev_item"
|
||||
android:layout_width="@dimen/instant_change_bar_width"
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<com.simplemobiletools.gallery.pro.views.InstantItemSwitch
|
||||
android:id="@+id/instant_next_item"
|
||||
android:layout_width="@dimen/instant_change_bar_width"
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentEnd="true"/>
|
||||
|
||||
|
|
|
@ -35,17 +35,6 @@
|
|||
android:layout_width="@dimen/media_side_slider_width"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<com.simplemobiletools.gallery.pro.views.InstantItemSwitch
|
||||
android:id="@+id/instant_prev_item"
|
||||
android:layout_width="@dimen/instant_change_bar_width"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<com.simplemobiletools.gallery.pro.views.InstantItemSwitch
|
||||
android:id="@+id/instant_next_item"
|
||||
android:layout_width="@dimen/instant_change_bar_width"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentEnd="true"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/video_play_outline"
|
||||
android:layout_width="@dimen/play_outline_size_big"
|
||||
|
|
|
@ -291,7 +291,7 @@
|
|||
<string name="faq_3_title">كيف يمكنني جعل ألبوماً يظهر دائماً في الأعلى ؟</string>
|
||||
<string name="faq_3_text">يمكنك الضغط مطولاً علي الألبوم المطلوب وحدد أيقونة "التثبيت" في قائمة الإجراءات، التي ستقوم بتثبيته في الأعلي. يمكنك تثبيت مجلدات متعددة أيضا، سيتم فرز العناصر المثبتة حسب طريقة الفرز الإفتراضية.</string>
|
||||
<string name="faq_4_title">كيف يمكنني تسريع مقاطع الفيديو؟</string>
|
||||
<string name="faq_4_text">يمكنك إما سحب إصبعك أفقياً على مشغل الفيديو، أو النقر على نصوص المدة الحالية أو أقصي مدة النصوص بالقرب من شريط التحكم (seekbar) . هذا سوف يحرك الفيديو إما إلى الخلف، أو إلى الأمام.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">ما هو الفرق بين إخفاء المجلد وإستبعاده ؟</string>
|
||||
<string name="faq_5_text">الإستبعاد يمنع عرض المجلد فقط في الاستديو، بينما الإخفاء يعمل على مستوى النظام ويخفي المجلد من المعارض الأخرى أيضاً. يعمل عن طريق إنشاء ملف فارغ \ ".nomedia \" في المجلد المحدد ، والذي يمكنك إزالته بعد ذلك بواسطة أي مدير ملفات أيضًا.</string>
|
||||
<string name="faq_6_title">لماذا تظهر المجلدات مع صورة غلاف الموسيقى أو الملصقات؟</string>
|
||||
|
|
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files.</string>
|
||||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">How can I fast-forward videos?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_title">How can I fast forward videos?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Com puc fer que un àlbum sempre aparegui a la part superior?</string>
|
||||
<string name="faq_3_text">Podeu prémer l’àlbum desitjat i seleccionar la icona de la xinxeta al menú d’acció i el fixarà a la part superior. També podeu enganxar diverses carpetes, els elements fixats s’ordenaran pel mètode de classificació predeterminat.</string>
|
||||
<string name="faq_4_title">Com puc fer avançar els vídeos?</string>
|
||||
<string name="faq_4_text">Podeu arrossegar el dit horitzontalment al reproductor de vídeo o fer clic als textos actuals o de màxima duració a prop de la barra de cerca. Això mourà el vídeo ja sigui cap enrere o cap endavant.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Quina és la diferència entre ocultar i excloure una carpeta?</string>
|
||||
<string name="faq_5_text">Excloure impedeix mostrar la carpeta només a Simple Galery, mentre que Ocultar també amaga la carpeta a altres galeries. Funciona creant un fitxer \". Nomedia \" buit a la carpeta donada, que podeu eliminar amb qualsevol gestor de fitxers.</string>
|
||||
<string name="faq_6_title">Per què apareixen les carpetes amb les portades de la música o adhesius?</string>
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
<string name="fixing">Opravuji…</string>
|
||||
<string name="dates_fixed_successfully">Datumy byly úspěšně opraveny</string>
|
||||
<string name="share_resized">Sdílet verzi se změněnou velikostí</string>
|
||||
<string name="upgraded_from_free">Zdravím,\n\nzdá se, že jse přešli ze staré bezplatné aplikace. Starou aplikaci, která má nahoře v nastavení tlačítko \'Stáhnout Pro verzi\', můžete již odinstalovat.\n\nZtratíte tím pouze soubory v odpadkovém koši, označení oblíbených souborů a také budete muset znovu nastavit položky v nastavení aplikace.\n\nDěkuji!</string>
|
||||
<string name="upgraded_from_free">Zdravím,\n\nzdá se, že jste přešli ze staré bezplatné aplikace. Starou aplikaci, která má nahoře v nastavení tlačítko \'Stáhnout Pro verzi\', můžete již odinstalovat.\n\nZtratíte tím pouze soubory v odpadkovém koši, označení oblíbených souborů a také budete muset znovu nastavit položky v nastavení aplikace.\n\nDěkuji!</string>
|
||||
<string name="switch_to_file_search">Přepnout na vyhledávání souborů ve všech viditelných složkách</string>
|
||||
|
||||
<!-- Filter -->
|
||||
|
@ -43,7 +43,7 @@
|
|||
<string name="raw_images">RAW obrázky</string>
|
||||
<string name="svgs">SVGčka</string>
|
||||
<string name="portraits">Portréty</string>
|
||||
<string name="no_media_with_filters">Se zvolenými filtry nebyly nalezeny žádné médiální soubory.</string>
|
||||
<string name="no_media_with_filters">Se zvolenými filtry nebyly nalezeny žádné mediální soubory.</string>
|
||||
<string name="change_filters_underlined"><u>Změnit filtry</u></string>
|
||||
|
||||
<!-- Hide / Exclude -->
|
||||
|
@ -53,7 +53,7 @@
|
|||
<string name="manage_excluded_folders">Spravovat vyloučené složky</string>
|
||||
<string name="exclude_folder_description">Tato funkce vyloučí výběr včetně podsložek jen z Jednoduché galerie. V nastavení můžete spravovat vyloučené složky.</string>
|
||||
<string name="exclude_folder_parent">Chcete vyloučit nadřazenou složku?</string>
|
||||
<string name="excluded_activity_placeholder">Vyloučené složky budou spolu s podsložkami vyloučeny jen z Jednoduché Galerie, ostatní aplikace je nadále uvidí.\n\nPokud je chcete skrýt i před ostatními aplikacemi, použijte funkci Skrýt.</string>
|
||||
<string name="excluded_activity_placeholder">Vyloučené složky budou spolu s podsložkami vyloučeny jen z Jednoduché galerie, ostatní aplikace je nadále uvidí.\n\nPokud je chcete skrýt i před ostatními aplikacemi, použijte funkci Skrýt.</string>
|
||||
<string name="remove_all">Odstranit všechny</string>
|
||||
<string name="remove_all_description">Odstranit všechny složky ze seznamu vyloučených? Tato operace neodstraní obsah složek.</string>
|
||||
<string name="hidden_folders">Skryté složky</string>
|
||||
|
@ -111,7 +111,7 @@
|
|||
|
||||
<!-- Slideshow -->
|
||||
<string name="slideshow">Prezentace</string>
|
||||
<string name="interval">Interval (vteřin):</string>
|
||||
<string name="interval">Interval (sekund):</string>
|
||||
<string name="include_photos">Zahrnout fotografie</string>
|
||||
<string name="include_videos">Zahrnout videa</string>
|
||||
<string name="include_gifs">Zahrnout GIFy</string>
|
||||
|
@ -169,10 +169,10 @@
|
|||
<string name="allow_photo_gestures">Povolit ovládání jasu vertikálními tahy</string>
|
||||
<string name="allow_video_gestures">Povolit ovládání hlasitosti a jasu videí vertikálními tahy</string>
|
||||
<string name="show_media_count">Zobrazit počet médií ve složce na hlavní obrazovce</string>
|
||||
<string name="show_extended_details">Zobrazit rozšířené vlastnosti přes celoobrazovkové média</string>
|
||||
<string name="show_extended_details">Zobrazit rozšířené vlastnosti přes celoobrazovková média</string>
|
||||
<string name="manage_extended_details">Spravovat rozšířené vlastnosti</string>
|
||||
<string name="one_finger_zoom">Povolit přibližování jedním prstem v celoobrazovkovém režimu</string>
|
||||
<string name="allow_instant_change">Povolit okamžité přepínání médií ťuknutím na okraj obrazovky</string>
|
||||
<string name="allow_instant_change">Povolit okamžité přepínání médií klepnutím na okraj obrazovky</string>
|
||||
<string name="allow_deep_zooming_images">Povolit hluboké přibližování obrázků</string>
|
||||
<string name="hide_extended_details">Skrýt rozšířené vlastnosti pokud je skrytá stavová lišta</string>
|
||||
<string name="show_at_bottom">Zobrazit některá akční tlačítka ve spodní části obrazovky</string>
|
||||
|
@ -198,7 +198,7 @@
|
|||
<string name="bottom_actions">Spodní akční tlačítka</string>
|
||||
|
||||
<!-- Bottom actions -->
|
||||
<string name="manage_bottom_actions">Upravit viditelné spodní akční tlačítka</string>
|
||||
<string name="manage_bottom_actions">Upravit viditelná spodní akční tlačítka</string>
|
||||
<string name="toggle_favorite">Přepnutí oblíbenosti</string>
|
||||
<string name="toggle_file_visibility">Přepnutí viditelnosti souboru</string>
|
||||
|
||||
|
@ -284,17 +284,17 @@
|
|||
<string name="pesdk_common_title_pipettableColor">Pipetovatelná barva</string>
|
||||
|
||||
<!-- FAQ -->
|
||||
<string name="faq_1_title">Jak nastavím Jednoduchou Galerii jako výchozí galerii?</string>
|
||||
<string name="faq_1_title">Jak nastavím Jednoduchou galerii jako výchozí galerii?</string>
|
||||
<string name="faq_1_text">Nejdříve musíte najít v nastavení zařízení, v sekci Aplikace, současnou výchozí galerii, zvolit tlačítko s textem ve smyslu \"Nastavení výchozího otevírání\" a následně \"Vymazat výchozí nastavení\".
|
||||
Pokud poté zkusíte otevřít obrázek nebo video, zobrazí se seznam aplikací, kde můžete zvolit Jednoduchou Galerii a nastavit ji jako výchozí.</string>
|
||||
Pokud poté zkusíte otevřít obrázek nebo video, zobrazí se seznam aplikací, kde můžete zvolit Jednoduchou galerii a nastavit ji jako výchozí.</string>
|
||||
<string name="faq_2_title">Uzamknul jsem aplikaci heslem, ale zapomněl jsem ho. Co můžu udělat?</string>
|
||||
<string name="faq_2_text">Můžete to vyriešǐť 2 způsoby. Můžete aplikaci buď přeinstalovat nebo ji najít v nastavení zařízení a zvolit \"Vymazat data\". Vymažou se pouze nastavení aplikace, nikoliv soubory.</string>
|
||||
<string name="faq_2_text">Můžete to vyriešit 2 způsoby. Můžete aplikaci buď přeinstalovat nebo ji najít v nastavení zařízení a zvolit \"Vymazat data\". Vymažou se pouze nastavení aplikace, nikoliv soubory.</string>
|
||||
<string name="faq_3_title">Jak mohu dosáhnout, aby bylo dané album stále zobrazeno jako první?</string>
|
||||
<string name="faq_3_text">Můžete označit danou složku dlouhým podržením a zvolit tlačítko s obrázkem připínáčku, to ji připne na vrch. Můžete připnout i více složek, budou seřazeny podle zvoleného řazení.</string>
|
||||
<string name="faq_3_text">Můžete označit danou složku dlouhým podržením a zvolit tlačítko s obrázkem připínáčku, to ji připne nahoru. Můžete připnout i více složek, budou seřazeny podle zvoleného řazení.</string>
|
||||
<string name="faq_4_title">Jak mohu video posunout vpřed?</string>
|
||||
<string name="faq_4_text">Můžete toho dosáhnout buď tažením prstu vodorovně přes okno přehrávače nebo ťuknutím na text aktuální či celkové délky videa, které najdete po bocích indikátoru aktuální pozice. To posune video buď zpět nebo vpřed.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Jaký je rozdíl mezi Skrytím a Vyloučením složky?</string>
|
||||
<string name="faq_5_text">Zatímco vyloučení zamezí zobrazení složky pouze vrámci Jednoduché Galerie, skrytí ji ukryje vrámci celého systému, tedy to ovlivní i ostatní galerie. Skrytí funguje pomocí vytvoření prázdného souboru \".nomedia\" v daném adresáři, který můžete vymazat i libovolným správcem souborů.</string>
|
||||
<string name="faq_5_text">Zatímco vyloučení zamezí zobrazení složky pouze vrámci Jednoduché galerie, skrytí ji ukryje v celém systému, tedy to ovlivní i ostatní galerie. Skrytí funguje pomocí vytvoření prázdného souboru \".nomedia\" v daném adresáři, který můžete vymazat i libovolným správcem souborů.</string>
|
||||
<string name="faq_6_title">Proč se mi zobrazují složky s obaly hudebních alb, nebo nálepkami?</string>
|
||||
<string name="faq_6_text">Může se stát, že se vám zobrazí také neobvyklé složky. Můžete je ale jednoduše skrýt jejich vybráním pomocí dlouhého podržení a zvolením Vyloučit. Pokud na následujícím dialogu zvolíte vyloučení nadřazené složky, pravděpodobně budou vyloučeny i ostatní podobné složky.</string>
|
||||
<string name="faq_7_title">Složka s fotografiemi se mi nezobrazuje nebo ve složce nevidím všechny soubory. Co s tím?</string>
|
||||
|
@ -317,13 +317,13 @@
|
|||
|
||||
<!-- 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">Jednoduchá Galerie Pro - Organizér a editor fotografií</string>
|
||||
<string name="app_title">Jednoduchá galerie Pro - Organizér fotografií</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">Prohlížejte svoje vzpomínky bez prerušení s touto foto a video galerií.</string>
|
||||
<string name="app_long_description">
|
||||
Jednoduchá Galerie Pro je vysoce přizpůsobitelná offline galerie. Organizujte a upravujte své fotografie, obnovujte smazané fotografie s funkcí odpadkového koše, chraňte je a skrývejte. Prohlížejte množství různých foto a video formátů včetně RAW, SVG a mnoho dalších.
|
||||
Jednoduchá galerie Pro je vysoce přizpůsobitelná offline galerie. Organizujte a upravujte své fotografie, obnovujte smazané fotografie s funkcí odpadkového koše, chraňte je a skrývejte. Prohlížejte množství různých foto a video formátů včetně RAW, SVG a mnoho dalších.
|
||||
|
||||
Aplikace neobsahuje žádné reklamy ani nepotřebná oprávnění. Tím, že ani nevyžaduje připojení k internetu je vaše soukromí maximálně chráněno.
|
||||
Aplikace neobsahuje žádné reklamy ani nepotřebná oprávnění. Tím, že ani nevyžaduje připojení k internetu, je vaše soukromí maximálně chráněno.
|
||||
|
||||
-------------------------------------------------
|
||||
<b>JEDNODUCHÁ GALERIE PRO – FUNKCE</b>
|
||||
|
@ -337,7 +337,7 @@
|
|||
• Otevírejte mnoho rozličných formátů fotografií a videí (RAW, SVG, GIF, panorama, atd)
|
||||
• Množství intuitivních gest pro jednoduchou úpravu a organizaci souborů
|
||||
• Mnoho různých způsobů filtrování, seskupování a řazení souborů
|
||||
• Změňte si vzhled Jednoduché galerie pro
|
||||
• Změňte si vzhled Jednoduché galerie Pro
|
||||
• Dostupná ve 32 jazycích
|
||||
• Označte si oblíbené soubory pro rychlý přístup
|
||||
• Chraňte své fotografie a videa pomocí pinu, vzoru nebo otiskem prstu
|
||||
|
@ -350,16 +350,16 @@
|
|||
… a mnoho dalších!
|
||||
|
||||
<b>EDITOR OBRÁZKŮ</b>
|
||||
Jednoduchá Galerie Pro umožňuje snadnou úpravu obrázků. Ořezávejte, překlápějte, otáčejte či měňte jejich velikost. Pokud se cítíte kreativně, můžete také aplikovat filtry nebo do obrázku kreslit!
|
||||
Jednoduchá galerie Pro umožňuje snadnou úpravu obrázků. Ořezávejte, překlápějte, otáčejte či měňte jejich velikost. Pokud se cítíte kreativně, můžete také aplikovat filtry nebo do obrázku kreslit!
|
||||
|
||||
<b>PODPORA MNOHA TYPŮ SOUBORŮ</b>
|
||||
Na rozdíl od některých galerií podporuje Jednoduchá Galerie Pro velké množství různých druhů souborů včetně JPEG, PNG, MP4, MKV, RAW, SVG, panoramatických fotografií a videí.
|
||||
Na rozdíl od některých galerií podporuje Jednoduchá galerie Pro velké množství různých druhů souborů včetně JPEG, PNG, MP4, MKV, RAW, SVG, panoramatických fotografií a videí.
|
||||
|
||||
<b>Vysoce upravitelný správce galerie</b>
|
||||
Od vzhledu až po funkční tlačítka na spodní liště, Jednoduchá Galerie Pro je plně nastavitelná a bude fungovat přesně jak si budete přát. Žádná jiná galerie nenabízí takovou flexibilitu! A díky otevřenému kódu je naše aplikace dostupná ve 32 jazycích!
|
||||
Od vzhledu až po funkční tlačítka na spodní liště, Jednoduchá galerie Pro je plně nastavitelná a bude fungovat přesně jak si budete přát. Žádná jiná galerie nenabízí takovou flexibilitu! A díky otevřenému kódu je naše aplikace dostupná ve 32 jazycích!
|
||||
|
||||
<b>OBNOVTE SMAZANÉ FOTOGRAFIE A VIDEA</b>
|
||||
Smazali jste nechtěně důležitou fotografii nebo video? Žádný strach! Jednoduchá Galerie Pro pro podobné případy nabízí funkci odpadkového koše, odkud smazané fotografie a videa snadno obnovíte.
|
||||
Smazali jste nechtěně důležitou fotografii nebo video? Žádný strach! Jednoduchá galerie Pro pro podobné případy nabízí funkci odpadkového koše, odkud smazané fotografie a videa snadno obnovíte.
|
||||
|
||||
<b>CHRAŇTE A SKRÝVEJTE SVÉ FOTOGRAFIE A VIDEA</b>
|
||||
Použitím pinu, vzoru nebo otisku prstu snadno své fotografie, videa či celá alba ochráníte nebo skryjete. Můžete ochránit i spuštění samotné aplikace, nebo některé její funkce. Například můžete zabránit náhodnému smazání souboru bez potvrzení otiskem prstu.
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Hvordan kan jeg altid få et bestemt album vist i toppen?</string>
|
||||
<string name="faq_3_text">Du kan holde fingeren nede på det ønskede album, og vælge tegnestift-ikonet i menuen, dette vil fastgøre den til toppen. Du kan fastgøre flere mapper også. Fastgjorte elementer vil blive sorteret efter standard sorterings-metoden.</string>
|
||||
<string name="faq_4_title">Hvordan kan jeg spole fremad i videoer?</string>
|
||||
<string name="faq_4_text">Du kan enten trække din finger vandret over videoafspilleren, eller klikke på den nuværende eller maksimum varighedsteksterne, nær søgefeltet. Det vil enten spole videoen tilbage eller fremad.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Hvad er forskellen på at skjule og ekskludere en mappe?</string>
|
||||
<string name="faq_5_text">Eksludering forhindrer kun visning af mappen i Simple Gallery, mens Skjul virker på systemniveau og skjuler mappen fra andre gallerier også. Det fungerer ved at oprette en tom \".nomedia\"-fil i den givne mappe, som du kan slette med enhver filhåndterings-app.</string>
|
||||
<string name="faq_6_title">Hvorfor dukker mapper med musikomslag eller klistermærker op?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Wie kann ich ein Album immer zuoberst erscheinen lassen?</string>
|
||||
<string name="faq_3_text">Du kannst lange auf das gewünschte Album drücken und im Aktionsmenü das Stecknadelsymbol auswählen; es wird nun zuoberst angepinnt. Ebenso kannst du mehrere Ordner anpinnen. Angepinnte Objekte werden nach der Standardmethode sortiert.</string>
|
||||
<string name="faq_4_title">Wie kann ich in Videos vor- oder zurückspringen?</string>
|
||||
<string name="faq_4_text">Du kannst deinen Finger horizontal über den Videoplayer ziehen oder in der Nähe der Suchleiste auf die aktuelle oder maximale Dauer klicken. Das Video wird so entweder vorwärts oder rückwärts bewegt.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Was ist der Unterschied zwischen \'Verstecken\' und \'Ausschließen\' eines Ordners?</string>
|
||||
<string name="faq_5_text">\'Ausschließen\' verhindert lediglich, dass der Ordner in Schlichte Galerie angezeigt wird. \'Verstecken\' hingegen versteckt den Ordner auch vor anderen Apps. Dies funktioniert durch das Erstellen einer leeren \".nomedia\"-Datei im betroffenen Ordner, welche du mit jedem Dateimanager wieder löschen kannst.</string>
|
||||
<string name="faq_6_title">Wieso erscheinen Ordner mit Musik-Cover oder Stickers?</string>
|
||||
|
|
|
@ -292,8 +292,8 @@
|
|||
<string name="faq_2_text">Υπάρχουν 2 λύσεις. Είτε επανεγκατάσταση της εφαρμογής, ή να εντοπίσετε την εφαρμογή στις ρυθμίσεις της συσκευής και να επιλέξετε \"Καθαρισμό δεδομένων\". Θα επαναφέρει όλες τις ρυθμίσεις και δεν θα σβήσει κάποιο αρχείο πολυμέσου.</string>
|
||||
<string name="faq_3_title">Πώς μπορώ να κάνω ένα άλμπουμ να φαίνεται στην κορυφή;</string>
|
||||
<string name="faq_3_text">Μπορείτε να πατήσετε παρατεταμένα στο άλμπουμ και να επιλέξετε το εικονίδιο καρφιτσώματος στο μενού, αυτό θα το καρφιτσώσει στην κορυφή. Επίσης μπορείτε να καρφιτσώσετε πολλαπλούς φακέλους, τα καρφιτσωμένα αντικείμενα θα είναι ταξινομημένα με την προεπιλεγμένη μέθοδο.</string>
|
||||
<string name="faq_4_title">Πώς μπορώ να τρέξω μπροστά (fast-forward) τα βίντεο;</string>
|
||||
<string name="faq_4_text">Μπορείτε είτε να σύρετε το δάχτυλό σας οριζόντια πάνω από το πρόγραμμα αναπαραγωγής Βίντεο ή να κάνετε κλικ στα γράμματα της τρέχουσας ή της μέγιστης διάρκειας κοντά στο Γραμμή Αναζήτησης. Αυτό θα μετακινήσει το βίντεο προς τα πίσω ή προς τα εμπρός.</string>
|
||||
<string name="faq_4_title">Πώς μπορώ να τρέξω μπροστά (fast forward) τα βίντεο;</string>
|
||||
<string name="faq_4_text">Μπορείτε να το κάνετε πατώντας δύο φορές την πλευρά της οθόνης ή πατώντας το κείμενο τρέχοντος ή μέγιστης διάρκειας κοντά στη γραμμή αναζήτησης. Αν ενεργοποιήσετε το άνοιγμα βίντεο σε ξεχωριστή οθόνη στις ρυθμίσεις εφαρμογής, μπορείτε επίσης να χρησιμοποιήσετε και τις οριζόντιες κινήσεις.</string>
|
||||
<string name="faq_5_title">Ποια είναι διαφορά μεταξύ απόκρυψης και εξαίρεσης ενός φακέλου;</string>
|
||||
<string name="faq_5_text">Η εξαίρεση δεν επιτρέπει την εμφάνιση του φακέλου μόνο στην Απλή Συλλογή, ενώ η απόκρυψη λειτουργεί σε επίπεδο συστήματος και θα αποκρύψει τον φάκελο και από άλλες εφαρμογές γκάλερι. Λειτουργεί δημιουργώντας ένα άδειο \".nomedia\" αρχείο στον επιλεγμένο φάκελο, το οποίο μπορείτε να το διαγράψετε και με οποιονδήποτε διαχειριστή αρχείων.</string>
|
||||
<string name="faq_6_title">Γιατί εμφανίζονται φάκελοι με εξώφυλλο μουσικής ή αυτόκολλητα;</string>
|
||||
|
|
|
@ -203,85 +203,85 @@
|
|||
<string name="toggle_file_visibility">Alternar visibilidad de archivo</string>
|
||||
|
||||
<!-- New editor strings -->
|
||||
<string name="pesdk_transform_button_freeCrop">Custom</string>
|
||||
<string name="pesdk_transform_button_resetCrop">Reset</string>
|
||||
<string name="pesdk_transform_button_squareCrop">Square</string>
|
||||
<string name="pesdk_transform_title_name">Transform</string>
|
||||
<string name="pesdk_filter_title_name">Filter</string>
|
||||
<string name="pesdk_filter_asset_none">None</string>
|
||||
<string name="pesdk_adjustments_title_name">Adjust</string>
|
||||
<string name="pesdk_adjustments_button_shadowTool">Shadows</string>
|
||||
<string name="pesdk_adjustments_button_exposureTool">Exposure</string>
|
||||
<string name="pesdk_adjustments_button_highlightTool">Highlights</string>
|
||||
<string name="pesdk_adjustments_button_brightnessTool">Brightness</string>
|
||||
<string name="pesdk_adjustments_button_contrastTool">Contrast</string>
|
||||
<string name="pesdk_adjustments_button_saturationTool">Saturation</string>
|
||||
<string name="pesdk_adjustments_button_clarityTool">Clarity</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_temperatureTool">Temperature</string>
|
||||
<string name="pesdk_adjustments_button_sharpnessTool">Sharpness</string>
|
||||
<string name="pesdk_adjustments_button_reset">Reset</string>
|
||||
<string name="pesdk_focus_title_name">Focus</string>
|
||||
<string name="pesdk_focus_title_disabled">None</string>
|
||||
<string name="pesdk_transform_button_freeCrop">Personalizado</string>
|
||||
<string name="pesdk_transform_button_resetCrop">Reiniciar</string>
|
||||
<string name="pesdk_transform_button_squareCrop">Cuadrado</string>
|
||||
<string name="pesdk_transform_title_name">Recortar</string>
|
||||
<string name="pesdk_filter_title_name">Filtros</string>
|
||||
<string name="pesdk_filter_asset_none">Ninguno</string>
|
||||
<string name="pesdk_adjustments_title_name">Ajustes</string>
|
||||
<string name="pesdk_adjustments_button_shadowTool">Sombras</string>
|
||||
<string name="pesdk_adjustments_button_exposureTool">Exposición</string>
|
||||
<string name="pesdk_adjustments_button_highlightTool">Luces</string>
|
||||
<string name="pesdk_adjustments_button_brightnessTool">Brillo</string>
|
||||
<string name="pesdk_adjustments_button_contrastTool">Contraste</string>
|
||||
<string name="pesdk_adjustments_button_saturationTool">Saturación</string>
|
||||
<string name="pesdk_adjustments_button_clarityTool">Claridad</string>
|
||||
<string name="pesdk_adjustments_button_gammaTool">Colores</string>
|
||||
<string name="pesdk_adjustments_button_blacksTool">Negros</string>
|
||||
<string name="pesdk_adjustments_button_whitesTool">Blancos</string>
|
||||
<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">Enfoque</string>
|
||||
<string name="pesdk_focus_title_disabled">Ninguno</string>
|
||||
<string name="pesdk_focus_button_radial">Radial</string>
|
||||
<string name="pesdk_focus_button_linear">Linear</string>
|
||||
<string name="pesdk_focus_button_mirrored">Mirrored</string>
|
||||
<string name="pesdk_focus_button_gaussian">Gaussian</string>
|
||||
<string name="pesdk_text_title_name">Text</string>
|
||||
<string name="pesdk_text_title_options">Text Options</string>
|
||||
<string name="pesdk_text_title_textColor">Text Color</string>
|
||||
<string name="pesdk_text_title_font">Font</string>
|
||||
<string name="pesdk_text_button_add">Add</string>
|
||||
<string name="pesdk_text_button_edit">Edit</string>
|
||||
<string name="pesdk_text_button_straighten">Straighten</string>
|
||||
<string name="pesdk_text_button_font">Font</string>
|
||||
<string name="pesdk_focus_button_linear">Lineal</string>
|
||||
<string name="pesdk_focus_button_mirrored">Reflejado</string>
|
||||
<string name="pesdk_focus_button_gaussian">Gaussiano</string>
|
||||
<string name="pesdk_text_title_name">Texto</string>
|
||||
<string name="pesdk_text_title_options">Opciones de texto</string>
|
||||
<string name="pesdk_text_title_textColor">Color de texto</string>
|
||||
<string name="pesdk_text_title_font">Fuente</string>
|
||||
<string name="pesdk_text_button_add">Añadir</string>
|
||||
<string name="pesdk_text_button_edit">Editar</string>
|
||||
<string name="pesdk_text_button_straighten">Enderezar</string>
|
||||
<string name="pesdk_text_button_font">Fuente</string>
|
||||
<string name="pesdk_text_button_color">Color</string>
|
||||
<string name="pesdk_text_button_backgroundColor">BG Color</string>
|
||||
<string name="pesdk_text_button_alignment">Alignment</string>
|
||||
<string name="pesdk_text_button_bringToFront">To Front</string>
|
||||
<string name="pesdk_text_button_delete">Delete</string>
|
||||
<string name="pesdk_text_text_editTextPlaceholder">Your text</string>
|
||||
<string name="pesdk_brush_title_name">Brush</string>
|
||||
<string name="pesdk_text_button_backgroundColor">Color de fondo</string>
|
||||
<string name="pesdk_text_button_alignment">Alineación</string>
|
||||
<string name="pesdk_text_button_bringToFront">Traer al frente</string>
|
||||
<string name="pesdk_text_button_delete">Eliminar</string>
|
||||
<string name="pesdk_text_text_editTextPlaceholder">Tu texto</string>
|
||||
<string name="pesdk_brush_title_name">Pincel</string>
|
||||
<string name="pesdk_brush_button_color">Color</string>
|
||||
<string name="pesdk_brush_button_size">Size</string>
|
||||
<string name="pesdk_brush_button_hardness">Hardness</string>
|
||||
<string name="pesdk_brush_button_bringToFront">To Front</string>
|
||||
<string name="pesdk_brush_button_delete">Delete</string>
|
||||
<string name="pesdk_brush_title_brushColor">Brush Color</string>
|
||||
<string name="pesdk_brush_button_size">Tamaño</string>
|
||||
<string name="pesdk_brush_button_hardness">Dureza</string>
|
||||
<string name="pesdk_brush_button_bringToFront">Traer al frente</string>
|
||||
<string name="pesdk_brush_button_delete">Eliminar</string>
|
||||
<string name="pesdk_brush_title_brushColor">Color del pincel</string>
|
||||
<string name="pesdk_editor_title_name">Editor</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">Close Editor?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">Do you really want to discard the image?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Yes</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">¿Cerrar editor?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">¿Realmente quieres descartar la imagen?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Sí</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">No</string>
|
||||
<string name="pesdk_editor_cancel">Cancel</string>
|
||||
<string name="pesdk_editor_accept">Accept</string>
|
||||
<string name="pesdk_editor_save">Save</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">Exporting image…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">Exporting image %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Flip H</string>
|
||||
<string name="pesdk_common_button_flipV">Flip V</string>
|
||||
<string name="pesdk_common_button_undo">Undo</string>
|
||||
<string name="pesdk_common_button_redo">Redo</string>
|
||||
<string name="pesdk_common_title_colorPicker">Color Picker</string>
|
||||
<string name="pesdk_common_title_transparentColor">Transparent</string>
|
||||
<string name="pesdk_common_title_whiteColor">White</string>
|
||||
<string name="pesdk_common_title_grayColor">Gray</string>
|
||||
<string name="pesdk_common_title_blackColor">Black</string>
|
||||
<string name="pesdk_common_title_lightBlueColor">Light blue</string>
|
||||
<string name="pesdk_common_title_blueColor">Blue</string>
|
||||
<string name="pesdk_common_title_purpleColor">Purple</string>
|
||||
<string name="pesdk_common_title_orchidColor">Orchid</string>
|
||||
<string name="pesdk_common_title_pinkColor">Pink</string>
|
||||
<string name="pesdk_common_title_redColor">Red</string>
|
||||
<string name="pesdk_common_title_orangeColor">Orange</string>
|
||||
<string name="pesdk_common_title_goldColor">Gold</string>
|
||||
<string name="pesdk_common_title_yellowColor">Yellow</string>
|
||||
<string name="pesdk_common_title_oliveColor">Olive</string>
|
||||
<string name="pesdk_common_title_greenColor">Green</string>
|
||||
<string name="pesdk_common_title_aquamarinColor">Aquamarin</string>
|
||||
<string name="pesdk_common_title_pipettableColor">Pipettable color</string>
|
||||
<string name="pesdk_editor_cancel">Cancelar</string>
|
||||
<string name="pesdk_editor_accept">Aceptar</string>
|
||||
<string name="pesdk_editor_save">Guardar</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">Exportando imagen…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">Exportando imagen %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Girar Hor</string>
|
||||
<string name="pesdk_common_button_flipV">Girar Vert</string>
|
||||
<string name="pesdk_common_button_undo">Deshacer</string>
|
||||
<string name="pesdk_common_button_redo">Rehacer</string>
|
||||
<string name="pesdk_common_title_colorPicker">Cuentagotas</string>
|
||||
<string name="pesdk_common_title_transparentColor">Transparente</string>
|
||||
<string name="pesdk_common_title_whiteColor">Blanco</string>
|
||||
<string name="pesdk_common_title_grayColor">Gris</string>
|
||||
<string name="pesdk_common_title_blackColor">Negro</string>
|
||||
<string name="pesdk_common_title_lightBlueColor">Azul claro</string>
|
||||
<string name="pesdk_common_title_blueColor">Azul</string>
|
||||
<string name="pesdk_common_title_purpleColor">Púrpura</string>
|
||||
<string name="pesdk_common_title_orchidColor">Orquídea</string>
|
||||
<string name="pesdk_common_title_pinkColor">Rosa</string>
|
||||
<string name="pesdk_common_title_redColor">Rojo</string>
|
||||
<string name="pesdk_common_title_orangeColor">Naranja</string>
|
||||
<string name="pesdk_common_title_goldColor">Dorado</string>
|
||||
<string name="pesdk_common_title_yellowColor">Amarillo</string>
|
||||
<string name="pesdk_common_title_oliveColor">Oliva</string>
|
||||
<string name="pesdk_common_title_greenColor">Verde</string>
|
||||
<string name="pesdk_common_title_aquamarinColor">Aguamarina</string>
|
||||
<string name="pesdk_common_title_pipettableColor">Color pipetable</string>
|
||||
|
||||
<!-- FAQ -->
|
||||
<string name="faq_1_title">¿Cómo puedo hacer que Simple Gallery sea la galería de dispositivos predeterminada?</string>
|
||||
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">¿Cómo puedo hacer que un álbum siempre aparezca en la parte superior?</string>
|
||||
<string name="faq_3_text">Puede aguantar pulsado el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado.</string>
|
||||
<string name="faq_4_title">¿Cómo puedo avanzar videos?</string>
|
||||
<string name="faq_4_text">Puede arrastrar el dedo horizontalmente sobre el reproductor de video, o hacer clic en los textos de duración actual o máxima cerca de la barra de búsqueda, que moverán el video hacia atrás o hacia adelante.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">¿Cuál es la diferencia entre ocultar y excluir una carpeta?</string>
|
||||
<string name="faq_5_text">Excluir evita mostrar la carpeta solo en Simple Gallery, mientras que Ocultar funciona en el sistema y oculta la carpeta de otras galerías también. Funciona al crear un archivo \".nomedia \" vacío en la carpeta determinada, que luego puede eliminar también con cualquier administrador de archivos.</string>
|
||||
<string name="faq_6_title">¿Por qué aparecen las carpetas con la portada de la música o las pegatinas?</string>
|
||||
|
|
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files.</string>
|
||||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">How can I fast-forward videos?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_title">How can I fast forward videos?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string>
|
||||
|
|
|
@ -291,7 +291,7 @@
|
|||
<string name="faq_3_title">Comment faire pour qu\'un album soit toujours affiché tout en haut ?</string>
|
||||
<string name="faq_3_text">Vous devez simplement à effectuer un appui prolongé sur l\'album en question et choisir l\'icône \"Épingler\" dans le menu d\'actions. Vous pouvez en épingler plusieurs. Les éléments épinglés seront alors triés selon l\'ordre par défaut.</string>
|
||||
<string name="faq_4_title">Comment avancer rapidement dans les vidéos ?</string>
|
||||
<string name="faq_4_text">Vous pouvez soit faire glisser votre doigt horizontalement sur le lecteur vidéo, soit cliquer sur le texte en cours ou la durée maximale près de la barre de recherche. Cela déplacera la vidéo vers l\'arrière ou vers l\'avant.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Quelle est la différence entre cacher et exclure un dossier ?</string>
|
||||
<string name="faq_5_text">\"Exclure un dossier\" permet de ne pas l\'afficher uniquement dans Simple Gallery, alors que \"Cacher un dossier\" rend le dossier invisible sur l\'ensemble de l\'appareil, y compris les autres applications de galerie. Dans le dernier cas, un fichier \".nomedia\" est créé dans le dossier caché, et peut être supprimé avec n\'importe quel explorateur de fichiers.</string>
|
||||
<string name="faq_6_title">Pourquoi des dossiers avec des pochettes d\'albums musicaux ou des miniatures d\'images sont affichés ?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<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_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</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.</string>
|
||||
<string name="faq_6_title">Por qué aparecen cartafoles de música con portadas ou pegatinas?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Kako postići da je album uvijek na vrhu?</string>
|
||||
<string name="faq_3_text">Dugo pritisnute željeni album i odaberite ikonu igle na akcijskom izborniku, koji će ga pričvrstiti na vrh. Možete prikvačiti više mapa odjednom, prikvačene stavke će biti razvrstane prema zadanom načinu razvrstavanja.</string>
|
||||
<string name="faq_4_title">Kako mogu ubrzati video?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Koja je razlika između skrivanja i izuzimanja mape?</string>
|
||||
<string name="faq_5_text">Izuzimanje sprječava prikaz mape samo u Jednostavnoj galeriji, a skrivanje radi na razini sustava i skriva mapu iz drugih galerija. Djeluje stvaranjem praznih \".nomedia\" datoteka u zadanoj mapi, koju možete ukloniti pomoću bilo kojeg upraviteljem datoteka.</string>
|
||||
<string name="faq_6_title">Zašto se prikazuju mape s naslovnicama albuma i minijaturama slika?</string>
|
||||
|
|
|
@ -295,7 +295,7 @@ A következő alkalommal, amikor megpróbál megnyitni egy képet vagy videót,
|
|||
<string name="faq_3_title">Hogyan állíthatok be egy albumot úgy, hogy mindig felül legyen?</string>
|
||||
<string name="faq_3_text">Hosszan nyomja meg a kívánt albumot, és válassza ki a Kitűzés ikont a művelet menüben, ami rögzíti felülre. Többféle mappát is kitűzhet, ezeket az elemeket az alapértelmezett rendezési mód szerint rendezi.</string>
|
||||
<string name="faq_4_title">Hogyan tudom előre tekerni a videókat?</string>
|
||||
<string name="faq_4_text">Húzhatja az ujját vízszintesen a videolejátszón, vagy kattintson az aktuális vagy a max. időtartam szövegekre a keresősáv közelében. Ez visszafelé vagy előre mozgatja a videót.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Mi a különbség a mappa elrejtése és kizárása között?</string>
|
||||
<string name="faq_5_text">A Kizárás megakadályozza, hogy a mappát a Simple Gallery megjelenítse, az Elrejtés pedig rendszer szinten működik, és elrejti a mappát más galériákból is. Úgy működik, hogy létrehoz egy üres \". nomedia\" nevű fájlt az adott mappában, amelyet bármikor eltávolíthat bármilyen fájlkezelővel is.</string>
|
||||
<string name="faq_6_title">Miért jelennek meg a zenei borítóval vagy matricával rendelkező mappák?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Bagaimana agar album selalu muncul paling atas di dalam daftar?</string>
|
||||
<string name="faq_3_text">Anda bisa menekan lama album tersebut dan pilih ikon Pin di menu tindakan, hal tersebut akan membuat album tetap berada di bagian paling atas daftar. Anda juga bisa menyematkan beberapa folder, item yang di-pin akan diurutkan berdasarkan metode urutan default.</string>
|
||||
<string name="faq_4_title">Bagaimana cara mempercepat laju video?</string>
|
||||
<string name="faq_4_text">Anda bisa menyeret jari anda secara horizontal pada pemutar video, atau klik pada teks durasi saat ini atau maks dekat bilah laju. Hal tersebut akan memundurkan atau memajukan laju video.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Apa perbedaan antara menyembunyikan dan mengecualikan folder?</string>
|
||||
<string name="faq_5_text">Mengecualikan tidak akan menampilkan folder di Simple Gallery saja, sedangkan Sembunyikan bekerja sesuai aturan sistem dan akan menyembunyikan folder dari aplikasi galeri yang lain. Cara kerjanya dengan membuat berkas \".nomedia\" kosong pada folder yang diinginkan, yang bisa anda hapus juga dengan aplikasi pengelola berkas.</string>
|
||||
<string name="faq_6_title">Mengapa folder dengan gambar album musik atau stiker muncul?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Bagaimana agar album selalu muncul paling atas di dalam daftar?</string>
|
||||
<string name="faq_3_text">Anda bisa menekan lama album tersebut dan pilih ikon Pin di menu tindakan, hal tersebut akan membuat album tetap berada di bagian paling atas daftar. Anda juga bisa menyematkan beberapa folder, item yang di-pin akan diurutkan berdasarkan metode urutan default.</string>
|
||||
<string name="faq_4_title">Bagaimana cara mempercepat laju video?</string>
|
||||
<string name="faq_4_text">Anda bisa menyeret jari anda secara horizontal pada pemutar video, atau klik pada teks durasi saat ini atau maks dekat bilah laju. Hal tersebut akan memundurkan atau memajukan laju video.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Apa perbedaan antara menyembunyikan dan mengecualikan folder?</string>
|
||||
<string name="faq_5_text">Mengecualikan tidak akan menampilkan folder di Simple Gallery saja, sedangkan Sembunyikan bekerja sesuai aturan sistem dan akan menyembunyikan folder dari aplikasi galeri yang lain. Cara kerjanya dengan membuat berkas \".nomedia\" kosong pada folder yang diinginkan, yang bisa anda hapus juga dengan aplikasi pengelola berkas.</string>
|
||||
<string name="faq_6_title">Mengapa folder dengan gambar album musik atau stiker muncul?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Come posso fare apparire un album sempre in cima?</string>
|
||||
<string name="faq_3_text">Si può toccare a lungo l\'album desiderato e selezionare l\'icona puntina nel menù azioni, ciò lo fisserà in cima. Si possono anche fissare varie cartelle, gli elementi fissati saranno ordinati dal metodo di ordinamento predefinito.</string>
|
||||
<string name="faq_4_title">Come avanzo velocemente nei video?</string>
|
||||
<string name="faq_4_text">Si possono trascinare le proprie dita orrizontalmente sul video, oppure cliccando i testi accanto alla barra di avanzamento. In questo modo il video andrà avanti o indietro.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Che differenza c\'è tra nascondere ed escludere una cartella?</string>
|
||||
<string name="faq_5_text">Escludere impedisce la visualizzazione della cartella solo in Semplice Galleria, mentre nascondere ha effetto in tutto il sistema e nasconde la cartella anche alle altre gallerie. Funziona creando un file vuoto \".nomedia\" nella cartella in questione, si possono anche rimuovere successivamente con qualsiasi gestore dei file.</string>
|
||||
<string name="faq_6_title">Perchè vengono mostrate cartelle con copertine o adesivi di musica?</string>
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
<string name="fixing">修正中…</string>
|
||||
<string name="dates_fixed_successfully">撮影日が正常に修正されました</string>
|
||||
<string name="share_resized">リサイズした画像を共有</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">Switch to file search across all visible folders</string>
|
||||
<string name="upgraded_from_free">あなたは無料版からアップグレードしたと思われます。\"Upgrade to Pro\"というボタンが設定の上部にある無料版はアンインストールすることができます。\n\nごみ箱の中身は削除され、お気に入りもアプリの設定もリセットされることになります。\n\nありがとう!</string>
|
||||
<string name="switch_to_file_search">表示されているすべてのフォルダで検索 に切り替え</string>
|
||||
|
||||
<!-- Filter -->
|
||||
<string name="filter_media">表示する形式</string>
|
||||
|
@ -42,7 +42,7 @@
|
|||
<string name="gifs">GIF</string>
|
||||
<string name="raw_images">RAW</string>
|
||||
<string name="svgs">SVG</string>
|
||||
<string name="portraits">Portraits</string>
|
||||
<string name="portraits">ポートレイト</string>
|
||||
<string name="no_media_with_filters">条件に該当するメディアがありません。</string>
|
||||
<string name="change_filters_underlined"><u>絞り込み条件を変更</u></string>
|
||||
|
||||
|
@ -82,7 +82,7 @@
|
|||
<string name="path">パス</string>
|
||||
<string name="invalid_image_path">無効な画像パス</string>
|
||||
<string name="image_editing_failed">画像の編集に失敗しました</string>
|
||||
<string name="file_edited_successfully">File edited successfully</string>
|
||||
<string name="file_edited_successfully">ファイルの編集に成功しました</string>
|
||||
<string name="edit_image_with">画像を編集:</string>
|
||||
<string name="no_editor_found">画像エディターが見つかりません</string>
|
||||
<string name="unknown_file_location">ファイルの場所が不明です</string>
|
||||
|
@ -180,11 +180,11 @@
|
|||
<string name="deep_zoomable_images">画像のズームを深くする</string>
|
||||
<string name="show_highest_quality">可能な限り高品質で画像を表示</string>
|
||||
<string name="show_recycle_bin_last">ごみ箱をメイン画面の最後に表示</string>
|
||||
<string name="allow_down_gesture">Allow closing the fullscreen view with a down gesture</string>
|
||||
<string name="allow_one_to_one_zoom">Allow 1:1 zooming in with two double taps</string>
|
||||
<string name="allow_down_gesture">フルスクリーン表示を下にスワイプするジェスチャーで閉じる</string>
|
||||
<string name="allow_one_to_one_zoom">ダブルタップして 1:1 ズームする</string>
|
||||
<string name="open_videos_on_separate_screen">Always open videos on a separate screen with new horizontal gestures</string>
|
||||
<string name="show_notch">Show a notch if available</string>
|
||||
<string name="allow_rotating_gestures">Allow rotating images with gestures</string>
|
||||
<string name="allow_rotating_gestures">ジェスチャーで画像を回転する</string>
|
||||
<string name="file_loading_priority">File loading priority</string>
|
||||
<string name="speed">Speed</string>
|
||||
<string name="compromise">Compromise</string>
|
||||
|
@ -203,69 +203,69 @@
|
|||
<string name="toggle_file_visibility">表示/非表示の切替</string>
|
||||
|
||||
<!-- New editor strings -->
|
||||
<string name="pesdk_transform_button_freeCrop">Custom</string>
|
||||
<string name="pesdk_transform_button_resetCrop">Reset</string>
|
||||
<string name="pesdk_transform_button_squareCrop">Square</string>
|
||||
<string name="pesdk_transform_title_name">Transform</string>
|
||||
<string name="pesdk_filter_title_name">Filter</string>
|
||||
<string name="pesdk_filter_asset_none">None</string>
|
||||
<string name="pesdk_adjustments_title_name">Adjust</string>
|
||||
<string name="pesdk_adjustments_button_shadowTool">Shadows</string>
|
||||
<string name="pesdk_adjustments_button_exposureTool">Exposure</string>
|
||||
<string name="pesdk_adjustments_button_highlightTool">Highlights</string>
|
||||
<string name="pesdk_adjustments_button_brightnessTool">Brightness</string>
|
||||
<string name="pesdk_adjustments_button_contrastTool">Contrast</string>
|
||||
<string name="pesdk_adjustments_button_saturationTool">Saturation</string>
|
||||
<string name="pesdk_adjustments_button_clarityTool">Clarity</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_temperatureTool">Temperature</string>
|
||||
<string name="pesdk_adjustments_button_sharpnessTool">Sharpness</string>
|
||||
<string name="pesdk_adjustments_button_reset">Reset</string>
|
||||
<string name="pesdk_focus_title_name">Focus</string>
|
||||
<string name="pesdk_focus_title_disabled">None</string>
|
||||
<string name="pesdk_focus_button_radial">Radial</string>
|
||||
<string name="pesdk_focus_button_linear">Linear</string>
|
||||
<string name="pesdk_focus_button_mirrored">Mirrored</string>
|
||||
<string name="pesdk_focus_button_gaussian">Gaussian</string>
|
||||
<string name="pesdk_text_title_name">Text</string>
|
||||
<string name="pesdk_text_title_options">Text Options</string>
|
||||
<string name="pesdk_text_title_textColor">Text Color</string>
|
||||
<string name="pesdk_text_title_font">Font</string>
|
||||
<string name="pesdk_text_button_add">Add</string>
|
||||
<string name="pesdk_text_button_edit">Edit</string>
|
||||
<string name="pesdk_text_button_straighten">Straighten</string>
|
||||
<string name="pesdk_text_button_font">Font</string>
|
||||
<string name="pesdk_text_button_color">Color</string>
|
||||
<string name="pesdk_text_button_backgroundColor">BG Color</string>
|
||||
<string name="pesdk_text_button_alignment">Alignment</string>
|
||||
<string name="pesdk_text_button_bringToFront">To Front</string>
|
||||
<string name="pesdk_text_button_delete">Delete</string>
|
||||
<string name="pesdk_text_text_editTextPlaceholder">Your text</string>
|
||||
<string name="pesdk_brush_title_name">Brush</string>
|
||||
<string name="pesdk_brush_button_color">Color</string>
|
||||
<string name="pesdk_brush_button_size">Size</string>
|
||||
<string name="pesdk_brush_button_hardness">Hardness</string>
|
||||
<string name="pesdk_brush_button_bringToFront">To Front</string>
|
||||
<string name="pesdk_brush_button_delete">Delete</string>
|
||||
<string name="pesdk_brush_title_brushColor">Brush Color</string>
|
||||
<string name="pesdk_editor_title_name">Editor</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">Close Editor?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">Do you really want to discard the image?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Yes</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">No</string>
|
||||
<string name="pesdk_editor_cancel">Cancel</string>
|
||||
<string name="pesdk_editor_accept">Accept</string>
|
||||
<string name="pesdk_editor_save">Save</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">Exporting image…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">Exporting image %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Flip H</string>
|
||||
<string name="pesdk_common_button_flipV">Flip V</string>
|
||||
<string name="pesdk_common_button_undo">Undo</string>
|
||||
<string name="pesdk_common_button_redo">Redo</string>
|
||||
<string name="pesdk_common_title_colorPicker">Color Picker</string>
|
||||
<string name="pesdk_common_title_transparentColor">Transparent</string>
|
||||
<string name="pesdk_transform_button_freeCrop">カスタム</string>
|
||||
<string name="pesdk_transform_button_resetCrop">リセット</string>
|
||||
<string name="pesdk_transform_button_squareCrop">正方形</string>
|
||||
<string name="pesdk_transform_title_name">変形</string>
|
||||
<string name="pesdk_filter_title_name">フィルター</string>
|
||||
<string name="pesdk_filter_asset_none">なし</string>
|
||||
<string name="pesdk_adjustments_title_name">調整</string>
|
||||
<string name="pesdk_adjustments_button_shadowTool">シャドウ</string>
|
||||
<string name="pesdk_adjustments_button_exposureTool">露出</string>
|
||||
<string name="pesdk_adjustments_button_highlightTool">ハイライト</string>
|
||||
<string name="pesdk_adjustments_button_brightnessTool">明るさ</string>
|
||||
<string name="pesdk_adjustments_button_contrastTool">コントラスト</string>
|
||||
<string name="pesdk_adjustments_button_saturationTool">彩度</string>
|
||||
<string name="pesdk_adjustments_button_clarityTool">明瞭度</string>
|
||||
<string name="pesdk_adjustments_button_gammaTool">ガンマ</string>
|
||||
<string name="pesdk_adjustments_button_blacksTool">黒レベル</string>
|
||||
<string name="pesdk_adjustments_button_whitesTool">白レベル</string>
|
||||
<string name="pesdk_adjustments_button_temperatureTool">色温度</string>
|
||||
<string name="pesdk_adjustments_button_sharpnessTool">シャープネス</string>
|
||||
<string name="pesdk_adjustments_button_reset">リセット</string>
|
||||
<string name="pesdk_focus_title_name">ぼかし</string>
|
||||
<string name="pesdk_focus_title_disabled">なし</string>
|
||||
<string name="pesdk_focus_button_radial">円形</string>
|
||||
<string name="pesdk_focus_button_linear">直線</string>
|
||||
<string name="pesdk_focus_button_mirrored">ミラー</string>
|
||||
<string name="pesdk_focus_button_gaussian">ガウス</string>
|
||||
<string name="pesdk_text_title_name">テキスト</string>
|
||||
<string name="pesdk_text_title_options">テキスト オプション</string>
|
||||
<string name="pesdk_text_title_textColor">文字色</string>
|
||||
<string name="pesdk_text_title_font">フォント</string>
|
||||
<string name="pesdk_text_button_add">追加</string>
|
||||
<string name="pesdk_text_button_edit">編集</string>
|
||||
<string name="pesdk_text_button_straighten">まっすぐにする</string>
|
||||
<string name="pesdk_text_button_font">フォント</string>
|
||||
<string name="pesdk_text_button_color">色</string>
|
||||
<string name="pesdk_text_button_backgroundColor">背景色</string>
|
||||
<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_brush_title_name">ブラシ</string>
|
||||
<string name="pesdk_brush_button_color">色</string>
|
||||
<string name="pesdk_brush_button_size">太さ</string>
|
||||
<string name="pesdk_brush_button_hardness">硬度</string>
|
||||
<string name="pesdk_brush_button_bringToFront">前面に</string>
|
||||
<string name="pesdk_brush_button_delete">削除</string>
|
||||
<string name="pesdk_brush_title_brushColor">ブラシの色</string>
|
||||
<string name="pesdk_editor_title_name">エディター</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">エディターを閉じますか?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">画像を破棄して閉じますか?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">はい</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">いいえ</string>
|
||||
<string name="pesdk_editor_cancel">キャンセル</string>
|
||||
<string name="pesdk_editor_accept">了解</string>
|
||||
<string name="pesdk_editor_save">保存</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">画像を保存中……</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">画像を保存中 %s.</string>
|
||||
<string name="pesdk_common_button_flipH">水平方向に反転</string>
|
||||
<string name="pesdk_common_button_flipV">垂直方向に反転</string>
|
||||
<string name="pesdk_common_button_undo">元に戻す</string>
|
||||
<string name="pesdk_common_button_redo">やり直し</string>
|
||||
<string name="pesdk_common_title_colorPicker">カラーピッカー</string>
|
||||
<string name="pesdk_common_title_transparentColor">透明</string>
|
||||
<string name="pesdk_common_title_whiteColor">White</string>
|
||||
<string name="pesdk_common_title_grayColor">Gray</string>
|
||||
<string name="pesdk_common_title_blackColor">Black</string>
|
||||
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">動画を早送りするにはどうすればよいですか?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string>
|
||||
|
@ -366,6 +366,9 @@
|
|||
|
||||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
|
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files.</string>
|
||||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">How can I fast-forward videos?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_title">How can I fast forward videos?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Kaip aš galiu padaryti albumą visada rodomą viršuje?</string>
|
||||
<string name="faq_3_text">Galite ilgai paspausti norimą albumą ir pasirinkti "Prisegti" piktogramą, esančią meniu "Veiksmo meniu", viršuje. Galite prisegti kelis aplankus, prisegti elementai bus rūšiuojami pagal numatytąjį rūšiavimo metodą.</string>
|
||||
<string name="faq_4_title">Kaip galėčiau greitai prasukti vaizdo įrašus?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Koks skirtumas tarp slėpimo ir išskyrimo iš aplanko?</string>
|
||||
<string name="faq_5_text">Išskyrimas neleidžia rodyti aplanko tik paprastoje galerijoje, tuo tarpu slėpimas slepia aplanką iš kitų galerijų. Tai veikia, sukuriant tuščią \ ". Nomedia \" bylą tam tikrame aplanke, kurį vėliau galite pašalinti bet kuria bylų tvarkykle.</string>
|
||||
<string name="faq_6_title">Kodėl pasirodo aplankai su muzikos viršeliu ar lipdukais?</string>
|
||||
|
|
|
@ -226,16 +226,16 @@
|
|||
<string name="pesdk_focus_title_name">Fokus</string>
|
||||
<string name="pesdk_focus_title_disabled">Ingen</string>
|
||||
<string name="pesdk_focus_button_radial">Radial</string>
|
||||
<string name="pesdk_focus_button_linear">Linear</string>
|
||||
<string name="pesdk_focus_button_mirrored">Mirrored</string>
|
||||
<string name="pesdk_focus_button_gaussian">Gaussian</string>
|
||||
<string name="pesdk_focus_button_linear">Lineær</string>
|
||||
<string name="pesdk_focus_button_mirrored">Speilet</string>
|
||||
<string name="pesdk_focus_button_gaussian">Gaussisk</string>
|
||||
<string name="pesdk_text_title_name">Tekst</string>
|
||||
<string name="pesdk_text_title_options">Tekstvalg</string>
|
||||
<string name="pesdk_text_title_textColor">Tekstfarge</string>
|
||||
<string name="pesdk_text_title_font">Skrift</string>
|
||||
<string name="pesdk_text_button_add">Legg til</string>
|
||||
<string name="pesdk_text_button_edit">Rediger</string>
|
||||
<string name="pesdk_text_button_straighten">Straighten</string>
|
||||
<string name="pesdk_text_button_straighten">Rette</string>
|
||||
<string name="pesdk_text_button_font">Skrift</string>
|
||||
<string name="pesdk_text_button_color">Farge</string>
|
||||
<string name="pesdk_text_button_backgroundColor">Bakg.farge</string>
|
||||
|
@ -250,38 +250,38 @@
|
|||
<string name="pesdk_brush_button_bringToFront">Til front</string>
|
||||
<string name="pesdk_brush_button_delete">Slett</string>
|
||||
<string name="pesdk_brush_title_brushColor">Penselfarge</string>
|
||||
<string name="pesdk_editor_title_name">Editor</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">Close Editor?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">Do you really want to discard the image?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Yes</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">No</string>
|
||||
<string name="pesdk_editor_cancel">Cancel</string>
|
||||
<string name="pesdk_editor_accept">Accept</string>
|
||||
<string name="pesdk_editor_save">Save</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">Exporting image…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">Exporting image %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Flip H</string>
|
||||
<string name="pesdk_common_button_flipV">Flip V</string>
|
||||
<string name="pesdk_common_button_undo">Undo</string>
|
||||
<string name="pesdk_common_button_redo">Redo</string>
|
||||
<string name="pesdk_common_title_colorPicker">Color Picker</string>
|
||||
<string name="pesdk_common_title_transparentColor">Transparent</string>
|
||||
<string name="pesdk_common_title_whiteColor">White</string>
|
||||
<string name="pesdk_common_title_grayColor">Gray</string>
|
||||
<string name="pesdk_common_title_blackColor">Black</string>
|
||||
<string name="pesdk_common_title_lightBlueColor">Light blue</string>
|
||||
<string name="pesdk_common_title_blueColor">Blue</string>
|
||||
<string name="pesdk_common_title_purpleColor">Purple</string>
|
||||
<string name="pesdk_common_title_orchidColor">Orchid</string>
|
||||
<string name="pesdk_common_title_pinkColor">Pink</string>
|
||||
<string name="pesdk_common_title_redColor">Red</string>
|
||||
<string name="pesdk_editor_title_name">Redigering</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">Lukke Redigering?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">Vil du forkaste bildet?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Ja</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">Nei</string>
|
||||
<string name="pesdk_editor_cancel">Avbryt</string>
|
||||
<string name="pesdk_editor_accept">Aksepter</string>
|
||||
<string name="pesdk_editor_save">Lagre</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">Eksporterer bilde…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">Eksporterer bilde %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Speilvend H</string>
|
||||
<string name="pesdk_common_button_flipV">Speilvend V</string>
|
||||
<string name="pesdk_common_button_undo">Angre</string>
|
||||
<string name="pesdk_common_button_redo">Annuler angre</string>
|
||||
<string name="pesdk_common_title_colorPicker">Fargevelger</string>
|
||||
<string name="pesdk_common_title_transparentColor">Gjennomsiktig</string>
|
||||
<string name="pesdk_common_title_whiteColor">Hvit</string>
|
||||
<string name="pesdk_common_title_grayColor">Grå</string>
|
||||
<string name="pesdk_common_title_blackColor">Svart</string>
|
||||
<string name="pesdk_common_title_lightBlueColor">Lyseblå</string>
|
||||
<string name="pesdk_common_title_blueColor">Blå</string>
|
||||
<string name="pesdk_common_title_purpleColor">Lilla</string>
|
||||
<string name="pesdk_common_title_orchidColor">Orkide</string>
|
||||
<string name="pesdk_common_title_pinkColor">Rosa</string>
|
||||
<string name="pesdk_common_title_redColor">Rød</string>
|
||||
<string name="pesdk_common_title_orangeColor">Orange</string>
|
||||
<string name="pesdk_common_title_goldColor">Gold</string>
|
||||
<string name="pesdk_common_title_yellowColor">Yellow</string>
|
||||
<string name="pesdk_common_title_oliveColor">Olive</string>
|
||||
<string name="pesdk_common_title_greenColor">Green</string>
|
||||
<string name="pesdk_common_title_aquamarinColor">Aquamarin</string>
|
||||
<string name="pesdk_common_title_pipettableColor">Pipettable color</string>
|
||||
<string name="pesdk_common_title_goldColor">Gull</string>
|
||||
<string name="pesdk_common_title_yellowColor">Gul</string>
|
||||
<string name="pesdk_common_title_oliveColor">Oliven</string>
|
||||
<string name="pesdk_common_title_greenColor">Grønn</string>
|
||||
<string name="pesdk_common_title_aquamarinColor">Akvamarin</string>
|
||||
<string name="pesdk_common_title_pipettableColor">Pipettefarge</string>
|
||||
|
||||
<!-- FAQ -->
|
||||
<string name="faq_1_title">How can I make Simple Gallery the default device gallery?</string>
|
||||
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files.</string>
|
||||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">How can I fast-forward videos?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_title">How can I fast forward videos?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string>
|
||||
|
|
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files.</string>
|
||||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">How can I fast-forward videos?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_title">How can I fast forward videos?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Hoe kan ik een map bovenaan vastzetten?</string>
|
||||
<string name="faq_3_text">Druk lang op het map en kies vervolgens de punaise in het actiemenu. Als er meerdere mappen zijn vastgezet, zullen deze worden weergeven op basis van de standaardsortering.</string>
|
||||
<string name="faq_4_title">Hoe kan ik terug- of vooruitspoelen in video’s?</string>
|
||||
<string name="faq_4_text">Sleep horizontaal over de videospeler, of klik bij de zoekbalk op de cijfers die de huidige voortgang of de lengte weergeven. Hierbij zal de video respectievelijk terug- of vooruitspringen.</string>
|
||||
<string name="faq_4_text">Dubbelklik op de zijkant van het scherm, of tik op de cijfers die de voortgang of de lengte van de video weergeven om resp. terug of vooruit te springen. Als de instelling om video's in een apart scherm te openen is ingeschakeld, dan kunnen ook horizontale veeggebaren worden gebruikt.</string>
|
||||
<string name="faq_5_title">Wat is het verschil tussen het verbergen en het uitsluiten van mappen?</string>
|
||||
<string name="faq_5_text">Met \"Uitsluiten\" wordt het tonen van de map alleen binnen deze app voorkomen, terwijl \"Verbergen\" de map ook zal verbergen voor andere galerij-apps. Met \"Verbergen\" wordt een bestand genaamd \".nomedia\" in de te verbergen map aangemaakt (het verwijderen van dit bestand uit de map maakt het verbergen ongedaan).</string>
|
||||
<string name="faq_6_title">Waarom zie ik mappen met stickers of covers van muziekalbums?</string>
|
||||
|
|
|
@ -291,7 +291,7 @@
|
|||
<string name="faq_3_title">Jak sprawić, aby album(y) zawsze pojawiał(y) się na górze?</string>
|
||||
<string name="faq_3_text">Przytrzymaj album(y) i wybierz ikonę przypięcia w pasku akcji.</string>
|
||||
<string name="faq_4_title">Jak mogę przwijać filmy?</string>
|
||||
<string name="faq_4_text">Na dwa sposoby: albo przeciągając poziomo palcem po filmie, albo klikając obecny (przewinięcie do tyłu) lub całkowity czas trwania (do przodu).</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Jaka jest różnica między ukryciem, a wykluczeniem folderu?</string>
|
||||
<string name="faq_5_text">Wykluczenie działa tylko w obrębie niniejszej aplikacji (wszędzie indziej pliki są normalnie widoczne), ukrywanie - w obrębie całego systemu (nie widać ich nigdzie), dodawany jest wtedy do folderu pusty plik \'.nomedia\', który możesz usunąć w dowolnym menedżerze plików.</string>
|
||||
<string name="faq_6_title">Dlaczego pokazują mi się foldery z okładkami do piosenek i tym podobne rzeczy?</string>
|
||||
|
|
|
@ -5,15 +5,15 @@
|
|||
<string name="edit">Editar</string>
|
||||
<string name="open_camera">Abrir câmera</string>
|
||||
<string name="hidden">(oculto)</string>
|
||||
<string name="excluded">(excluído)</string>
|
||||
<string name="excluded">(ignorado)</string>
|
||||
<string name="pin_folder">Fixar pasta</string>
|
||||
<string name="unpin_folder">Desafixar pasta</string>
|
||||
<string name="pin_to_the_top">Fixar no topo</string>
|
||||
<string name="show_all">Mostrar conteúdo de todas as pastas</string>
|
||||
<string name="show_all">Exibir conteúdo de todas as pastas</string>
|
||||
<string name="all_folders">Todas as pastas</string>
|
||||
<string name="folder_view">Alternar para a visualização de pastas</string>
|
||||
<string name="other_folder">Outra pasta</string>
|
||||
<string name="show_on_map">Mostrar no mapa</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>
|
||||
|
@ -32,7 +32,7 @@
|
|||
<string name="fixing">Corrigindo…</string>
|
||||
<string name="dates_fixed_successfully">Datas corrigidas com sucesso</string>
|
||||
<string name="share_resized">Compartilhar uma versão redimensionada</string>
|
||||
<string name="upgraded_from_free">Olá,\n\nparece que você atualizou o antigo aplicativo gratuito. Agora você poderá desinstalar a velha versão que tem o botão de atualizar para a versão Pro no topo das Configurações.\n\nVocê terá os itens da Lixeira excluídos, itens favoritos desmarcados e também terá que redefinir as configurações do seu aplicativo.\n\nObrigado!</string>
|
||||
<string name="upgraded_from_free">Olá,\n\nparece que você está atualizando do antigo aplicativo gratuito. Agora você já pode desinstalar a versão antiga, que tem o botão de atualizar para a versão Pro no topo da pagina de Configurações.\n\nVocê terá os itens da Lixeira excluídos, itens favoritos desmarcados e também terá que redefinir as configurações do seu aplicativo.\n\nObrigado!</string>
|
||||
<string name="switch_to_file_search">Alternar para a pesquisa de arquivos em todas as pastas visíveis</string>
|
||||
|
||||
<!-- Filter -->
|
||||
|
@ -47,25 +47,25 @@
|
|||
<string name="change_filters_underlined"><u>Alterar filtros</u></string>
|
||||
|
||||
<!-- Hide / Exclude -->
|
||||
<string name="hide_folder_description">Esta opção oculta a pasta com a adição de um arquivo \".nomedia\" dentro dela, o que também ocultará todas as subpastas que estejam dentro da mesma. Você poderá voltar a exibir estas pastas com a opção \"Mostrar pastas ocultas\". Continuar?</string>
|
||||
<string name="hide_folder_description">Esta opção oculta a pasta ao adicionar um arquivo \".nomedia\" dentro dela, o que também ocultará todas as suas subpastas. Você poderá voltar a exibir estas pastas com a opção \"Exibir pastas ocultas\". Continuar?</string>
|
||||
<string name="exclude">Ignorar</string>
|
||||
<string name="excluded_folders">Pastas ignoradas</string>
|
||||
<string name="manage_excluded_folders">Gerenciar pastas ignoradas</string>
|
||||
<string name="exclude_folder_description">Esta ação deixará de exibir as pastas selecionadas apenas dentro deste aplicativo. Você pode gerenciar as pastas ignoradas nas Configurações do aplicativo.</string>
|
||||
<string name="exclude_folder_description">Esta ação deixará de exibir as pastas selecionadas apenas dentro deste aplicativo. Você pode gerenciar as pastas ignoradas nas configurações do aplicativo.</string>
|
||||
<string name="exclude_folder_parent">Ignorar a pasta raiz ao invés desta?</string>
|
||||
<string name="excluded_activity_placeholder">Ignorar uma pasta apenas deixa de exibi-la nesta galeria. Ela continuará visível para outros aplicativos.\n\nSe você quiser ocultar a pasta para todos os aplicativos, utilize a função ocultar.</string>
|
||||
<string name="excluded_activity_placeholder">Ignorar uma pasta apenas deixa de exibi-la nesta galeria. Ela continuará visível para outros aplicativos.\n\nSe você quiser ocultar a pasta para todos os aplicativos, utilize a função Ocultar.</string>
|
||||
<string name="remove_all">Remover todas</string>
|
||||
<string name="remove_all_description">Remover todas as pastas da lista de pastas ignoradas? Esta ação não exclui as pastas.</string>
|
||||
<string name="hidden_folders">Pastas ocultas</string>
|
||||
<string name="manage_hidden_folders">Gerenciar pastas ocultas</string>
|
||||
<string name="hidden_folders_placeholder">Parece que você não tem nenhuma pasta ocultada por um arquivo \".nomedia\".</string>
|
||||
<string name="hidden_folders_placeholder">Parece que você não tem nenhuma pasta oculta por um arquivo \".nomedia\".</string>
|
||||
|
||||
<!-- Include folders -->
|
||||
<string name="include_folders">Pastas incluídas</string>
|
||||
<string name="manage_included_folders">Gerenciar pastas incluídas</string>
|
||||
<string name="include_folders">Pastas inclusas</string>
|
||||
<string name="manage_included_folders">Gerenciar pastas inclusas</string>
|
||||
<string name="add_folder">Adicionar pasta</string>
|
||||
<string name="included_activity_placeholder">Se você possuir pastas com dados multimídia não reconhecidos pelo aplicativo, aqui você pode adicioná-las manualmente.</string>
|
||||
<string name="no_media_add_included">Nenhum arquivo de mídia foi encontrado. Como alternativa você pode tentar incluir manualmente as pastas com arquivos de mídia.</string>
|
||||
<string name="included_activity_placeholder">Se você possuir pastas contendo mídia, mas que não foram reconhecidas pelo aplicativo, aqui você pode adicioná-las manualmente.</string>
|
||||
<string name="no_media_add_included">Nenhum arquivo de mídia foi encontrado. Você pode resolver isso incluindo manualmente as pastas com arquivos de mídia.</string>
|
||||
|
||||
<!-- Resizing -->
|
||||
<string name="resize">Redimensionar</string>
|
||||
|
@ -84,8 +84,8 @@
|
|||
<string name="image_editing_failed">Falha na edição da imagem</string>
|
||||
<string name="file_edited_successfully">Arquivo editado com sucesso</string>
|
||||
<string name="edit_image_with">Editar imagem com:</string>
|
||||
<string name="no_editor_found">Editor não encontrado</string>
|
||||
<string name="unknown_file_location">Localização desconhecida</string>
|
||||
<string name="no_editor_found">Nenhum editor de imagem encontrado</string>
|
||||
<string name="unknown_file_location">Localização de arquivo desconhecida</string>
|
||||
<string name="error_saving_file">Não foi possível substituir o arquivo original</string>
|
||||
<string name="rotate_left">Girar para a esquerda</string>
|
||||
<string name="rotate_right">Girar para a direita</string>
|
||||
|
@ -101,7 +101,7 @@
|
|||
<string name="set_as_wallpaper">Definir como papel de parede</string>
|
||||
<string name="set_as_wallpaper_failed">Falha ao definir como papel de parede</string>
|
||||
<string name="set_as_wallpaper_with">Definir papel de parede com:</string>
|
||||
<string name="setting_wallpaper">Definindo como papel de parede</string>
|
||||
<string name="setting_wallpaper">Definindo como papel de parede…</string>
|
||||
<string name="wallpaper_set_successfully">Papel de parede definido com sucesso</string>
|
||||
<string name="portrait_aspect_ratio">Retrato</string>
|
||||
<string name="landscape_aspect_ratio">Paisagem</string>
|
||||
|
@ -116,7 +116,7 @@
|
|||
<string name="include_videos">Incluir vídeos</string>
|
||||
<string name="include_gifs">Incluir GIFs</string>
|
||||
<string name="random_order">Ordem aleatória</string>
|
||||
<string name="move_backwards">Retroceder</string>
|
||||
<string name="move_backwards">Ordem inversa</string>
|
||||
<string name="loop_slideshow">Apresentação em ciclo</string>
|
||||
<string name="animation">Animação</string>
|
||||
<string name="no_animation">Nenhuma</string>
|
||||
|
@ -151,8 +151,8 @@
|
|||
|
||||
<!-- Settings -->
|
||||
<string name="autoplay_videos">Reproduzir vídeos automaticamente</string>
|
||||
<string name="remember_last_video_position">Lembrar da última posição de reprodução de vídeo</string>
|
||||
<string name="toggle_filename">Mostrar/ocultar nome do arquivo</string>
|
||||
<string name="remember_last_video_position">Lembrar posição da última reprodução de vídeo</string>
|
||||
<string name="toggle_filename">Exibir/ocultar nome do arquivo</string>
|
||||
<string name="loop_videos">Reproduzir vídeos em ciclo</string>
|
||||
<string name="animate_gifs">Animar GIFs nas miniaturas</string>
|
||||
<string name="max_brightness">Maximizar o brilho ao visualizar mídia em tela cheia</string>
|
||||
|
@ -162,48 +162,48 @@
|
|||
<string name="screen_rotation_system_setting">Padrão do sistema</string>
|
||||
<string name="screen_rotation_device_rotation">Sensor do aparelho</string>
|
||||
<string name="screen_rotation_aspect_ratio">Proporção da mídia</string>
|
||||
<string name="black_background_at_fullscreen">Fundo de tela e barra de status preta quando em visualização de tela cheia</string>
|
||||
<string name="black_background_at_fullscreen">Fundo preto quando mídia estiver em tela cheia</string>
|
||||
<string name="scroll_thumbnails_horizontally">Rolar miniaturas horizontalmente</string>
|
||||
<string name="hide_system_ui_at_fullscreen">Esconder interface do sistema quando em tela cheia</string>
|
||||
<string name="delete_empty_folders">Apagar pastas vazias após excluir o seu conteúdo</string>
|
||||
<string name="allow_photo_gestures">Permitir controle do brilho com gestos na vertical</string>
|
||||
<string name="allow_video_gestures">Permitir controle do volume e brilho com gestos na vertical</string>
|
||||
<string name="show_media_count">Mostrar quantidade de arquivos em cada pasta na tela inicial</string>
|
||||
<string name="allow_photo_gestures">Habilitar controle do brilho com gestos na vertical</string>
|
||||
<string name="allow_video_gestures">Habilitar controle de volume e brilho com gestos na vertical</string>
|
||||
<string name="show_media_count">Exibir quantidade de arquivos em cada pasta na tela inicial</string>
|
||||
<string name="show_extended_details">Exibir detalhes adicionais quando em tela cheia</string>
|
||||
<string name="manage_extended_details">Gerenciar detalhes adicionais</string>
|
||||
<string name="one_finger_zoom">Permitir zoom com um dedo quando em exibição de tela cheia</string>
|
||||
<string name="allow_instant_change">Tocar na lateral da tela navega para a próxima imagem ou vídeo</string>
|
||||
<string name="allow_deep_zooming_images">Permitir zoom aprofundado para imagens</string>
|
||||
<string name="hide_extended_details">Ocultar detalhes adicionais quando a barra de status estiver oculta</string>
|
||||
<string name="show_at_bottom">Mostrar alguns botões de ação na parte inferior da tela</string>
|
||||
<string name="show_recycle_bin">Mostrar a Lixeira na tela inicial</string>
|
||||
<string name="one_finger_zoom">Habilitar zoom com um dedo em exibição de tela cheia</string>
|
||||
<string name="allow_instant_change">Habilitar a troca de mídia tocando nas laterais da tela</string>
|
||||
<string name="allow_deep_zooming_images">Habilitar zoom aprofundado para imagens</string>
|
||||
<string name="hide_extended_details">Ocultar detalhes adicionais quando a barra de status estiver escondida</string>
|
||||
<string name="show_at_bottom">Exibir alguns botões de ação na parte inferior da tela</string>
|
||||
<string name="show_recycle_bin">Exibir a Lixeira na tela inicial</string>
|
||||
<string name="deep_zoomable_images">Zoom aprofundado para imagens</string>
|
||||
<string name="show_highest_quality">Mostrar imagens na maior qualidade possível</string>
|
||||
<string name="show_recycle_bin_last">Mostrar a Lixeira como o último item na tela inicial</string>
|
||||
<string name="allow_down_gesture">Gesto para baixo sai da exibição em tela cheia</string>
|
||||
<string name="allow_one_to_one_zoom">Dois toques duplos fazem zoom 1:1</string>
|
||||
<string name="show_highest_quality">Exibir imagens na maior qualidade possível</string>
|
||||
<string name="show_recycle_bin_last">Exibir a Lixeira como o último item na tela inicial</string>
|
||||
<string name="allow_down_gesture">Habilitar fechar a exibição em tela cheia com um gesto para baixo</string>
|
||||
<string name="allow_one_to_one_zoom">Habilitar zoom 1:1 com dois toques duplos</string>
|
||||
<string name="open_videos_on_separate_screen">Sempre abrir vídeos em uma tela separada com novos gestos horizontais</string>
|
||||
<string name="show_notch">Mostrar o notch, se existente</string>
|
||||
<string name="allow_rotating_gestures">Permitir rotação de imagens com gestos</string>
|
||||
<string name="show_notch">Exibir o notch, se existente</string>
|
||||
<string name="allow_rotating_gestures">Habilitar rotação de imagens com gestos</string>
|
||||
<string name="file_loading_priority">Prioridade de carregamento de arquivos</string>
|
||||
<string name="speed">Velocidade</string>
|
||||
<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">Mostrar tipos de arquivo de imagem</string>
|
||||
<string name="show_image_file_types">Exibir tipos de arquivo de imagem</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Miniaturas</string>
|
||||
<string name="fullscreen_media">Mídia em tela cheia</string>
|
||||
<string name="extended_details">Detalhes adicionais</string>
|
||||
<string name="bottom_actions">Botões de ação</string>
|
||||
<string name="bottom_actions">Barra inferior</string>
|
||||
|
||||
<!-- Bottom actions -->
|
||||
<string name="manage_bottom_actions">Gerenciar botões de ação</string>
|
||||
<string name="toggle_favorite">Favoritar/Desfavoritar</string>
|
||||
<string name="toggle_file_visibility">Exibir/Ocultar arquivo</string>
|
||||
<string name="manage_bottom_actions">Gerenciar botões visíveis</string>
|
||||
<string name="toggle_favorite">Favoritar/desfavoritar</string>
|
||||
<string name="toggle_file_visibility">Exibir/ocultar arquivo</string>
|
||||
|
||||
<!-- New editor strings -->
|
||||
<string name="pesdk_transform_button_freeCrop">Personalizadar</string>
|
||||
<string name="pesdk_transform_button_freeCrop">Personalizar</string>
|
||||
<string name="pesdk_transform_button_resetCrop">Redefinir</string>
|
||||
<string name="pesdk_transform_button_squareCrop">Quadrado</string>
|
||||
<string name="pesdk_transform_title_name">Modificar</string>
|
||||
|
@ -284,43 +284,45 @@
|
|||
<string name="pesdk_common_title_pipettableColor">Cor pipetável</string>
|
||||
|
||||
<!-- FAQ -->
|
||||
<string name="faq_1_title">O que devo fazer para que a Simple Galeria seja o aplicativo de galeria padrão do meu aparelho?</string>
|
||||
<string name="faq_1_text">Primeiro, você deve encontrar o aplicativo padrão atual nas configurações do seu aparelho, e apertar o botão que diz "Limpar Padrões".
|
||||
Na próxima vez que você abrir uma imagem ou vídeo, você deverá ver um seletor do aplicativo, no qual você terá a oportunidade de selecionar a Simple Galeria como o app padrão.</string>
|
||||
<string name="faq_2_title">Eu protegi o app com senha, mas me esqueci da senha. O que posso fazer?</string>
|
||||
<string name="faq_2_text">Você pode resolver isto de duas formas. A primeira é reinstalar o aplicativo. A segunda é ir nas configurações do seu dispositivo e selecionar a opção "Restaurar preferências do app".</string>
|
||||
<string name="faq_3_title">Como posso fazer para que uma pasta sempre apareça no topo da lista?</string>
|
||||
<string name="faq_3_text">Faça um toque longo na pasta em questão, e depois toque no ícone de alfinete na parte superior da tela para fixar a pasta ao topo. Se você fixar múltiplas pastas, elas serão ordenadas de acordo como seu critério de ordenação padrão.</string>
|
||||
<string name="faq_4_title">Como faço para avançar rapidamente um vídeo (fast-forward)?</string>
|
||||
<string name="faq_4_text">Você pode fazer um gesto horizontal como dedo, ou tocar nos números de tempo atual ou tempo total do vídeo, que se encontram próximos à barra de posicionamento.</string>
|
||||
<string name="faq_1_title">Como posso fazer do Simple Galeria a galeria padrão do dispositivo?</string>
|
||||
<string name="faq_1_text">Primeiro, você deve encontrar o aplicativo padrão atual nas configurações do seu dispositivo, procurar um botão que diga algo como "Abrir por padrão", clicar nele e selecionar \"Limpar padrão\"
|
||||
Na próxima vez que você abrir uma imagem ou vídeo, você deverá ver um seletor do aplicativo, no qual você terá a oportunidade de selecionar a Simple Galeria como o app padrão.</string>
|
||||
<string name="faq_2_title">Eu protegi o app com senha, mas a esqueci. O que posso fazer?</string>
|
||||
<string name="faq_2_text">Você pode resolver isto de duas formas. Você pode reinstalar o aplicativo ou ir nas configurações do seu dispositivo e selecionar a opção "Limpar armazenamento". Isto irá redefinir todas as suas configurações, não removerá nenhum arquivo de mídia.</string>
|
||||
<string name="faq_3_title">O que posso fazer para que uma pasta sempre apareça no topo da lista?</string>
|
||||
<string name="faq_3_text">Faça um toque longo na pasta em questão, e depois toque no ícone de alfinete na parte superior da tela, isto irá fixá-la no topo. Você também pode fixar várias pastas; os itens fixados serão classificados pelo método de ordenação padrão.</string>
|
||||
<string name="faq_4_title">Como faço para avançar rapidamente um vídeo (fast forward)?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Qual é a diferença entre ocultar e ignorar uma pasta?</string>
|
||||
<string name="faq_5_text">O opção de ignorar deixa de exibir a pasta apenas na Simple Galeria, enquanto a opção de ocultar afeta todo o sistema, e também irá deixar de exibir a pasta em outros apps de galeria. A função de ocultar cria um arquivo vazio chamado \".nomedia\" na raiz da pasta em questão. Caso você queira fazer a pasta voltar a ser exibida, você pode excluir o arquivo \".nomedia\" usando o gerenciador de arquivos.</string>
|
||||
<string name="faq_5_text">Ignorar deixa de exibir a pasta apenas no Simple Galeria, enquanto Ocultar afeta todo o sistema e pode ocultar pastas de outras galerias também. A função ocultar funciona adicionando um arquivo vazio chamado \".nomedia\" na pasta em questão, arquivo este você também pode excluir com um gerenciador de arquivos, se quiser.</string>
|
||||
<string name="faq_6_title">Porque pastas com capas de CD de música ou figurinhas aparecem na lista?</string>
|
||||
<string name="faq_6_text">Você pode pedir para a Simple Galeria ignorar estas pastas, adicionando a pasta raiz onde você guarda as suas músicas à lista de pastas ignoradas. Uma maneira de fazer isso é fazer um toque longo em uma destas pastas, e selecionar a opção Ignorar e, em seguida, seleciona a pasta pai.</string>
|
||||
<string name="faq_6_text">Pode acontecer de que algumas pastas incomuns apareçam. Você pode utlizar a opção Ignorar nestas pastas, adicionando-as a lista de pastas ignoradas. Uma maneira de fazer isso é realizar um toque longo em uma destas pastas, selecionar a opção Ignorar e, em seguida, selecionar a pasta pai.</string>
|
||||
<string name="faq_7_title">Uma das minhas pastas não aparece, ou nem todos os seus itens são exibidos. O que posso fazer?</string>
|
||||
<string name="faq_7_text">Isso pode ocorrer por diversos motivos, mas resolver o problema é fácil. Entre em Configurações --> Gerenciar pastas incluídas, toque no botão \"+\", e selecione a pasta em questão.</string>
|
||||
<string name="faq_8_title">Como posso fazer para exibir apenas certas pastas?</string>
|
||||
<string name="faq_8_text">Adicionar uma pasta à lista de Pastas Incluídas não remove outras pastas da exibição. O que você pode fazer é ir em Configurações -> Gerenciar pastas ignoradas, excluir a pasta raiz \"/\", e finalmente incluir somente as pastas desejadas através de Configurações -> Gerenciar pastas incluídas.</string>
|
||||
<string name="faq_8_text">Adicionar uma pasta à lista de Pastas Incluídas não remove outras pastas da exibição. O que você pode fazer é ir em Configurações -> Gerenciar pastas ignoradas, excluir a pasta raiz \"/\", e finalmente incluir somente as pastas desejadas através de Configurações -> Gerenciar pastas incluídas.
|
||||
Isso tornará apenas as pastas selecionadas visíveis, já que ignorar e incluir são funçoes recursivas e, se uma pasta for ignorada e incluída ao mesmo tempo, ela será exibida.</string>
|
||||
<string name="faq_10_title">Posso recortar imagens usando este app?</string>
|
||||
<string name="faq_10_text">Sim, você pode recortar imagens no editor, arrastando os cantos da imagem. Você pode entrar no editor fazendo um toque longo na imagem e selecionando Editar, ou selecionando Editar a partir da visualização de tela cheia.</string>
|
||||
<string name="faq_11_title">É possível exibir os meus arquivos de mídia em subgrupos ao invés de em uma única grande lista?</string>
|
||||
<string name="faq_11_text">Você pode usar a opção \"Agrupar por\" para agrupar os seus arquivos de mídia por data, formato ou outros critérios. Se a opção \"Mostrar conteúdo de todas as pastas\" estiver ativada, você também poderá agrupar por subpasta.</string>
|
||||
<string name="faq_11_text">Você pode usar a opção \"Agrupar por\" para agrupar os seus arquivos de mídia por data, formato ou outros critérios. Se a opção \"Exibir conteúdo de todas as pastas\" estiver ativada, você também poderá agrupar por subpasta.</string>
|
||||
<string name="faq_12_title">A ordenação por Data da Foto não funciona corretamente. O que posso fazer?</string>
|
||||
<string name="faq_12_text">Isto pode ter ocorrer caso as suas fotos tenham sido copiadas de outro local. Para resolver o problema, você pode selecionar a função \"Corrigir data da foto\" no menu deste aplicativo.</string>
|
||||
<string name="faq_13_title">Algumas imagens exibem artefatos de exibição, como bandas de cor. Como posso melhorar a qualidade da exibição?</string>
|
||||
<string name="faq_13_text">O nosso método atual para a exibição de imagens funciona bem na grande maioria dos casos, mas caso você queira uma qualidade ainda melhor, ative a opção \"Mostrar imagens na maior qualidade possível\" na seção \"Zoom aprofundado para imagens\" das configurações deste aplicativo.</string>
|
||||
<string name="faq_13_text">O nosso método atual para a exibição de imagens funciona bem na grande maioria dos casos, mas caso você queira uma qualidade ainda melhor, ative a opção \"Exibir imagens na maior qualidade possível\" na seção \"Zoom aprofundado para imagens\" das configurações deste aplicativo.</string>
|
||||
<string name="faq_14_title">Eu ocultei um arquivo/pasta. Como posso desfazer isso?</string>
|
||||
<string name="faq_14_text">Você pode pressionar no item do menu \"Mostrar temporariamente itens ocultos\", localizado na tela principal. Você também pode alterar para \"Mostrar itens ocultos\" nas configurações do aplicativo e ver os itens escondidos. Se você quiser reexibir, basta pressionar e selecionar \"Mostrar\". As pastas estão ocultas, adicionando um arquivo oculto \".nomedia\" dentro delas e você pode excluir o arquivo com qualquer gerenciador de arquivos também.</string>
|
||||
<string name="faq_15_title">Porque este app gasta tanto espaço?</string>
|
||||
<string name="faq_15_text">O cache deste app, que garante que as imagens sejam carregadas mais rapidamente, pode gastar até 250 MB. Se o app estiver gastando mais espaço que isso, pode ser por que você tem muitos arquivos na sua Lixeira. Arquivos na Lixeira são removidos permanentemente após 30 dias, mas se sua Lixeira estiver usando muito espaço apesar disso você pode esvaziá-la manualmente. Para fazer isso, você pode abrir a Lixeira e excluir os arquivos dentro dela, ou você pode fazer o mesmo na tela de configurações deste app.</string>
|
||||
<string name="faq_14_text">Você pode pressionar o item de menu \"Exibir ocultos temporariamente\" na tela principal, ou ativar \"Exibir itens ocultos\" nas configurações do aplicativo para ver o item oculto. Se você quiser reexibir-lo, basta pressionar e selecionar \"Exibir\". As pastas são ocultas adicionando um arquivo oculto \".nomedia\" dentro delas, arquivo este que você também pode excluir com um gerenciador de arquivos, se quiser.</string>
|
||||
<string name="faq_15_title">Porque este app ocupa tanto espaço?</string>
|
||||
<string name="faq_15_text">O cache deste app, que garante que as imagens sejam carregadas mais rapidamente, pode ocupar até 250MB. Se o app estiver ocupando mais espaço que isso, pode ser por que você tem muitos arquivos na sua Lixeira. Arquivos na Lixeira são removidos permanentemente após 30 dias, mas se mesmo assim sua Lixeira estiver ocupando muito espaço, você pode esvaziá-la manualmente. Para fazer isso, você pode abrir a Lixeira e excluir os arquivos dentro dela, ou você pode fazer o mesmo na tela de Configurações deste app.</string>
|
||||
|
||||
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">Simple Galeria Pro - Gerenciador de Imagens</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">Navegue por suas memórias sem distrações com esta galeria de fotos e vídeos</string>
|
||||
<string name="app_long_description">
|
||||
A Simple Galeria Pro é uma galeria de imagens e vídeos altamente customizável. Organize e edite suas fotos e vídeos, recupere arquivos movidos para a lixeira, proteja e oculte seus arquivos, e visualize arquivos em uma grande variedade de formatos, incluindo RAW, SVG, e muito mais.
|
||||
|
||||
Este app não inclui anúncios ou permissões desnecessárias e também não acessa a internet. Sua privacidade está protegida.
|
||||
|
||||
-------------------------------------------------
|
||||
|
@ -364,6 +366,9 @@
|
|||
<b>Dê uma olhada nos nossos outros aplicativos Simple:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Site dedicado do Simple Galeria Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
@ -372,7 +377,7 @@
|
|||
</string>
|
||||
|
||||
<!--
|
||||
Não encontrou todas as cadeias a traduzir? Existem mais algumas em:
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
|
|
|
@ -251,37 +251,37 @@
|
|||
<string name="pesdk_brush_button_delete">Apagar</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">Close Editor?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">Do you really want to discard the image?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Yes</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">No</string>
|
||||
<string name="pesdk_editor_cancel">Cancel</string>
|
||||
<string name="pesdk_editor_accept">Accept</string>
|
||||
<string name="pesdk_editor_save">Save</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">Exporting image…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">Exporting image %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Flip H</string>
|
||||
<string name="pesdk_common_button_flipV">Flip V</string>
|
||||
<string name="pesdk_common_button_undo">Undo</string>
|
||||
<string name="pesdk_common_button_redo">Redo</string>
|
||||
<string name="pesdk_common_title_colorPicker">Color Picker</string>
|
||||
<string name="pesdk_common_title_transparentColor">Transparent</string>
|
||||
<string name="pesdk_common_title_whiteColor">White</string>
|
||||
<string name="pesdk_common_title_grayColor">Gray</string>
|
||||
<string name="pesdk_common_title_blackColor">Black</string>
|
||||
<string name="pesdk_common_title_lightBlueColor">Light blue</string>
|
||||
<string name="pesdk_common_title_blueColor">Blue</string>
|
||||
<string name="pesdk_common_title_purpleColor">Purple</string>
|
||||
<string name="pesdk_common_title_orchidColor">Orchid</string>
|
||||
<string name="pesdk_common_title_pinkColor">Pink</string>
|
||||
<string name="pesdk_common_title_redColor">Red</string>
|
||||
<string name="pesdk_common_title_orangeColor">Orange</string>
|
||||
<string name="pesdk_common_title_goldColor">Gold</string>
|
||||
<string name="pesdk_common_title_yellowColor">Yellow</string>
|
||||
<string name="pesdk_common_title_oliveColor">Olive</string>
|
||||
<string name="pesdk_common_title_greenColor">Green</string>
|
||||
<string name="pesdk_common_title_aquamarinColor">Aquamarin</string>
|
||||
<string name="pesdk_common_title_pipettableColor">Pipettable color</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">Fechar editor?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">Tem a certeza de que deseja descartar as alterações?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Sim</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">Não</string>
|
||||
<string name="pesdk_editor_cancel">Cancelar</string>
|
||||
<string name="pesdk_editor_accept">Aceitar</string>
|
||||
<string name="pesdk_editor_save">Guardar</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">A exportar imagem…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">A exportar a imagem %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Inversão horizontal</string>
|
||||
<string name="pesdk_common_button_flipV">Inversão vertical</string>
|
||||
<string name="pesdk_common_button_undo">Desfazer</string>
|
||||
<string name="pesdk_common_button_redo">Refazer</string>
|
||||
<string name="pesdk_common_title_colorPicker">Seletor de cores</string>
|
||||
<string name="pesdk_common_title_transparentColor">Transparente</string>
|
||||
<string name="pesdk_common_title_whiteColor">Branco</string>
|
||||
<string name="pesdk_common_title_grayColor">Cinzento</string>
|
||||
<string name="pesdk_common_title_blackColor">Preto</string>
|
||||
<string name="pesdk_common_title_lightBlueColor">Azul claro</string>
|
||||
<string name="pesdk_common_title_blueColor">Azul</string>
|
||||
<string name="pesdk_common_title_purpleColor">Púrpura</string>
|
||||
<string name="pesdk_common_title_orchidColor">Orquídea</string>
|
||||
<string name="pesdk_common_title_pinkColor">Cor de rosa</string>
|
||||
<string name="pesdk_common_title_redColor">Vermelho</string>
|
||||
<string name="pesdk_common_title_orangeColor">Cor de laranja</string>
|
||||
<string name="pesdk_common_title_goldColor">Dourado</string>
|
||||
<string name="pesdk_common_title_yellowColor">Amarelo</string>
|
||||
<string name="pesdk_common_title_oliveColor">Oliva</string>
|
||||
<string name="pesdk_common_title_greenColor">Verde</string>
|
||||
<string name="pesdk_common_title_aquamarinColor">Aquamarino</string>
|
||||
<string name="pesdk_common_title_pipettableColor">Pipeta de cores</string>
|
||||
|
||||
<!-- FAQ -->
|
||||
<string name="faq_1_title">How can I make Simple Gallery the default device gallery?</string>
|
||||
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files.</string>
|
||||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">How can I fast-forward videos?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_title">How can I fast forward videos?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</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 - Editor e gestor 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">Explore as suas memórias sem interrupções com esta aplicação</string>
|
||||
<string name="app_long_description">
|
||||
Simple Gallery Pro é uma aplicação local para gerir fotos e vídeos. Pode organizar e editar as suas fotos, recuperar ficheiros através da reciclagem, proteger e ocultar ficheiros e ver imagens e vídeos disponíveis em vários formatos tais como RAW, SVG e muito mais.
|
||||
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Как я могу сделать альбом всегда отображающимся сверху?</string>
|
||||
<string name="faq_3_text">Вы можете длительным нажатием на желаемый альбом открыть меню действий в нём выбрать пункт \"Закрепить\". Можно закрепить несколько альбомов (папок); прикреплённые элементы будут отсортированы по методу сортировки по умолчанию.</string>
|
||||
<string name="faq_4_title">Как ускорить перемотку видео?</string>
|
||||
<string name="faq_4_text">Вы можете либо перемещать пальцем по горизонтали над видеопроигрывателем, либо нажать на цифры текущего положения или максимальной длительности видео рядом с панелью поиска, что приведёт к перемещению позиции воспроизведения назад или вперёд.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">В чём разница между скрытием и исключением папки?</string>
|
||||
<string name="faq_5_text">Исключение запрещает отображение папки только в Simple Gallery, в то время как скрытие работает системно и скрывает папку из других галерей. Это достигается путём создания пустого файла \".nomedia\" в данной папке, который впоследствии можно удалить любым файловым менеджером.</string>
|
||||
<string name="faq_6_title">Почему отображаются папки с музыкальными обложками?</string>
|
||||
|
|
|
@ -182,7 +182,7 @@
|
|||
<string name="show_recycle_bin_last">Zobraziť odpadkový kôš ako poslednú položku na hlavnej obrazovke</string>
|
||||
<string name="allow_down_gesture">Povoliť zatváranie celoobrazovkového režimu potiahnutím prsta dole</string>
|
||||
<string name="allow_one_to_one_zoom">Povoliť 1:1 priblíženie dvojnásobným dvojklikom</string>
|
||||
<string name="open_videos_on_separate_screen">Vždy otvárať videá na vlastnej obrazovke s novými vodorovnými gestami</string>
|
||||
<string name="open_videos_on_separate_screen">Vždy otvárať videá na novej obrazovke s novými vodorovnými gestami</string>
|
||||
<string name="show_notch">Zobraziť výrez obrazovky, ak je dostupný</string>
|
||||
<string name="allow_rotating_gestures">Povoliť otáčanie obrázkov gestami</string>
|
||||
<string name="file_loading_priority">Priorita pri načítavaní súborov</string>
|
||||
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">Viete to vyriešǐť 2 spôsobmi. Môžete apku buď preinštalovať, alebo ju nájsť v nastaveniach zariadenia a zvoliť \"Vymazať údaje\". Vymaže to iba nastavenia, nie súbory.</string>
|
||||
<string name="faq_3_title">Ako môžem dosiahnuť, aby bol daný album stále zobrazený prvý?</string>
|
||||
<string name="faq_3_text">Môžete označiť daný priečinok dlhým podržaním a zvoliť tlačidlo s obrázkom pripinačky, to ho pripne na vrch. Môžete pripnúť aj viacero priečinkov, budú zoradené podľa zvoleného radenia.</string>
|
||||
<string name="faq_4_title">Ako viem posunúť video vpred?</string>
|
||||
<string name="faq_4_text">Môžete to dosiahnuť vodorovným potiahnutím prsta cez video prehrávač, alebo kliknúť na texty súčasnej, alebo maximálnej dĺžky videa, ktoré sú vedľa indikátora súčasného progresu. To posunie video buď vpred, alebo vzad.</string>
|
||||
<string name="faq_4_title">Ako viem posunúť video rýchlo vpred?</string>
|
||||
<string name="faq_4_text">Viete to dosiahnuť dvojitým kliknutím na boky obrazovky, alebo kliknutím na texty súčasnej, alebo maximálnej dĺžky videa, ktoré sú vedľa indikátora súčasného progresu. Ak v nastaveniach apky zapnete možnosť spúšťania videí na novej obrazovke, budete môcť použiť aj vodorovné gestá.</string>
|
||||
<string name="faq_5_title">Aký je rozdiel medzi Skrytím a Vylúčením priečinka?</string>
|
||||
<string name="faq_5_text">Kým vylúčenie predíde zobrazeniu priečinka iba vrámci Jednoduchej Galérie, skrytie ho ukryje vrámci celého systému, teda to ovplyvní aj ostatné galérie. Skrytie funguje pomocou vytvorenia prázdneho \".nomedia\" súboru v danom priečinku, ktorý viete vymazať aj nejakým správcom súborov.</string>
|
||||
<string name="faq_6_title">Prečo sa mi zobrazujú priečinky s obalmi hudobných albumov, alebo nálepkami?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Kako nastaviti, da se določen album vedno prikaže na vrhu?</string>
|
||||
<string name="faq_3_text">Z dolgim pritiskom na album se vam prikaže meni, v katerem je na voljo bucika, s katero pripnete album na željeno mesto. Na ta način lahko pripnete več albumov, ki bodo razvrščeni v skladu s privzetim načinom razvrščanja.</string>
|
||||
<string name="faq_4_title">Ali lahko hitro predvajam videoposnetke?</string>
|
||||
<string name="faq_4_text">To lahko storite tako, da s prstom vodoravno potegnete čez predvajalnik ali kliknete na izpis trenutnega oz. skupnega trajanja, kar bo videoposnetek premaknilo naprej ali nazaj.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Kakšna je razlika med skrivanjem in izključevanjem mape?</string>
|
||||
<string name="faq_5_text">Izključevanje mape jo skrije le v Simple galeriji, medtem ko jo skrivanje skrije tudi v ostalih aplikacijah oz. galerijah. Deluje tako, da kreira prazno \".nomedia\" datoteko v izbrani mapi, katero lahko odstranite tudi s katerimkoli urejevalnikom datotek.</string>
|
||||
<string name="faq_6_title">Zakaj se v galeriji prikažejo datoteke z naslovnicami glasbenih map ali nalepk?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Како да подесим да се неки албум увек појављује на врху?</string>
|
||||
<string name="faq_3_text">Дуго притисните на жељени албум и изаберите Закачи икону у менију за акције, то ће га поставити на врх. Можете да закачите више фасцикли истовремено, с тим што ће бити сортирани према подразумевајућем методу за сортирање.</string>
|
||||
<string name="faq_4_title">Како да премотавам видео снимке?</string>
|
||||
<string name="faq_4_text">Можете да вучете прст хоризонтално преко видео плејера, или да кликнете на тренутно или максимално поред траке за премотавање. То ће премотати видео назад или напред.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Која је разлика између скривања и изузимања фасцикле?</string>
|
||||
<string name="faq_5_text">Изузимање спречава приказивање фасцикле само у Једноставној галерији, док се скривање односи на цео систем и скрива фасциклу од свих других галерија. Он функционише тако што прави празан \".nomedia\" фајл у задатој фасцикли, који затим можете да уклоните са било којим фајл менаџером.</string>
|
||||
<string name="faq_6_title">Зашто се фасцикле са сликама музичких извођача или налепницама приказују?</string>
|
||||
|
|
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files.</string>
|
||||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">How can I fast-forward videos?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar, that will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_title">How can I fast forward videos?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string>
|
||||
|
|
|
@ -5,6 +5,5 @@
|
|||
<dimen name="sd_card_icon_size">30dp</dimen>
|
||||
<dimen name="selection_check_size">38dp</dimen>
|
||||
<dimen name="tmb_shadow_height">70dp</dimen>
|
||||
<dimen name="instant_change_bar_width">100dp</dimen>
|
||||
<dimen name="lock_padding">80dp</dimen>
|
||||
</resources>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Bir albümün her zaman en üstte görünmesini nasıl sağlayabilirim?</string>
|
||||
<string name="faq_3_text">İstediğiniz albüme uzunca basabilir ve eylem menüsündeki Sabitle simgesini seçebilirsiniz. Birden çok klasörü de sabitleyebilirsiniz, sabitlenmiş öğeler varsayılan sıralama yöntemine göre sıralanır.</string>
|
||||
<string name="faq_4_title">Videoları nasıl hızlıca ileri sarabilirim?</string>
|
||||
<string name="faq_4_text">Parmağınızı video oynatıcı üzerinde yatay olarak sürükleyebilir veya videoyu ileri veya geri hareket ettirecek arama çubuğunun yanındaki geçerli veya maksimum süre metinlerine tıklayabilirsiniz.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Klasörün gizlenmesi ve hariç tutulması arasındaki fark nedir?</string>
|
||||
<string name="faq_5_text">Hariç tut, klasörü yalnızca Basit Galeri\'de görüntülemeyi engellerken, Gizle sistem genelinde çalışır ve klasörü diğer galerilerden de gizler. Verilen klasörde boş bir \".nomedia\" dosyası oluşturarak çalışır, daha sonra herhangi bir dosya yöneticisi ile kaldırabilirsiniz.</string>
|
||||
<string name="faq_6_title">Neden albüm resimlerini içeren klasörler görünüyor?</string>
|
||||
|
@ -317,9 +317,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">Basit Galeri Pro - Fotoğraf Yönetici & Düzenleyici</string>
|
||||
<string name="app_title">Basit Galeri Pro - Fotoğraf Yönetici, Düzenleyici</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">Bu fotoğraf ve video galerisinde kesintisiz olarak anılarınıza göz atın</string>
|
||||
<string name="app_long_description">
|
||||
Basit Galeri Pro, özelleştirilebilir bir çevrimdışı galeridir. Fotoğraflarınızı düzenleyin ve organize edin, geri dönüşüm kutusuyla silinen dosyaları kurtarın, dosyaları koruyun ve gizleyin ve RAW, SVG ve çok daha fazlası dahil olmak üzere çok çeşitli fotoğraf ve video formatlarını görüntüleyin.
|
||||
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Як зробити альбом завжди доступним у верхній частині?</string>
|
||||
<string name="faq_3_text">Ви можете виконати довге натискання на бажаному альбомі і вибрати піктограму \"Закріпити\" у меню дій, що закріпить його вгорі. Ви також можете закріпити декілька тек; закріплені елементи будуть відсортовані за методом сортування за-замовчуванням.</string>
|
||||
<string name="faq_4_title">Як я можу швидко прокручувати відео?</string>
|
||||
<string name="faq_4_text">Ви можете або провести пальцем горизонтально під час відтворення відео, або натиснути на текст поточної або максимальної тривалості відео біля прогрес-бару, що прокрутить відео або назад, або вперед.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">В чому полягає різниця між приховуванням та виключенням теки?</string>
|
||||
<string name="faq_5_text">\"Виключити\" запобігає відображенню теки тільки в додатку Simple Gallery, в той час як \"Приховати\" працює на системному рівні і приховує теку і в інших галереях також. Це здійснюється шляхом створення порожнього файлу \".nomedia\" в заданій теці, який може бути видалений пізніше будь-яким файловим менеджером.</string>
|
||||
<string name="faq_6_title">Чому відображаються теки з музичними обкладинками або стікерами?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">Làm thế nào tôi có thể làm cho một album luôn xuất hiện ở đầu?</string>
|
||||
<string name="faq_3_text">Bạn có thể nhấn và giữ album mong muốn và chọn biểu tượng Ghim ở menu hành động, nó sẽ ghim nó lên trên cùng. Bạn cũng có thể ghim nhiều thư mục, các mục được ghim sẽ được sắp xếp theo phương pháp sắp xếp mặc định.</string>
|
||||
<string name="faq_4_title">Làm cách nào tôi có tua video nhanh?</string>
|
||||
<string name="faq_4_text">Bạn có thể kéo ngón tay của mình theo chiều ngang trên trình phát video hoặc nhấp vào văn bản thời lượng hiện tại hoặc tối đa gần thanh tìm kiếm. Điều đó sẽ di chuyển video hoặc lùi hoặc tiến.</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">Sự khác biệt giữa ẩn và loại trừ một thư mục là gì?</string>
|
||||
<string name="faq_5_text">Loại trừ ngăn chỉ hiển thị thư mục trong Thư viện đơn giản, trong khi Ẩn hoạt động theo hệ thống và nó cũng ẩn thư mục khỏi các phòng trưng bày khác. Nó hoạt động bằng cách tạo một tệp \".nomedia\" trong thư mục đã cho, sau đó bạn cũng có thể xóa bằng bất kỳ trình quản lý tệp nào.</string>
|
||||
<string name="faq_6_title">Tại sao hiển thị các thư mục với ảnh bìa hoặc nhãn dán?</string>
|
||||
|
|
|
@ -291,7 +291,7 @@
|
|||
<string name="faq_3_title">如何让某个相册始终显示在最上面?</string>
|
||||
<string name="faq_3_text">你可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。你也可以固定多个文件夹,固定项目将按照默认排序方法排序。</string>
|
||||
<string name="faq_4_title">如何快进/快退视频?</string>
|
||||
<string name="faq_4_text">只需在视频播放器上左右滑动,或点击底栏进度条两侧的时间文本,即可前进或后退视频。</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">文件夹的隐藏和排除有什么区别?</string>
|
||||
<string name="faq_5_text">排除功能只是防止其在简约图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,你可以使用任何文件管理器删除它。</string>
|
||||
<string name="faq_6_title">为什么会出现音乐艺术家封面或贴纸文件夹?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">我如何讓某個相冊總是出現在頂端?</string>
|
||||
<string name="faq_3_text">你可以長按想要的相冊,然後在操作選單中選擇[圖釘]圖示,就會釘選於頂端。你也能釘選多個資料夾,釘選的項目會依預設的排序方法來排序。</string>
|
||||
<string name="faq_4_title">我如何快轉影片?</string>
|
||||
<string name="faq_4_text">你可以在影片播放器上水平滑動你的手指,或者點擊進度條附近的當前或總時長文字。這會使影片快轉或倒轉。</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">隱藏和排除資料夾,兩者有什麼不同?</string>
|
||||
<string name="faq_5_text">[排除]只在簡易相簿中避免顯示出來;而[隱藏]則作用於整個系統,資料夾也會被其他相簿隱藏。這是藉由在指定資料夾內建立一個\".nomedia\"空白檔案來進行隱藏,你之後也能用任何檔案管理器移除。</string>
|
||||
<string name="faq_6_title">為什麼有些音樂專輯封面或貼圖的資料夾會出現?</string>
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
<string name="faq_3_title">我如何讓某個相冊總是出現在頂端?</string>
|
||||
<string name="faq_3_text">你可以長按想要的相冊,然後在操作選單中選擇[圖釘]圖示,就會釘選於頂端。你也能釘選多個資料夾,釘選的項目會依預設的排序方法來排序。</string>
|
||||
<string name="faq_4_title">我如何快轉影片?</string>
|
||||
<string name="faq_4_text">你可以在影片播放器上水平滑動你的手指,或者點擊進度條附近的當前或總時長文字。這會使影片快轉或倒轉。</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">隱藏和排除資料夾,兩者有什麼不同?</string>
|
||||
<string name="faq_5_text">[排除]只在簡易相簿中避免顯示出來;而[隱藏]則作用於整個系統,資料夾也會被其他相簿隱藏。這是藉由在指定資料夾內建立一個\".nomedia\"空白檔案來進行隱藏,你之後也能用任何檔案管理器移除。</string>
|
||||
<string name="faq_6_title">為什麼有些音樂專輯封面或貼圖的資料夾會出現?</string>
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
<dimen name="tmb_shadow_height">70dp</dimen>
|
||||
<dimen name="media_side_slider_width">60dp</dimen>
|
||||
<dimen name="video_player_play_pause_size">60dp</dimen>
|
||||
<dimen name="instant_change_bar_width">50dp</dimen>
|
||||
<dimen name="list_view_folder_thumbnail_size">72dp</dimen>
|
||||
<dimen name="bottom_actions_height">64dp</dimen>
|
||||
<dimen name="bottom_actions_height_double">128dp</dimen>
|
||||
|
|
|
@ -291,8 +291,8 @@
|
|||
<string name="faq_2_text">You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files.</string>
|
||||
<string name="faq_3_title">How can I make an album always appear at the top?</string>
|
||||
<string name="faq_3_text">You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method.</string>
|
||||
<string name="faq_4_title">How can I fast-forward videos?</string>
|
||||
<string name="faq_4_text">You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward.</string>
|
||||
<string name="faq_4_title">How can I fast forward videos?</string>
|
||||
<string name="faq_4_text">You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too.</string>
|
||||
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string>
|
||||
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string>
|
||||
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string>
|
||||
|
|
|
@ -12,7 +12,7 @@ buildscript {
|
|||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.5.3'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath 'ly.img.android.pesdk:plugin:6.6.4'
|
||||
classpath 'ly.img.android.pesdk:plugin:7.0.10'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Jednoduchá Galerie Pro je vysoce přizpůsobitelná offline galerie. Organizujte a upravujte své fotografie, obnovujte smazané fotografie s funkcí odpadkového koše, chraňte je a skrývejte. Prohlížejte množství různých foto a video formátů včetně RAW, SVG a mnoho dalších.
|
||||
Jednoduchá galerie Pro je vysoce přizpůsobitelná offline galerie. Organizujte a upravujte své fotografie, obnovujte smazané fotografie s funkcí odpadkového koše, chraňte je a skrývejte. Prohlížejte množství různých foto a video formátů včetně RAW, SVG a mnoho dalších.
|
||||
|
||||
Aplikace neobsahuje žádné reklamy ani nepotřebná oprávnění. Tím, že ani nevyžaduje připojení k internetu je vaše soukromí maximálně chráněno.
|
||||
Aplikace neobsahuje žádné reklamy ani nepotřebná oprávnění. Tím, že ani nevyžaduje připojení k internetu, je vaše soukromí maximálně chráněno.
|
||||
|
||||
-------------------------------------------------
|
||||
<b>JEDNODUCHÁ GALERIE PRO – FUNKCE</b>
|
||||
|
@ -14,7 +14,7 @@ Aplikace neobsahuje žádné reklamy ani nepotřebná oprávnění. Tím, že an
|
|||
• Otevírejte mnoho rozličných formátů fotografií a videí (RAW, SVG, GIF, panorama, atd)
|
||||
• Množství intuitivních gest pro jednoduchou úpravu a organizaci souborů
|
||||
• Mnoho různých způsobů filtrování, seskupování a řazení souborů
|
||||
• Změňte si vzhled Jednoduché galerie pro
|
||||
• Změňte si vzhled Jednoduché galerie Pro
|
||||
• Dostupná ve 32 jazycích
|
||||
• Označte si oblíbené soubory pro rychlý přístup
|
||||
• Chraňte své fotografie a videa pomocí pinu, vzoru nebo otiskem prstu
|
||||
|
@ -27,16 +27,16 @@ Aplikace neobsahuje žádné reklamy ani nepotřebná oprávnění. Tím, že an
|
|||
… a mnoho dalších!
|
||||
|
||||
<b>EDITOR OBRÁZKŮ</b>
|
||||
Jednoduchá Galerie Pro umožňuje snadnou úpravu obrázků. Ořezávejte, překlápějte, otáčejte či měňte jejich velikost. Pokud se cítíte kreativně, můžete také aplikovat filtry nebo do obrázku kreslit!
|
||||
Jednoduchá galerie Pro umožňuje snadnou úpravu obrázků. Ořezávejte, překlápějte, otáčejte či měňte jejich velikost. Pokud se cítíte kreativně, můžete také aplikovat filtry nebo do obrázku kreslit!
|
||||
|
||||
<b>PODPORA MNOHA TYPŮ SOUBORŮ</b>
|
||||
Na rozdíl od některých galerií podporuje Jednoduchá Galerie Pro velké množství různých druhů souborů včetně JPEG, PNG, MP4, MKV, RAW, SVG, panoramatických fotografií a videí.
|
||||
Na rozdíl od některých galerií podporuje Jednoduchá galerie Pro velké množství různých druhů souborů včetně JPEG, PNG, MP4, MKV, RAW, SVG, panoramatických fotografií a videí.
|
||||
|
||||
<b>Vysoce upravitelný správce galerie</b>
|
||||
Od vzhledu až po funkční tlačítka na spodní liště, Jednoduchá Galerie Pro je plně nastavitelná a bude fungovat přesně jak si budete přát. Žádná jiná galerie nenabízí takovou flexibilitu! A díky otevřenému kódu je naše aplikace dostupná ve 32 jazycích!
|
||||
Od vzhledu až po funkční tlačítka na spodní liště, Jednoduchá galerie Pro je plně nastavitelná a bude fungovat přesně jak si budete přát. Žádná jiná galerie nenabízí takovou flexibilitu! A díky otevřenému kódu je naše aplikace dostupná ve 32 jazycích!
|
||||
|
||||
<b>OBNOVTE SMAZANÉ FOTOGRAFIE A VIDEA</b>
|
||||
Smazali jste nechtěně důležitou fotografii nebo video? Žádný strach! Jednoduchá Galerie Pro pro podobné případy nabízí funkci odpadkového koše, odkud smazané fotografie a videa snadno obnovíte.
|
||||
Smazali jste nechtěně důležitou fotografii nebo video? Žádný strach! Jednoduchá galerie Pro pro podobné případy nabízí funkci odpadkového koše, odkud smazané fotografie a videa snadno obnovíte.
|
||||
|
||||
<b>CHRAŇTE A SKRÝVEJTE SVÉ FOTOGRAFIE A VIDEA</b>
|
||||
Použitím pinu, vzoru nebo otisku prstu snadno své fotografie, videa či celá alba ochráníte nebo skryjete. Můžete ochránit i spuštění samotné aplikace, nebo některé její funkce. Například můžete zabránit náhodnému smazání souboru bez potvrzení otiskem prstu.
|
||||
|
|
|
@ -1 +1 @@
|
|||
Prohlížejte své vzpomínky bez přerušení.
|
||||
Prohlížejte svoje vzpomínky bez prerušení s touto foto a video galerií.
|
||||
|
|
|
@ -1 +1 @@
|
|||
Jednoduchá Galerie Pro - Organizér a editor fotografií
|
||||
Jednoduchá Galerie Pro - Organizér fotografií
|
||||
|
|
1
fastlane/metadata/android/en-US/changelogs/288.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/288.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Reverted Glide to fix some crashes
|
8
fastlane/metadata/android/en-US/changelogs/289.txt
Normal file
8
fastlane/metadata/android/en-US/changelogs/289.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
* Properly handle sorting by date taken after using "Fix Date Taken values" on the wrong files
|
||||
* Fixed some issues at copying files, when the source was on an SD card
|
||||
* Change the way Favorite items are stored, to avoid accidental removal
|
||||
* Improved video looping (by ForgottenUmbrella)
|
||||
* Recognize a new type of panoramic photos
|
||||
* Properly remember last video playback position if the video is paused on exit
|
||||
* Properly color the top status bar icons at using light primary colors
|
||||
* Other UX and translation improvements
|
2
fastlane/metadata/android/en-US/changelogs/290.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/290.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
* Improved the performance of the initial screen loading
|
||||
* Fixed some editor related glitches
|
1
fastlane/metadata/android/en-US/changelogs/291.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/291.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Fixed some sorting and thumbnail related issues
|
2
fastlane/metadata/android/en-US/changelogs/292.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/292.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
* Fixed image disappearing at using the Editor
|
||||
* Properly copy over EXIF values after editing an image
|
1
fastlane/metadata/android/en-US/changelogs/293.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/293.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Fixed some folder sorting related glitches
|
2
fastlane/metadata/android/en-US/changelogs/294.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/294.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
* Fixed some sorting related glitches
|
||||
* Keep the old last modified value at file editing
|
|
@ -42,6 +42,9 @@ Usando um PIN, padrão, ou sua impressão digital, você pode proteger ou oculta
|
|||
<b>Dê uma olhada nos nossos outros aplicativos Simple:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Site dedicado do Simple Galeria Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Explore as suas memórias sem interrupções.
|
||||
Explore as suas memórias sem interrupções com esta aplicação
|
||||
|
|
|
@ -1 +1 @@
|
|||
Reklamsız çevrimdışı galeri. Fotoğraf & videolarınızı yönetin ve düzenleyin
|
||||
Bu fotoğraf ve video galerisinde kesintisiz olarak anılarınıza göz atın
|
||||
|
|
|
@ -1 +1 @@
|
|||
Basit Galeri Pro - Fotoğraf Yönetici & Düzenleyici
|
||||
Basit Galeri Pro - Fotoğraf Yönetici, Düzenleyici
|
||||
|
|
Loading…
Reference in a new issue