Merge pull request #2 from SimpleMobileTools/master

update fork
This commit is contained in:
Matheus Victor 2019-06-28 12:15:01 -03:00 committed by GitHub
commit 637612025f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
111 changed files with 2634 additions and 1034 deletions

View file

@ -1,6 +1,87 @@
Changelog
==========
Version 6.8.1 *(2019-06-27)*
----------------------------
* Improved Search on the main screen, allow using it for searching all files, not folders
* Added Print functionality at fullscreen images
* Fixed a glitch at PNGs getting deleted after rotating
* Other stability, translation and performance improvements
Version 6.8.0 *(2019-06-21)*
----------------------------
* Allow grouping files by date_taken or last_modified either daily, or monthly
* Allow selecting fade animation or no animation at all at slideshow transitions
* Improved the performance at loading fullscreen videos
* Use last_modified value at batch file renaming, if date_taken isn't available
* Some other stability and translation improvements
Version 6.7.9 *(2019-06-12)*
----------------------------
* Fixed a crash at zooming
Version 6.7.8 *(2019-06-11)*
----------------------------
* Improved the UX at zooming and panning at the fullscreen view
* Fixed unchecking Favorite items in some cases
* Show the available aspect ratios at the editor by default
* Couple stability, performance and translation improvements
Version 6.7.7 *(2019-05-28)*
----------------------------
* Fixed some file deleting related glitches
* Improved batch renaming, use the old file extension in case a new one is missing
Version 6.7.6 *(2019-05-26)*
----------------------------
* Improved batch renaming, allow using date time patterns in it
* Fixed empty folder deleting after deleting its content
* Improved new file cache updating in the background
* Improved the placeholder text in case no files are found
* Keep last_modified field at deleting and restoring files from the bin
* Increase the max image duration at slideshows
* Highlight the warning at deleting a folder
* Other stability, translation and performance improvements
Version 6.7.5 *(2019-05-15)*
----------------------------
* Hotfixing a glitch with opening third party intents
Version 6.7.4 *(2019-05-15)*
----------------------------
* Speeded up video deleting from fullscreen view
* Hotfixed some crashes
Version 6.7.3 *(2019-05-14)*
----------------------------
* Fixed folder sorting if used together with subfolder grouping
* Fixed some copy/move related progressbar issues
* Added many performance and stability improvements
Version 6.7.2 *(2019-05-09)*
----------------------------
* Allow creating file or folder shortcuts only from Android 8+
Version 6.7.1 *(2019-05-08)*
----------------------------
* Allow creating file or folder shortcuts on home screen on Android 7+
* Allow creating new folders on the file thumbnails screen too
* Added a checkbox at sorting by name/path to sort numbers by their actual numeric value
* Improve grouping direct subfolders, do not ignore parent folders without media files
* Show the Open Camera button at the menu on the main screen, instead of the Sort by button
* Other translation and stability improvements
Version 6.7.0 *(2019-05-02)*
----------------------------

View file

@ -15,8 +15,8 @@ android {
applicationId "com.simplemobiletools.gallery.pro"
minSdkVersion 21
targetSdkVersion 28
versionCode 244
versionName "6.7.0"
versionCode 255
versionName "6.8.1"
multiDexEnabled true
setProperty("archivesBaseName", "gallery")
}
@ -61,24 +61,24 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:5.12.12'
implementation 'com.simplemobiletools:commons:5.14.2'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha5'
implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.17'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
implementation 'com.google.android.exoplayer:exoplayer-core:2.10.2'
implementation 'com.google.vr:sdk-panowidget:1.180.0'
implementation 'com.google.vr:sdk-videowidget:1.180.0'
implementation 'org.apache.sanselan:sanselan:0.97-incubator'
implementation 'info.androidhive:imagefilters:1.0.7'
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.caverock:androidsvg-aar:1.3'
implementation 'com.github.tibbi:gestureviews:1506ec6156'
implementation 'com.github.tibbi:subsampling-scale-image-view:1df78cdfff'
implementation 'com.github.tibbi:gestureviews:4444214285'
implementation 'com.github.tibbi:subsampling-scale-image-view:55eb1ddd5b'
kapt 'com.github.bumptech.glide:compiler:4.9.0' // keep it here too, not just in Commons, else loading SVGs wont work
kapt 'androidx.room:room-compiler:2.0.0'
implementation 'androidx.room:room-runtime:2.0.0'
annotationProcessor 'androidx.room:room-compiler:2.0.0'
kapt 'androidx.room:room-compiler:2.1.0'
implementation 'androidx.room:room-runtime:2.1.0'
annotationProcessor 'androidx.room:room-compiler:2.1.0'
}

View file

@ -36,14 +36,6 @@
android:name=".activities.MainActivity"
android:resizeableActivity="true">
<meta-data
android:name="android.app.default_searchable"
android:resource="@xml/searchable"/>
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PICK"/>
<category android:name="android.intent.category.DEFAULT"/>
@ -81,6 +73,21 @@
</activity>
<activity
android:name=".activities.SearchActivity"
android:label="@string/search"
android:parentActivityName=".activities.MainActivity"
android:resizeableActivity="true">
<meta-data
android:name="android.app.default_searchable"
android:resource="@xml/searchable"/>
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
</activity>
<activity
android:name=".activities.ViewPagerActivity"
android:configChanges="orientation|keyboardHidden|screenSize"

View file

@ -26,10 +26,7 @@ import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.simplemobiletools.commons.dialogs.ColorPickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.REAL_FILE_PATH
import com.simplemobiletools.commons.helpers.SIDELOADING_TRUE
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.gallery.pro.BuildConfig
import com.simplemobiletools.gallery.pro.R
@ -80,7 +77,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private var drawColor = 0
private var lastOtherAspectRatio: Pair<Int, Int>? = null
private var currPrimaryAction = PRIMARY_ACTION_NONE
private var currCropRotateAction = CROP_ROTATE_NONE
private var currCropRotateAction = CROP_ROTATE_ASPECT_RATIO
private var currAspectRatio = ASPECT_RATIO_FREE
private var isCropIntent = false
private var isEditingWithThirdParty = false
@ -189,6 +186,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
lastOtherAspectRatio = Pair(config.lastEditorCropOtherAspectRatioX, config.lastEditorCropOtherAspectRatioY)
}
updateAspectRatio(config.lastEditorCropAspectRatio)
crop_image_view.guidelines = CropImageView.Guidelines.ON
bottom_aspect_ratios.beVisible()
}
private fun loadDefaultImageView() {
@ -257,9 +256,9 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
if (!wasDrawCanvasPositioned) {
wasDrawCanvasPositioned = true
editor_draw_canvas.onGlobalLayout {
Thread {
ensureBackgroundThread {
fillCanvasBackground()
}.start()
}
}
}
}
@ -334,7 +333,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
bottom_actions_filter_list.adapter = null
bottom_actions_filter_list.beGone()
Thread {
ensureBackgroundThread {
try {
val originalBitmap = Glide.with(applicationContext).asBitmap().load(uri).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()
currentFilter.filter.processFilter(originalBitmap)
@ -342,23 +341,23 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
} catch (e: OutOfMemoryError) {
toast(R.string.out_of_memory_error)
}
}.start()
}
}
}
}
private fun shareImage() {
Thread {
ensureBackgroundThread {
when {
default_image_view.isVisible() -> {
val currentFilter = getFiltersAdapter()?.getCurrentFilter()
if (currentFilter == null) {
toast(R.string.unknown_error_occurred)
return@Thread
return@ensureBackgroundThread
}
val originalBitmap = Glide.with(applicationContext).asBitmap().load(uri).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()
currentFilter!!.filter.processFilter(originalBitmap)
currentFilter.filter.processFilter(originalBitmap)
shareBitmap(originalBitmap)
}
crop_image_view.isVisible() -> {
@ -369,12 +368,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
editor_draw_canvas.isVisible() -> shareBitmap(editor_draw_canvas.getBitmap())
}
}.start()
}
}
private fun getTempImagePath(bitmap: Bitmap, callback: (path: String?) -> Unit) {
val bytes = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 0, bytes)
bitmap.compress(CompressFormat.PNG, 0, bytes)
val folder = File(cacheDir, TEMP_FOLDER_NAME)
if (!folder.exists()) {
@ -579,20 +578,27 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
bottom_editor_draw_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_DRAW)
if (currPrimaryAction == PRIMARY_ACTION_FILTER && bottom_actions_filter_list.adapter == null) {
Thread {
ensureBackgroundThread {
val thumbnailSize = resources.getDimension(R.dimen.bottom_filters_thumbnail_size).toInt()
val bitmap = Glide.with(this)
.asBitmap()
.load(uri).listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
showErrorToast(e.toString())
return false
}
override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean) = false
})
.submit(thumbnailSize, thumbnailSize)
.get()
val bitmap = try {
Glide.with(this)
.asBitmap()
.load(uri).listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
showErrorToast(e.toString())
return false
}
override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean) = false
})
.submit(thumbnailSize, thumbnailSize)
.get()
} catch (e: GlideException) {
showErrorToast(e)
finish()
return@ensureBackgroundThread
}
runOnUiThread {
val filterThumbnailsManager = FilterThumbnailsManager()
@ -621,14 +627,14 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
bottom_actions_filter_list.adapter = adapter
adapter.notifyDataSetChanged()
}
}.start()
}
}
if (currPrimaryAction != PRIMARY_ACTION_CROP_ROTATE) {
bottom_aspect_ratios.beGone()
currCropRotateAction = CROP_ROTATE_NONE
updateCropRotateActionButtons()
}
updateCropRotateActionButtons()
}
private fun applyFilter(filterItem: FilterItem) {
@ -802,7 +808,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private fun saveBitmapToFile(bitmap: Bitmap, path: String, showSavingToast: Boolean) {
try {
Thread {
ensureBackgroundThread {
val file = File(path)
val fileDirItem = FileDirItem(path, path.getFilenameFromPath())
getFileOutputStream(fileDirItem, true) {
@ -812,7 +818,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
toast(R.string.image_editing_failed)
}
}
}.start()
}
} catch (e: Exception) {
showErrorToast(e)
} catch (e: OutOfMemoryError) {
@ -852,7 +858,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
private fun scanFinalPath(path: String) {
scanPathRecursively(path) {
rescanPaths(arrayListOf(path)) {
setResult(Activity.RESULT_OK, intent)
toast(R.string.file_saved)
finish()

View file

@ -5,6 +5,7 @@ import android.view.Menu
import android.view.MenuItem
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.ManageHiddenFoldersAdapter
@ -55,11 +56,11 @@ class HiddenFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private fun addFolder() {
FilePickerDialog(this, config.lastFilepickerPath, false, config.shouldShowHidden, false, true) {
config.lastFilepickerPath = it
Thread {
ensureBackgroundThread {
addNoMedia(it) {
updateFolders()
}
}.start()
}
}
}
}

View file

@ -3,9 +3,7 @@ package com.simplemobiletools.gallery.pro.activities
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.scanPathRecursively
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.ManageFoldersAdapter
@ -50,13 +48,8 @@ class IncludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
}
private fun addFolder() {
FilePickerDialog(this, config.lastFilepickerPath, false, config.shouldShowHidden, false, true) {
config.lastFilepickerPath = it
config.addIncludedFolder(it)
showAddIncludedFolderDialog {
updateFolders()
Thread {
scanPathRecursively(it)
}.start()
}
}
}

View file

@ -1,9 +1,7 @@
package com.simplemobiletools.gallery.pro.activities
import android.app.Activity
import android.app.SearchManager
import android.content.ClipData
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
@ -14,8 +12,6 @@ import android.view.MenuItem
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.Toast
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog
@ -39,7 +35,6 @@ 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.AlbumCover
import com.simplemobiletools.gallery.pro.models.Directory
import com.simplemobiletools.gallery.pro.models.Medium
import kotlinx.android.synthetic.main.activity_main.*
@ -66,7 +61,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private var mIsPasswordProtectionPending = false
private var mWasProtectionHandled = false
private var mShouldStopFetching = false
private var mIsSearchOpen = false
private var mLatestMediaId = 0L
private var mLatestMediaDateId = 0L
private var mCurrentPathPrefix = "" // used at "Group direct subfolders" for navigation
@ -74,7 +68,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private var mLastMediaHandler = Handler()
private var mTempShowHiddenHandler = Handler()
private var mZoomListener: MyRecyclerView.MyZoomListener? = null
private var mSearchMenuItem: MenuItem? = null
private var mDirs = ArrayList<Directory>()
private var mStoredAnimateGifs = true
@ -118,10 +111,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
storeStateVariables()
checkWhatsNewDialog()
directories_empty_text.setOnClickListener {
showFilterMediaDialog()
}
mIsPasswordProtectionPending = config.isAppPasswordProtectionOn
setupLatestMediaId()
@ -139,7 +128,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (!config.wasRecycleBinPinned) {
config.addPinnedFolders(hashSetOf(RECYCLE_BIN))
config.wasRecycleBinPinned = true
config.saveFolderGrouping(SHOW_ALL, GROUP_BY_DATE_TAKEN or GROUP_DESCENDING)
config.saveFolderGrouping(SHOW_ALL, GROUP_BY_DATE_TAKEN_DAILY or GROUP_DESCENDING)
}
if (!config.wasSVGShowingHandled) {
@ -149,6 +138,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
if (!config.wasSortingByNumericValueAdded) {
config.wasSortingByNumericValueAdded = true
config.sorting = config.sorting or SORT_USE_NUMERIC_VALUE
}
updateWidgets()
registerFileUpdateListener()
}
@ -224,8 +218,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
override fun onStop() {
super.onStop()
mSearchMenuItem?.collapseActionView()
if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
mTempShowHiddenHandler.postDelayed({
config.temporarilyShowHidden = false
@ -276,7 +268,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
findItem(R.id.reduce_column_count).isVisible = config.viewTypeFolders == VIEW_TYPE_GRID && config.dirColumnCnt > 1
findItem(R.id.hide_the_recycle_bin).isVisible = useBin && config.showRecycleBinAtFolders
findItem(R.id.show_the_recycle_bin).isVisible = useBin && !config.showRecycleBinAtFolders
setupSearch(this)
}
}
@ -288,6 +279,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.search -> launchSearchActivity()
R.id.sort -> showSortingDialog()
R.id.filter -> showFilterMediaDialog()
R.id.open_camera -> launchCamera()
@ -331,43 +323,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
private fun setupSearch(menu: Menu) {
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
mSearchMenuItem = menu.findItem(R.id.search)
(mSearchMenuItem?.actionView as? SearchView)?.apply {
setSearchableInfo(searchManager.getSearchableInfo(componentName))
isSubmitButtonEnabled = false
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String) = false
override fun onQueryTextChange(newText: String): Boolean {
if (mIsSearchOpen) {
setupAdapter(mDirs, newText)
}
return true
}
})
}
MenuItemCompat.setOnActionExpandListener(mSearchMenuItem, object : MenuItemCompat.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem?): Boolean {
mIsSearchOpen = true
directories_refresh_layout.isEnabled = false
return true
}
// this triggers on device rotation too, avoid doing anything
override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
if (mIsSearchOpen) {
mIsSearchOpen = false
directories_refresh_layout.isEnabled = config.enablePullToRefresh
setupAdapter(mDirs, "")
}
return true
}
})
}
private fun startNewPhotoFetcher() {
if (isNougatPlus()) {
val photoFetcher = NewPhotoFetcher()
@ -383,7 +338,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (newFolder.exists() && newFolder.isDirectory) {
if (newFolder.list()?.isEmpty() == true) {
toast(String.format(getString(R.string.deleting_folder), config.tempFolderPath), Toast.LENGTH_LONG)
tryDeleteFileDirItem(newFolder.toFileDirItem(applicationContext), true, true)
tryDeleteFileDirItem(newFolder.toFileDirItem(), true, true)
}
}
config.tempFolderPath = ""
@ -391,7 +346,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun checkOTGPath() {
Thread {
ensureBackgroundThread {
if (!config.wasOTGHandled && hasPermission(PERMISSION_WRITE_STORAGE) && hasOTGConnected() && config.OTGPath.isEmpty()) {
getStorageDirectories().firstOrNull { it.trimEnd('/') != internalStoragePath && it.trimEnd('/') != sdCardPath }?.apply {
config.wasOTGHandled = true
@ -409,7 +364,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
}
}.start()
}
}
private fun checkDefaultSpamFolders() {
@ -467,15 +422,21 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
private fun launchSearchActivity() {
Intent(this, SearchActivity::class.java).apply {
startActivity(this)
}
}
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) {
getDirectories()
} else {
Thread {
ensureBackgroundThread {
gotDirectories(getCurrentlyDisplayedDirs())
}.start()
}
}
}
}
@ -554,7 +515,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
(it.isGif() && filter and TYPE_GIFS != 0) ||
(it.isRawFast() && filter and TYPE_RAWS != 0) ||
(it.isSvg() && filter and TYPE_SVGS != 0))
}?.mapTo(itemsToDelete) { it.toFileDirItem(this) }
}?.mapTo(itemsToDelete) { it.toFileDirItem() }
}
if (config.useRecycleBin) {
@ -579,11 +540,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
refreshItems()
}
Thread {
ensureBackgroundThread {
folders.filter { !it.exists() }.forEach {
mDirectoryDao.deleteDirPath(it.absolutePath)
}
}.start()
}
}
}
@ -668,22 +629,22 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun toggleRecycleBin(show: Boolean) {
config.showRecycleBinAtFolders = show
invalidateOptionsMenu()
Thread {
ensureBackgroundThread {
var dirs = getCurrentlyDisplayedDirs()
if (!show) {
dirs = dirs.filter { it.path != RECYCLE_BIN } as ArrayList<Directory>
}
gotDirectories(dirs)
}.start()
}
}
private fun createNewFolder() {
FilePickerDialog(this, internalStoragePath, false, config.shouldShowHidden, false, true) {
CreateNewFolderDialog(this, it) {
config.tempFolderPath = it
Thread {
ensureBackgroundThread {
gotDirectories(addTempFolderIfNeeded(getCurrentlyDisplayedDirs()))
}.start()
}
}
}
}
@ -999,26 +960,27 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun checkPlaceholderVisibility(dirs: ArrayList<Directory>) {
directories_empty_text_label.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
directories_empty_text.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
directories_grid.beVisibleIf(directories_empty_text_label.isGone())
}
private fun createDirectoryFromMedia(path: String, curMedia: ArrayList<Medium>, albumCovers: ArrayList<AlbumCover>, hiddenString: String,
includedFolders: MutableSet<String>, isSortingAscending: Boolean, getProperFileSize: Boolean): Directory {
var thumbnail = curMedia.firstOrNull { File(it.path).exists() }?.path ?: ""
albumCovers.forEach {
if (it.path == path && File(it.tmb).exists()) {
thumbnail = it.tmb
if (dirs.isEmpty() && config.filterMedia == TYPE_DEFAULT_FILTER) {
directories_empty_text_label.text = getString(R.string.no_media_add_included)
directories_empty_text.text = getString(R.string.add_folder)
directories_empty_text.setOnClickListener {
showAddIncludedFolderDialog {
refreshItems()
}
}
} else {
directories_empty_text_label.text = getString(R.string.no_media_with_filters)
directories_empty_text.text = getString(R.string.change_filters_underlined)
directories_empty_text.setOnClickListener {
showFilterMediaDialog()
}
}
val firstItem = curMedia.first()
val lastItem = curMedia.last()
val dirName = checkAppendingHidden(path, hiddenString, includedFolders)
val lastModified = if (isSortingAscending) Math.min(firstItem.modified, lastItem.modified) else Math.max(firstItem.modified, lastItem.modified)
val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)
val size = 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)
directories_empty_text.underlineText()
directories_grid.beVisibleIf(directories_empty_text_label.isGone())
}
private fun setupAdapter(dirs: ArrayList<Directory>, textToSearch: String = "") {
@ -1136,12 +1098,12 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
?: ""
private fun setupLatestMediaId() {
Thread {
ensureBackgroundThread {
if (hasPermission(PERMISSION_READ_STORAGE)) {
mLatestMediaId = getLatestMediaId()
mLatestMediaDateId = getLatestMediaByDateId()
}
}.start()
}
}
private fun checkLastMediaChanged() {
@ -1150,7 +1112,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
mLastMediaHandler.postDelayed({
Thread {
ensureBackgroundThread {
val mediaId = getLatestMediaId()
val mediaDateId = getLatestMediaByDateId()
if (mLatestMediaId != mediaId || mLatestMediaDateId != mediaDateId) {
@ -1163,7 +1125,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
mLastMediaHandler.removeCallbacksAndMessages(null)
checkLastMediaChanged()
}
}.start()
}
}, LAST_MEDIA_CHECK_PERIOD)
}
@ -1171,12 +1133,12 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (config.useRecycleBin && config.lastBinCheck < System.currentTimeMillis() - DAY_SECONDS * 1000) {
config.lastBinCheck = System.currentTimeMillis()
Handler().postDelayed({
Thread {
ensureBackgroundThread {
try {
mMediumDao.deleteOldRecycleBinItems(System.currentTimeMillis() - MONTH_MILLISECONDS)
} catch (e: Exception) {
}
}.start()
}
}, 3000L)
}
}
@ -1185,7 +1147,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
// /storage/emulated/0/Android/data/com.facebook.orca/files/stickers/175139712676531/209575122566323
// /storage/emulated/0/Android/data/com.facebook.orca/files/stickers/497837993632037/499671223448714
private fun excludeSpamFolders() {
Thread {
ensureBackgroundThread {
try {
val internalPath = internalStoragePath
val checkedPaths = ArrayList<String>()
@ -1222,7 +1184,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
} catch (e: Exception) {
}
}.start()
}
}
override fun refreshItems() {
@ -1230,16 +1192,16 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
override fun recheckPinnedFolders() {
Thread {
ensureBackgroundThread {
gotDirectories(movePinnedDirectoriesToFront(getCurrentlyDisplayedDirs()))
}.start()
}
}
override fun updateDirectories(directories: ArrayList<Directory>) {
Thread {
ensureBackgroundThread {
storeDirectoryItems(directories, mDirectoryDao)
removeInvalidDBDirectories()
}.start()
}
}
private fun checkWhatsNewDialog() {

View file

@ -22,10 +22,12 @@ import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.REQUEST_EDIT_IMAGE
import com.simplemobiletools.commons.helpers.SORT_BY_RANDOM
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.commons.views.MyRecyclerView
@ -220,6 +222,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
findItem(R.id.folder_view).isVisible = mShowAll
findItem(R.id.open_camera).isVisible = mShowAll
findItem(R.id.about).isVisible = mShowAll
findItem(R.id.create_new_folder).isVisible = !mShowAll && mPath != RECYCLE_BIN && mPath != FAVORITES
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden
@ -249,6 +252,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
R.id.hide_folder -> tryHideFolder()
R.id.unhide_folder -> unhideFolder()
R.id.exclude_folder -> tryExcludeFolder()
R.id.create_new_folder -> createNewFolder()
R.id.temporarily_show_hidden -> tryToggleTemporarilyShowHidden()
R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden()
R.id.increase_column_count -> increaseColumnCount()
@ -324,18 +328,25 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun searchQueryChanged(text: String) {
Thread {
ensureBackgroundThread {
try {
val filtered = mMedia.filter { it is Medium && it.name.contains(text, true) } as ArrayList
filtered.sortBy { it is Medium && !it.name.startsWith(text, true) }
val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList<Medium>, mPath)
runOnUiThread {
if (grouped.isEmpty()) {
media_empty_text_label.text = getString(R.string.no_items_found)
media_empty_text_label.beVisible()
} else {
media_empty_text_label.beGone()
}
getMediaAdapter()?.updateMedia(grouped)
measureRecyclerViewContent(grouped)
}
} catch (ignored: Exception) {
}
}.start()
}
}
private fun tryLoadGallery() {
@ -425,7 +436,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mLastMediaHandler.removeCallbacksAndMessages(null)
mLastMediaHandler.postDelayed({
Thread {
ensureBackgroundThread {
val mediaId = getLatestMediaId()
val mediaDateId = getLatestMediaByDateId()
if (mLatestMediaId != mediaId || mLatestMediaDateId != mediaDateId) {
@ -437,7 +448,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} else {
checkLastMediaChanged()
}
}.start()
}
}, LAST_MEDIA_CHECK_PERIOD)
}
@ -477,9 +488,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) {
Thread {
ensureBackgroundThread {
mDirectoryDao.deleteDirPath(RECYCLE_BIN)
}.start()
}
finish()
}
}
@ -583,7 +594,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun startAsyncTask() {
mCurrAsyncTask?.stopFetching()
mCurrAsyncTask = GetMediaAsynctask(applicationContext, mPath, mIsGetImageIntent, mIsGetVideoIntent, mShowAll) {
Thread {
ensureBackgroundThread {
val oldMedia = mMedia.clone() as ArrayList<ThumbnailItem>
val newMedia = it
gotMedia(newMedia, false)
@ -593,7 +604,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
} catch (e: Exception) {
}
}.start()
}
}
mCurrAsyncTask!!.execute()
@ -607,9 +618,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
if (mPath == FAVORITES) {
Thread {
ensureBackgroundThread {
mDirectoryDao.deleteDirPath(FAVORITES)
}.start()
}
}
finish()
@ -620,9 +631,15 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun deleteDBDirectory() {
Thread {
ensureBackgroundThread {
mDirectoryDao.deleteDirPath(mPath)
}.start()
}
}
private fun createNewFolder() {
CreateNewFolderDialog(this, mPath) {
config.tempFolderPath = it
}
}
private fun tryToggleTemporarilyShowHidden() {
@ -837,6 +854,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
media_refresh_layout.isRefreshing = false
media_empty_text_label.beVisibleIf(media.isEmpty() && !isFromCache)
media_empty_text.beVisibleIf(media.isEmpty() && !isFromCache)
if (media_empty_text_label.isVisible()) {
media_empty_text_label.text = getString(R.string.no_media_with_filters)
}
media_grid.beVisibleIf(media_empty_text_label.isGone())
val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath)
@ -890,14 +911,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mMedia.removeAll { filtered.map { it.path }.contains((it as? Medium)?.path) }
Thread {
ensureBackgroundThread {
val useRecycleBin = config.useRecycleBin
filtered.forEach {
if (it.path.startsWith(recycleBinPath) || !useRecycleBin) {
deleteDBPath(mMediumDao, it.path)
}
}
}.start()
}
if (mMedia.isEmpty()) {
deleteDirectoryIfEmpty()

View file

@ -15,6 +15,7 @@ import com.simplemobiletools.commons.extensions.onGlobalLayout
import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.PATH
@ -94,7 +95,7 @@ open class PanoramaPhotoActivity : SimpleActivity() {
try {
val options = VrPanoramaView.Options()
options.inputType = VrPanoramaView.Options.TYPE_MONO
Thread {
ensureBackgroundThread {
val bitmap = getBitmapToLoad(path)
runOnUiThread {
panorama_view.apply {
@ -120,7 +121,7 @@ open class PanoramaPhotoActivity : SimpleActivity() {
})
}
}
}.start()
}
} catch (e: Exception) {
showErrorToast(e)
}

View file

@ -97,9 +97,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
val realPath = intent.extras!!.getString(REAL_FILE_PATH)
if (realPath != null && File(realPath).exists()) {
if (realPath.getFilenameFromPath().contains('.') || filename.contains('.')) {
sendViewPagerIntent(realPath)
finish()
return
if (isFileTypeVisible(realPath)) {
sendViewPagerIntent(realPath)
finish()
return
}
} else {
filename = realPath.getFilenameFromPath()
}
@ -108,7 +110,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
if (mUri!!.scheme == "file") {
if (filename.contains('.')) {
scanPathRecursively(mUri!!.path)
rescanPaths(arrayListOf(mUri!!.path))
sendViewPagerIntent(mUri!!.path)
finish()
return
@ -116,10 +118,12 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
} else {
val path = applicationContext.getRealPathFromURI(mUri!!) ?: ""
if (path != mUri.toString() && path.isNotEmpty() && mUri!!.authority != "mms" && filename.contains('.') && File(path).exists()) {
scanPathRecursively(mUri!!.path)
sendViewPagerIntent(path)
finish()
return
if (isFileTypeVisible(path)) {
rescanPaths(arrayListOf(mUri!!.path))
sendViewPagerIntent(path)
finish()
return
}
}
}
@ -253,6 +257,15 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
PropertiesDialog(this, mUri!!.path)
}
private fun isFileTypeVisible(path: String): Boolean {
val filter = config.filterMedia
return !(path.isImageFast() && filter and TYPE_IMAGES == 0 ||
path.isVideoFast() && filter and TYPE_VIDEOS == 0 ||
path.isGif() && filter and TYPE_GIFS == 0 ||
path.isRawFast() && filter and TYPE_RAWS == 0 ||
path.isSvg() && filter and TYPE_SVGS == 0)
}
private fun initBottomActions() {
initBottomActionsLayout()
initBottomActionButtons()

View file

@ -0,0 +1,340 @@
package com.simplemobiletools.gallery.pro.activities
import android.app.SearchManager
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.ViewGroup
import android.widget.RelativeLayout
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.MediaAdapter
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.interfaces.MediaOperationsListener
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection
import kotlinx.android.synthetic.main.activity_search.*
import java.io.File
class SearchActivity : SimpleActivity(), MediaOperationsListener {
private var mIsSearchOpen = false
private var mLastSearchedText = ""
private var mSearchMenuItem: MenuItem? = null
private var mCurrAsyncTask: GetMediaAsynctask? = null
private var mAllMedia = ArrayList<ThumbnailItem>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_search)
media_empty_text_label.setTextColor(config.textColor)
getAllMedia()
}
override fun onDestroy() {
super.onDestroy()
mCurrAsyncTask?.stopFetching()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_search, menu)
setupSearch(menu)
return true
}
private fun setupSearch(menu: Menu) {
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
mSearchMenuItem = menu.findItem(R.id.search)
(mSearchMenuItem?.actionView as? SearchView)?.apply {
setSearchableInfo(searchManager.getSearchableInfo(componentName))
isSubmitButtonEnabled = false
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String) = false
override fun onQueryTextChange(newText: String): Boolean {
if (mIsSearchOpen) {
mLastSearchedText = newText
textChanged(newText)
}
return true
}
})
}
MenuItemCompat.setOnActionExpandListener(mSearchMenuItem, object : MenuItemCompat.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem?): Boolean {
mIsSearchOpen = true
return true
}
// this triggers on device rotation too, avoid doing anything
override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
if (mIsSearchOpen) {
mIsSearchOpen = false
mLastSearchedText = ""
}
return true
}
})
mSearchMenuItem?.expandActionView()
}
private fun textChanged(text: String) {
ensureBackgroundThread {
try {
val filtered = mAllMedia.filter { it is Medium && it.name.contains(text, true) } as ArrayList
filtered.sortBy { it is Medium && !it.name.startsWith(text, true) }
val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList<Medium>, "")
runOnUiThread {
if (grouped.isEmpty()) {
media_empty_text_label.text = getString(R.string.no_items_found)
media_empty_text_label.beVisible()
} else {
media_empty_text_label.beGone()
}
getMediaAdapter()?.updateMedia(grouped)
measureRecyclerViewContent(grouped)
}
} catch (ignored: Exception) {
}
}
}
private fun setupAdapter() {
val currAdapter = media_grid.adapter
if (currAdapter == null) {
val fastscroller = if (config.scrollHorizontally) media_horizontal_fastscroller else media_vertical_fastscroller
MediaAdapter(this, ArrayList(), this, false, false, "", media_grid, fastscroller) {
if (it is Medium) {
itemClicked(it.path)
}
}.apply {
media_grid.adapter = this
}
setupLayoutManager()
} else {
(currAdapter as MediaAdapter).updateMedia(mAllMedia)
}
measureRecyclerViewContent(mAllMedia)
setupScrollDirection()
}
private fun getMediaAdapter() = media_grid.adapter as? MediaAdapter
private fun itemClicked(path: String) {
val isVideo = path.isVideoFast()
if (isVideo) {
openPath(path, false)
} else {
Intent(this, ViewPagerActivity::class.java).apply {
putExtra(PATH, path)
putExtra(SHOW_ALL, false)
startActivity(this)
}
}
}
private fun setupLayoutManager() {
val viewType = config.getFolderViewType(SHOW_ALL)
if (viewType == VIEW_TYPE_GRID) {
setupGridLayoutManager()
} else {
setupListLayoutManager()
}
}
private fun setupGridLayoutManager() {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager
if (config.scrollHorizontally) {
layoutManager.orientation = RecyclerView.HORIZONTAL
media_grid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
} else {
layoutManager.orientation = RecyclerView.VERTICAL
media_grid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
layoutManager.spanCount = config.mediaColumnCnt
val adapter = getMediaAdapter()
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if (adapter?.isASectionTitle(position) == true) {
layoutManager.spanCount
} else {
1
}
}
}
}
private fun setupListLayoutManager() {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL
}
private fun setupScrollDirection() {
val viewType = config.getFolderViewType(SHOW_ALL)
val allowHorizontalScroll = config.scrollHorizontally && viewType == VIEW_TYPE_GRID
media_vertical_fastscroller.isHorizontal = false
media_vertical_fastscroller.beGoneIf(allowHorizontalScroll)
media_horizontal_fastscroller.isHorizontal = true
media_horizontal_fastscroller.beVisibleIf(allowHorizontalScroll)
val sorting = config.getFileSorting(SHOW_ALL)
if (allowHorizontalScroll) {
media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid) {
media_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
} else {
media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid) {
media_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
}
}
private fun getBubbleTextItem(index: Int, sorting: Int): String {
var realIndex = index
val mediaAdapter = getMediaAdapter()
if (mediaAdapter?.isASectionTitle(index) == true) {
realIndex++
}
return mediaAdapter?.getItemBubbleText(realIndex, sorting) ?: ""
}
private fun measureRecyclerViewContent(media: ArrayList<ThumbnailItem>) {
media_grid.onGlobalLayout {
if (config.scrollHorizontally) {
calculateContentWidth(media)
} else {
calculateContentHeight(media)
}
}
}
private fun calculateContentWidth(media: ArrayList<ThumbnailItem>) {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager
val thumbnailWidth = layoutManager.getChildAt(0)?.width ?: 0
val fullWidth = ((media.size - 1) / layoutManager.spanCount + 1) * thumbnailWidth
media_horizontal_fastscroller.setContentWidth(fullWidth)
media_horizontal_fastscroller.setScrollToX(media_grid.computeHorizontalScrollOffset())
}
private fun calculateContentHeight(media: ArrayList<ThumbnailItem>) {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager
val pathToCheck = SHOW_ALL
val hasSections = config.getFolderGrouping(pathToCheck) and GROUP_BY_NONE == 0 && !config.scrollHorizontally
val sectionTitleHeight = if (hasSections) layoutManager.getChildAt(0)?.height ?: 0 else 0
val thumbnailHeight = if (hasSections) layoutManager.getChildAt(1)?.height ?: 0 else layoutManager.getChildAt(0)?.height ?: 0
var fullHeight = 0
var curSectionItems = 0
media.forEach {
if (it is ThumbnailSection) {
fullHeight += sectionTitleHeight
if (curSectionItems != 0) {
val rows = ((curSectionItems - 1) / layoutManager.spanCount + 1)
fullHeight += rows * thumbnailHeight
}
curSectionItems = 0
} else {
curSectionItems++
}
}
fullHeight += ((curSectionItems - 1) / layoutManager.spanCount + 1) * thumbnailHeight
media_vertical_fastscroller.setContentHeight(fullHeight)
media_vertical_fastscroller.setScrollToY(media_grid.computeVerticalScrollOffset())
}
private fun getAllMedia() {
getCachedMedia("") {
if (it.isNotEmpty()) {
mAllMedia = it.clone() as ArrayList<ThumbnailItem>
}
runOnUiThread {
setupAdapter()
}
startAsyncTask(false)
}
}
private fun startAsyncTask(updateItems: Boolean) {
mCurrAsyncTask?.stopFetching()
mCurrAsyncTask = GetMediaAsynctask(applicationContext, "", showAll = true) {
mAllMedia = it.clone() as ArrayList<ThumbnailItem>
if (updateItems) {
textChanged(mLastSearchedText)
}
}
mCurrAsyncTask!!.execute()
}
override fun refreshItems() {
startAsyncTask(true)
}
override fun tryDeleteFiles(fileDirItems: ArrayList<FileDirItem>) {
val filtered = fileDirItems.filter { File(it.path).isFile && it.path.isMediaFile() } as ArrayList
if (filtered.isEmpty()) {
return
}
if (config.useRecycleBin && !filtered.first().path.startsWith(recycleBinPath)) {
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()) {
if (it) {
deleteFilteredFiles(filtered)
} else {
toast(R.string.unknown_error_occurred)
}
}
} else {
val deletingItems = resources.getQuantityString(R.plurals.deleting_items, filtered.size, filtered.size)
toast(deletingItems)
deleteFilteredFiles(filtered)
}
}
private fun deleteFilteredFiles(filtered: ArrayList<FileDirItem>) {
deleteFiles(filtered) {
if (!it) {
toast(R.string.unknown_error_occurred)
return@deleteFiles
}
mAllMedia.removeAll { filtered.map { it.path }.contains((it as? Medium)?.path) }
ensureBackgroundThread {
val useRecycleBin = config.useRecycleBin
filtered.forEach {
if (it.path.startsWith(recycleBinPath) || !useRecycleBin) {
deleteDBPath(galleryDB.MediumDao(), it.path)
}
}
}
}
}
override fun selectedPaths(paths: ArrayList<String>) {
}
}

View file

@ -11,6 +11,7 @@ import android.view.Menu
import android.view.MenuItem
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.pro.R
@ -117,7 +118,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
if (result.error == null) {
toast(R.string.setting_wallpaper)
Thread {
ensureBackgroundThread {
val bitmap = result.bitmap
val wantedHeight = wallpaperManager.desiredMinimumHeight
val ratio = wantedHeight / bitmap.height.toFloat()
@ -135,7 +136,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
setResult(Activity.RESULT_CANCELED)
}
finish()
}.start()
}
} else {
toast("${getString(R.string.image_editing_failed)}: ${result.error.message}")
}

View file

@ -572,7 +572,7 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupEmptyRecycleBin() {
Thread {
ensureBackgroundThread {
try {
mRecycleBinContentSize = galleryDB.MediumDao().getDeletedMedia().sumByLong { it.size }
} catch (ignored: Exception) {
@ -580,7 +580,7 @@ class SettingsActivity : SimpleActivity() {
runOnUiThread {
settings_empty_recycle_bin_size.text = mRecycleBinContentSize.formatSize()
}
}.start()
}
settings_empty_recycle_bin_holder.setOnClickListener {
if (mRecycleBinContentSize == 0L) {
@ -686,13 +686,13 @@ class SettingsActivity : SimpleActivity() {
private fun setupImportSettings() {
settings_import_holder.setOnClickListener {
FilePickerDialog(this) {
Thread {
ensureBackgroundThread {
try {
parseFile(it)
} catch (e: Exception) {
showErrorToast(e)
}
}.start()
}
}
}
}

View file

@ -6,11 +6,16 @@ import android.net.Uri
import android.provider.MediaStore
import android.view.WindowManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.getParentPath
import com.simplemobiletools.commons.extensions.getRealPathFromURI
import com.simplemobiletools.commons.extensions.scanPathRecursively
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isPiePlus
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.addPathToDB
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.updateDirectoryPath
open class SimpleActivity : BaseSimpleActivity() {
val observer = object : ContentObserver(null) {
@ -18,6 +23,7 @@ open class SimpleActivity : BaseSimpleActivity() {
super.onChange(selfChange, uri)
val path = getRealPathFromURI(uri)
if (path != null) {
updateDirectoryPath(path.getParentPath())
addPathToDB(path)
}
}
@ -76,4 +82,15 @@ open class SimpleActivity : BaseSimpleActivity() {
} catch (ignored: Exception) {
}
}
protected fun showAddIncludedFolderDialog(callback: () -> Unit) {
FilePickerDialog(this, config.lastFilepickerPath, false, config.shouldShowHidden, false, true) {
config.lastFilepickerPath = it
config.addIncludedFolder(it)
callback()
ensureBackgroundThread {
scanPathRecursively(it)
}
}
}
}

View file

@ -25,6 +25,7 @@ import com.google.android.exoplayer2.upstream.DataSpec
import com.google.android.exoplayer2.video.VideoListener
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.*
@ -566,10 +567,10 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
private fun releaseExoPlayer() {
mExoPlayer?.stop()
Thread {
ensureBackgroundThread {
mExoPlayer?.release()
mExoPlayer = null
}.start()
}
}
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
@ -602,9 +603,9 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
override fun onSurfaceTextureDestroyed(surface: SurfaceTexture?) = false
override fun onSurfaceTextureAvailable(surface: SurfaceTexture?, width: Int, height: Int) {
Thread {
ensureBackgroundThread {
mExoPlayer?.setVideoSurface(Surface(video_surface!!.surfaceTexture))
}.start()
}
}
override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) {}

View file

@ -2,13 +2,18 @@ package com.simplemobiletools.gallery.pro.activities
import android.animation.Animator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.content.res.Configuration
import android.database.Cursor
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Icon
import android.media.ExifInterface
import android.net.Uri
import android.os.Bundle
@ -20,7 +25,15 @@ import android.view.View
import android.view.WindowManager
import android.view.animation.DecelerateInterpolator
import android.widget.Toast
import androidx.print.PrintHelper
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.extensions.*
@ -66,6 +79,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mMediaFiles = ArrayList<Medium>()
private var mFavoritePaths = ArrayList<String>()
private var mIgnoredPaths = ArrayList<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -155,11 +169,13 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
findItem(R.id.menu_copy_to).isVisible = visibleBottomActions and BOTTOM_ACTION_COPY == 0
findItem(R.id.menu_move_to).isVisible = visibleBottomActions and BOTTOM_ACTION_MOVE == 0
findItem(R.id.menu_save_as).isVisible = rotationDegrees != 0
findItem(R.id.menu_print).isVisible = currentMedium.isImage() || currentMedium.isRaw()
findItem(R.id.menu_hide).isVisible = !currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin()
findItem(R.id.menu_unhide).isVisible = currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin()
findItem(R.id.menu_add_to_favorites).isVisible = !currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0
findItem(R.id.menu_remove_from_favorites).isVisible = currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0
findItem(R.id.menu_add_to_favorites).isVisible = !currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 && !currentMedium.getIsInRecycleBin()
findItem(R.id.menu_remove_from_favorites).isVisible = currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 && !currentMedium.getIsInRecycleBin()
findItem(R.id.menu_restore_file).isVisible = currentMedium.path.startsWith(recycleBinPath)
findItem(R.id.menu_create_shortcut).isVisible = isOreoPlus()
findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 && visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0
findItem(R.id.menu_change_orientation).icon = resources.getDrawable(getChangeOrientationIcon())
findItem(R.id.menu_rotate).setShowAsAction(
@ -191,6 +207,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
R.id.menu_share -> shareMediumPath(getCurrentPath())
R.id.menu_delete -> checkDeleteConfirmation()
R.id.menu_rename -> renameFile()
R.id.menu_print -> printFile()
R.id.menu_edit -> openEditor(getCurrentPath())
R.id.menu_properties -> showProperties()
R.id.menu_show_on_map -> showOnMap()
@ -204,6 +221,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
R.id.menu_force_landscape -> toggleOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
R.id.menu_default_orientation -> toggleOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
R.id.menu_save_as -> saveImageAs()
R.id.menu_create_shortcut -> createShortcut()
R.id.menu_settings -> launchSettings()
else -> return super.onOptionsItemSelected(item)
}
@ -317,8 +335,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
if (intent.action == "com.android.camera.action.REVIEW") {
Thread {
if (galleryDB.MediumDao().getMediaFromPath(mPath).isEmpty()) {
ensureBackgroundThread {
val mediumDao = galleryDB.MediumDao()
if (mediumDao.getMediaFromPath(mPath).isEmpty()) {
val type = when {
mPath.isVideoFast() -> TYPE_VIDEOS
mPath.isGif() -> TYPE_GIFS
@ -327,11 +346,13 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
else -> TYPE_IMAGES
}
val isFavorite = mediumDao.isFavorite(mPath)
val duration = if (type == TYPE_VIDEOS) mPath.getVideoDuration() else 0
val medium = Medium(null, mPath.getFilenameFromPath(), mPath, mPath.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(), File(mPath).length(), type, duration, false, 0)
galleryDB.MediumDao().insert(medium)
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)
}
}.start()
}
}
}
@ -341,9 +362,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun initFavorites() {
Thread {
ensureBackgroundThread {
mFavoritePaths = getFavoritePaths()
}.start()
}
}
private fun setupOrientation() {
@ -359,8 +380,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun updatePagerItems(media: MutableList<Medium>) {
val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, media)
if (!isDestroyed) {
pagerAdapter.shouldInitFragment = mPos < 5
view_pager.apply {
adapter = pagerAdapter
pagerAdapter.shouldInitFragment = true
currentItem = mPos
removeOnPageChangeListener(this@ViewPagerActivity)
addOnPageChangeListener(this@ViewPagerActivity)
@ -384,6 +407,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (getMediaForSlideshow()) {
view_pager.onGlobalLayout {
if (!isDestroyed) {
if (config.slideshowAnimation == SLIDESHOW_ANIMATION_FADE) {
view_pager.setPageTransformer(false, FadePageTransformer())
}
hideSystemUI(true)
mSlideshowInterval = config.slideshowInterval
mSlideshowMoveBackwards = config.slideshowMoveBackwards
@ -395,6 +422,16 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
}
private fun goToNextMedium(forward: Boolean) {
val oldPosition = view_pager.currentItem
val newPosition = if (forward) oldPosition + 1 else oldPosition - 1
if (newPosition == -1 || newPosition > view_pager.adapter!!.count - 1) {
slideshowEnded(forward)
} else {
view_pager.setCurrentItem(newPosition, false)
}
}
private fun animatePagerTransition(forward: Boolean) {
val oldPosition = view_pager.currentItem
val animator = ValueAnimator.ofInt(0, view_pager.width)
@ -424,7 +461,13 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
})
animator.interpolator = DecelerateInterpolator()
if (config.slideshowAnimation == SLIDESHOW_ANIMATION_SLIDE) {
animator.interpolator = DecelerateInterpolator()
animator.duration = SLIDESHOW_SLIDE_DURATION
} else {
animator.duration = SLIDESHOW_FADE_DURATION
}
animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener {
var oldDragPosition = 0
override fun onAnimationUpdate(animation: ValueAnimator) {
@ -441,7 +484,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
})
animator.duration = SLIDESHOW_SCROLL_DURATION
view_pager.beginFakeDrag()
animator.start()
}
@ -461,6 +503,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun stopSlideshow() {
if (mIsSlideshowActive) {
view_pager.setPageTransformer(false, DefaultPageTransformer())
mIsSlideshowActive = false
showSystemUI(true)
mSlideshowHandler.removeCallbacksAndMessages(null)
@ -484,7 +527,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun swipeToNextMedium() {
animatePagerTransition(!mSlideshowMoveBackwards)
if (config.slideshowAnimation == SLIDESHOW_ANIMATION_NONE) {
goToNextMedium(!mSlideshowMoveBackwards)
} else {
animatePagerTransition(!mSlideshowMoveBackwards)
}
}
private fun getMediaForSlideshow(): Boolean {
@ -588,14 +635,37 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val newPath = it
handleSAFDialog(it) {
toast(R.string.saving)
Thread {
val photoFragment = getCurrentPhotoFragment() ?: return@Thread
ensureBackgroundThread {
val photoFragment = getCurrentPhotoFragment() ?: return@ensureBackgroundThread
saveRotatedImageToFile(currPath, newPath, photoFragment.mCurrentRotationDegrees, true) {
toast(R.string.file_saved)
getCurrentPhotoFragment()?.mCurrentRotationDegrees = 0
invalidateOptionsMenu()
}
}.start()
}
}
}
}
@SuppressLint("NewApi")
private fun createShortcut() {
val manager = getSystemService(ShortcutManager::class.java)
if (manager.isRequestPinShortcutSupported) {
val medium = getCurrentMedium() ?: return
val path = medium.path
val drawable = resources.getDrawable(R.drawable.shortcut_image).mutate()
getShortcutImage(path, drawable) {
val intent = Intent(this, PhotoVideoActivity::class.java)
intent.action = Intent.ACTION_VIEW
intent.data = Uri.fromFile(File(path))
val shortcut = ShortcutInfo.Builder(this, path)
.setShortLabel(medium.name)
.setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
.setIntent(intent)
.build()
manager.requestPinShortcut(shortcut, null)
}
}
}
@ -704,13 +774,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun initBottomActionButtons() {
val currentMedium = getCurrentMedium()
val visibleBottomActions = if (config.bottomActions) config.visibleBottomActions else 0
bottom_favorite.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0)
bottom_favorite.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0 && currentMedium?.getIsInRecycleBin() == false)
bottom_favorite.setOnClickListener {
toggleFavorite()
}
bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && getCurrentMedium()?.isSVG() == false)
bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && currentMedium?.isSVG() == false)
bottom_edit.setOnClickListener {
openEditor(getCurrentPath())
}
@ -742,7 +813,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
else -> ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
mIsOrientationLocked = requestedOrientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
updateBottomActionIcons(getCurrentMedium())
updateBottomActionIcons(currentMedium)
}
bottom_slideshow.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SLIDESHOW != 0)
@ -757,14 +828,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
bottom_toggle_file_visibility.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0)
bottom_toggle_file_visibility.setOnClickListener {
getCurrentMedium()?.apply {
currentMedium?.apply {
toggleFileVisibility(!isHidden()) {
updateBottomActionIcons(getCurrentMedium())
updateBottomActionIcons(currentMedium)
}
}
}
bottom_rename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 && getCurrentMedium()?.getIsInRecycleBin() == false)
bottom_rename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 && currentMedium?.getIsInRecycleBin() == false)
bottom_rename.setOnClickListener {
renameFile()
}
@ -803,7 +874,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun toggleFavorite() {
val medium = getCurrentMedium() ?: return
medium.isFavorite = !medium.isFavorite
Thread {
ensureBackgroundThread {
galleryDB.MediumDao().updateFavorite(medium.path, medium.isFavorite)
if (medium.isFavorite) {
mFavoritePaths.add(medium.path)
@ -811,7 +882,60 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
mFavoritePaths.remove(medium.path)
}
invalidateOptionsMenu()
}.start()
}
}
private fun printFile() {
sendPrintIntent(getCurrentPath())
}
private fun sendPrintIntent(path: String) {
val printHelper = PrintHelper(this)
printHelper.scaleMode = PrintHelper.SCALE_MODE_FIT
printHelper.orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
try {
val resolution = path.getImageResolution()
if (resolution == null) {
toast(R.string.unknown_error_occurred)
return
}
var requestedWidth = resolution.x
var requestedHeight = resolution.y
if (requestedWidth >= MAX_PRINT_SIDE_SIZE) {
requestedHeight = (requestedHeight / (requestedWidth / MAX_PRINT_SIDE_SIZE.toFloat())).toInt()
requestedWidth = MAX_PRINT_SIDE_SIZE
} else if (requestedHeight >= MAX_PRINT_SIDE_SIZE) {
requestedWidth = (requestedWidth / (requestedHeight / MAX_PRINT_SIDE_SIZE.toFloat())).toInt()
requestedHeight = MAX_PRINT_SIDE_SIZE
}
val options = RequestOptions()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
Glide.with(this)
.asBitmap()
.load(path)
.apply(options)
.listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
showErrorToast(e?.localizedMessage ?: "")
return false
}
override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
if (bitmap != null) {
printHelper.printBitmap(path.getFilenameFromPath(), bitmap)
}
return false
}
}).submit(requestedWidth, requestedHeight)
} catch (e: Exception) {
}
}
private fun restoreFile() {
@ -877,19 +1001,37 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val fileDirItem = FileDirItem(path, path.getFilenameFromPath())
if (config.useRecycleBin && !getCurrentMedium()!!.getIsInRecycleBin()) {
mIgnoredPaths.add(fileDirItem.path)
val media = mMediaFiles.filter { !mIgnoredPaths.contains(it.path) } as ArrayList<ThumbnailItem>
runOnUiThread {
gotMedia(media)
}
movePathsInRecycleBin(arrayListOf(path)) {
if (it) {
tryDeleteFileDirItem(fileDirItem, false, false) {
refreshViewPager()
mIgnoredPaths.remove(fileDirItem.path)
deleteDirectoryIfEmpty()
}
} else {
toast(R.string.unknown_error_occurred)
}
}
} else {
tryDeleteFileDirItem(fileDirItem, false, true) {
refreshViewPager()
}
handleDeletion(fileDirItem)
}
}
private fun handleDeletion(fileDirItem: FileDirItem) {
mIgnoredPaths.add(fileDirItem.path)
val media = mMediaFiles.filter { !mIgnoredPaths.contains(it.path) } as ArrayList<ThumbnailItem>
runOnUiThread {
gotMedia(media)
}
tryDeleteFileDirItem(fileDirItem, false, true) {
mIgnoredPaths.remove(fileDirItem.path)
deleteDirectoryIfEmpty()
}
}
@ -911,9 +1053,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
name = it.getFilenameFromPath()
}
Thread {
ensureBackgroundThread {
updateDBMediaPath(oldPath, it)
}.start()
}
updateActionbarTitle()
}
}
@ -932,7 +1074,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun gotMedia(thumbnailItems: ArrayList<ThumbnailItem>) {
val media = thumbnailItems.asSequence().filter { it is Medium }.map { it as Medium }.toMutableList() as ArrayList<Medium>
val media = thumbnailItems.asSequence().filter { it is Medium && !mIgnoredPaths.contains(it.path) }.map { it as Medium }.toMutableList() as ArrayList<Medium>
if (isDirEmpty(media) || media.hashCode() == mPrevHashcode) {
return
}
@ -966,9 +1108,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val fileDirItem = FileDirItem(mDirectory, mDirectory.getFilenameFromPath(), File(mDirectory).isDirectory)
if (config.deleteEmptyFolders && !fileDirItem.isDownloadsFolder() && fileDirItem.isDirectory && fileDirItem.getProperFileCount(true) == 0) {
tryDeleteFileDirItem(fileDirItem, true, true)
scanPathRecursively(mDirectory)
}
scanPathRecursively(mDirectory)
}
private fun checkOrientation() {
@ -976,8 +1117,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
var flipSides = false
try {
val pathToLoad = getCurrentPath()
val exif = android.media.ExifInterface(pathToLoad)
val orientation = exif.getAttributeInt(android.media.ExifInterface.TAG_ORIENTATION, -1)
val exif = ExifInterface(pathToLoad)
val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1)
flipSides = orientation == ExifInterface.ORIENTATION_ROTATE_90 || orientation == ExifInterface.ORIENTATION_ROTATE_270
} catch (e: Exception) {
}
@ -1015,8 +1156,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
override fun launchViewVideoIntent(path: String) {
Thread {
val newUri = getFinalUriFromPath(path, BuildConfig.APPLICATION_ID) ?: return@Thread
ensureBackgroundThread {
val newUri = getFinalUriFromPath(path, BuildConfig.APPLICATION_ID) ?: return@ensureBackgroundThread
val mimeType = getUriMimeType(path, newUri)
Intent().apply {
action = Intent.ACTION_VIEW
@ -1039,7 +1180,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
}
}
}.start()
}
}
private fun checkSystemUI() {

View file

@ -10,6 +10,7 @@ import android.widget.RelativeLayout
import android.widget.RemoteViews
import com.simplemobiletools.commons.dialogs.ColorPickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.dialogs.PickDirectoryDialog
import com.simplemobiletools.gallery.pro.extensions.*
@ -89,9 +90,9 @@ class WidgetConfigureActivity : SimpleActivity() {
AppWidgetManager.getInstance(this).updateAppWidget(mWidgetId, views)
config.showWidgetFolderName = folder_picker_show_folder_name.isChecked
val widget = Widget(null, mWidgetId, mFolderPath)
Thread {
ensureBackgroundThread {
widgetsDB.insertOrUpdate(widget)
}.start()
}
storeWidgetColors()
requestWidgetUpdate()
@ -161,14 +162,14 @@ class WidgetConfigureActivity : SimpleActivity() {
config_folder_name.text = getFolderNameFromPath(folderPath)
}
Thread {
ensureBackgroundThread {
val path = directoryDB.getDirectoryThumbnail(folderPath)
if (path != null) {
runOnUiThread {
loadJpg(path, config_image, config.cropThumbnails)
}
}
}.start()
}
}
private fun handleFolderNameDisplay() {

View file

@ -1,5 +1,10 @@
package com.simplemobiletools.gallery.pro.adapters
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.graphics.drawable.Icon
import android.view.Menu
import android.view.View
import android.view.ViewGroup
@ -12,10 +17,14 @@ import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.dialogs.RenameItemsDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.MediaActivity
import com.simplemobiletools.gallery.pro.dialogs.ConfirmDeleteFolderDialog
import com.simplemobiletools.gallery.pro.dialogs.ExcludeFolderDialog
import com.simplemobiletools.gallery.pro.dialogs.PickMediumDialog
import com.simplemobiletools.gallery.pro.extensions.*
@ -75,6 +84,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
findItem(R.id.cab_empty_recycle_bin).isVisible = isOneItemSelected && selectedPaths.first() == RECYCLE_BIN
findItem(R.id.cab_empty_disable_recycle_bin).isVisible = isOneItemSelected && selectedPaths.first() == RECYCLE_BIN
findItem(R.id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected
checkHideBtnVisibility(this, selectedPaths)
checkPinBtnVisibility(this, selectedPaths)
}
@ -98,6 +109,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
R.id.cab_copy_to -> copyMoveTo(true)
R.id.cab_move_to -> moveFilesTo()
R.id.cab_select_all -> selectAll()
R.id.cab_create_shortcut -> createShortcut()
R.id.cab_delete -> askConfirmDelete()
R.id.cab_select_photo -> changeAlbumCover(false)
R.id.cab_use_default -> changeAlbumCover(true)
@ -159,10 +171,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
tmb = File(it, tmb.getFilenameFromPath()).absolutePath
}
updateDirs(dirs)
Thread {
ensureBackgroundThread {
activity.galleryDB.DirectoryDao().updateDirectoryAfterRename(firstDir.tmb, firstDir.name, firstDir.path, sourcePath)
listener?.refreshItems()
}.start()
}
}
}
} else {
@ -340,6 +352,31 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
}
}
@SuppressLint("NewApi")
private fun createShortcut() {
val manager = activity.getSystemService(ShortcutManager::class.java)
if (manager.isRequestPinShortcutSupported) {
val dir = getFirstSelectedItem() ?: return
val path = dir.path
val drawable = resources.getDrawable(R.drawable.shortcut_image).mutate()
val coverThumbnail = config.parseAlbumCovers().firstOrNull { it.tmb == dir.path }?.tmb ?: dir.tmb
activity.getShortcutImage(coverThumbnail, drawable) {
val intent = Intent(activity, MediaActivity::class.java)
intent.action = Intent.ACTION_VIEW
intent.flags = intent.flags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY
intent.putExtra(DIRECTORY, path)
val shortcut = ShortcutInfo.Builder(activity, path)
.setShortLabel(dir.name)
.setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
.setIntent(intent)
.build()
manager.requestPinShortcut(shortcut, null)
}
}
}
private fun askConfirmDelete() {
when {
config.isDeletePasswordProtectionOn -> activity.handleDeletePasswordProtection {
@ -349,7 +386,11 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
else -> {
val itemsCnt = selectedKeys.size
val items = if (itemsCnt == 1) {
"\"${getSelectedPaths().first().getFilenameFromPath()}\""
var folder = getSelectedPaths().first().getFilenameFromPath()
if (folder == RECYCLE_BIN) {
folder = activity.getString(R.string.recycle_bin)
}
"\"$folder\""
} else {
resources.getQuantityString(R.plurals.delete_items, itemsCnt, itemsCnt)
}
@ -361,10 +402,9 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
R.string.move_to_recycle_bin_confirmation
}
var question = String.format(resources.getString(baseString), items)
val question = String.format(resources.getString(baseString), items)
val warning = resources.getQuantityString(R.plurals.delete_warning, itemsCnt, itemsCnt)
question += "\n\n$warning"
ConfirmationDialog(activity, question) {
ConfirmDeleteFolderDialog(activity, question, warning) {
deleteFolders()
}
}
@ -392,10 +432,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
if (it.isRecycleBin()) {
tryEmptyRecycleBin(false)
} else {
Thread {
ensureBackgroundThread {
activity.galleryDB.MediumDao().clearFavorites()
listener?.refreshItems()
}.start()
}
}
if (selectedKeys.size == 1) {

View file

@ -11,8 +11,9 @@ import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.dialogs.RenameItemsDialog
import com.simplemobiletools.commons.dialogs.RenameItemsPatternDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
@ -46,7 +47,6 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
private var loadImageInstantly = false
private var delayHandler = Handler(Looper.getMainLooper())
private var currentMediaHash = media.hashCode()
private val hasOTGConnected = activity.hasOTGConnected()
private var scrollHorizontally = config.scrollHorizontally
private var animateGifs = config.animateGifs
@ -109,8 +109,12 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
val isOneItemSelected = isOneItemSelected()
val selectedPaths = selectedItems.map { it.path } as ArrayList<String>
val isInRecycleBin = selectedItems.firstOrNull()?.getIsInRecycleBin() == true
menu.apply {
findItem(R.id.cab_rename).isVisible = selectedItems.firstOrNull()?.getIsInRecycleBin() == false
findItem(R.id.cab_rename).isVisible = !isInRecycleBin
findItem(R.id.cab_add_to_favorites).isVisible = !isInRecycleBin
findItem(R.id.cab_fix_date_taken).isVisible = !isInRecycleBin
findItem(R.id.cab_move_to).isVisible = !isInRecycleBin
findItem(R.id.cab_open_with).isVisible = isOneItemSelected
findItem(R.id.cab_confirm_selection).isVisible = isAGetIntent && allowMultiplePicks && selectedKeys.isNotEmpty()
findItem(R.id.cab_restore_recycle_bin_files).isVisible = selectedPaths.all { it.startsWith(activity.recycleBinPath) }
@ -178,8 +182,8 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
}
private fun checkFavoriteBtnVisibility(menu: Menu, selectedItems: ArrayList<Medium>) {
menu.findItem(R.id.cab_add_to_favorites).isVisible = selectedItems.any { !it.isFavorite }
menu.findItem(R.id.cab_remove_from_favorites).isVisible = selectedItems.any { it.isFavorite }
menu.findItem(R.id.cab_add_to_favorites).isVisible = selectedItems.none { it.getIsInRecycleBin() } && selectedItems.any { !it.isFavorite }
menu.findItem(R.id.cab_remove_from_favorites).isVisible = selectedItems.none { it.getIsInRecycleBin() } && selectedItems.any { it.isFavorite }
}
private fun confirmSelection() {
@ -200,7 +204,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
if (selectedKeys.size == 1) {
val oldPath = getFirstSelectedItemPath() ?: return
RenameItemDialog(activity, oldPath) {
Thread {
ensureBackgroundThread {
activity.updateDBMediaPath(oldPath, it)
activity.runOnUiThread {
@ -208,10 +212,10 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
listener?.refreshItems()
finishActMode()
}
}.start()
}
}
} else {
RenameItemsDialog(activity, getSelectedPaths()) {
RenameItemsPatternDialog(activity, getSelectedPaths()) {
enableInstantLoad()
listener?.refreshItems()
finishActMode()
@ -235,7 +239,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
}
private fun toggleFileVisibility(hide: Boolean) {
Thread {
ensureBackgroundThread {
getSelectedItems().forEach {
activity.toggleFileVisibility(it.path, hide)
}
@ -243,11 +247,11 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
listener?.refreshItems()
finishActMode()
}
}.start()
}
}
private fun toggleFavorites(add: Boolean) {
Thread {
ensureBackgroundThread {
val mediumDao = activity.galleryDB.MediumDao()
getSelectedItems().forEach {
it.isFavorite = add
@ -257,7 +261,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
listener?.refreshItems()
finishActMode()
}
}.start()
}
}
private fun restoreFiles() {
@ -277,7 +281,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
private fun rotateSelection(degrees: Int) {
activity.toast(R.string.saving)
Thread {
ensureBackgroundThread {
val paths = getSelectedPaths().filter { it.isImageFast() }
var fileCnt = paths.size
rotatedImagePaths.clear()
@ -293,7 +297,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
}
}
}
}.start()
}
}
private fun moveFilesTo() {
@ -330,12 +334,12 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
}
private fun fixDateTaken() {
Thread {
activity.fixDateTaken(getSelectedPaths()) {
ensureBackgroundThread {
activity.fixDateTaken(getSelectedPaths(), true) {
listener?.refreshItems()
finishActMode()
}
}.start()
}
}
private fun checkDeleteConfirmation() {

View file

@ -12,16 +12,20 @@ import com.simplemobiletools.gallery.pro.fragments.PhotoFragment
import com.simplemobiletools.gallery.pro.fragments.VideoFragment
import com.simplemobiletools.gallery.pro.fragments.ViewPagerFragment
import com.simplemobiletools.gallery.pro.helpers.MEDIUM
import com.simplemobiletools.gallery.pro.helpers.SHOULD_INIT_FRAGMENT
import com.simplemobiletools.gallery.pro.models.Medium
class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val media: MutableList<Medium>) : FragmentStatePagerAdapter(fm) {
private val fragments = HashMap<Int, ViewPagerFragment>()
var shouldInitFragment = true
override fun getCount() = media.size
override fun getItem(position: Int): Fragment {
val medium = media[position]
val bundle = Bundle()
bundle.putSerializable(MEDIUM, medium)
bundle.putBoolean(SHOULD_INIT_FRAGMENT, shouldInitFragment)
val fragment = if (medium.isVideo()) {
VideoFragment()
} else {

View file

@ -18,7 +18,7 @@ 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 != 0
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 favoritePaths = context.getFavoritePaths()
val getVideoDurations = context.config.showThumbnailVideoDuration

View file

@ -41,8 +41,10 @@ class ChangeGroupingDialog(val activity: BaseSimpleActivity, val path: String =
val groupBtn = when {
currGrouping and GROUP_BY_NONE != 0 -> groupingRadio.grouping_dialog_radio_none
currGrouping and GROUP_BY_LAST_MODIFIED != 0 -> groupingRadio.grouping_dialog_radio_last_modified
currGrouping and GROUP_BY_DATE_TAKEN != 0 -> groupingRadio.grouping_dialog_radio_date_taken
currGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 -> groupingRadio.grouping_dialog_radio_last_modified_daily
currGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 -> groupingRadio.grouping_dialog_radio_last_modified_monthly
currGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 -> groupingRadio.grouping_dialog_radio_date_taken_daily
currGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -> groupingRadio.grouping_dialog_radio_date_taken_monthly
currGrouping and GROUP_BY_FILE_TYPE != 0 -> groupingRadio.grouping_dialog_radio_file_type
currGrouping and GROUP_BY_EXTENSION != 0 -> groupingRadio.grouping_dialog_radio_extension
else -> groupingRadio.grouping_dialog_radio_folder
@ -64,8 +66,10 @@ class ChangeGroupingDialog(val activity: BaseSimpleActivity, val path: String =
val groupingRadio = view.grouping_dialog_radio_grouping
var grouping = when (groupingRadio.checkedRadioButtonId) {
R.id.grouping_dialog_radio_none -> GROUP_BY_NONE
R.id.grouping_dialog_radio_last_modified -> GROUP_BY_LAST_MODIFIED
R.id.grouping_dialog_radio_date_taken -> GROUP_BY_DATE_TAKEN
R.id.grouping_dialog_radio_last_modified_daily -> GROUP_BY_LAST_MODIFIED_DAILY
R.id.grouping_dialog_radio_last_modified_monthly -> GROUP_BY_LAST_MODIFIED_MONTHLY
R.id.grouping_dialog_radio_date_taken_daily -> GROUP_BY_DATE_TAKEN_DAILY
R.id.grouping_dialog_radio_date_taken_monthly -> GROUP_BY_DATE_TAKEN_MONTHLY
R.id.grouping_dialog_radio_file_type -> GROUP_BY_FILE_TYPE
R.id.grouping_dialog_radio_extension -> GROUP_BY_EXTENSION
else -> GROUP_BY_FOLDER

View file

@ -5,6 +5,7 @@ import android.view.View
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.isVisible
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.pro.R
@ -12,7 +13,7 @@ import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorting: Boolean, showFolderCheckbox: Boolean,
class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorting: Boolean, val showFolderCheckbox: Boolean,
val path: String = "", val callback: () -> Unit) :
DialogInterface.OnClickListener {
private var currSorting = 0
@ -21,11 +22,16 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti
private var view: View
init {
currSorting = if (isDirectorySorting) config.directorySorting else config.getFileSorting(pathToUse)
view = activity.layoutInflater.inflate(R.layout.dialog_change_sorting, null).apply {
use_for_this_folder_divider.beVisibleIf(showFolderCheckbox)
use_for_this_folder_divider.beVisibleIf(showFolderCheckbox || (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
sorting_dialog_numeric_sorting.beVisibleIf(showFolderCheckbox && (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
sorting_dialog_numeric_sorting.isChecked = currSorting and SORT_USE_NUMERIC_VALUE != 0
sorting_dialog_use_for_this_folder.beVisibleIf(showFolderCheckbox)
sorting_dialog_bottom_note.beVisibleIf(!isDirectorySorting)
sorting_dialog_use_for_this_folder.isChecked = config.hasCustomSorting(pathToUse)
sorting_dialog_bottom_note.beVisibleIf(!isDirectorySorting)
}
AlertDialog.Builder(activity)
@ -35,13 +41,17 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti
activity.setupDialogStuff(view, this, R.string.sort_by)
}
currSorting = if (isDirectorySorting) config.directorySorting else config.getFileSorting(pathToUse)
setupSortRadio()
setupOrderRadio()
}
private fun setupSortRadio() {
val sortingRadio = view.sorting_dialog_radio_sorting
sortingRadio.setOnCheckedChangeListener { group, checkedId ->
val isSortingByNameOrPath = checkedId == sortingRadio.sorting_dialog_radio_name.id || checkedId == sortingRadio.sorting_dialog_radio_path.id
view.sorting_dialog_numeric_sorting.beVisibleIf(isSortingByNameOrPath)
view.use_for_this_folder_divider.beVisibleIf(view.sorting_dialog_numeric_sorting.isVisible() || view.sorting_dialog_use_for_this_folder.isVisible())
}
val sortBtn = when {
currSorting and SORT_BY_PATH != 0 -> sortingRadio.sorting_dialog_radio_path
@ -79,6 +89,10 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti
sorting = sorting or SORT_DESCENDING
}
if (view.sorting_dialog_numeric_sorting.isChecked) {
sorting = sorting or SORT_USE_NUMERIC_VALUE
}
if (isDirectorySorting) {
config.directorySorting = sorting
} else {

View file

@ -0,0 +1,31 @@
package com.simplemobiletools.gallery.pro.dialogs
import android.app.Activity
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.dialog_confirm_delete_folder.view.*
class ConfirmDeleteFolderDialog(activity: Activity, message: String, warningMessage: String, val callback: () -> Unit) {
var dialog: AlertDialog
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_confirm_delete_folder, null)
view.message.text = message
view.message_warning.text = warningMessage
val builder = AlertDialog.Builder(activity)
.setPositiveButton(R.string.yes) { dialog, which -> dialogConfirmed() }
builder.setNegativeButton(R.string.no, null)
dialog = builder.create().apply {
activity.setupDialogStuff(view, this)
}
}
private fun dialogConfirmed() {
dialog.dismiss()
callback()
}
}

View file

@ -3,10 +3,16 @@ package com.simplemobiletools.gallery.pro.dialogs
import android.view.View
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.hideKeyboard
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.value
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_FADE
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_NONE
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_SLIDE
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_DEFAULT_INTERVAL
import kotlinx.android.synthetic.main.dialog_slideshow.view.*
@ -28,6 +34,18 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit
activity.hideKeyboard(v)
}
animation_holder.setOnClickListener {
val items = arrayListOf(
RadioItem(SLIDESHOW_ANIMATION_NONE, activity.getString(R.string.no_animation)),
RadioItem(SLIDESHOW_ANIMATION_SLIDE, activity.getString(R.string.slide)),
RadioItem(SLIDESHOW_ANIMATION_FADE, activity.getString(R.string.fade)))
RadioGroupDialog(activity, items, activity.config.slideshowAnimation) {
activity.config.slideshowAnimation = it as Int
animation_value.text = getAnimationText()
}
}
include_videos_holder.setOnClickListener {
interval_value.clearFocus()
include_videos.toggle()
@ -43,11 +61,6 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit
random_order.toggle()
}
use_fade_holder.setOnClickListener {
interval_value.clearFocus()
use_fade.toggle()
}
move_backwards_holder.setOnClickListener {
interval_value.clearFocus()
move_backwards.toggle()
@ -79,10 +92,10 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit
val config = activity.config
view.apply {
interval_value.setText(config.slideshowInterval.toString())
animation_value.text = getAnimationText()
include_videos.isChecked = config.slideshowIncludeVideos
include_gifs.isChecked = config.slideshowIncludeGIFs
random_order.isChecked = config.slideshowRandomOrder
use_fade.isChecked = config.slideshowUseFade
move_backwards.isChecked = config.slideshowMoveBackwards
loop_slideshow.isChecked = config.loopSlideshow
}
@ -94,13 +107,29 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit
interval = SLIDESHOW_DEFAULT_INTERVAL.toString()
activity.config.apply {
slideshowAnimation = getAnimationValue(view.animation_value.value)
slideshowInterval = interval.toInt()
slideshowIncludeVideos = view.include_videos.isChecked
slideshowIncludeGIFs = view.include_gifs.isChecked
slideshowRandomOrder = view.random_order.isChecked
slideshowUseFade = view.use_fade.isChecked
slideshowMoveBackwards = view.move_backwards.isChecked
loopSlideshow = view.loop_slideshow.isChecked
}
}
private fun getAnimationText(): String {
return when (activity.config.slideshowAnimation) {
SLIDESHOW_ANIMATION_SLIDE -> activity.getString(R.string.slide)
SLIDESHOW_ANIMATION_FADE -> activity.getString(R.string.fade)
else -> activity.getString(R.string.no_animation)
}
}
private fun getAnimationValue(text: String): Int {
return when (text) {
activity.getString(R.string.slide) -> SLIDESHOW_ANIMATION_SLIDE
activity.getString(R.string.fade) -> SLIDESHOW_ANIMATION_FADE
else -> SLIDESHOW_ANIMATION_NONE
}
}
}

View file

@ -7,6 +7,8 @@ import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable
import android.media.ExifInterface
import android.os.Build
import android.provider.MediaStore
@ -14,6 +16,9 @@ import android.util.DisplayMetrics
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.*
@ -163,8 +168,7 @@ fun BaseSimpleActivity.removeNoMedia(path: String, callback: (() -> Unit)? = nul
return
}
tryDeleteFileDirItem(file.toFileDirItem(applicationContext), false, false) {
scanPathRecursively(file.parent)
tryDeleteFileDirItem(file.toFileDirItem(), false, false) {
callback?.invoke()
}
}
@ -186,9 +190,9 @@ fun BaseSimpleActivity.toggleFileVisibility(oldPath: String, hide: Boolean, call
val newPath = "$path/$filename"
renameFile(oldPath, newPath) {
callback?.invoke(newPath)
Thread {
ensureBackgroundThread {
updateDBMediaPath(oldPath, newPath)
}.start()
}
}
}
@ -208,12 +212,12 @@ fun BaseSimpleActivity.tryDeleteFileDirItem(fileDirItem: FileDirItem, allowDelet
callback: ((wasSuccess: Boolean) -> Unit)? = null) {
deleteFile(fileDirItem, allowDeleteFolder) {
if (deleteFromDatabase) {
Thread {
ensureBackgroundThread {
deleteDBPath(galleryDB.MediumDao(), fileDirItem.path)
runOnUiThread {
callback?.invoke(it)
}
}.start()
}
} else {
callback?.invoke(it)
}
@ -221,15 +225,20 @@ fun BaseSimpleActivity.tryDeleteFileDirItem(fileDirItem: FileDirItem, allowDelet
}
fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList<String>, mediumDao: MediumDao = galleryDB.MediumDao(), callback: ((wasSuccess: Boolean) -> Unit)?) {
Thread {
ensureBackgroundThread {
var pathsCnt = paths.size
paths.forEach {
val file = File(it)
val internalFile = File(recycleBinPath, it)
val lastModified = file.lastModified()
try {
if (file.copyRecursively(internalFile, true)) {
mediumDao.updateDeleted("$RECYCLE_BIN$it", System.currentTimeMillis(), it)
pathsCnt--
if (config.keepLastModified) {
internalFile.setLastModified(lastModified)
}
}
} catch (e: Exception) {
showErrorToast(e)
@ -237,7 +246,7 @@ fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList<String>, mediumDao
}
}
callback?.invoke(pathsCnt == 0)
}.start()
}
}
fun BaseSimpleActivity.restoreRecycleBinPath(path: String, callback: () -> Unit) {
@ -245,22 +254,27 @@ fun BaseSimpleActivity.restoreRecycleBinPath(path: String, callback: () -> Unit)
}
fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList<String>, mediumDao: MediumDao = galleryDB.MediumDao(), callback: () -> Unit) {
Thread {
ensureBackgroundThread {
val newPaths = ArrayList<String>()
paths.forEach {
val source = it
val destination = it.removePrefix(recycleBinPath)
val lastModified = File(source).lastModified()
var inputStream: InputStream? = null
var out: OutputStream? = null
try {
out = getFileOutputStreamSync(destination, source.getMimeType())
inputStream = getFileInputStreamSync(source)!!
inputStream = getFileInputStreamSync(source)
inputStream.copyTo(out!!)
if (File(source).length() == File(destination).length()) {
mediumDao.updateDeleted(destination.removePrefix(recycleBinPath), 0, "$RECYCLE_BIN$destination")
}
newPaths.add(destination)
if (config.keepLastModified) {
File(destination).setLastModified(lastModified)
}
} catch (e: Exception) {
showErrorToast(e)
} finally {
@ -273,27 +287,31 @@ fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList<String>, mediumDa
callback()
}
fixDateTaken(newPaths)
}.start()
fixDateTaken(newPaths, false)
}
}
fun BaseSimpleActivity.emptyTheRecycleBin(callback: (() -> Unit)? = null) {
Thread {
recycleBin.deleteRecursively()
galleryDB.MediumDao().clearRecycleBin()
galleryDB.DirectoryDao().deleteRecycleBin()
toast(R.string.recycle_bin_emptied)
callback?.invoke()
}.start()
ensureBackgroundThread {
try {
recycleBin.deleteRecursively()
galleryDB.MediumDao().clearRecycleBin()
galleryDB.DirectoryDao().deleteRecycleBin()
toast(R.string.recycle_bin_emptied)
callback?.invoke()
} catch (e: Exception) {
toast(R.string.unknown_error_occurred)
}
}
}
fun BaseSimpleActivity.emptyAndDisableTheRecycleBin(callback: () -> Unit) {
Thread {
ensureBackgroundThread {
emptyTheRecycleBin {
config.useRecycleBin = false
callback()
}
}.start()
}
}
fun BaseSimpleActivity.showRecycleBinEmptyingDialog(callback: () -> Unit) {
@ -303,12 +321,12 @@ fun BaseSimpleActivity.showRecycleBinEmptyingDialog(callback: () -> Unit) {
}
fun BaseSimpleActivity.updateFavoritePaths(fileDirItems: ArrayList<FileDirItem>, destination: String) {
Thread {
ensureBackgroundThread {
fileDirItems.forEach {
val newPath = "$destination/${it.name}"
updateDBMediaPath(it.path, newPath)
}
}.start()
}
}
fun Activity.hasNavBar(): Boolean {
@ -323,9 +341,12 @@ fun Activity.hasNavBar(): Boolean {
return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels > 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels > 0)
}
fun Activity.fixDateTaken(paths: ArrayList<String>, callback: (() -> Unit)? = null) {
fun Activity.fixDateTaken(paths: ArrayList<String>, showToasts: Boolean, callback: (() -> Unit)? = null) {
val BATCH_SIZE = 50
toast(R.string.fixing)
if (showToasts) {
toast(R.string.fixing)
}
try {
var didUpdateFile = false
val operations = ArrayList<ContentProviderOperation>()
@ -366,13 +387,18 @@ fun Activity.fixDateTaken(paths: ArrayList<String>, callback: (() -> Unit)? = nu
didUpdateFile = false
}
toast(if (didUpdateFile) R.string.dates_fixed_successfully else R.string.unknown_error_occurred)
runOnUiThread {
if (showToasts) {
toast(if (didUpdateFile) R.string.dates_fixed_successfully else R.string.unknown_error_occurred)
}
callback?.invoke()
}
}
} catch (e: Exception) {
showErrorToast(e)
if (showToasts) {
showErrorToast(e)
}
}
}
@ -409,12 +435,8 @@ fun BaseSimpleActivity.saveRotatedImageToFile(oldPath: String, newPath: String,
saveFile(tmpPath, bitmap, it as FileOutputStream, newDegrees)
}
if (File(newPath).exists()) {
tryDeleteFileDirItem(FileDirItem(newPath, newPath.getFilenameFromPath()), false, true)
}
copyFile(tmpPath, newPath)
scanPathRecursively(newPath)
rescanPaths(arrayListOf(newPath))
fileRotatedSuccessfully(newPath, oldLastModified)
it.flush()
@ -478,7 +500,7 @@ fun BaseSimpleActivity.copyFile(source: String, destination: String) {
try {
out = getFileOutputStreamSync(destination, source.getMimeType())
inputStream = getFileInputStreamSync(source)
inputStream?.copyTo(out!!)
inputStream.copyTo(out!!)
} finally {
inputStream?.close()
out?.close()
@ -491,3 +513,30 @@ fun saveFile(path: String, bitmap: Bitmap, out: FileOutputStream, degrees: Int)
val bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
bmp.compress(path.getCompressionFormat(), 90, out)
}
fun Activity.getShortcutImage(tmb: String, drawable: Drawable, callback: () -> Unit) {
ensureBackgroundThread {
val options = RequestOptions()
.format(DecodeFormat.PREFER_ARGB_8888)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.fitCenter()
val size = resources.getDimension(R.dimen.shortcut_size).toInt()
val builder = Glide.with(this)
.asDrawable()
.load(tmb)
.apply(options)
.centerCrop()
.into(size, size)
try {
(drawable as LayerDrawable).setDrawableByLayerId(R.id.shortcut_image, builder.get())
} catch (e: Exception) {
}
runOnUiThread {
callback()
}
}
}

View file

@ -13,6 +13,7 @@ import android.provider.MediaStore
import android.view.WindowManager
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.Priority
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
@ -27,6 +28,7 @@ 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
@ -165,7 +167,20 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
o1 as Directory
o2 as Directory
var result = when {
sorting and SORT_BY_NAME != 0 -> AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase())
sorting and SORT_BY_NAME != 0 -> {
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase())
} else {
o1.name.toLowerCase().compareTo(o2.name.toLowerCase())
}
}
sorting and SORT_BY_PATH != 0 -> {
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
} else {
o1.path.toLowerCase().compareTo(o2.path.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)
@ -200,7 +215,7 @@ fun Context.getDirsToShow(dirs: ArrayList<Directory>, allDirs: ArrayList<Directo
}
}
parentDirs
getSortedDirectories(parentDirs)
} else {
dirs.forEach { it.subfoldersMediaCount = it.mediaCnt }
dirs
@ -209,31 +224,74 @@ fun Context.getDirsToShow(dirs: ArrayList<Directory>, allDirs: ArrayList<Directo
fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPrefix: String): ArrayList<Directory> {
val folders = dirs.map { it.path }.sorted().toMutableSet() as HashSet<String>
val internalPath = internalStoragePath
val sdPath = sdCardPath
val currentPaths = LinkedHashSet<String>()
val foldersWithoutMediaFiles = ArrayList<String>()
var newDirId = 1000L
folders.forEach {
val path = it
if (path != RECYCLE_BIN && path != FAVORITES && !path.equals(internalPath, true) && !path.equals(sdPath, true)) {
if (currentPathPrefix.isNotEmpty()) {
if (path == currentPathPrefix || File(path).parent.equals(currentPathPrefix, true)) {
currentPaths.add(path)
}
} else if (folders.any { !it.equals(path, true) && (File(path).parent.equals(it, true) || File(it).parent.equals(File(path).parent, true)) }) {
// if we have folders like
// /storage/emulated/0/Pictures/Images and
// /storage/emulated/0/Pictures/Screenshots,
// but /storage/emulated/0/Pictures is empty, show Images and Screenshots as separate folders, do not group them at /Pictures
val parent = File(path).parent
if (folders.contains(parent)) {
currentPaths.add(parent)
} else {
currentPaths.add(path)
}
} else {
currentPaths.add(path)
for (path in folders) {
if (path == RECYCLE_BIN || path == FAVORITES) {
continue
}
if (currentPathPrefix.isNotEmpty()) {
if (!path.startsWith(currentPathPrefix, true)) {
continue
}
if (!File(path).parent.equals(currentPathPrefix, true)) {
continue
}
}
if (currentPathPrefix.isNotEmpty() && path == currentPathPrefix || File(path).parent.equals(currentPathPrefix, true)) {
currentPaths.add(path)
} else if (folders.any { !it.equals(path, true) && (File(path).parent.equals(it, true) || File(it).parent.equals(File(path).parent, true)) }) {
// if we have folders like
// /storage/emulated/0/Pictures/Images and
// /storage/emulated/0/Pictures/Screenshots,
// but /storage/emulated/0/Pictures is empty, still Pictures with the first folders thumbnails and proper other info
val parent = File(path).parent
if (!folders.contains(parent) && dirs.none { it.path == parent }) {
currentPaths.add(parent)
val isSortingAscending = config.sorting and SORT_DESCENDING == 0
val subDirs = dirs.filter { File(it.path).parent.equals(File(path).parent, true) } as ArrayList<Directory>
if (subDirs.isNotEmpty()) {
val lastModified = if (isSortingAscending) {
subDirs.minBy { it.modified }?.modified
} else {
subDirs.maxBy { it.modified }?.modified
} ?: 0
val dateTaken = if (isSortingAscending) {
subDirs.minBy { it.taken }?.taken
} else {
subDirs.maxBy { it.taken }?.taken
} ?: 0
var mediaTypes = 0
subDirs.forEach {
mediaTypes = mediaTypes or it.types
}
val directory = Directory(newDirId++,
parent,
subDirs.first().tmb,
getFolderNameFromPath(parent),
subDirs.sumBy { it.mediaCnt },
lastModified,
dateTaken,
subDirs.sumByLong { it.size },
getPathLocation(parent),
mediaTypes)
directory.containsMediaFilesDirectly = false
dirs.add(directory)
currentPaths.add(parent)
foldersWithoutMediaFiles.add(parent)
}
}
} else {
currentPaths.add(path)
}
}
@ -241,7 +299,7 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
currentPaths.forEach {
val path = it
currentPaths.forEach {
if (!it.equals(path) && File(it).parent?.equals(path) == true) {
if (!foldersWithoutMediaFiles.contains(it) && !it.equals(path, true) && File(it).parent?.equals(path, true) == true) {
areDirectSubfoldersAvailable = true
}
}
@ -287,7 +345,10 @@ fun Context.updateSubfolderCounts(children: ArrayList<Directory>, parentDirs: Ar
// make sure we count only the proper direct subfolders, grouped the same way as on the main screen
parentDirs.firstOrNull { it.path == longestSharedPath }?.apply {
if (path.equals(child.path, true) || path.equals(File(child.path).parent, true) || children.any { it.path.equals(File(child.path).parent, true) }) {
subfoldersCount++
if (child.containsMediaFilesDirectly) {
subfoldersCount++
}
if (path != child.path) {
subfoldersMediaCount += child.mediaCnt
}
@ -297,7 +358,7 @@ fun Context.updateSubfolderCounts(children: ArrayList<Directory>, parentDirs: Ar
}
fun Context.getNoMediaFolders(callback: (folders: ArrayList<String>) -> Unit) {
Thread {
ensureBackgroundThread {
val folders = ArrayList<String>()
val uri = MediaStore.Files.getContentUri("external")
@ -323,20 +384,20 @@ fun Context.getNoMediaFolders(callback: (folders: ArrayList<String>) -> Unit) {
}
callback(folders)
}.start()
}
}
fun Context.rescanFolderMedia(path: String) {
Thread {
ensureBackgroundThread {
rescanFolderMediaSync(path)
}.start()
}
}
fun Context.rescanFolderMediaSync(path: String) {
getCachedMedia(path) {
val cached = it
GetMediaAsynctask(applicationContext, path, false, false, false) {
Thread {
ensureBackgroundThread {
val newMedia = it
val mediumDao = galleryDB.MediumDao()
val media = newMedia.filter { it is Medium } as ArrayList<Medium>
@ -350,15 +411,15 @@ fun Context.rescanFolderMediaSync(path: String) {
}
}
}
}.start()
}
}.execute()
}
}
fun Context.storeDirectoryItems(items: ArrayList<Directory>, directoryDao: DirectoryDao) {
Thread {
ensureBackgroundThread {
directoryDao.insertAll(items)
}.start()
}
}
fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: MutableSet<String>): String {
@ -412,14 +473,16 @@ fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizo
}
fun Context.addTempFolderIfNeeded(dirs: ArrayList<Directory>): ArrayList<Directory> {
val directories = ArrayList<Directory>()
val tempFolderPath = config.tempFolderPath
if (tempFolderPath.isNotEmpty()) {
return if (tempFolderPath.isNotEmpty()) {
val directories = ArrayList<Directory>()
val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0)
directories.add(newFolder)
directories.addAll(dirs)
directories
} else {
dirs
}
directories.addAll(dirs)
return directories
}
fun Context.getPathLocation(path: String): Int {
@ -435,6 +498,7 @@ fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boo
.signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.priority(Priority.LOW)
.format(DecodeFormat.PREFER_ARGB_8888)
val builder = Glide.with(applicationContext)
@ -449,6 +513,7 @@ fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boo
val options = RequestOptions()
.signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
.priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
val builder = Glide.with(applicationContext)
@ -474,7 +539,7 @@ fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boo
}
fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, directoryDao: DirectoryDao = galleryDB.DirectoryDao(), forceShowHidden: Boolean = false, callback: (ArrayList<Directory>) -> Unit) {
Thread {
ensureBackgroundThread {
val directories = try {
directoryDao.getAll() as ArrayList<Directory>
} catch (e: Exception) {
@ -516,12 +581,12 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
callback(clone.distinctBy { it.path.getDistinctPath() } as ArrayList<Directory>)
removeInvalidDBDirectories(filteredDirectories, directoryDao)
}.start()
}
}
fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, mediumDao: MediumDao = galleryDB.MediumDao(),
callback: (ArrayList<ThumbnailItem>) -> Unit) {
Thread {
ensureBackgroundThread {
val mediaFetcher = MediaFetcher(this)
val foldersToScan = if (path.isEmpty()) mediaFetcher.getFoldersToScan() else arrayListOf(path)
var media = ArrayList<Medium>()
@ -579,7 +644,7 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
}
} catch (ignored: Exception) {
}
}.start()
}
}
fun Context.removeInvalidDBDirectories(dirs: ArrayList<Directory>? = null, directoryDao: DirectoryDao = galleryDB.DirectoryDao()) {
@ -599,7 +664,10 @@ fun Context.updateDBMediaPath(oldPath: String, newPath: String) {
}
fun Context.updateDBDirectory(directory: Directory, directoryDao: DirectoryDao) {
directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types)
try {
directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types)
} catch (ignored: Exception) {
}
}
fun Context.getFavoritePaths(): ArrayList<String> {
@ -673,7 +741,7 @@ fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: L
val sb = StringBuilder()
val buffer = ByteArray(1024)
while (true) {
while (sb.length < size) {
val n = fis.read(buffer)
if (n != -1) {
sb.append(String(buffer, 0, n))
@ -700,9 +768,9 @@ fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: L
}
fun Context.addPathToDB(path: String) {
Thread {
ensureBackgroundThread {
if (!File(path).exists()) {
return@Thread
return@ensureBackgroundThread
}
val type = when {
@ -713,12 +781,51 @@ fun Context.addPathToDB(path: String) {
else -> TYPE_IMAGES
}
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, false, 0L)
try {
galleryDB.MediumDao().insert(medium)
val mediumDao = galleryDB.MediumDao()
val isFavorite = mediumDao.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)
} catch (ignored: Exception) {
}
}.start()
}
}
fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList<Medium>, albumCovers: ArrayList<AlbumCover>, hiddenString: String,
includedFolders: MutableSet<String>, isSortingAscending: Boolean, getProperFileSize: Boolean): Directory {
var thumbnail = curMedia.firstOrNull { File(it.path).exists() }?.path ?: ""
albumCovers.forEach {
if (it.path == path && File(it.tmb).exists()) {
thumbnail = it.tmb
}
}
val defaultMedium = Medium(0, "", "", "", 0L, 0L, 0L, 0, 0, false, 0L)
val firstItem = curMedia.firstOrNull() ?: defaultMedium
val lastItem = curMedia.lastOrNull() ?: defaultMedium
val dirName = checkAppendingHidden(path, hiddenString, includedFolders)
val lastModified = if (isSortingAscending) Math.min(firstItem.modified, lastItem.modified) else Math.max(firstItem.modified, lastItem.modified)
val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)
val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L
val mediaTypes = curMedia.getDirMediaTypes()
return Directory(null, path, thumbnail, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes)
}
fun Context.updateDirectoryPath(path: String) {
val mediaFetcher = MediaFetcher(applicationContext)
val getImagesOnly = false
val getVideosOnly = false
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 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())
}

View file

@ -1,18 +1,10 @@
package com.simplemobiletools.gallery.pro.extensions
import android.media.MediaMetadataRetriever
import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.gallery.pro.helpers.NOMEDIA
import java.io.File
import java.io.IOException
fun String.getFileSignature() = ObjectKey(getFileKey())
fun String.getFileKey(): String {
val file = File(this)
return "${file.absolutePath}${file.lastModified()}"
}
fun String.isThisOrParentIncluded(includedPaths: MutableSet<String>) = includedPaths.any { startsWith(it, true) }
fun String.isThisOrParentExcluded(excludedPaths: MutableSet<String>) = excludedPaths.any { startsWith(it, true) }

View file

@ -21,6 +21,7 @@ import android.view.ViewGroup
import com.alexvasilkov.gestures.GestureController
import com.alexvasilkov.gestures.State
import com.bumptech.glide.Glide
import com.bumptech.glide.Priority
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
@ -35,14 +36,12 @@ import com.davemorrissey.labs.subscaleview.ImageRegionDecoder
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.PanoramaPhotoActivity
import com.simplemobiletools.gallery.pro.activities.PhotoActivity
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.MEDIUM
import com.simplemobiletools.gallery.pro.helpers.PATH
import com.simplemobiletools.gallery.pro.helpers.PicassoDecoder
import com.simplemobiletools.gallery.pro.helpers.PicassoRegionDecoder
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.svg.SvgSoftwareLayerSetter
import com.squareup.picasso.Callback
@ -89,7 +88,14 @@ class PhotoFragment : ViewPagerFragment() {
private lateinit var mMedium: Medium
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
mView = (inflater.inflate(R.layout.pager_photo_item, container, false) as ViewGroup).apply {
mView = (inflater.inflate(R.layout.pager_photo_item, container, false) as ViewGroup)
if (!arguments!!.getBoolean(SHOULD_INIT_FRAGMENT, true)) {
return mView
}
mMedium = arguments!!.getSerializable(MEDIUM) as Medium
mView.apply {
subsampling_view.setOnClickListener { photoClicked() }
gestures_view.setOnClickListener { photoClicked() }
gif_view.setOnClickListener { photoClicked() }
@ -146,7 +152,6 @@ class PhotoFragment : ViewPagerFragment() {
mIsFragmentVisible = true
}
mMedium = arguments!!.getSerializable(MEDIUM) as Medium
if (mMedium.path.startsWith("content://") && !mMedium.path.startsWith("content://mms/")) {
val originalPath = mMedium.path
mMedium.path = context!!.getRealPathFromURI(Uri.parse(originalPath)) ?: mMedium.path
@ -226,20 +231,31 @@ class PhotoFragment : ViewPagerFragment() {
super.onDestroyView()
if (activity?.isDestroyed == false) {
mView.subsampling_view.recycle()
try {
if (context != null) {
Glide.with(context!!).clear(mView.gestures_view)
}
} catch (ignored: Exception) {
}
}
mLoadZoomableViewHandler.removeCallbacksAndMessages(null)
if (mCurrentRotationDegrees != 0) {
Thread {
ensureBackgroundThread {
val path = mMedium.path
(activity as? BaseSimpleActivity)?.saveRotatedImageToFile(path, path, mCurrentRotationDegrees, false) {}
}.start()
}
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (!mWasInit) {
return
}
// avoid GIFs being skewed, played in wrong aspect ratio
if (mMedium.isGIF()) {
mView.onGlobalLayout {
@ -359,9 +375,11 @@ class PhotoFragment : ViewPagerFragment() {
}
private fun loadBitmap(addZoomableView: Boolean = true) {
val priority = if (mIsFragmentVisible) Priority.IMMEDIATE else Priority.NORMAL
val options = RequestOptions()
.signature(mMedium.path.getFileSignature())
.format(DecodeFormat.PREFER_ARGB_8888)
.priority(priority)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.fitCenter()
@ -540,7 +558,7 @@ class PhotoFragment : ViewPagerFragment() {
tag?.getValueAsInt(defaultOrientation) ?: defaultOrientation
} else {
val exif = android.media.ExifInterface(path)
exif.getAttributeInt(android.media.ExifInterface.TAG_ORIENTATION, defaultOrientation)
exif.getAttributeInt(TAG_ORIENTATION, defaultOrientation)
}
if (orient == defaultOrientation || context!!.isPathOnOTG(mMedium.path)) {
@ -641,6 +659,7 @@ class PhotoFragment : ViewPagerFragment() {
if (mIsPanorama) {
panorama_outline.animate().alpha(if (isFullscreen) 0f else 1f).start()
panorama_outline.isClickable = !isFullscreen
}
}
}

View file

@ -24,14 +24,12 @@ import com.google.android.exoplayer2.upstream.DataSource
import com.google.android.exoplayer2.upstream.DataSpec
import com.google.android.exoplayer2.upstream.FileDataSource
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.PanoramaVideoActivity
import com.simplemobiletools.gallery.pro.activities.VideoActivity
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.Config
import com.simplemobiletools.gallery.pro.helpers.MEDIUM
import com.simplemobiletools.gallery.pro.helpers.MIN_SKIP_LENGTH
import com.simplemobiletools.gallery.pro.helpers.PATH
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.views.MediaSideScroll
import kotlinx.android.synthetic.main.bottom_video_time_holder.view.*
@ -77,6 +75,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
private lateinit var mSeekBar: SeekBar
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
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() }
@ -125,8 +124,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
}
}
if (!arguments!!.getBoolean(SHOULD_INIT_FRAGMENT, true)) {
return mView
}
storeStateVariables()
mMedium = arguments!!.getSerializable(MEDIUM) as Medium
Glide.with(context!!).load(mMedium.path).into(mView.video_preview)
// setMenuVisibility is not called at VideoActivity (third party intent)
@ -138,9 +140,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
initTimeHolder()
checkIfPanorama()
activity?.getVideoResolution(mMedium.path)?.apply {
mVideoSize.x = x
mVideoSize.y = y
ensureBackgroundThread {
activity?.getVideoResolution(mMedium.path)?.apply {
mVideoSize.x = x
mVideoSize.y = y
}
}
if (mIsPanorama) {
@ -654,10 +658,10 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
private fun releaseExoPlayer() {
mExoPlayer?.stop()
Thread {
ensureBackgroundThread {
mExoPlayer?.release()
mExoPlayer = null
}.start()
}
}
override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) {}
@ -667,9 +671,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
override fun onSurfaceTextureDestroyed(surface: SurfaceTexture?) = false
override fun onSurfaceTextureAvailable(surface: SurfaceTexture?, width: Int, height: Int) {
Thread {
ensureBackgroundThread {
mExoPlayer?.setVideoSurface(Surface(mTextureView.surfaceTexture))
}.start()
}
}
private fun setVideoSize() {

View file

@ -203,7 +203,7 @@ class Config(context: Context) : BaseConfig(context) {
set(blackBackground) = prefs.edit().putBoolean(BLACK_BACKGROUND, blackBackground).apply()
var filterMedia: Int
get() = prefs.getInt(FILTER_MEDIA, TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS or TYPE_SVGS)
get() = prefs.getInt(FILTER_MEDIA, TYPE_DEFAULT_FILTER)
set(filterMedia) = prefs.edit().putInt(FILTER_MEDIA, filterMedia).apply()
var dirColumnCnt: Int
@ -303,14 +303,14 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(SLIDESHOW_RANDOM_ORDER, false)
set(slideshowRandomOrder) = prefs.edit().putBoolean(SLIDESHOW_RANDOM_ORDER, slideshowRandomOrder).apply()
var slideshowUseFade: Boolean
get() = prefs.getBoolean(SLIDESHOW_USE_FADE, false)
set(slideshowUseFade) = prefs.edit().putBoolean(SLIDESHOW_USE_FADE, slideshowUseFade).apply()
var slideshowMoveBackwards: Boolean
get() = prefs.getBoolean(SLIDESHOW_MOVE_BACKWARDS, false)
set(slideshowMoveBackwards) = prefs.edit().putBoolean(SLIDESHOW_MOVE_BACKWARDS, slideshowMoveBackwards).apply()
var slideshowAnimation: Int
get() = prefs.getInt(SLIDESHOW_ANIMATION, SLIDESHOW_ANIMATION_SLIDE)
set(slideshowAnimation) = prefs.edit().putInt(SLIDESHOW_ANIMATION, slideshowAnimation).apply()
var loopSlideshow: Boolean
get() = prefs.getBoolean(SLIDESHOW_LOOP, false)
set(loopSlideshow) = prefs.edit().putBoolean(SLIDESHOW_LOOP, loopSlideshow).apply()
@ -387,8 +387,8 @@ class Config(context: Context) : BaseConfig(context) {
fun getLastVideoPosition(path: String) = prefs.getInt("$LAST_VIDEO_POSITION_PREFIX${path.toLowerCase()}", 0)
fun getAllLastVideoPositions() = prefs.all.filterKeys {
it.startsWith(LAST_VIDEO_POSITION_PREFIX)
fun getAllLastVideoPositions() = prefs.all.filterKeys {
it.startsWith(LAST_VIDEO_POSITION_PREFIX)
}
var rememberLastVideoPosition: Boolean

View file

@ -84,13 +84,19 @@ const val SLIDESHOW_INTERVAL = "slideshow_interval"
const val SLIDESHOW_INCLUDE_VIDEOS = "slideshow_include_videos"
const val SLIDESHOW_INCLUDE_GIFS = "slideshow_include_gifs"
const val SLIDESHOW_RANDOM_ORDER = "slideshow_random_order"
const val SLIDESHOW_USE_FADE = "slideshow_use_fade"
const val SLIDESHOW_MOVE_BACKWARDS = "slideshow_move_backwards"
const val SLIDESHOW_ANIMATION = "slideshow_animation"
const val SLIDESHOW_LOOP = "loop_slideshow"
const val SLIDESHOW_DEFAULT_INTERVAL = 5
const val SLIDESHOW_SCROLL_DURATION = 500L
const val SLIDESHOW_SLIDE_DURATION = 500L
const val SLIDESHOW_FADE_DURATION = 1500L
const val SLIDESHOW_START_ON_ENTER = "slideshow_start_on_enter"
// slideshow animations
const val SLIDESHOW_ANIMATION_NONE = 0
const val SLIDESHOW_ANIMATION_SLIDE = 1
const val SLIDESHOW_ANIMATION_FADE = 2
const val NOMEDIA = ".nomedia"
const val FAVORITES = "favorites"
const val RECYCLE_BIN = "recycle_bin"
@ -109,6 +115,7 @@ const val DRAG_THRESHOLD = 8
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 DIRECTORY = "directory"
const val MEDIUM = "medium"
@ -119,6 +126,7 @@ const val GET_ANY_INTENT = "get_any_intent"
const val SET_WALLPAPER_INTENT = "set_wallpaper_intent"
const val IS_VIEW_INTENT = "is_view_intent"
const val PICKED_PATHS = "picked_paths"
const val SHOULD_INIT_FRAGMENT = "should_init_fragment"
// rotations
const val ROTATE_BY_SYSTEM_SETTING = 0
@ -153,17 +161,20 @@ const val TYPE_VIDEOS = 2
const val TYPE_GIFS = 4
const val TYPE_RAWS = 8
const val TYPE_SVGS = 16
const val TYPE_DEFAULT_FILTER = TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS or TYPE_SVGS
const val LOCATION_INTERNAL = 1
const val LOCATION_SD = 2
const val LOCATION_OTG = 3
const val GROUP_BY_NONE = 1
const val GROUP_BY_LAST_MODIFIED = 2
const val GROUP_BY_DATE_TAKEN = 4
const val GROUP_BY_LAST_MODIFIED_DAILY = 2
const val GROUP_BY_DATE_TAKEN_DAILY = 4
const val GROUP_BY_FILE_TYPE = 8
const val GROUP_BY_EXTENSION = 16
const val GROUP_BY_FOLDER = 32
const val GROUP_BY_LAST_MODIFIED_MONTHLY = 64
const val GROUP_BY_DATE_TAKEN_MONTHLY = 128
const val GROUP_DESCENDING = 1024
// bottom actions

View file

@ -0,0 +1,8 @@
package com.simplemobiletools.gallery.pro.helpers
import android.view.View
import androidx.viewpager.widget.ViewPager
class DefaultPageTransformer : ViewPager.PageTransformer {
override fun transformPage(view: View, position: Float) {}
}

View file

@ -0,0 +1,18 @@
package com.simplemobiletools.gallery.pro.helpers
import android.view.View
import androidx.viewpager.widget.ViewPager
class FadePageTransformer : ViewPager.PageTransformer {
override fun transformPage(view: View, position: Float) {
view.translationX = view.width * -position
view.alpha = if (position <= -1f || position >= 1f) {
0f
} else if (position == 0f) {
1f
} else {
1f - Math.abs(position)
}
}
}

View file

@ -126,7 +126,7 @@ class MediaFetcher(val context: Context) {
if (cursor.moveToFirst()) {
do {
val path = cursor.getStringValue(MediaStore.Images.Media.DATA)
val parentPath = File(path).parent?.trimEnd('/') ?: continue
val parentPath = File(path).parent ?: continue
if (!includedFolders.contains(parentPath) && !foldersToIgnore.contains(parentPath)) {
foldersToScan.add(parentPath)
}
@ -287,8 +287,20 @@ class MediaFetcher(val context: Context) {
o1 as Medium
o2 as Medium
var result = when {
sorting and SORT_BY_NAME != 0 -> AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase())
sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
sorting and SORT_BY_NAME != 0 -> {
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase())
} else {
o1.name.toLowerCase().compareTo(o2.name.toLowerCase())
}
}
sorting and SORT_BY_PATH != 0 -> {
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
} else {
o1.path.toLowerCase().compareTo(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)
@ -324,7 +336,8 @@ class MediaFetcher(val context: Context) {
}
val sortDescending = currentGrouping and GROUP_DESCENDING != 0
val sorted = if (currentGrouping and GROUP_BY_DATE_TAKEN != 0 || currentGrouping and GROUP_BY_LAST_MODIFIED != 0) {
val sorted = if (currentGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || currentGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 ||
currentGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || currentGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0) {
mediumGroups.toSortedMap(if (sortDescending) compareByDescending {
it.toLongOrNull() ?: 0L
} else {
@ -339,8 +352,8 @@ class MediaFetcher(val context: Context) {
mediumGroups[key] = value
}
val today = formatDate(System.currentTimeMillis().toString())
val yesterday = formatDate((System.currentTimeMillis() - DAY_SECONDS * 1000).toString())
val today = formatDate(System.currentTimeMillis().toString(), true)
val yesterday = formatDate((System.currentTimeMillis() - DAY_SECONDS * 1000).toString(), true)
for ((key, value) in mediumGroups) {
val sectionKey = getFormattedKey(key, currentGrouping, today, yesterday)
thumbnailItems.add(ThumbnailSection(sectionKey))
@ -351,13 +364,20 @@ class MediaFetcher(val context: Context) {
}
private fun getFormattedKey(key: String, grouping: Int, today: String, yesterday: String): String {
return when {
grouping and GROUP_BY_LAST_MODIFIED != 0 || grouping and GROUP_BY_DATE_TAKEN != 0 -> getFinalDate(formatDate(key), today, yesterday)
var result = when {
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 -> getFinalDate(formatDate(key, true), today, yesterday)
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 || grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -> formatDate(key, false)
grouping and GROUP_BY_FILE_TYPE != 0 -> getFileTypeString(key)
grouping and GROUP_BY_EXTENSION != 0 -> key.toUpperCase()
grouping and GROUP_BY_FOLDER != 0 -> context.humanizePath(key)
else -> key
}
if (result.isEmpty()) {
result = context.getString(R.string.unknown)
}
return result
}
private fun getFinalDate(date: String, today: String, yesterday: String): String {
@ -368,11 +388,12 @@ class MediaFetcher(val context: Context) {
}
}
private fun formatDate(timestamp: String): String {
private fun formatDate(timestamp: String, showDay: Boolean): String {
return if (timestamp.areDigitsOnly()) {
val cal = Calendar.getInstance(Locale.ENGLISH)
cal.timeInMillis = timestamp.toLong()
DateFormat.format("dd MMM yyyy", cal).toString()
val format = if (showDay) "dd MMM yyyy" else "MMM yyyy"
DateFormat.format(format, cal).toString()
} else {
""
}

View file

@ -10,12 +10,17 @@ import android.widget.RemoteViews
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.extensions.getFileSignature
import com.simplemobiletools.commons.extensions.setBackgroundColor
import com.simplemobiletools.commons.extensions.setText
import com.simplemobiletools.commons.extensions.setVisibleIf
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.*
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.directoryDB
import com.simplemobiletools.gallery.pro.extensions.getFolderNameFromPath
import com.simplemobiletools.gallery.pro.extensions.widgetsDB
import com.simplemobiletools.gallery.pro.models.Widget
class MyWidgetProvider : AppWidgetProvider() {
@ -30,7 +35,7 @@ class MyWidgetProvider : AppWidgetProvider() {
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
super.onUpdate(context, appWidgetManager, appWidgetIds)
Thread {
ensureBackgroundThread {
val config = context.config
context.widgetsDB.getWidgets().filter { appWidgetIds.contains(it.widgetId) }.forEach {
val views = RemoteViews(context.packageName, R.layout.widget).apply {
@ -44,7 +49,12 @@ class MyWidgetProvider : AppWidgetProvider() {
val options = RequestOptions()
.signature(path.getFileSignature())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
if (context.config.cropThumbnails) options.centerCrop() else options.fitCenter()
if (context.config.cropThumbnails) {
options.centerCrop()
} else {
options.fitCenter()
}
val density = context.resources.displayMetrics.density
val appWidgetOptions = appWidgetManager.getAppWidgetOptions(appWidgetIds.first())
@ -66,7 +76,7 @@ class MyWidgetProvider : AppWidgetProvider() {
setupAppOpenIntent(context, views, R.id.widget_holder, it)
appWidgetManager.updateAppWidget(it.widgetId, views)
}
}.start()
}
}
override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle) {
@ -76,10 +86,10 @@ class MyWidgetProvider : AppWidgetProvider() {
override fun onDeleted(context: Context, appWidgetIds: IntArray) {
super.onDeleted(context, appWidgetIds)
Thread {
ensureBackgroundThread {
appWidgetIds.forEach {
context.widgetsDB.deleteWidgetId(it)
}
}.start()
}
}
}

View file

@ -21,6 +21,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")
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)

View file

@ -12,8 +12,11 @@ import android.net.Uri
import android.os.Build
import android.os.Handler
import android.provider.MediaStore
import com.simplemobiletools.commons.extensions.getParentPath
import com.simplemobiletools.commons.extensions.getStringValue
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.extensions.addPathToDB
import com.simplemobiletools.gallery.pro.extensions.updateDirectoryPath
// based on https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri)
@TargetApi(Build.VERSION_CODES.N)
@ -54,6 +57,7 @@ class NewPhotoFetcher : JobService() {
override fun onStartJob(params: JobParameters): Boolean {
mRunningParams = params
val affectedFolderPaths = HashSet<String>()
if (params.triggeredContentAuthorities != null && params.triggeredContentUris != null) {
val ids = arrayListOf<String>()
for (uri in params.triggeredContentUris!!) {
@ -80,6 +84,7 @@ class NewPhotoFetcher : JobService() {
cursor = contentResolver.query(it, projection, selection.toString(), null, null)
while (cursor!!.moveToNext()) {
val path = cursor!!.getStringValue(MediaStore.Images.ImageColumns.DATA)
affectedFolderPaths.add(path.getParentPath())
addPathToDB(path)
}
}
@ -90,6 +95,12 @@ class NewPhotoFetcher : JobService() {
}
}
ensureBackgroundThread {
affectedFolderPaths.forEach {
updateDirectoryPath(it)
}
}
mHandler.post(mWorker)
return true
}

View file

@ -26,7 +26,8 @@ data class Directory(
// used with "Group direct subfolders" enabled
@Ignore var subfoldersCount: Int = 0,
@Ignore var subfoldersMediaCount: Int = 0) {
@Ignore var subfoldersMediaCount: Int = 0,
@Ignore var containsMediaFilesDirectly: Boolean = true) {
constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, 0, 0)

View file

@ -56,8 +56,10 @@ data class Medium(
fun getGroupingKey(groupBy: Int): String {
return when {
groupBy and GROUP_BY_LAST_MODIFIED != 0 -> getDayStartTS(modified)
groupBy and GROUP_BY_DATE_TAKEN != 0 -> getDayStartTS(taken)
groupBy and GROUP_BY_LAST_MODIFIED_DAILY != 0 -> getDayStartTS(modified, false)
groupBy and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 -> getDayStartTS(modified, true)
groupBy and GROUP_BY_DATE_TAKEN_DAILY != 0 -> getDayStartTS(taken, false)
groupBy and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -> getDayStartTS(taken, true)
groupBy and GROUP_BY_FILE_TYPE != 0 -> type.toString()
groupBy and GROUP_BY_EXTENSION != 0 -> name.getFilenameExtension().toLowerCase()
groupBy and GROUP_BY_FOLDER != 0 -> parentPath
@ -67,13 +69,17 @@ data class Medium(
fun getIsInRecycleBin() = deletedTS != 0L
private fun getDayStartTS(ts: Long): String {
private fun getDayStartTS(ts: Long, resetDays: Boolean): String {
val calendar = Calendar.getInstance(Locale.ENGLISH).apply {
timeInMillis = ts
set(Calendar.HOUR_OF_DAY, 0)
set(Calendar.MINUTE, 0)
set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0)
if (resetDays) {
set(Calendar.DAY_OF_MONTH, 1)
}
}
return calendar.timeInMillis.toString()

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/shortcut_image"
android:drawable="@mipmap/ic_launcher"/>
</layer-list>

View file

@ -48,9 +48,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingStart="@dimen/normal_margin"
android:paddingLeft="@dimen/normal_margin"
android:visibility="gone">
<include layout="@layout/fastscroller_handle_vertical"/>
@ -62,7 +60,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:paddingTop="@dimen/normal_margin"
android:visibility="gone">

View file

@ -48,9 +48,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingStart="@dimen/normal_margin"
android:paddingLeft="@dimen/normal_margin"
android:visibility="gone">
<include layout="@layout/fastscroller_handle_vertical"/>
@ -62,7 +60,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:paddingTop="@dimen/normal_margin"
android:visibility="gone">

View file

@ -23,7 +23,7 @@
android:id="@+id/cardboard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_cardboard"/>
@ -32,7 +32,7 @@
android:id="@+id/explore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_explore"/>

View file

@ -17,7 +17,7 @@
android:id="@+id/explore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_explore"/>
@ -26,7 +26,7 @@
android:id="@+id/cardboard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_cardboard"/>

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/media_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/media_empty_text_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:paddingLeft="@dimen/big_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/big_margin"
android:text="@string/no_media_with_filters"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/media_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager"
app:spanCount="@integer/media_columns_vertical_scroll"/>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/media_vertical_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin"
android:visibility="gone">
<include layout="@layout/fastscroller_handle_vertical"/>
</com.simplemobiletools.commons.views.FastScroller>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/media_horizontal_fastscroller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:paddingTop="@dimen/normal_margin"
android:visibility="gone">
<include layout="@layout/fastscroller_handle_horizontal"/>
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>

View file

@ -2,6 +2,7 @@
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/settings_scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@ -29,7 +30,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/customize_colors"/>
</RelativeLayout>
@ -52,7 +52,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/use_english_language"
app:switchPadding="@dimen/medium_margin"/>
@ -75,7 +74,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/change_date_and_time_format"/>
</RelativeLayout>
@ -97,7 +95,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_file_loading_priority"
android:layout_toLeftOf="@+id/settings_file_loading_priority"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/file_loading_priority"/>
@ -107,11 +104,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/small_margin"
android:layout_marginRight="@dimen/small_margin"
android:background="@null"
android:clickable="false"/>
android:clickable="false"
tools:text="@string/compromise"/>
</RelativeLayout>
@ -127,7 +123,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/visibility"
android:textAllCaps="true"
@ -150,7 +145,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_included_folders"/>
</RelativeLayout>
@ -172,7 +166,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_excluded_folders"/>
</RelativeLayout>
@ -194,7 +187,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_hidden_folders"/>
</RelativeLayout>
@ -217,7 +209,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_hidden_items"
app:switchPadding="@dimen/medium_margin"/>
@ -235,7 +226,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/videos"
android:textAllCaps="true"
@ -259,7 +249,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/autoplay_videos"
app:switchPadding="@dimen/medium_margin"/>
@ -283,7 +272,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/remember_last_video_position"
app:switchPadding="@dimen/medium_margin"/>
@ -307,7 +295,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/loop_videos"
app:switchPadding="@dimen/medium_margin"/>
@ -331,7 +318,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/open_videos_on_separate_screen"
app:switchPadding="@dimen/medium_margin"/>
@ -355,7 +341,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/allow_video_gestures"
app:switchPadding="@dimen/medium_margin"/>
@ -373,7 +358,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/thumbnails"
android:textAllCaps="true"
@ -397,7 +381,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/animate_gifs"
app:switchPadding="@dimen/medium_margin"/>
@ -421,7 +404,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/crop_thumbnails"
app:switchPadding="@dimen/medium_margin"/>
@ -445,7 +427,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_thumbnail_video_duration"
app:switchPadding="@dimen/medium_margin"/>
@ -469,7 +450,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_media_count"
app:switchPadding="@dimen/medium_margin"/>
@ -487,7 +467,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/scrolling"
android:textAllCaps="true"
@ -511,7 +490,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_info_bubble"
app:switchPadding="@dimen/medium_margin"/>
@ -535,7 +513,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/scroll_thumbnails_horizontally"
app:switchPadding="@dimen/medium_margin"/>
@ -559,7 +536,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/enable_pull_to_refresh"
app:switchPadding="@dimen/medium_margin"/>
@ -577,7 +553,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/fullscreen_media"
android:textAllCaps="true"
@ -601,7 +576,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/max_brightness"
app:switchPadding="@dimen/medium_margin"/>
@ -625,7 +599,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/black_background_at_fullscreen"
app:switchPadding="@dimen/medium_margin"/>
@ -649,7 +622,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/hide_system_ui_at_fullscreen"
app:switchPadding="@dimen/medium_margin"/>
@ -673,7 +645,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/allow_instant_change"
app:switchPadding="@dimen/medium_margin"/>
@ -697,7 +668,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/allow_photo_gestures"
app:switchPadding="@dimen/medium_margin"/>
@ -721,7 +691,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/allow_down_gesture"
app:switchPadding="@dimen/medium_margin"/>
@ -745,7 +714,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_notch"
app:switchPadding="@dimen/medium_margin"/>
@ -768,7 +736,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_screen_rotation"
android:layout_toLeftOf="@+id/settings_screen_rotation"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/screen_rotation_by"/>
@ -778,9 +745,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/small_margin"
android:layout_marginRight="@dimen/small_margin"
android:background="@null"
android:clickable="false"/>
@ -798,7 +763,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/deep_zoomable_images"
android:textAllCaps="true"
@ -822,7 +786,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/allow_deep_zooming_images"
app:switchPadding="@dimen/medium_margin"/>
@ -846,7 +809,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/allow_rotating_gestures"
app:switchPadding="@dimen/medium_margin"/>
@ -870,7 +832,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_highest_quality"
app:switchPadding="@dimen/medium_margin"/>
@ -894,7 +855,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/allow_one_to_one_zoom"
app:switchPadding="@dimen/medium_margin"/>
@ -912,7 +872,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/extended_details"
android:textAllCaps="true"
@ -936,7 +895,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_extended_details"
app:switchPadding="@dimen/medium_margin"/>
</RelativeLayout>
@ -959,7 +917,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/hide_extended_details"
app:switchPadding="@dimen/medium_margin"/>
</RelativeLayout>
@ -981,7 +938,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_extended_details"/>
</RelativeLayout>
@ -998,7 +954,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/security"
android:textAllCaps="true"
@ -1022,7 +977,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/password_protect_hidden_items"
app:switchPadding="@dimen/medium_margin"/>
@ -1046,7 +1000,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/password_protect_whole_app"
app:switchPadding="@dimen/medium_margin"/>
@ -1070,7 +1023,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/password_protect_file_deletion"
app:switchPadding="@dimen/medium_margin"/>
@ -1088,7 +1040,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/file_operations"
android:textAllCaps="true"
@ -1112,7 +1063,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/delete_empty_folders"
app:switchPadding="@dimen/medium_margin"/>
@ -1136,7 +1086,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/keep_last_modified"
app:switchPadding="@dimen/medium_margin"/>
@ -1160,7 +1109,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/skip_delete_confirmation"
app:switchPadding="@dimen/medium_margin"/>
@ -1178,7 +1126,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/bottom_actions"
android:textAllCaps="true"
@ -1202,7 +1149,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_at_bottom"
app:switchPadding="@dimen/medium_margin"/>
@ -1225,7 +1171,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_bottom_actions"/>
</RelativeLayout>
@ -1242,7 +1187,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/recycle_bin"
android:textAllCaps="true"
@ -1266,7 +1210,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/move_items_into_recycle_bin"
app:switchPadding="@dimen/medium_margin"/>
@ -1290,7 +1233,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_recycle_bin"
app:switchPadding="@dimen/medium_margin"/>
@ -1314,7 +1256,6 @@
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_recycle_bin_last"
app:switchPadding="@dimen/medium_margin"/>
@ -1337,7 +1278,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_empty_recycle_bin_size"
android:layout_toLeftOf="@+id/settings_empty_recycle_bin_size"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/empty_recycle_bin"/>
@ -1347,9 +1287,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/small_margin"
android:layout_marginRight="@dimen/small_margin"
android:background="@null"
android:clickable="false"/>
@ -1367,7 +1305,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/migrating"
android:textAllCaps="true"
@ -1390,7 +1327,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/export_settings"/>
</RelativeLayout>
@ -1412,7 +1348,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/import_settings"/>
</RelativeLayout>

View file

@ -23,8 +23,7 @@
android:id="@+id/video_volume_controller"
android:layout_width="@dimen/media_side_slider_width"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"/>
android:layout_alignParentEnd="true"/>
<com.simplemobiletools.gallery.pro.views.MediaSideScroll
android:id="@+id/video_brightness_controller"

View file

@ -20,9 +20,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingLeft="@dimen/activity_margin"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/medium_margin"
android:paddingEnd="@dimen/medium_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
@ -43,7 +43,7 @@
android:layout_below="@+id/folder_picker_show_folder_name_holder"
android:layout_marginTop="@dimen/small_margin"
android:layout_marginBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/activity_margin"
android:paddingStart="@dimen/activity_margin"
android:text="@string/folder_on_widget"/>
<com.simplemobiletools.commons.views.MyTextView
@ -51,7 +51,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/folder_picker_label"
android:layout_marginLeft="@dimen/activity_margin"
android:layout_marginStart="@dimen/activity_margin"
android:background="@drawable/button_background"
android:padding="@dimen/normal_margin"
tools:text="@string/internal"/>
@ -100,7 +100,6 @@
android:layout_alignTop="@+id/config_bg_color"
android:layout_alignBottom="@+id/config_bg_color"
android:layout_toEndOf="@+id/config_bg_color"
android:layout_toRightOf="@+id/config_bg_color"
android:background="@android:color/white">
<SeekBar
@ -123,7 +122,6 @@
android:layout_width="wrap_content"
android:layout_height="@dimen/widget_colorpicker_size"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:fontFamily="sans-serif-light"
android:paddingLeft="@dimen/activity_margin"

View file

@ -16,9 +16,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_star_off"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_edit"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_edit"
@ -27,9 +30,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_edit"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_share"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_favorite"/>
app:layout_constraintStart_toEndOf="@+id/bottom_favorite"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_share"
@ -38,9 +44,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_share"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_delete"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_edit"/>
app:layout_constraintStart_toEndOf="@+id/bottom_edit"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_delete"
@ -49,9 +58,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_delete"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_rotate"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_share"/>
app:layout_constraintStart_toEndOf="@+id/bottom_share"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_rotate"
@ -60,9 +72,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_rotate_right"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_properties"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_delete"/>
app:layout_constraintStart_toEndOf="@+id/bottom_delete"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_properties"
@ -71,9 +86,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_properties"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_change_orientation"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_rotate"/>
app:layout_constraintStart_toEndOf="@+id/bottom_rotate"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_change_orientation"
@ -82,9 +100,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_orientation_auto"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_slideshow"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_properties"/>
app:layout_constraintStart_toEndOf="@+id/bottom_properties"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_slideshow"
@ -93,9 +114,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_slideshow"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_show_on_map"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_change_orientation"/>
app:layout_constraintStart_toEndOf="@+id/bottom_change_orientation"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_show_on_map"
@ -104,9 +128,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_place"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_toggle_file_visibility"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_slideshow"/>
app:layout_constraintStart_toEndOf="@+id/bottom_slideshow"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_toggle_file_visibility"
@ -115,9 +142,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_hide"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_rename"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_show_on_map"/>
app:layout_constraintStart_toEndOf="@+id/bottom_show_on_map"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_rename"
@ -126,9 +156,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_rename_new"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/bottom_set_as"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_toggle_file_visibility"/>
app:layout_constraintStart_toEndOf="@+id/bottom_toggle_file_visibility"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_set_as"
@ -137,9 +170,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_set_as"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/bottom_copy"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_rename"/>
app:layout_constraintStart_toEndOf="@+id/bottom_rename"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_copy"
@ -148,9 +184,12 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_copy"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/bottom_move"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_set_as"/>
app:layout_constraintStart_toEndOf="@+id/bottom_set_as"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ImageView
android:id="@+id/bottom_move"
@ -159,8 +198,11 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_move"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_copy"/>
app:layout_constraintStart_toEndOf="@+id/bottom_copy"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -17,9 +17,12 @@
android:textAllCaps="true"
android:textColor="@android:color/white"
android:textSize="@dimen/big_text_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_aspect_ratio_one_one"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<TextView
android:id="@+id/bottom_aspect_ratio_one_one"
@ -30,9 +33,12 @@
android:text="1:1"
android:textColor="@android:color/white"
android:textSize="@dimen/big_text_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_aspect_ratio_four_three"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio_free"/>
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio_free"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<TextView
android:id="@+id/bottom_aspect_ratio_four_three"
@ -43,9 +49,12 @@
android:text="4:3"
android:textColor="@android:color/white"
android:textSize="@dimen/big_text_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_aspect_ratio_sixteen_nine"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio_one_one"/>
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio_one_one"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<TextView
android:id="@+id/bottom_aspect_ratio_sixteen_nine"
@ -56,9 +65,12 @@
android:text="16:9"
android:textColor="@android:color/white"
android:textSize="@dimen/big_text_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_aspect_ratio_other"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio_four_three"/>
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio_four_three"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<TextView
android:id="@+id/bottom_aspect_ratio_other"
@ -70,8 +82,11 @@
android:textAllCaps="true"
android:textColor="@android:color/white"
android:textSize="@dimen/big_text_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio_sixteen_nine"/>
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio_sixteen_nine"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -24,7 +24,7 @@
android:id="@+id/bottom_draw_color_clickable"
android:layout_width="@dimen/bottom_editor_color_picker_size"
android:layout_height="@dimen/bottom_editor_color_picker_size"
android:layout_marginRight="@dimen/small_margin"
android:layout_marginEnd="@dimen/small_margin"
android:background="?attr/selectableItemBackgroundBorderless"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@+id/bottom_draw_undo"
@ -34,7 +34,7 @@
android:id="@+id/bottom_draw_color"
android:layout_width="@dimen/bottom_editor_color_picker_size"
android:layout_height="@dimen/bottom_editor_color_picker_size"
android:layout_marginRight="@dimen/small_margin"
android:layout_marginEnd="@dimen/small_margin"
android:clickable="false"
android:padding="@dimen/small_margin"
android:src="@drawable/circle_background"
@ -46,7 +46,7 @@
android:id="@+id/bottom_draw_undo"
android:layout_width="@dimen/bottom_editor_color_picker_size"
android:layout_height="@dimen/bottom_editor_color_picker_size"
android:layout_marginRight="@dimen/normal_margin"
android:layout_marginEnd="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="false"
android:padding="@dimen/medium_margin"

View file

@ -50,7 +50,6 @@
android:layout_alignTop="@+id/video_seekbar"
android:layout_alignBottom="@+id/video_seekbar"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:gravity="center_vertical"
android:paddingLeft="@dimen/activity_margin"
@ -64,9 +63,7 @@
android:layout_height="wrap_content"
android:layout_below="@+id/video_toggle_play_pause"
android:layout_toStartOf="@+id/video_duration"
android:layout_toLeftOf="@+id/video_duration"
android:layout_toEndOf="@+id/video_curr_time"
android:layout_toRightOf="@+id/video_curr_time"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"/>
@ -78,7 +75,6 @@
android:layout_alignTop="@+id/video_seekbar"
android:layout_alignBottom="@+id/video_seekbar"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:gravity="center_vertical"
android:paddingLeft="@dimen/activity_margin"

View file

@ -29,20 +29,36 @@
android:text="@string/do_not_group_files"/>
<com.simplemobiletools.commons.views.MyCompatRadioButton
android:id="@+id/grouping_dialog_radio_last_modified"
android:id="@+id/grouping_dialog_radio_last_modified_daily"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/medium_margin"
android:paddingBottom="@dimen/medium_margin"
android:text="@string/by_last_modified"/>
android:text="@string/by_last_modified_daily"/>
<com.simplemobiletools.commons.views.MyCompatRadioButton
android:id="@+id/grouping_dialog_radio_date_taken"
android:id="@+id/grouping_dialog_radio_last_modified_monthly"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/medium_margin"
android:paddingBottom="@dimen/medium_margin"
android:text="@string/by_date_taken"/>
android:text="@string/by_last_modified_monthly"/>
<com.simplemobiletools.commons.views.MyCompatRadioButton
android:id="@+id/grouping_dialog_radio_date_taken_daily"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/medium_margin"
android:paddingBottom="@dimen/medium_margin"
android:text="@string/by_date_taken_daily"/>
<com.simplemobiletools.commons.views.MyCompatRadioButton
android:id="@+id/grouping_dialog_radio_date_taken_monthly"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/medium_margin"
android:paddingBottom="@dimen/medium_margin"
android:text="@string/by_date_taken_monthly"/>
<com.simplemobiletools.commons.views.MyCompatRadioButton
android:id="@+id/grouping_dialog_radio_file_type"

View file

@ -101,6 +101,14 @@
android:id="@+id/use_for_this_folder_divider"
layout="@layout/divider"/>
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/sorting_dialog_numeric_sorting"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/sort_numeric_parts"/>
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/sorting_dialog_use_for_this_folder"
android:layout_width="match_parent"

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_confirm_delete_folder_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/big_margin"
android:paddingTop="@dimen/big_margin"
android:paddingRight="@dimen/big_margin"
android:textSize="@dimen/bigger_text_size"/>
<TextView
android:id="@+id/message_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/message"
android:paddingLeft="@dimen/big_margin"
android:paddingTop="@dimen/big_margin"
android:paddingRight="@dimen/big_margin"
android:paddingBottom="@dimen/activity_margin"
android:textColor="@color/md_red_700"
android:textSize="@dimen/bigger_text_size"/>
</RelativeLayout>

View file

@ -33,8 +33,8 @@
android:layout_height="wrap_content"
android:layout_alignTop="@+id/aspect_ratio_width"
android:layout_alignBottom="@+id/aspect_ratio_width"
android:layout_toLeftOf="@+id/aspect_ratio_height"
android:layout_toRightOf="@+id/aspect_ratio_width"
android:layout_toStartOf="@+id/aspect_ratio_height"
android:layout_toEndOf="@+id/aspect_ratio_width"
android:gravity="center"
android:text=":"
android:textStyle="bold"/>
@ -44,8 +44,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginLeft="50dp"
android:layout_toRightOf="@+id/aspect_ratio_width_label"
android:layout_toEndOf="@+id/aspect_ratio_width_label"
android:text="@string/height"/>
<com.simplemobiletools.commons.views.MyEditText
@ -54,7 +53,6 @@
android:layout_height="wrap_content"
android:layout_below="@+id/aspect_ratio_width_label"
android:layout_alignStart="@+id/aspect_ratio_height_label"
android:layout_alignLeft="@+id/aspect_ratio_height_label"
android:inputType="number"
android:maxLength="6"
android:maxLines="1"

View file

@ -7,8 +7,6 @@
android:layout_height="match_parent">
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/directories_grid_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -27,9 +25,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingStart="@dimen/normal_margin"
android:paddingLeft="@dimen/normal_margin">
android:paddingStart="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical"/>
@ -40,7 +36,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:paddingTop="@dimen/normal_margin">

View file

@ -19,9 +19,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingStart="@dimen/normal_margin"
android:paddingLeft="@dimen/normal_margin">
android:paddingStart="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical"/>
@ -32,7 +30,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:paddingTop="@dimen/normal_margin">

View file

@ -27,7 +27,7 @@
android:id="@+id/other_aspect_ratio_2_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="2:1"
@ -37,18 +37,17 @@
android:id="@+id/other_aspect_ratio_3_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="3:2"
android:textSize="@dimen/bigger_text_size"/>
<com.simplemobiletools.commons.views.MyCompatRadioButton
android:id="@+id/other_aspect_ratio_4_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="4:3"
@ -58,7 +57,7 @@
android:id="@+id/other_aspect_ratio_5_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="5:3"
@ -68,7 +67,7 @@
android:id="@+id/other_aspect_ratio_16_9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="16:9"
@ -78,7 +77,7 @@
android:id="@+id/other_aspect_ratio_19_9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="19:9"
@ -88,7 +87,7 @@
android:id="@+id/other_aspect_ratio_custom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="@string/custom"
@ -107,7 +106,7 @@
android:id="@+id/other_aspect_ratio_1_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="1:2"
@ -117,7 +116,7 @@
android:id="@+id/other_aspect_ratio_2_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="2:3"
@ -128,7 +127,7 @@
android:id="@+id/other_aspect_ratio_3_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="3:4"
@ -138,7 +137,7 @@
android:id="@+id/other_aspect_ratio_3_5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="3:5"
@ -148,7 +147,7 @@
android:id="@+id/other_aspect_ratio_9_16"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="9:16"
@ -158,7 +157,7 @@
android:id="@+id/other_aspect_ratio_9_19"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="9:19"

View file

@ -32,8 +32,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginLeft="50dp"
android:layout_toRightOf="@+id/image_width_label"
android:layout_toEndOf="@+id/image_width_label"
android:text="@string/height"/>
<com.simplemobiletools.commons.views.MyEditText
@ -42,7 +41,6 @@
android:layout_height="wrap_content"
android:layout_below="@+id/image_width_label"
android:layout_alignStart="@+id/image_height_label"
android:layout_alignLeft="@+id/image_height_label"
android:inputType="number"
android:maxLength="6"
android:maxLines="1"

View file

@ -18,10 +18,10 @@
android:id="@+id/save_as_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/activity_margin"
android:layout_marginStart="@dimen/activity_margin"
android:layout_marginBottom="@dimen/activity_margin"
android:paddingTop="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"/>
android:paddingEnd="@dimen/small_margin"/>
<com.simplemobiletools.commons.views.MyEditText
android:id="@+id/save_as_name"

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/slideshow_scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -17,7 +18,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/interval"/>
@ -27,23 +27,53 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:ems="5"
android:gravity="right"
android:gravity="end"
android:imeOptions="actionDone"
android:inputType="number"
android:maxLength="2"
android:maxLength="5"
android:textCursorDrawable="@null"
android:textSize="@dimen/normal_text_size"/>
<RelativeLayout
android:id="@+id/animation_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/interval_label"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingTop="@dimen/bigger_margin"
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/animation_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/animation_value"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/animation"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/animation_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginEnd="@dimen/medium_margin"
android:background="@null"
android:clickable="false"
tools:text="@string/slide"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/include_videos_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/interval_label"
android:layout_below="@+id/animation_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin">
@ -64,7 +94,6 @@
android:layout_below="@+id/include_videos_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin">
@ -85,7 +114,6 @@
android:layout_below="@+id/include_gifs_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin">
@ -100,35 +128,12 @@
</RelativeLayout>
<RelativeLayout
android:id="@+id/use_fade_holder"
android:id="@+id/move_backwards_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/random_order_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:visibility="gone">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/use_fade"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:text="@string/use_fade"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/move_backwards_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/use_fade_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin">
@ -149,7 +154,6 @@
android:layout_below="@+id/move_backwards_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin">

View file

@ -17,10 +17,9 @@
android:id="@+id/dir_check"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignRight="@+id/dir_shadow_holder"
android:layout_alignEnd="@+id/dir_shadow_holder"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_background"
android:padding="@dimen/tiny_margin"
@ -32,7 +31,6 @@
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_black_background"
@ -44,8 +42,8 @@
android:id="@+id/dir_shadow_holder"
android:layout_width="match_parent"
android:layout_height="@dimen/tmb_shadow_height"
android:layout_alignLeft="@+id/dir_bottom_holder"
android:layout_alignRight="@+id/dir_bottom_holder"
android:layout_alignStart="@+id/dir_bottom_holder"
android:layout_alignEnd="@+id/dir_bottom_holder"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient_background"/>
@ -53,8 +51,8 @@
android:id="@+id/dir_bottom_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/dir_thumbnail"
android:layout_alignRight="@+id/dir_thumbnail"
android:layout_alignStart="@+id/dir_thumbnail"
android:layout_alignEnd="@+id/dir_thumbnail"
android:layout_alignParentBottom="true"
android:gravity="bottom"
android:orientation="vertical"
@ -69,9 +67,9 @@
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:paddingBottom="@dimen/small_margin"
android:shadowColor="@color/default_background_color"
android:shadowRadius="4"
android:paddingBottom="@dimen/small_margin"
android:textColor="@android:color/white"
android:textSize="@dimen/normal_text_size"/>
@ -88,11 +86,10 @@
android:id="@+id/dir_location"
android:layout_width="@dimen/sd_card_icon_size"
android:layout_height="@dimen/sd_card_icon_size"
android:layout_alignRight="@+id/dir_bottom_holder"
android:layout_alignEnd="@+id/dir_bottom_holder"
android:layout_alignParentBottom="true"
android:alpha="0.8"
android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_sd_card"
android:visibility="gone"/>

View file

@ -6,7 +6,7 @@
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/small_margin">
<com.simplemobiletools.gallery.pro.views.MySquareImageView
@ -20,7 +20,6 @@
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_background"
android:padding="@dimen/tiny_margin"
@ -31,7 +30,7 @@
android:id="@+id/dir_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/dir_thumbnail"
android:layout_toEndOf="@+id/dir_thumbnail"
android:ellipsize="end"
android:maxLines="1"
android:paddingLeft="6dp"
@ -44,12 +43,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/dir_name"
android:layout_alignLeft="@+id/dir_name"
android:layout_marginRight="@dimen/activity_margin"
android:layout_alignStart="@+id/dir_name"
android:layout_marginEnd="@dimen/activity_margin"
android:alpha="0.4"
android:ellipsize="end"
android:maxLines="1"
android:paddingLeft="6dp"
android:paddingStart="6dp"
android:textColor="@android:color/white"
android:textSize="@dimen/smaller_text_size"/>
@ -58,7 +57,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/dir_name"
android:layout_toRightOf="@+id/dir_name"
android:layout_toEndOf="@+id/dir_name"
android:alpha="0.4"
android:textColor="@android:color/white"
android:textSize="@dimen/smaller_text_size"/>
@ -68,9 +67,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="@dimen/small_margin"
android:layout_marginEnd="@dimen/small_margin"
android:gravity="end"
android:orientation="horizontal"
android:paddingBottom="@dimen/tiny_margin">
@ -98,7 +96,7 @@
android:layout_height="1dp"
android:layout_alignBottom="@+id/dir_thumbnail"
android:layout_marginTop="2dp"
android:layout_toRightOf="@+id/dir_thumbnail"
android:layout_toEndOf="@+id/dir_thumbnail"
android:background="@drawable/divider"/>
</RelativeLayout>

View file

@ -45,7 +45,7 @@
android:id="@+id/photo_details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginRight="@dimen/small_margin"
android:background="@color/gradient_grey_start"
@ -59,8 +59,7 @@
android:id="@+id/photo_brightness_controller"
android:layout_width="@dimen/media_side_slider_width"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"/>
android:layout_alignParentStart="true"/>
<TextView
android:id="@+id/slide_info"
@ -88,7 +87,6 @@
android:id="@+id/instant_next_item"
android:layout_width="@dimen/instant_change_bar_width"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"/>
android:layout_alignParentEnd="true"/>
</RelativeLayout>

View file

@ -28,8 +28,7 @@
android:id="@+id/video_volume_controller"
android:layout_width="@dimen/media_side_slider_width"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"/>
android:layout_alignParentEnd="true"/>
<com.simplemobiletools.gallery.pro.views.MediaSideScroll
android:id="@+id/video_brightness_controller"
@ -45,8 +44,7 @@
android:id="@+id/instant_next_item"
android:layout_width="@dimen/instant_change_bar_width"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"/>
android:layout_alignParentEnd="true"/>
<ImageView
android:id="@+id/video_play_outline"
@ -69,7 +67,7 @@
android:id="@+id/video_details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginRight="@dimen/small_margin"
android:background="@color/gradient_grey_start"

View file

@ -7,7 +7,7 @@
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:paddingLeft="@dimen/small_margin"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/small_margin">
<com.simplemobiletools.gallery.pro.views.MySquareImageView
@ -21,7 +21,6 @@
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_background"
android:padding="@dimen/tiny_margin"
@ -34,12 +33,12 @@
android:layout_height="match_parent"
android:layout_alignTop="@+id/medium_thumbnail"
android:layout_alignBottom="@+id/medium_thumbnail"
android:layout_toRightOf="@+id/medium_thumbnail"
android:layout_toEndOf="@+id/medium_thumbnail"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="3"
android:paddingLeft="6dp"
android:paddingRight="@dimen/normal_margin"
android:paddingStart="6dp"
android:paddingEnd="@dimen/normal_margin"
android:textColor="@android:color/white"
android:textSize="@dimen/bigger_text_size"
tools:text="My photo"/>
@ -48,9 +47,9 @@
android:id="@+id/play_outline"
android:layout_width="@dimen/play_outline_icon_size"
android:layout_height="@dimen/play_outline_icon_size"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="@dimen/small_margin"
android:layout_marginEnd="@dimen/small_margin"
android:paddingBottom="6dp"
android:src="@drawable/img_play_outline_empty"
android:visibility="gone"/>
@ -61,7 +60,7 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="6dp"
android:layout_toLeftOf="@+id/play_outline"
android:layout_toStartOf="@+id/play_outline"
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@ -75,7 +74,7 @@
android:layout_height="1dp"
android:layout_alignBottom="@+id/medium_thumbnail"
android:layout_marginTop="2dp"
android:layout_toRightOf="@+id/medium_thumbnail"
android:layout_toEndOf="@+id/medium_thumbnail"
android:background="@drawable/divider"/>
</RelativeLayout>

View file

@ -48,19 +48,15 @@
android:id="@+id/cab_exclude"
android:title="@string/exclude"
app:showAsAction="never"/>
<item
android:id="@+id/cab_copy_to"
android:title="@string/copy_to"
app:showAsAction="never"/>
<item
android:id="@+id/cab_move_to"
android:title="@string/move_to"
app:showAsAction="never"/>
<item
android:id="@+id/cab_select_all"
android:icon="@drawable/ic_select_all"
android:title="@string/select_all"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_create_shortcut"
android:title="@string/create_shortcut"
app:showAsAction="never"/>
<item
android:id="@+id/cab_change_cover_image"
android:title="@string/change_cover_image"
@ -74,4 +70,12 @@
android:title="@string/use_default"/>
</menu>
</item>
<item
android:id="@+id/cab_copy_to"
android:title="@string/copy_to"
app:showAsAction="never"/>
<item
android:id="@+id/cab_move_to"
android:title="@string/move_to"
app:showAsAction="never"/>
</menu>

View file

@ -5,8 +5,7 @@
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="@string/search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|ifRoom"/>
app:showAsAction="always"/>
<item
android:id="@+id/open_camera"
android:icon="@drawable/ic_camera"

View file

@ -63,6 +63,10 @@
android:id="@+id/exclude_folder"
android:title="@string/exclude"
app:showAsAction="never"/>
<item
android:id="@+id/create_new_folder"
android:title="@string/create_new_folder"
app:showAsAction="never"/>
<item
android:id="@+id/temporarily_show_hidden"
android:title="@string/temporarily_show_hidden"

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="@string/search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|always"/>
</menu>

View file

@ -110,6 +110,14 @@
android:icon="@drawable/ic_rename_new"
android:title="@string/rename"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_print"
android:title="@string/print"
app:showAsAction="never"/>
<item
android:id="@+id/menu_create_shortcut"
android:title="@string/create_shortcut"
app:showAsAction="never"/>
<item
android:id="@+id/menu_show_on_map"
android:title="@string/show_on_map"

View file

@ -65,6 +65,7 @@
<string name="manage_included_folders">إدارة المجلدات المضمنة</string>
<string name="add_folder">اضافة مجلد</string>
<string name="included_activity_placeholder">إذا كان لديك بعض المجلدات التي تحتوي على الملتيميديا ، ولكن لم يتم التعرف عليها من قبل التطبيق، يمكنك إضافتها يدويا هنا.\n
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
\n
لن تؤدي إضافة بعض العناصر هنا إلى استبعاد أي مجلد آخر.</string>
@ -116,12 +117,14 @@
<string name="include_videos">تضمين الفديو</string>
<string name="include_gifs">تضمين GIF</string>
<string name="random_order">ترتيب عشوائي</string>
<string name="use_fade">استخدام تاثير التلاشي</string>
<string name="move_backwards">ارجع للخلف</string>
<string name="loop_slideshow">حلقة عرض الشرائح</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">انتهى عرض الشرائح</string>
<string name="no_media_for_slideshow">لم يتم العثور على وسائط لعرض الشرائح</string>
<string name="use_crossfade_animation">Use crossfade animations</string>
<!-- View types -->
<string name="change_view_type">تغيير طريقة العرض</string>
@ -134,7 +137,11 @@
<string name="do_not_group_files">Do not group files</string>
<string name="by_folder">Folder</string>
<string name="by_last_modified">Last modified</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Date taken</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">File type</string>
<string name="by_extension">Extension</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Manage included folders</string>
<string name="add_folder">Add folder</string>
<string name="included_activity_placeholder">If you have some folders which contain media, but were not recognized by the app, you can add them manually here.\n\nAdding some items here will not exclude any other folder.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Resize</string>
@ -112,12 +113,14 @@
<string name="include_videos">Include videos</string>
<string name="include_gifs">Include GIFs</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="loop_slideshow">Loop slideshow</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<string name="use_crossfade_animation">Use crossfade animations</string>
<!-- View types -->
<string name="change_view_type">Change view type</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Do not group files</string>
<string name="by_folder">Folder</string>
<string name="by_last_modified">Last modified</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Date taken</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">File type</string>
<string name="by_extension">Extension</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>

View file

@ -32,7 +32,7 @@
<string name="fixing">Fixant…</string>
<string name="dates_fixed_successfully">Data fixada correctament</string>
<string name="share_resized">Comparteix una versió redimensionada</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="upgraded_from_free">Hola,\n\nsembla que heu actualitzat des de l\'antiga aplicació gratuïta. Ara podeu desinstal·lar la versió antiga, que té un botó "Actualitza a Pro" a la part superior de la configuració de laplicació.\nNomés seliminaran els elements de la paperera, els elements preferits sense marcar i també caldrà restablirla configuració de la vostra aplicació.\n\nGràcies!</string>
<!-- Filter -->
<string name="filter_media">Filtre darxius</string>
@ -63,6 +63,7 @@
<string name="manage_included_folders">Gestionar carpetes incloses</string>
<string name="add_folder">Agregar carpeta</string>
<string name="included_activity_placeholder">Si tens alguna carpeta que contingui multimèdia però no ha estat reconeguda per la aplicació, pots agregar-les manualment aquí.</string>
<string name="no_media_add_included">No sha trobat cap fitxer multimèdia. Podeu resoldre-ho afegint manualment les carpetes que contenen fitxers multimèdia.</string>
<!-- Resizing -->
<string name="resize">Redimensionar</string>
@ -112,12 +113,14 @@
<string name="include_videos">Inclou vídeos</string>
<string name="include_gifs">Inclou GIFs</string>
<string name="random_order">Ordre aleatori</string>
<string name="use_fade">Utilitza animacions de desaparició</string>
<string name="move_backwards">Moure cap enrere</string>
<string name="loop_slideshow">Presentació de diapositives</string>
<string name="animation">Animació</string>
<string name="no_animation">Cap</string>
<string name="fade">Esvair</string>
<string name="slide">Lliscar</string>
<string name="slideshow_ended">Sha acabat la presentació de diapositives</string>
<string name="no_media_for_slideshow">No shan trobat mitjans per a la presentació de diapositives</string>
<string name="use_crossfade_animation">Utilitzeu animacions creuades</string>
<!-- View types -->
<string name="change_view_type">Canviar el tipus de vista</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">No agrupar fitxers</string>
<string name="by_folder">Carpeta</string>
<string name="by_last_modified">Darrer modificat</string>
<string name="by_last_modified_daily">Darrer modificat (diari)</string>
<string name="by_last_modified_monthly">Darrer modificat (mensual)</string>
<string name="by_date_taken">Data de presa</string>
<string name="by_date_taken_daily">Data de presa (diari)</string>
<string name="by_date_taken_monthly">Data de presa (mensual)</string>
<string name="by_file_type">Tipus de fitxer</string>
<string name="by_extension">Extensió</string>
<string name="grouping_and_sorting">Tingueu en compte que lagrupació i la classificació són 2 camps independents</string>
@ -216,12 +223,12 @@
<string name="faq_11_text">Si, només heu dutilitzar lítem del menú \"Agrupar per\" mentre es troba a la vista en miniatura. Podeu agrupar fitxers amb diversos criteris, inclòs data de presa. Si utilitzeu la funció \"Mostra el contingut de totes les carpetes\", també podeu agrupar-les per carpetes.</string>
<string name="faq_12_title">Lordenació per data que de presa no sembla funcionar correctament, com puc solucionar-ho?</string>
<string name="faq_12_text">Probablement, els fitxers es copiïn en un lloc incorrecte. Podeu arreglar-ho si seleccioneu les miniatures del fitxer i seleccioneu \"Fixar data de presa\".</string>
<string name="faq_13_title">I see some color banding on the images. How can I improve the quality?</string>
<string name="faq_13_text">The current solution for displaying images works fine in the vast majority of cases, but if you want even better image quality, you can enable the \"Show images in the highest possible quality\" at the app settings, in the \"Deep zoomable images\" section.</string>
<string name="faq_14_title">I have hidden a file/folder. How can I unhide it?</string>
<string name="faq_14_text">You can either press the \"Temporarily show hidden items\" menu item at the main screen, or toggle \"Show hidden items\" in the app settings to see the hidden item. If you want to unhide it, just long press it and select \"Unhide\". Folders are hidden by adding a hidden \".nomedia\" file into them, you can delete the file with any file manager too.</string>
<string name="faq_15_title">Why does the app take up so much space?</string>
<string name="faq_15_text">App cache can take up to 250MB, it ensures quicker image loading. If the app is taking up even more space, it is most likely caused by you having items in the Recycle Bin. Those files count to the app size. You can clear the Recycle bin by opening it and deleting all files, or from the app settings. Every file in the Bin is deleted automatically after 30 days.</string>
<string name="faq_13_title">Veig algunes bandes de colors a les imatges. Com puc millorar la qualitat?</string>
<string name="faq_13_text">La solució actual per mostrar imatges funciona bé en la gran majoria dels casos, però si voleu obtenir una millor qualitat d\'imatge, podeu activar \"Mostra les imatges amb la màxima qualitat possible\" a la configuració de laplicació, a la secció \"Imatges ampliades a mida\".</string>
<string name="faq_14_title">He amagat un fitxer / carpeta. Com puc mostrar-la?</string>
<string name="faq_14_text">Podeu prémer lelement de menú \"Mostra temporalment elements ocults\" a la pantalla principal o canviar \"Mostra els elements ocults\" a la configuració de laplicació per veure lelement amagat. Si voleu mostrar-la sempre, premeu-la i seleccioneu \"Mostra\". Les carpetes s\'amaguen afegint un fitxer \".nomedia\" ocult en elles, també podeu eliminar el fitxer amb qualsevol gestor de fitxers.</string>
<string name="faq_15_title">Per què laplicació ocupa molt despai?</string>
<string name="faq_15_text">La memòria cau daplicacions pot ocupar fins a 250 MB, garanteix una càrrega de les imatges més ràpida. Si laplicació ocupa més espai, probablement sigui per tenir elements a la Paperera de reciclatge. Aquests fitxers compten a la mida de laplicació. Podeu esborrar la paperera de reciclatge obrint-la i suprimint tots els fitxers o des de la configuració de laplicació. Els fitxers de la paperera seliminen automàticament després de 30 dies.</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 -->

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Spravovat přidané složky</string>
<string name="add_folder">Přidat složku</string>
<string name="included_activity_placeholder">Pokud máte nějaké složky obsahující média, ale nebyly aplikací nalezeny, můžete je zde přidat ručně.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Změnit velikost</string>
@ -112,12 +113,14 @@
<string name="include_videos">Zahrnout videa</string>
<string name="include_gifs">Zahrnout GIFy</string>
<string name="random_order">Náhodné pořadí</string>
<string name="use_fade">Použít animaci slábnutí</string>
<string name="move_backwards">Jít opačným směrem</string>
<string name="loop_slideshow">Opakovat prezentaci ve smyčce</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Prezentace skončila</string>
<string name="no_media_for_slideshow">Nebyla nalezena žádná média pro prezentaci</string>
<string name="use_crossfade_animation">Použít animaci prolnutí</string>
<!-- View types -->
<string name="change_view_type">Změnit typ zobrazení</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Neseskupovat soubory</string>
<string name="by_folder">Složky</string>
<string name="by_last_modified">Data poslední úpravy</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Data pořízení</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Typu souboru</string>
<string name="by_extension">Přípony</string>
<string name="grouping_and_sorting">Mějte prosím na paměti, že seskupování a řazení jsou 2 nezávislé hodnoty</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Administrer inkluderede mapper</string>
<string name="add_folder">Tilføj mappe</string>
<string name="included_activity_placeholder">Hvis du har mapper med mediefiler som appen ikke har fundet, kan du manuelt tilføje dem her.\n\nDet vil ikke ekskludere andre mapper.</string>
<string name="no_media_add_included">Ingen mediefiler er fundet. Dette kan løses ved manuelt at tilføje mapper som indeholder mediefiler.</string>
<!-- Resizing -->
<string name="resize">Skaler</string>
@ -112,12 +113,14 @@
<string name="include_videos">Inkluder videoer</string>
<string name="include_gifs">Inkluder GIF\'er</string>
<string name="random_order">Tilfældig rækkefølge</string>
<string name="use_fade">Brug udtonende animationer</string>
<string name="move_backwards">Kør baglæns</string>
<string name="loop_slideshow">Endeløs kørsel</string>
<string name="animation">Animation</string>
<string name="no_animation">Ingen</string>
<string name="fade">Udton</string>
<string name="slide">Glid</string>
<string name="slideshow_ended">Slideshowet endte</string>
<string name="no_media_for_slideshow">Der blev ikke funket nogen mediefiler til slideshowet</string>
<string name="use_crossfade_animation">Anvend crossfade-animationer</string>
<!-- View types -->
<string name="change_view_type">Skift visning</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Gruppér ikke filer</string>
<string name="by_folder">Mappe</string>
<string name="by_last_modified">Sidst ændret</string>
<string name="by_last_modified_daily">Sidst ændret (daglig)</string>
<string name="by_last_modified_monthly">Sidst ændret (månedlig)</string>
<string name="by_date_taken">Eksponeringsdato</string>
<string name="by_date_taken_daily">Eksponeringsdato (daglig)</string>
<string name="by_date_taken_monthly">Eksponeringsdato (månedlig)</string>
<string name="by_file_type">Filtype</string>
<string name="by_extension">Filendelse</string>
<string name="grouping_and_sorting">Vær opmærksom på at gruppering og sortering er to individuelle felter</string>

View file

@ -32,7 +32,7 @@
<string name="fixing">Korrigiere…</string>
<string name="dates_fixed_successfully">Datum erfolgreich korrigiert.</string>
<string name="share_resized">Teile eine verkleinerte Version</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="upgraded_from_free">Hey,\n\nes sieht so aus, als hättest du von der alten kostenlosen App geupgraded. Du kannst nun die alte Version deinstallieren, die oben in den App-Einstellungen einen \'Upgrade auf Pro\' Button hat.\n\nEs wird nur der Papierkorb gelöscht, die Markierungen von Favoriten entfernt und die App-Einstellungen zurückgesetzt.\n\nDanke!</string>
<!-- Filter -->
<string name="filter_media">Filter</string>
@ -63,6 +63,7 @@
<string name="manage_included_folders">Einbezogene Ordner verwalten</string>
<string name="add_folder">Ordner hinzufügen</string>
<string name="included_activity_placeholder">Solltest du weitere Mediendateien haben, die von der App nicht gefunden wurden, kannst du deren Ordner hier manuell hinzufügen.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Größe ändern</string>
@ -112,12 +113,14 @@
<string name="include_videos">Videos verwenden</string>
<string name="include_gifs">GIFs verwenden</string>
<string name="random_order">Zufällige Reihenfolge</string>
<string name="use_fade">Übergänge animieren</string>
<string name="move_backwards">Rückwärts abspielen</string>
<string name="loop_slideshow">Endlos abspielen</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Diashow beendet.</string>
<string name="no_media_for_slideshow">Keine Medien für Diashow gefunden.</string>
<string name="use_crossfade_animation">Verwende Überblendanimationen</string>
<!-- View types -->
<string name="change_view_type">Darstellung ändern</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Dateien nicht gruppieren</string>
<string name="by_folder">Ordner</string>
<string name="by_last_modified">Datum der letzten Änderung</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Aufnahmedatum</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Dateityp (Bilder/Videos)</string>
<string name="by_extension">Dateierweiterung</string>
<string name="grouping_and_sorting">Bitte beachte, dass Gruppieren und Sortieren zwei unabhängige Felder sind.</string>
@ -219,12 +226,12 @@
<string name="faq_13_text">Die jetzige Methode für die Anzeige von Bildern funktioniert gut, aber für eine noch bessere Bildqualität kann die Einstellung \"Zeige Bilder in der höchstmöglichen Qualität\" im Menü unter \"Stark vergrösserbare Bilder\" gesetzt werden.</string>
<string name="faq_14_title">Ich habe eine versteckte Datei bzw. einen versteckten Ordner. Wie kann ich diese/n sichtbar stellen?</string>
<string name="faq_14_text">Du kannst entweder auf \"Verstecktes temporär anzeigen\" im Hauptmenü drücken oder die Einstellung \"Versteckte Elemente anzeigen\" setzen. Wenn du es sichtbar einstellen willst, drücke lange darauf und wähle \"Nicht verstecken\" aus. Ordner werden durch eine versteckte, in ihnen gespeicherte \".nomedia\"-Datei versteckt und das Löschen der Datei ist mit jedem Dateimanger möglich.</string>
<string name="faq_15_title">Why does the app take up so much space?</string>
<string name="faq_15_text">App cache can take up to 250MB, it ensures quicker image loading. If the app is taking up even more space, it is most likely caused by you having items in the Recycle Bin. Those files count to the app size. You can clear the Recycle bin by opening it and deleting all files, or from the app settings. Every file in the Bin is deleted automatically after 30 days.</string>
<string name="faq_15_title">Warum beansprucht die App so viel Speicherplatz?</string>
<string name="faq_15_text">Der Cache der App kann bis zu 250 MB groß werden und sorgt dafür, dass die Bilder schneller geladen werden. Wenn die App noch mehr Speicherplatz beansprucht, liegt das wahrscheinlich daran, dass der Papierkorb zu voll ist. Diese Dateien zählen zum Speicherplatz der App dazu. Du kannst den Papierkorb leeren, indem du ihn öffnest und alle Dateien darin löschst, oder den entsprechenden Button in den Einstellungen betätigst. All 30 Tage wird der Papierkorb automatisch geleert.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro: Photo Manager &amp; Editor</string>
<string name="app_title">Schlichte Galerie Pro: Foto Manager &amp; Editor</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Galerie ohne Werbung. Ordnen, Bearbeiten und Wiederherstellen von Fotos &amp; Videos</string>
<string name="app_long_description">
@ -256,10 +263,10 @@
• Schlichte Galerie Pro ist Open Source
… und viele, viele mehr!
<b>FOTO EDITOR</b>
<b>FOTOEDITOR</b>
Schlichte Galerie Pro macht es schnell und einfach deine Bilder zu bearbeiten. Schneide Bilder zu, drehe sie und ändere die Größe. Wenn du dich etwas kreativer fühlst, kannst du Filter hinzufügen und auf deinen Bildern malen!
<b>UNTERSTÜTZUNG FÜR VIELE DATEITYPEEN</b>
<b>UNTERSTÜTZUNG FÜR VIELE DATEITYPEN</b>
Im Gegensatz zu einigen anderen Galerien unterstütz Schlichte Galerie Pro eine Vielzahl verschiedener Dateitypen. Unter anderem JPEG, PNG, MP4, MKV, RAW, SVG, Panoramabilder, Panoramavideos und viele mehr.
<b>STARK INDIVIDUALISIERBARE GALERIE</b>
@ -268,7 +275,7 @@
<b>WIEDERHERSTELLUNG GELÖSCHTER FOTOS &amp; VIDEOS</b>
Versehentlich ein wertvolles Foto oder Video gelöscht? Keine Sorge! Schlichte Galerie Pro verfügt über einen praktischen Papierkorb, aus dem du gelöschte Bilder &amp; Videos leicht wiederherstellen kannst.
<b>SCHÜTZE &amp; VERSTECKE FOTOS, VIDEOS &amp; DATEIEN</b>
<b>SCHÜTZE UND VERSTECKE FOTOS, VIDEOS &amp; DATEIEN</b>
Mit einem PIN, Muster oder dem Fingerabdrucksensor deines Gerätes kannst du Fotos, Videos und komplette Alben verstecken und schützen. Du kannst auch die App selber schützen oder bestimmte Funktionen der App sperren. Beispielsweise kannst du eine Datei nicht ohne Scan des Fingerabdrucks löschen, um deine Dateien vor versehentlichem Löschen zu schützen.
<b>Schau dir die vollständige Serie der Schlichten Apps hier an:</b>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Gallery</string>
<string name="app_launcher_name">Gallery</string>
<string name="app_name">Απλή Συλλογή</string>
<string name="app_launcher_name">Συλλογή</string>
<string name="edit">Επεξεργασία</string>
<string name="open_camera">Άνοιγμα κάμερας</string>
<string name="hidden">(κρυφά)</string>
@ -49,9 +49,9 @@
<string name="exclude">Εξαίρεση</string>
<string name="excluded_folders">Εξαίρεση φακέλων</string>
<string name="manage_excluded_folders">Διαχείριση εξαιρεμένων φακέλων</string>
<string name="exclude_folder_description">Αυτό θα εξαιρέσει το επιλεγμένο μαζί με τους υποφακέλους από το Simple Gallery μόνο. Μπορείτε να διαχειριστείτε τους φακέλους που εξαιρέθηκαν στις Ρυθμίσεις.</string>
<string name="exclude_folder_description">Αυτό θα εξαιρέσει το επιλεγμένο μαζί με τους υποφακέλους από την Απλή Συλλογή μόνο. Μπορείτε να διαχειριστείτε τους φακέλους που εξαιρέθηκαν στις Ρυθμίσεις.</string>
<string name="exclude_folder_parent">Να εξαιρεθεί μήπως ο γονικός φάκελος;</string>
<string name="excluded_activity_placeholder">Εξαιρώντας τους φακέλους, θα τους αποκρύψει μαζί με τους υποφακέλους τους μόνο στο Simple Gallery, θα είναι ορατοί στις υπόλοιπες εφαρμογές.\n\nΑν θέλετε να τους αποκρύψετε και στις υπόλοιπες εφαρμογές, χρησιμοποιήστε την λειτουργία Απόκρυψη.</string>
<string name="excluded_activity_placeholder">Εξαιρώντας τους φακέλους, θα τους αποκρύψει μαζί με τους υποφακέλους τους μόνο στην Απλή Συλλογή, θα είναι ορατοί στις υπόλοιπες εφαρμογές.\n\nΑν θέλετε να τους αποκρύψετε και στις υπόλοιπες εφαρμογές, χρησιμοποιήστε την λειτουργία Απόκρυψη.</string>
<string name="remove_all">Διαγραφή όλων</string>
<string name="remove_all_description">Να αφαιρεθούν όλοι οι φάκελοι από την λίστα των εξαιρεμένων; Αυτό δεν θα διαγράψει τους φακέλους.</string>
<string name="hidden_folders">Κρυφοί φάκελοι</string>
@ -63,6 +63,7 @@
<string name="manage_included_folders">Διαχείριση φακέλων που συμπεριλαμβάνονται</string>
<string name="add_folder">Προσθήκη φακέλου</string>
<string name="included_activity_placeholder">Αν υπάρχουν κάποιοι φάκελοι που περιέχουν πολυμέσα, αλλά δεν αναγνωρίζονται από την εφαρμογή, μπορείτε να τους προσθέσετε χειροκίνητα εδώ.\n\nΗ προσθήκη στοιχείων εδώ, δεν θα εξαιρέσει κάποιον άλλο φάκελο.</string>
<string name="no_media_add_included">Δεν βρέθηκαν αρχεία πολυμέσων. Μπορεί να λυθεί αυτό, προσθέτοντας τους φακέλους που περιέχουν αρχεία πολυμέσων με μη αυτόματο τρόπο.</string>
<!-- Resizing -->
<string name="resize">Αλλαγή μεγέθους</string>
@ -93,7 +94,7 @@
<string name="other_aspect_ratio">Άλλο</string> <!-- available as an option: 1:1, 4:3, 16:9, free, other -->
<!-- Set wallpaper -->
<string name="simple_wallpaper">Simple Wallpaper</string>
<string name="simple_wallpaper">Απλή Συλλογή</string>
<string name="set_as_wallpaper">Εφαρμογή ως ταπετσαρία</string>
<string name="set_as_wallpaper_failed">Η εφαρμογή ως ταπετσαρία απέτυχε</string>
<string name="set_as_wallpaper_with">Εφαρμογή ως ταπετσαρία με:</string>
@ -103,7 +104,7 @@
<string name="landscape_aspect_ratio">Αναλογία σε οριζόντια προβολή</string>
<string name="home_screen">Αρχική οθόνη</string>
<string name="lock_screen">Οθόνη κλειδώματος</string>
<string name="home_and_lock_screen">Αρχική οθόνη και κλειδώματος</string>
<string name="home_and_lock_screen">Αρχική και Οθόνη Κλειδώματος</string>
<!-- Slideshow -->
<string name="slideshow">Παρουσίαση διαφανιών</string>
@ -112,12 +113,14 @@
<string name="include_videos">Συμπερίληψη βίντεο</string>
<string name="include_gifs">Συμπερίληψη GIFs</string>6
<string name="random_order">Τυχαία σειρά</string>
<string name="use_fade">Εφέ σταδιακής αλλαγής</string>
<string name="move_backwards">Κίνηση προς τα πίσω</string>
<string name="loop_slideshow">Επανάληψη εμφάνισης διαφανιών</string>
<string name="loop_slideshow">Επανάληψη εμφάνισης διαφανειών</string>
<string name="animation">Κινήσεις</string>
<string name="no_animation">Χωρίς</string>
<string name="fade">Εξασθένηση</string>
<string name="slide">Ολίσθηση</string>
<string name="slideshow_ended">Η εμφάνιση διαφανειών τελείωσε</string>
<string name="no_media_for_slideshow">Δεν βρέθηκαν πολυμέσα για την εμφάνιση διαφανειών</string>
<string name="use_crossfade_animation">Χρήση κίνησης εικόνων με διαγώνιο ξεθώριασμα</string>
<!-- View types -->
<string name="change_view_type">Αλλαγή τύπου εμφάνισης</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Χωρίς</string>
<string name="by_folder">Φάκελο</string>
<string name="by_last_modified">Τελευταία τροπ/ηση</string>
<string name="by_last_modified_daily">Τελευταία τροπ/ηση (ημερήσια)</string>
<string name="by_last_modified_monthly">Τελευταία τροπ/ηση (μηνιαία)</string>
<string name="by_date_taken">Ημερομ. λήψης</string>
<string name="by_date_taken_daily">Ημερομ. λήψης (ημερήσια)</string>
<string name="by_date_taken_monthly">Ημερομ. λήψης (μηνιαία)</string>
<string name="by_file_type">Τύπο αρχείου</string>
<string name="by_extension">Επέκταση</string>
<string name="grouping_and_sorting">Σημειώστε ότι ομαδοποίηση και ταξινόμηση είναι 2 ανεξάρτητα πεδία</string>
@ -192,9 +199,9 @@
<string name="toggle_file_visibility">Εναλλαγή προβολής αρχείου</string>
<!-- FAQ -->
<string name="faq_1_title">Πώς μπορώ να κάνω το Simple Gallery προεπιλεγμένη εφαρμογή συλλογής πολυμέσων;</string>
<string name="faq_1_title">Πώς μπορώ να κάνω την Απλή Συλλογή προεπιλεγμένη εφαρμογή συλλογής πολυμέσων;</string>
<string name="faq_1_text">Αρχικά πρέπει να βρείτε την τρέχουσα προεπιλεγμένη εφαρμογή γκάλερι στις Ρυθμίσεις (τμήμα Εφαρμογών) της συσκευής. Αναζητήστε για ένα κουμπί που αναφέρει κάτι σαν \"Άνοιγμα με προεπιλογή\", πατήστε το, μετά επιλέξτε \"Καθαρισμός προεπιλεγμένων\".
Την επόμενη φορά που θα προσπαθήσετε να ανοίξετε μία εικόνα ή ένα βίντεο θα πρέπει να δείτε έναν διάλογο επιλογής εφαρμογών, όπου μπορείτε να επιλέξετε Simple Gallery να το κάνετε προεπιλεγμένη εφαρμογή.</string>
Την επόμενη φορά που θα προσπαθήσετε να ανοίξετε μία εικόνα ή ένα βίντεο θα πρέπει να δείτε έναν διάλογο επιλογής εφαρμογών, όπου μπορείτε να επιλέξετε Απλή Συλλογή να την κάνετε προεπιλεγμένη εφαρμογή.</string>
<string name="faq_2_title">Κλείδωσα την εφαρμογή με κωδικό, αλλά τον ξέχασα. Τι μπορώ να κάνω;</string>
<string name="faq_2_text">Υπάρχουν 2 λύσεις. Είτε επανεγκατάσταση της εφαρμογής, ή να εντοπίσετε την εφαρμογή στις ρυθμίσεις της συσκευής και να επιλέξετε \"Καθαρισμό δεδομένων\". Θα επαναφέρει όλες τις ρυθμίσεις και δεν θα σβήσει κάποιο αρχείο πολυμέσου.</string>
<string name="faq_3_title">Πώς μπορώ να κάνω ένα άλμπουμ να φαίνεται στην κορυφή;</string>
@ -202,7 +209,7 @@
<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">Η εξαίρεση δεν επιτρέπει την εμφάνιση του φακέλου μόνο στο Simple Gallery, ενώ η απόκρυψη λειτουργεί σε επίπεδο συστήματος και θα αποκρύψει τον φάκελο και από άλλες εφαρμογές γκάλερι. Λειτουργεί δημιουργώντας ένα άδειο \".nomedia\" αρχείο στον επιλεγμένο φάκελο, το οποίο μπορείτε να το διαγράψετε και με οποιονδήποτε διαχειριστή αρχείων.</string>
<string name="faq_5_text">Η εξαίρεση δεν επιτρέπει την εμφάνιση του φακέλου μόνο στην Απλή Συλλογή, ενώ η απόκρυψη λειτουργεί σε επίπεδο συστήματος και θα αποκρύψει τον φάκελο και από άλλες εφαρμογές γκάλερι. Λειτουργεί δημιουργώντας ένα άδειο \".nomedia\" αρχείο στον επιλεγμένο φάκελο, το οποίο μπορείτε να το διαγράψετε και με οποιονδήποτε διαχειριστή αρχείων.</string>
<string name="faq_6_title">Γιατί εμφανίζονται φάκελοι με εξώφυλλο μουσικής ή αυτόκολλητα;</string>
<string name="faq_6_text">Είναι πιθανόν να δείτε κάποια περίεργα άλμπουμ να εμφανίζονται. Μπορείτε να τα εξαιρέσετε εύκολα με παρατεταμένο άγγιγμα και επιλογή του Εξαίρεση. Στον επόμενο διάλογο μπορείτε να επιλέξετε επάνω φάκελο. Είναι πιθανό να μην επιτρέψει την εμφάνιση και άλλων σχετικών άλμπουμ.</string>
<string name="faq_7_title">Ένας φάκελος με εικόνες δεν εμφανίζεται. Τι μπορώ να κάνω;</string>
@ -225,27 +232,27 @@
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Απλή Συλλογή Pro: Διαχείριση &amp; Επεξεργασία</string>
<string name="app_title">ΑΠΛΗ ΣΥΛΛΟΓΗ Pro: Διαχείριση &amp; Επεξεργασία</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Μια Offline gallery χωρίς διαφ/σεις. Επεξεργασία ανάκτηση προστασία Φωτό-Βίντεο</string>
<string name="app_short_description">Μια Offline Συλλογή χωρίς διαφ/σεις. Επεξεργασία ανάκτηση προστασία Φωτό-Βίντεο</string>
<string name="app_long_description">
Η Simple Gallery Pro είναι εκτός σύνδεσης και εξαιρετικά προσαρμόσιμη. Οργανώστε και επεξεργαστείτε τις φωτογραφίες σας, ανακτήσετε διαγραμμένα αρχεία απο τον κάδο ανακύκλωσης, προστατεύσετε και αποκρύψτε αρχεία, προβάλετε πλήθος διαφορετικών φωτογραφιών και μορφών βίντεο, συμπεριλαμβανομένων των RAW, SVG και πολλών άλλων.
Η Απλή Συλλογή Pro είναι εκτός σύνδεσης και εξαιρετικά προσαρμόσιμη. Οργανώστε και επεξεργαστείτε τις φωτογραφίες σας, ανακτήσετε διαγραμμένα αρχεία απο τον κάδο ανακύκλωσης, προστατεύσετε και αποκρύψτε αρχεία, προβάλετε πλήθος διαφορετικών φωτογραφιών και μορφών βίντεο, συμπεριλαμβανομένων των RAW, SVG και πολλών άλλων.
Η εφαρμογή δεν περιέχει διαφημίσεις και περιττά δικαιώματα. Εφόσον δεν απαιτεί πρόσβαση στο διαδίκτυο, έτσι προστατεύεται το απόρρητό σας.
-------------------------------------------------
<b>ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ-SIMPLE GALLERY PRO</b>
<b>ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ-ΑΠΛΗΣ ΣΥΛΛΟΓΗΣ PRO</b>
-------------------------------------------------
• Εκτός σύνδεσης χωρίς διαφημίσεις ή αναδυόμενα παράθυρα
Simple gallery photo editor κόψιμο, περιστροφή, αλλαγή μεγέθους, σχεδίαση, φίλτρα και άλλα
Απλής Συλλογής Επεξεργαστής κόψιμο, περιστροφή, αλλαγή μεγέθους, σχεδίαση, φίλτρα και άλλα
• Δεν απαιτείται πρόσβαση στο διαδίκτυο, παρέχοντας μεγαλύτερη προστασία της ιδιωτικής ζωής και ασφάλειας
• Δεν απαιτούνται περιττά δικαιώματα
• Γρήγορη αναζήτηση εικόνων, βίντεο και αρχείων
• Άνοιγμα και προβολή πολλών διαφορετικών τύπων φωτογραφιών και βίντεο (RAW, SVG, πανοραμική κλπ)
Μια ποικιλία διαισθητικών χειρονομιών για εύκολη επεξεργασία και οργάνωση αρχείων
• Πολλοί τρόποι για φιλτράρισμα, ομαδοποίησης και ταξινόμησης αρχείων
• Προσαρμογή εμφάνισης του Simple Gallery Pro
• Προσαρμογή εμφάνισης της Απλής Συλλογής Pro
• Διατίθεται σε 32 γλώσσες
• Σημειώστε τα αρχεία ως αγαπημένα για γρήγορη πρόσβαση
• Προστατέψτε τις φωτογραφίες σας και βίντεο με μοτίβο, κωδικό ή δακτυλικό αποτύπωμα
@ -254,20 +261,20 @@
• Εναλλαγή προβολής αρχείων για απόκρυψη φωτογραφιών και Βίντεο
• Δημιουργήστε μια προσαρμόσιμη παρουσίαση των αρχείων σας
• Δείτε λεπτομερείς πληροφορίες των αρχείων σας (ανάλυση, τιμές EXIF κλπ.)
Η Simple Gallery Pro είναι ανοικτού κώδικα
Η Απλή Συλλογή Pro είναι ανοικτού κώδικα
… και πάρα πολλά ακόμα!
<b>ΕΞΕΡΓΑΣΤΗΣ PHOTO GALLERY</b>
Η Simple Gallery Pro σας διευκολύνει να επεξεργαστείτε τις φωτογραφίες σας άμεσα. Περικοπή, αναστροφή, περιστροφή και αλλαγή μεγέθους των εικόνων σας. Εάν αισθάνεστε λίγο πιο δημιουργικοί, μπορείτε να προσθέσετε φίλτρα και σχεδίαση στις φωτογραφίες σας!
<b>ΕΞΕΡΓΑΣΤΗΣ ΑΠΛΗΣ ΣΥΛΛΟΓΗΣ</b>
Η Απλή Συλλογή Pro σας διευκολύνει να επεξεργαστείτε τις φωτογραφίες σας άμεσα. Περικοπή, αναστροφή, περιστροφή και αλλαγή μεγέθους των εικόνων σας. Εάν αισθάνεστε λίγο πιο δημιουργικοί, μπορείτε να προσθέσετε φίλτρα και σχεδίαση στις φωτογραφίες σας!
<b>ΥΠΟΣΤΗΡΙΞΗ ΠΟΛΛΩΝ ΤΥΠΩΝ ΑΡΧΕΙΩΝ</b>
Σε αντίθεση με κάποιες άλλες εφαρμογές η Simple Gallery Pro υποστηρίζει ένα τεράστιο φάσμα διαφορετικών τύπων αρχείων, όπως JPEG, PNG, MP4, MKV, RAW, SVG, Πανοραμικές φωτογραφίες, βίντεο πανοραμικών και πολλά άλλα.
Σε αντίθεση με κάποιες άλλες εφαρμογές η Απλή Συλλογή Pro υποστηρίζει ένα τεράστιο φάσμα διαφορετικών τύπων αρχείων, όπως JPEG, PNG, MP4, MKV, RAW, SVG, Πανοραμικές φωτογραφίες, βίντεο πανοραμικών και πολλά άλλα.
<b>ΠΟΛΥ ΠΡΟΣΑΡΜΟΣΙΜΟΣ ΔΙΑΧΕΙΡΙΣΤΗΣ GALLERY</b>
Από το UI στα κουμπιά λειτουργιών στην κάτω γραμμή εργαλείων, η Simple Gallery Pro είναι ιδιαίτερα προσαρμόσιμη και λειτουργεί όπως εσείς θέλετε. Καμιά άλλη εφαρμογή δεν έχει τέτοια ευελιξία! Χάρη στον ανοιχτό κώδικα, είναι επίσης διαθέσιμη σε 32 γλώσσες!
<b>ΠΟΛΥ ΠΡΟΣΑΡΜΟΣΙΜΟΣ ΔΙΑΧΕΙΡΙΣΤΗΣ ΣΥΛΛΟΓΗΣ</b>
Από το UI στα κουμπιά λειτουργιών στην κάτω γραμμή εργαλείων, η Απλή Συλλογή Pro είναι ιδιαίτερα προσαρμόσιμη και λειτουργεί όπως εσείς θέλετε. Καμιά άλλη εφαρμογή δεν έχει τέτοια ευελιξία! Χάρη στον ανοιχτό κώδικα, είναι επίσης διαθέσιμη σε 32 γλώσσες!
<b>ΕΠΑΝΑΦΟΡΑ ΔΙΑΓΡΑΜΕΝΩΝ ΦΩΤΟ ΚΑΙ ΒΙΝΤΕΟ</b>
Διαγράψατε τυχαία μια πολύτιμη φωτογραφία ή βίντεο; Μην ανησυχείτε! Η Simple Gallery Pro διαθέτει έναν εύχρηστο κάδο ανακύκλωσης όπου μπορείτε να ανακτήσετε τις διαγραμμένες φωτογραφίες και βίντεο πανεύκολα.
Διαγράψατε τυχαία μια πολύτιμη φωτογραφία ή βίντεο; Μην ανησυχείτε! Η Απλή Συλλογή Pro διαθέτει έναν εύχρηστο κάδο ανακύκλωσης όπου μπορείτε να ανακτήσετε τις διαγραμμένες φωτογραφίες και βίντεο πανεύκολα.
<b>ΠΡΟΣΤΑΣΙΑ ΚΑΙ ΑΠΟΚΡΥΨΗ ΑΡΧΕΙΩΝ ΦΩΤΟ ΚΑΙ ΒΙΝΤΕΟ</b>
Χρησιμοποιώντας κωδικό, μοτίβο ή τον σαρωτή δακτυλικών αποτυπωμάτων της συσκευής σας, μπορείτε να προστατεύσετε και να αποκρύψετε φωτογραφίες, βίντεο ή ολόκληρα άλμπουμ. Μπορείτε να προστατεύσετε την ίδια την εφαρμογή ή να κλειδώσετε συγκεκριμένες λειτουργίες της. Για παράδειγμα, δεν μπορείτε να διαγράψετε ένα αρχείο χωρίς χρήση των δακτυλικών αποτυπωμάτων, συμβάλλοντας στην προστασία των αρχείων σας από τυχαία διαγραφή.

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Gestionar carpetas incluidas</string>
<string name="add_folder">Agregar carpeta</string>
<string name="included_activity_placeholder">Si tiene algunas carpetas que contengan multimedia, pero que no fueron reconocidas por la aplicación, puede agregarlas manualmente aquí.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Redimensionar</string>
@ -112,12 +113,14 @@
<string name="include_videos">Incluir vídeos</string>
<string name="include_gifs">Incluir GIFs</string>
<string name="random_order">Orden aleatorio</string>
<string name="use_fade">Usar animaciones de desvanecimiento</string>
<string name="move_backwards">Mover hacia atrás</string>
<string name="loop_slideshow">Presentación de diapositivas</string>
<string name="animation">Animación</string>
<string name="no_animation">Ninguna</string>
<string name="fade">Fusión</string>
<string name="slide">Desplazamineto</string>
<string name="slideshow_ended">La diapositiva terminó</string>
<string name="no_media_for_slideshow">No se han encontrado medios para la presentación de diapositivas</string>
<string name="use_crossfade_animation">Usa animaciones de crossfade.</string>
<!-- View types -->
<string name="change_view_type">Cambiar tipo de vista</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">No agrupar ficheros</string>
<string name="by_folder">Carpeta</string>
<string name="by_last_modified">Último modificado</string>
<string name="by_date_taken">Data de toma</string>
<string name="by_last_modified_daily">Último modificado (diario)</string>
<string name="by_last_modified_monthly">Último modificado (mensual)</string>
<string name="by_date_taken">Fecha de toma</string>
<string name="by_date_taken_daily">Fecha de toma (diario)</string>
<string name="by_date_taken_monthly">Fecha de toma (mensual)</string>
<string name="by_file_type">Tipo de fichero</string>
<string name="by_extension">Extensión</string>
<string name="grouping_and_sorting">Tenga en cuenta que la agrupación y la clasificación son 2 campos independientes</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Hallitse sisällettyjä kansioita</string>
<string name="add_folder">Lisää kansio</string>
<string name="included_activity_placeholder">Jos sinulla on kansioita, jotka sisältää mediaa, mutta sovellus ei tunnistanut, voit lisätä ne manuaalisesti tähän.\n\Lisääminen ei poissulje muita kansioita.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Rajaa</string>
@ -112,12 +113,14 @@
<string name="include_videos">Sisällytä Videot</string>
<string name="include_gifs">Sisällytä GIFit</string>
<string name="random_order">Satunnainen järjestys</string>
<string name="use_fade">Käytä häivitys-animaatiota</string>
<string name="move_backwards">Liiku takaisinpäin</string>
<string name="loop_slideshow">Jatkuva diaesitys</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Diaesitys päättyi</string>
<string name="no_media_for_slideshow">Mediaa diaesitykseen ei löytynyt</string>
<string name="use_crossfade_animation">Use crossfade animations</string>
<!-- View types -->
<string name="change_view_type">Vaihda näkymää</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Do not group files</string>
<string name="by_folder">Folder</string>
<string name="by_last_modified">Last modified</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Date taken</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">File type</string>
<string name="by_extension">Extension</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Gérer les dossiers ajoutés</string>
<string name="add_folder">Ajouter un dossier</string>
<string name="included_activity_placeholder">Si vous avez des dossiers contenant des médias qui ne sont pas affichés dans l\'application, vous pouvez les ajouter manuellement ici.\n\nCet ajout n\'exclura aucun autre dossier.</string>
<string name="no_media_add_included">Aucun fichier multimédia n\'a été trouvé. Vous pouvez ajouter manuellement des dossiers contenant des fichiers multimédia.</string>
<!-- Resizing -->
<string name="resize">Redimensionner</string>
@ -112,12 +113,14 @@
<string name="include_videos">Inclure les vidéos</string>
<string name="include_gifs">Inclure les GIFs</string>
<string name="random_order">Ordre aléatoire</string>
<string name="use_fade">Utiliser un fondu</string>
<string name="move_backwards">Défilement inverse</string>
<string name="loop_slideshow">Diaporama en boucle</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Diaporama terminé</string>
<string name="no_media_for_slideshow">Aucun média trouvé pour le diaporama</string>
<string name="use_crossfade_animation">Utiliser des animations en fondu enchaîné</string>
<!-- View types -->
<string name="change_view_type">Changer de mode d\'affichage</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Ne pas grouper les fichiers</string>
<string name="by_folder">Dossier</string>
<string name="by_last_modified">Date de modification</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Date de prise de vue</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Type de fichier</string>
<string name="by_extension">Extension</string>
<string name="grouping_and_sorting">Notez que grouper et trier sont 2 modes de tri indépendants</string>
@ -167,7 +174,7 @@
<string name="hide_extended_details">Cacher les informations supplémentaires si la barre d\'état est masquée</string>
<string name="show_at_bottom">Afficher les boutons d\'action</string>
<string name="show_recycle_bin">Afficher la corbeille en vue \"Dossier\"</string>
<string name="deep_zoomable_images">Niveau de zoom maximal des images</string>
<string name="deep_zoomable_images">Niveau de zoom</string>
<string name="show_highest_quality">Afficher les images avec la meilleur qualité possible</string>
<string name="show_recycle_bin_last">Afficher la corbeille en fin de liste sur l\'écran principal</string>
<string name="allow_down_gesture">Fermer la vue plein écran par un geste vers le bas</string>
@ -218,8 +225,8 @@
<string name="faq_13_text">La solution actuelle d\'affichage des images fonctionne bien dans la grande majorité des cas, mais si vous voulez une qualité d\'image encore meilleure, vous pouvez activer l\'option \"Afficher les images avec la plus haute qualité possible\" dans la section \"Niveau de zoom maximal des images\" des paramètres de l\'application.</string>
<string name="faq_14_title">J\'ai caché un fichier ou un dossier. Comment puis-je en rétablir l\'affichage ?</string>
<string name="faq_14_text">Vous pouvez soit appuyer sur l\'option \"Afficher les fichiers cachés\" du menu de l\'écran principal, ou appuyer sur le bouton \"Afficher les éléments cachés\" dans les paramètres de l\'application. Si vous voulez rétablir leur affichage, effectuez un appui prolongé dessus et appuyez sur le symbole \"Œil\" permettant l\'affichage. Les dossiers sont cachés en ajoutant un fichier \".nomedia\" à leur racine, vous pouvez également supprimer ce fichier avec n\importe quel explorateur de fichiers.</string>
<string name="faq_15_title">Why does the app take up so much space?</string>
<string name="faq_15_text">App cache can take up to 250MB, it ensures quicker image loading. If the app is taking up even more space, it is most likely caused by you having items in the Recycle Bin. Those files count to the app size. You can clear the Recycle bin by opening it and deleting all files, or from the app settings. Every file in the Bin is deleted automatically after 30 days.</string>
<string name="faq_15_title">Pourquoi l\'application prend-elle tant de place ?</string>
<string name="faq_15_text">Le cache d\'application peut prendre jusqu\'à 250 Mo pour accélérer le chargement des images. Si l\'application occupe encore plus d\'espace, c\'est probablement parce que vous avez des éléments dans la corbeille. Ces fichiers comptent pour la taille de l\'application. Vous pouvez vider la corbeille en l\'ouvrant et en supprimant tous les fichiers ou à partir des paramètres de l\'application. Chaque fichier de la corbeille est automatiquement supprimé après 30 jours.</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 -->

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Xestionar cartafoles incluídos</string>
<string name="add_folder">Engadir cartafol</string>
<string name="included_activity_placeholder">Si ten algún cartafol con medios, mais non foi recoñecido polo aplicativo, pódeo engadir manualmente.\n\nEngadindo aquí elementos non eliminará outros.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Redimensionar</string>
@ -112,12 +113,14 @@
<string name="include_videos">Incluír vídeos</string>
<string name="include_gifs">Incluír GIFs</string>
<string name="random_order">Orde aleatoria</string>
<string name="use_fade">Utilizar animación esvaescente</string>
<string name="move_backwards">Mover atrás</string>
<string name="loop_slideshow">Reproducir en bucle</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Rematou a presentación</string>
<string name="no_media_for_slideshow">Non se atoparon medios para a presentación</string>
<string name="use_crossfade_animation">Use crossfade animations</string>
<!-- View types -->
<string name="change_view_type">Cambiar o tipo de vista</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Non agrupar ficheiros</string>
<string name="by_folder">Cartafol</string>
<string name="by_last_modified">Último modificado</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Data de captura</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Tipo de ficheior</string>
<string name="by_extension">Extensión</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Upravljajte uključenim mapama</string>
<string name="add_folder">Dodaj mapu</string>
<string name="included_activity_placeholder">Ako imate neke mape koje sadrže medije, ali ih aplikacija nije prepoznala, ručno ih možete dodati ovdje.\n\nDodavanjem nekih stavki ovdje nećete izuzeti bilo koju drugu mapu.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Promjeni veličinu</string>
@ -112,12 +113,14 @@
<string name="include_videos">Dodaj videe</string>
<string name="include_gifs">Dodaj GIF-ove</string>
<string name="random_order">Nasumični redoslijed</string>
<string name="use_fade">Koristi animaciju izbljeđivanja</string>
<string name="move_backwards">Pomakni unatrag</string>
<string name="loop_slideshow">Prikaži dijaprojekciju kao petlju</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Kraj dijaprojekcije</string>
<string name="no_media_for_slideshow">Nema datoteka za dijaprojekciju</string>
<string name="use_crossfade_animation">Koristi prijelazne animacije</string>
<!-- View types -->
<string name="change_view_type">Promijeni vrstu prikaza</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Nemoj grupirati ove datoteke</string>
<string name="by_folder">Mapa</string>
<string name="by_last_modified">Zadnje uređivano</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Datum snimanja</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Tip datoteke</string>
<string name="by_extension">Vrsta datoteke</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Befoglalt mappák kezelése</string>
<string name="add_folder">Mappa hozzáadása</string>
<string name="included_activity_placeholder">Ha vannak olyan mappák, amelyek média fájlokat tartalmaznak, de az alkalmazás nem ismerte fel, akkor kézzel is hozzáadhatja ezeket.\n\nAz elemek hozzáadása nem zár ki más mappákat.</string>
<string name="no_media_add_included">Nem talált médiafájlokat. Ezt megoldhatja a médiafájlokat tartalmazó mappák manuális hozzáadásával.</string>
<!-- Resizing -->
<string name="resize">Átméretezés</string>
@ -113,12 +114,14 @@
<string name="include_videos">Videók befoglalása</string>
<string name="include_gifs">GIF befoglalása</string>
<string name="random_order">Véletlen sorrend</string>
<string name="use_fade">Halványuló animáció használat</string>
<string name="move_backwards">Áthelyezés hátra</string>
<string name="loop_slideshow">Diavetítés ismétlése</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">A diavetítés vége</string>
<string name="no_media_for_slideshow">A diavetítéshez nem található média</string>
<string name="use_crossfade_animation">Animáció átmenet használat</string>
<!-- View types -->
<string name="change_view_type">Nézet típus változtatása</string>
@ -131,10 +134,14 @@
<string name="do_not_group_files">Nincs csoportosítás</string>
<string name="by_folder">Mappa</string>
<string name="by_last_modified">Utolsó módosítás</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Dátum</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Fájl típus</string>
<string name="by_extension">Kiterjesztés</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>
<string name="grouping_and_sorting">Kérjük, vegye figyelembe, hogy a csoportosítás és a rendezés 2 egymástól független mező</string>
<!-- Widgets -->
<string name="folder_on_widget">Mappa mutatása a widgeten:</string>

View file

@ -2,7 +2,7 @@
<resources>
<string name="app_name">Simple Gallery</string>
<string name="app_launcher_name">Galeri</string>
<string name="edit">Edit</string>
<string name="edit">Sunting</string>
<string name="open_camera">Buka kamera</string>
<string name="hidden">(tersembunyi)</string>
<string name="excluded">(dikecualikan)</string>
@ -26,13 +26,13 @@
<string name="unlock_orientation">Aktifkan rotasi</string>
<string name="change_orientation">Ubah orientasi</string>
<string name="force_portrait">Paksa potret</string>
<string name="force_landscape">Paksa landscape</string>
<string name="force_landscape">Paksa lanskap</string>
<string name="use_default_orientation">Gunakan orientasi default</string>
<string name="fix_date_taken">Perbaiki Tanggal Diambil</string>
<string name="fixing">Memperbaiki…</string>
<string name="dates_fixed_successfully">Tanggal berhasil diperbaiki</string>
<string name="share_resized">Share a resized version</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="share_resized">Bagikan versi yang diubah ukurannya</string>
<string name="upgraded_from_free">Hai,\n\nsepertinya anda memperbarui dari aplikasi gratis versi lama. Anda sekarang bisa mencopot versi yang lama, yang ada tombol \'Tingkatkan ke Pro\' di bagian atas pengaturan aplikasi.\n\nHanya item Keranjang sampah yang akan dihapus, item favorit menjadi tak bertanda dan anda juga harus menyetel ulang pengaturan aplikasi.\n\nThanks!</string>
<!-- Filter -->
<string name="filter_media">Filter media</string>
@ -41,28 +41,29 @@
<string name="gifs">GIF</string>
<string name="raw_images">Gambar RAW</string>
<string name="svgs">SVG</string>
<string name="no_media_with_filters">Tidak ada file media ditemukan dari filter ini.</string>
<string name="no_media_with_filters">Tidak ada berkas media ditemukan dari filter ini.</string>
<string name="change_filters_underlined"><u>Ubah filter</u></string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Fungsi ini menyembunyikan folder dengan menambahkan file \'.nomedia\' ke dalamnya, juga akan menyembunyikan semua subfolder. Anda bisa melihatnya dari opsi \'Tampilkan file tersembunyi\' di Setelan. Lanjutkan?</string>
<string name="hide_folder_description">Fungsi ini menyembunyikan folder dengan menambahkan berkas \'.nomedia\' ke dalamnya, juga akan menyembunyikan semua subfolder. Anda bisa melihatnya dari opsi \'Tampilkan berkas tersembunyi\' di Pengaturan. Lanjutkan?</string>
<string name="exclude">Kecualikan</string>
<string name="excluded_folders">Folder yang dikecualikan</string>
<string name="manage_excluded_folders">Atur folder yang dikecualikan</string>
<string name="exclude_folder_description">Ini hanya akan mengecualikan pilihan bersama dengan subfoldernya di Simple Gallery. Anda bisa mengatur pengecualian di Setelan.</string>
<string name="exclude_folder_description">Ini hanya akan mengecualikan pilihan bersama dengan subfoldernya di Simple Gallery. Anda bisa mengatur pengecualian di Pengaturan.</string>
<string name="exclude_folder_parent">Kecualikan folder induk?</string>
<string name="excluded_activity_placeholder">Mengecualikan folder akan membuatnya bersama subfoldernya tersembunyi hanya di Simple Gallery, namun masih bisa dilihat di aplikasi lain.\n\nJika Anda ingin menyembunyikannya dari aplikasi lain juga, gunakan fitur Sembunyikan.</string>
<string name="excluded_activity_placeholder">Mengecualikan folder akan membuatnya bersama subfoldernya tersembunyi hanya di Simple Gallery, namun masih bisa dilihat di aplikasi lain.\n\nJika anda ingin menyembunyikannya dari aplikasi lain juga, gunakan fitur Sembunyikan.</string>
<string name="remove_all">Bersihkan daftar</string>
<string name="remove_all_description">Hapus semua folder dari daftar pengecualian? Ini tidak akan menghapus folder tersebut.</string>
<string name="hidden_folders">Folder tersembunyi</string>
<string name="manage_hidden_folders">Atur folder tersembunyi</string>
<string name="hidden_folders_placeholder">Sepertinya tidak ada folder tersembunyi dengan file \".nomedia\" didalamnya.</string>
<string name="hidden_folders_placeholder">Sepertinya tidak ada folder tersembunyi dengan berkas \".nomedia\" didalamnya.</string>
<!-- Include folders -->
<string name="include_folders">Folder yang disertakan</string>
<string name="manage_included_folders">Atur folder yang disertakan</string>
<string name="add_folder">Tambah folder</string>
<string name="included_activity_placeholder">Jika ada folder yang berisi file media, namun tidak dikenali oleh aplikasi ini, Anda bisa menambahkannya disini secara manual.\n\nMenambah beberapa item disini tidak akan mengecualikan folder yang lain.</string>
<string name="included_activity_placeholder">Jika ada folder yang berisi berkas media, namun tidak dikenali oleh aplikasi ini, anda bisa menambahkannya disini secara manual.\n\nMenambah beberapa item disini tidak akan mengecualikan folder yang lain.</string>
<string name="no_media_add_included">Tidak ada berkas media yang ditemukan. Anda bisa memperbaikinya dengan menambahkan folder yang berisi berkas media secara manual.</string>
<!-- Resizing -->
<string name="resize">Ubah ukuran</string>
@ -73,16 +74,16 @@
<string name="invalid_values">Harap masukkan resolusi dengan benar</string>
<!-- Editor -->
<string name="editor">Editor</string>
<string name="editor">Penyunting</string>
<string name="save">Simpan</string>
<string name="rotate">Rotasi</string>
<string name="path">Jalur</string>
<string name="invalid_image_path">Jalur gambar tidak valid</string>
<string name="image_editing_failed">Gagal mengedit gambar</string>
<string name="edit_image_with">Edit dengan:</string>
<string name="no_editor_found">Tidak ada aplikasi editor gambar</string>
<string name="unknown_file_location">Lokasi file tidak diketahui</string>
<string name="error_saving_file">Tidak dapat mengganti file sumber</string>
<string name="image_editing_failed">Gagal menyunting gambar</string>
<string name="edit_image_with">Sunting dengan:</string>
<string name="no_editor_found">Tidak ada aplikasi penyunting gambar</string>
<string name="unknown_file_location">Lokasi berkas tidak diketahui</string>
<string name="error_saving_file">Tidak bisa mengganti berkas sumber</string>
<string name="rotate_left">Putar ke kiri</string>
<string name="rotate_right">Putar ke kanan</string>
<string name="rotate_one_eighty">Putar 180º</string>
@ -100,7 +101,7 @@
<string name="setting_wallpaper">Menyetel wallpaper&#8230;</string>
<string name="wallpaper_set_successfully">Wallpaper berhasil disetel</string>
<string name="portrait_aspect_ratio">Aspek rasio potret</string>
<string name="landscape_aspect_ratio">Aspek rasio landscape</string>
<string name="landscape_aspect_ratio">Aspek rasio lanskap</string>
<string name="home_screen">Layar beranda</string>
<string name="lock_screen">Layar kunci</string>
<string name="home_and_lock_screen">Beranda dan layar kunci</string>
@ -112,37 +113,43 @@
<string name="include_videos">Sertakan video</string>
<string name="include_gifs">Sertakan GIF</string>
<string name="random_order">Urutan acak</string>
<string name="use_fade">Animasi memudar</string>
<string name="move_backwards">Mundur</string>
<string name="loop_slideshow">Slideshow tanpa henti</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Slideshow berakhir</string>
<string name="no_media_for_slideshow">Tidak ditemukan media untuk slideshow</string>
<string name="use_crossfade_animation">Use crossfade animations</string>
<!-- View types -->
<string name="change_view_type">Ubah jenis tampilan</string>
<string name="grid">Kotak</string>
<string name="list">Daftar</string>
<string name="group_direct_subfolders">Kelompokkan langsung subfolder</string>
<string name="group_direct_subfolders">Kelompokkan subfolder langsung</string>
<!-- Grouping at media thumbnails -->
<string name="group_by">Kelompokkan menurut</string>
<string name="do_not_group_files">Jangan kelompokkan file</string>
<string name="do_not_group_files">Jangan kelompokkan berkas</string>
<string name="by_folder">Folder</string>
<string name="by_last_modified">Terakhir diubah</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Tanggal diambil</string>
<string name="by_file_type">Jenis file</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Jenis berkas</string>
<string name="by_extension">Ekstensi</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>
<string name="grouping_and_sorting">Harap dicatat bahwa mengelompokkan dan mengurutkan adalah 2 ruas yang berbeda</string>
<!-- Widgets -->
<string name="folder_on_widget">Folder shown on the widget:</string>
<string name="show_folder_name">Show folder name</string>
<string name="folder_on_widget">Folder yang ditampilkan pada widget:</string>
<string name="show_folder_name">Tampilkan nama folder</string>
<!-- Settings -->
<string name="autoplay_videos">Putar video otomatis</string>
<string name="remember_last_video_position">Ingat posisi pemutaran terakhir</string>
<string name="toggle_filename">Tampil/sembunyikan nama file</string>
<string name="toggle_filename">Tampil/sembunyikan nama berkas</string>
<string name="loop_videos">Ulangi video</string>
<string name="animate_gifs">Animasi GIF di thumbnail</string>
<string name="max_brightness">Kecerahan maksimal saat melihat di layar penuh</string>
@ -171,67 +178,67 @@
<string name="show_highest_quality">Tampilkan gambar dalam kualitas tertinggi</string>
<string name="show_recycle_bin_last">Tampilkan Sampah sebagai item terakhir di layar utama</string>
<string name="allow_down_gesture">Izinkan keluar dari layar penuh dengan menggeser kebawah</string>
<string name="allow_one_to_one_zoom">Allow 1:1 zooming in with two double taps</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="file_loading_priority">File loading priority</string>
<string name="speed">Speed</string>
<string name="compromise">Compromise</string>
<string name="avoid_showing_invalid_files">Avoid showing invalid files</string>
<string name="allow_one_to_one_zoom">Izinkan pembesaran 1:1 dengan dua kali ketuk</string>
<string name="open_videos_on_separate_screen">Selalu buka video pada layar terpisah dengan gestur horizontal baru</string>
<string name="show_notch">Tampilkan notch jika tersedia</string>
<string name="allow_rotating_gestures">Izinkan memutar gambar dengan gestur</string>
<string name="file_loading_priority">Prioritas pemuatan berkas</string>
<string name="speed">Kecepatan</string>
<string name="compromise">Kompromi</string>
<string name="avoid_showing_invalid_files">Hindari menampilkan berkas yang tidak valid</string>
<!-- Setting sections -->
<string name="thumbnails">Thumbnail</string>
<string name="fullscreen_media">Media layar penuh</string>
<string name="extended_details">Detail tambahan</string>
<string name="bottom_actions">Tindakan di bawah</string>
<string name="bottom_actions">Tindakan bawah</string>
<!-- Bottom actions -->
<string name="manage_bottom_actions">Sesuaikan tombol tindakan bawah</string>
<string name="toggle_favorite">Favorit</string>
<string name="toggle_file_visibility">Tampil/sembunyikan file</string>
<string name="toggle_file_visibility">Tampil/sembunyikan berkas</string>
<!-- FAQ -->
<string name="faq_1_title">Bagaimana cara menjadikan Simple Gallery sebagai aplikasi galeri default?</string>
<string name="faq_1_text">Pertama Anda harus menemukan galeri default saat ini di bagian Aplikasi di Setelan perangkat, lihatlah tombol yang seperti \"Buka secara default\", klik itu, lalu pilih \"Hapus default\".
Lain kali Anda mencoba membuka gambar atau video, Anda akan disuruh memilih aplikasi, dimana Anda bisa memilih Simple Gallery dan menjadikannya default.</string>
<string name="faq_2_title">Saya mengunci aplikasi dengan password, tapi saya lupa. Apa yang harus dilakukan?</string>
<string name="faq_2_text">Anda bisa menyelesaikannya dengan 2 cara. Anda bisa instal ulang aplikasi, atau cari aplikasi ini di Setelan perangkat dan pilih \"Hapus data\". Ini akan menyetel ulang semua setelan Anda, dan tidak akan menghapus file media apapun.</string>
<string name="faq_1_text">Pertama anda harus menemukan galeri default saat ini di bagian Aplikasi di Pengaturan perangkat, lihatlah tombol yang seperti \"Buka secara default\", klik itu, lalu pilih \"Hapus default\".
Lain kali anda mencoba membuka gambar atau video, anda akan disuruh memilih aplikasi, dan anda bisa memilih Simple Gallery dan menjadikannya default.</string>
<string name="faq_2_title">Saya mengunci aplikasi dengan sandi, tapi saya lupa. Apa yang harus dilakukan?</string>
<string name="faq_2_text">Anda bisa menyelesaikannya dengan 2 cara. Anda bisa pasang ulang aplikasi, atau cari aplikasi ini di Pengaturan perangkat dan pilih \"Hapus data\". Ini akan menyetel ulang semua pengaturan anda, dan tidak akan menghapus berkas media apapun.</string>
<string name="faq_3_title">Bagaimana agar sebuah album selalu muncul paling atas di daftar?</string>
<string name="faq_3_text">Anda bisa menekan lama album tersebut dan pilih ikon Pin di menu tindakan, itu akan menaruhnya di 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">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_5_title">Apa perbedaan antara menyembunyikan dan mengecualikan folder?</string>
<string name="faq_5_text">Mengecualikan tidak akan menampilkan folder di Simple Gallery, sedangkan Sembunyikan bekerja sesuai aturan sistem dan akan menyembunyikan folder juga dari aplikasi galeri yang lain. Cara kerjanya dengan membuat file \".nomedia\" kosong pada folder yang diinginkan, yang bisa Anda hapus juga dengan aplikasi file manager.</string>
<string name="faq_5_text">Mengecualikan tidak akan menampilkan folder di Simple Gallery, sedangkan Sembunyikan bekerja sesuai aturan sistem dan akan menyembunyikan folder juga 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>
<string name="faq_6_text">Kadang Anda melihat beberapa album yang tidak biasa muncul. Anda bisa dengan mudah menyembunyikannya dengan menekan lama dan pilih Kecualikan. Pada dialog berikutnya, Anda lalu bisa memilih folder induk, yang akan mencegah album terkait muncul kembali.</string>
<string name="faq_6_text">Kadang anda melihat beberapa album yang tidak biasa muncul. Anda bisa dengan mudah menyembunyikannya dengan menekan lama dan pilih Kecualikan. Pada dialog berikutnya, anda lalu bisa memilih folder induk, yang akan mencegah album terkait muncul kembali.</string>
<string name="faq_7_title">Ada folder berisi gambar namun tidak muncul, apa yang harus dilakukan?</string>
<string name="faq_7_text">Itu bisa disebabkan berbagai alasan, namun solusinya mudah. Pergi ke Setelan -> Atur folder yang disertakan, pilih Tambah dan cari folder yang diinginkan.</string>
<string name="faq_7_text">Itu bisa disebabkan berbagai alasan, namun solusinya mudah. Pergi ke Pengaturan -> Atur folder yang disertakan, pilih Tambah dan cari folder yang diinginkan.</string>
<string name="faq_8_title">Bagaimana jika saya hanya ingin beberapa folder saja yang terlihat?</string>
<string name="faq_8_text">Menambahkan folder di Folder yang Disertakan tidak otomatis mengecualikan folder yang lain. Yang bisa Anda lakukan adalah pergi ke Setelan -> Atur Folder yang Dikecualikan, lalu kecualikan folder root \"/\", lalu tambahkan folder yang diinginkan di Setelan -> Atur Folder yang Disertakan.
<string name="faq_8_text">Menambahkan folder di Folder yang Disertakan tidak otomatis mengecualikan folder yang lain. Yang bisa anda lakukan adalah pergi ke Pengaturan -> Atur Folder yang Dikecualikan, lalu kecualikan folder root \"/\", lalu tambahkan folder yang diinginkan di Pengaturan -> Atur Folder yang Disertakan.
Itu akan membuat folder yang dipilih saja yang muncul, dan jika sebuah folder disertakan dan dikecualikan secara bersamaan, folder tersebut akan muncul.</string>
<string name="faq_10_title">Bisakah saya meng-crop gambar dengan aplikasi ini?</string>
<string name="faq_10_text">Ya, Anda bisa melakukannya di Editor, dengan menyeret sudut gambar. Anda bisa masuk ke editor dengan menekan lama thumbnail gambar dan memilih Edit, atau pilih Edit dari tampilan layar penuh.</string>
<string name="faq_11_title">Bisakah saya mengelompokkan thumbnail file media?</string>
<string name="faq_11_text">Bisa, gunakan menu \"Kelompokkan menurut\" pada tampilan thumbnail. Anda bisa mengelompokkan file dengan berbagai kriteria, termasuk Tanggal Diambil. Jika Anda menggunakan fungsi \"Tampilkan semua isi folder\", Anda juga bisa mengelompokkan berdasarkan foldernya.</string>
<string name="faq_12_title">Tidak dapat mengurutkan berdasarkan Tanggal Diambil, bagaimana cara memperbaikinya?</string>
<string name="faq_12_text">Itu umumnya disebabkan karena file yang disalin dari tempat lain. Anda bisa memperbaikinya dengan memilih thumbnail file dan pilih \"Perbaiki Tanggal Diambil\".</string>
<string name="faq_10_text">Ya, anda bisa melakukannya di Penyunting, dengan menyeret sudut gambar. Anda bisa masuk ke penyunting dengan menekan lama thumbnail gambar dan memilih Sunting, atau pilih Sunting dari tampilan layar penuh.</string>
<string name="faq_11_title">Bisakah saya mengelompokkan thumbnail berkas media?</string>
<string name="faq_11_text">Bisa, gunakan menu \"Kelompokkan menurut\" pada tampilan thumbnail. Anda bisa mengelompokkan berkas dengan berbagai kriteria, termasuk Tanggal Diambil. Jika anda menggunakan fungsi \"Tampilkan semua isi folder\", anda juga bisa mengelompokkan berdasarkan foldernya.</string>
<string name="faq_12_title">Tidak bisa mengurutkan berdasarkan Tanggal Diambil, bagaimana cara memperbaikinya?</string>
<string name="faq_12_text">Itu umumnya disebabkan karena berkas yang disalin dari tempat lain. Anda bisa memperbaikinya dengan memilih berkas thumbnail dan pilih \"Perbaiki Tanggal Diambil\".</string>
<string name="faq_13_title">Saya melihat beberapa pita warna pada gambar. Bagaimana saya meningkatkan kualitasnya?</string>
<string name="faq_13_text">Solusi saat ini untuk menampilkan gambar berfungsi dengan baik dalam sebagian besar kasus, namun jika Anda ingin kualitas gambar yang lebih baik, Anda bisa mengaktifkan \"Tampilkan gambar dalam kualitas tertinggi\" di setelan aplikasi, pada bagian \"Zoom gambar mendalam\".</string>
<string name="faq_14_title">Saya punya file/folder tersembunyi. Bagaimana cara memunculkannya?</string>
<string name="faq_14_text">Anda bisa memilih menu \"Tampilkan sementara file tersembunyi\" di layar utama, atau \"Tampilkan file tersembunyi\" di setelan aplikasi untuk menampilkannya. Jika Anda tidak ingin menyembunyikannya, tekan lama dan pilih \"Jangan sembunyikan\". Folder disembunyikan dengan menambahkan file \".nomedia\" di dalamnya, Anda bisa menghapus file tersebut dengan aplikasi file manager.</string>
<string name="faq_15_title">Why does the app take up so much space?</string>
<string name="faq_15_text">App cache can take up to 250MB, it ensures quicker image loading. If the app is taking up even more space, it is most likely caused by you having items in the Recycle Bin. Those files count to the app size. You can clear the Recycle bin by opening it and deleting all files, or from the app settings. Every file in the Bin is deleted automatically after 30 days.</string>
<string name="faq_13_text">Solusi saat ini untuk menampilkan gambar berfungsi dengan baik dalam sebagian besar kasus, namun jika anda ingin kualitas gambar yang lebih baik, anda bisa mengaktifkan \"Tampilkan gambar dalam kualitas tertinggi\" di pengaturan aplikasi, pada bagian \"Zoom gambar mendalam\".</string>
<string name="faq_14_title">Saya punya berkas/folder tersembunyi. Bagaimana cara memunculkannya?</string>
<string name="faq_14_text">Anda bisa memilih menu \"Tampilkan sementara berkas tersembunyi\" di layar utama, atau \"Tampilkan berkas tersembunyi\" di pengaturan aplikasi untuk menampilkannya. Jika anda tidak ingin menyembunyikannya, tekan lama dan pilih \"Jangan sembunyikan\". Folder disembunyikan dengan menambahkan berkas \".nomedia\" di dalamnya, anda bisa menghapus berkas tersebut dengan aplikasi pengelola berkas.</string>
<string name="faq_15_title">Kenapa aplikasi menggunakan sangat banyak ruang kosong?</string>
<string name="faq_15_text">Cache aplikasi bisa mencapai 250MB, ini untuk menjamin pemuatan gambar yang lebih cepat. Jika aplikasi menggunakan lebih banyak lagi ruang kosong, sangat memungkinkan anda memiliki item di dalam Keranjang Sampah. Berkas tersebut akan menambah ukuran aplikasi. Anda bisa mengosongkan Keranjang sampah dengan cara membukanya dan menghapus semua berkas, atau dari pengaturan aplikasi. Semua berkas di dalam keranjang sampah akan otomatis dihapus setelah 30 hari.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro: Photo Manager &amp; Editor</string>
<string name="app_title">Simple Gallery Pro: Pengelola &amp; Penyunting Foto</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Offline gallery without ads. Organize, edit, recover and protect photos &amp; videos</string>
<string name="app_short_description">Galeri luring tanpa iklan. Kelola, sunting, pulihkan dan lindungi foto &amp; video</string>
<string name="app_long_description">
Simple Gallery Pro is a highly customizable offline gallery. Organize &amp; edit your photos, recover deleted files with the recycle bin, protect &amp; hide files and view a huge variety of different photo &amp; video formats including RAW, SVG and much more.
Simple Gallery Pro adalah aplikasi galeri luring yang sangat mudah diubahsuai. Mengelola &amp; menyunting foto anda, memulihkan berkas yang terhapus dari keranjang sampah, melindungi &amp; menyembunyikan berkas, dan menampilkan banyak format foto &amp; video, diantaranya RAW, SVG dan masih banyak lainnya.
The app contains no ads and unnecessary permissions. As the app doesnt require internet access either, your privacy is protected.
Aplikasi sama sekali tidak berisi iklan dan tidak membutuhkan perizinan yang tidak perlu. Dan karena aplikasi juga tidak membutuhkan akses internet, privasi anda terlindungi.
-------------------------------------------------
<b>SIMPLE GALLERY PRO FEATURES</b>

View file

@ -0,0 +1,296 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Gallery</string>
<string name="app_launcher_name">Galeri</string>
<string name="edit">Sunting</string>
<string name="open_camera">Buka kamera</string>
<string name="hidden">(tersembunyi)</string>
<string name="excluded">(dikecualikan)</string>
<string name="pin_folder">Pin folder</string>
<string name="unpin_folder">Lepas pin folder</string>
<string name="pin_to_the_top">Pin ke atas</string>
<string name="show_all">Tampilkan semua isi folder</string>
<string name="all_folders">Semua folder</string>
<string name="folder_view">Beralih ke tampilan folder</string>
<string name="other_folder">Folder lain</string>
<string name="show_on_map">Tampilkan di peta</string>
<string name="unknown_location">Lokasi tidak diketahui</string>
<string name="increase_column_count">Tambah jumlah kolom</string>
<string name="reduce_column_count">Kurangi jumlah kolom</string>
<string name="change_cover_image">Ubah sampul</string>
<string name="select_photo">Pilih foto</string>
<string name="use_default">Gunakan default</string>
<string name="volume">Volume</string>
<string name="brightness">Kecerahan</string>
<string name="lock_orientation">Kunci rotasi</string>
<string name="unlock_orientation">Aktifkan rotasi</string>
<string name="change_orientation">Ubah orientasi</string>
<string name="force_portrait">Paksa potret</string>
<string name="force_landscape">Paksa lanskap</string>
<string name="use_default_orientation">Gunakan orientasi default</string>
<string name="fix_date_taken">Perbaiki Tanggal Diambil</string>
<string name="fixing">Memperbaiki…</string>
<string name="dates_fixed_successfully">Tanggal berhasil diperbaiki</string>
<string name="share_resized">Bagikan versi yang diubah ukurannya</string>
<string name="upgraded_from_free">Hai,\n\nsepertinya anda memperbarui dari aplikasi gratis versi lama. Anda sekarang bisa mencopot versi yang lama, yang ada tombol \'Tingkatkan ke Pro\' di bagian atas pengaturan aplikasi.\n\nHanya item Keranjang sampah yang akan dihapus, item favorit menjadi tak bertanda dan anda juga harus menyetel ulang pengaturan aplikasi.\n\nThanks!</string>
<!-- Filter -->
<string name="filter_media">Filter media</string>
<string name="images">Gambar</string>
<string name="videos">Video</string>
<string name="gifs">GIF</string>
<string name="raw_images">Gambar RAW</string>
<string name="svgs">SVG</string>
<string name="no_media_with_filters">Tidak ada berkas media ditemukan dari filter ini.</string>
<string name="change_filters_underlined"><u>Ubah filter</u></string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Fungsi ini menyembunyikan folder dengan menambahkan berkas \'.nomedia\' ke dalamnya, juga akan menyembunyikan semua subfolder. Anda bisa melihatnya dari opsi \'Tampilkan berkas tersembunyi\' di Pengaturan. Lanjutkan?</string>
<string name="exclude">Kecualikan</string>
<string name="excluded_folders">Folder yang dikecualikan</string>
<string name="manage_excluded_folders">Atur folder yang dikecualikan</string>
<string name="exclude_folder_description">Ini hanya akan mengecualikan pilihan bersama dengan subfoldernya di Simple Gallery. Anda bisa mengatur pengecualian di Pengaturan.</string>
<string name="exclude_folder_parent">Kecualikan folder induk?</string>
<string name="excluded_activity_placeholder">Mengecualikan folder akan membuatnya bersama subfoldernya tersembunyi hanya di Simple Gallery, namun masih bisa dilihat di aplikasi lain.\n\nJika anda ingin menyembunyikannya dari aplikasi lain juga, gunakan fitur Sembunyikan.</string>
<string name="remove_all">Bersihkan daftar</string>
<string name="remove_all_description">Hapus semua folder dari daftar pengecualian? Ini tidak akan menghapus folder tersebut.</string>
<string name="hidden_folders">Folder tersembunyi</string>
<string name="manage_hidden_folders">Atur folder tersembunyi</string>
<string name="hidden_folders_placeholder">Sepertinya tidak ada folder tersembunyi dengan berkas \".nomedia\" didalamnya.</string>
<!-- Include folders -->
<string name="include_folders">Folder yang disertakan</string>
<string name="manage_included_folders">Atur folder yang disertakan</string>
<string name="add_folder">Tambah folder</string>
<string name="included_activity_placeholder">Jika ada folder yang berisi berkas media, namun tidak dikenali oleh aplikasi ini, anda bisa menambahkannya disini secara manual.\n\nMenambah beberapa item disini tidak akan mengecualikan folder yang lain.</string>
<string name="no_media_add_included">Tidak ada berkas media yang ditemukan. Anda bisa memperbaikinya dengan menambahkan folder yang berisi berkas media secara manual.</string>
<!-- Resizing -->
<string name="resize">Ubah ukuran</string>
<string name="resize_and_save">Ubah ukuran terpilih dan simpan</string>
<string name="width">Lebar</string>
<string name="height">Tinggi</string>
<string name="keep_aspect_ratio">Jaga aspek rasio</string>
<string name="invalid_values">Harap masukkan resolusi dengan benar</string>
<!-- Editor -->
<string name="editor">Penyunting</string>
<string name="save">Simpan</string>
<string name="rotate">Rotasi</string>
<string name="path">Jalur</string>
<string name="invalid_image_path">Jalur gambar tidak valid</string>
<string name="image_editing_failed">Gagal menyunting gambar</string>
<string name="edit_image_with">Sunting dengan:</string>
<string name="no_editor_found">Tidak ada aplikasi penyunting gambar</string>
<string name="unknown_file_location">Lokasi berkas tidak diketahui</string>
<string name="error_saving_file">Tidak bisa mengganti berkas sumber</string>
<string name="rotate_left">Putar ke kiri</string>
<string name="rotate_right">Putar ke kanan</string>
<string name="rotate_one_eighty">Putar 180º</string>
<string name="flip">Balik</string>
<string name="flip_horizontally">Balik horizontal</string>
<string name="flip_vertically">Balik vertikal</string>
<string name="free_aspect_ratio">Bebas</string> <!-- available as an option: 1:1, 4:3, 16:9, free -->
<string name="other_aspect_ratio">Lainnya</string> <!-- available as an option: 1:1, 4:3, 16:9, free, other -->
<!-- Set wallpaper -->
<string name="simple_wallpaper">Simple Wallpaper</string>
<string name="set_as_wallpaper">Setel wallpaper</string>
<string name="set_as_wallpaper_failed">Gagal menyetel sebagai wallpaper</string>
<string name="set_as_wallpaper_with">Setel wallpaper dengan:</string>
<string name="setting_wallpaper">Menyetel wallpaper&#8230;</string>
<string name="wallpaper_set_successfully">Wallpaper berhasil disetel</string>
<string name="portrait_aspect_ratio">Aspek rasio potret</string>
<string name="landscape_aspect_ratio">Aspek rasio lanskap</string>
<string name="home_screen">Layar beranda</string>
<string name="lock_screen">Layar kunci</string>
<string name="home_and_lock_screen">Beranda dan layar kunci</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (detik):</string>
<string name="include_photos">Sertakan foto</string>
<string name="include_videos">Sertakan video</string>
<string name="include_gifs">Sertakan GIF</string>
<string name="random_order">Urutan acak</string>
<string name="move_backwards">Mundur</string>
<string name="loop_slideshow">Slideshow tanpa henti</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Slideshow berakhir</string>
<string name="no_media_for_slideshow">Tidak ditemukan media untuk slideshow</string>
<!-- View types -->
<string name="change_view_type">Ubah jenis tampilan</string>
<string name="grid">Kotak</string>
<string name="list">Daftar</string>
<string name="group_direct_subfolders">Kelompokkan subfolder langsung</string>
<!-- Grouping at media thumbnails -->
<string name="group_by">Kelompokkan menurut</string>
<string name="do_not_group_files">Jangan kelompokkan berkas</string>
<string name="by_folder">Folder</string>
<string name="by_last_modified">Terakhir diubah</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Tanggal diambil</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Jenis berkas</string>
<string name="by_extension">Ekstensi</string>
<string name="grouping_and_sorting">Harap dicatat bahwa mengelompokkan dan mengurutkan adalah 2 ruas yang berbeda</string>
<!-- Widgets -->
<string name="folder_on_widget">Folder yang ditampilkan pada widget:</string>
<string name="show_folder_name">Tampilkan nama folder</string>
<!-- Settings -->
<string name="autoplay_videos">Putar video otomatis</string>
<string name="remember_last_video_position">Ingat posisi pemutaran terakhir</string>
<string name="toggle_filename">Tampil/sembunyikan nama berkas</string>
<string name="loop_videos">Ulangi video</string>
<string name="animate_gifs">Animasi GIF di thumbnail</string>
<string name="max_brightness">Kecerahan maksimal saat melihat di layar penuh</string>
<string name="crop_thumbnails">Pangkas thumbnail menjadi persegi</string>
<string name="show_thumbnail_video_duration">Tampilkan durasi video</string>
<string name="screen_rotation_by">Rotasi layar penuh dari</string>
<string name="screen_rotation_system_setting">Pengaturan sistem</string>
<string name="screen_rotation_device_rotation">Rotasi perangkat</string>
<string name="screen_rotation_aspect_ratio">Aspek rasio</string>
<string name="black_background_at_fullscreen">Background dan status bar hitam saat layar penuh</string>
<string name="scroll_thumbnails_horizontally">Gulir thumbnail secara horizontal</string>
<string name="hide_system_ui_at_fullscreen">Otomatis sembunyikan sistem UI saat layar penuh</string>
<string name="delete_empty_folders">Hapus folder kosong setelah menghapus isinya</string>
<string name="allow_photo_gestures">Izinkan mengontrol kecerahan foto dengan gerakan vertikal</string>
<string name="allow_video_gestures">Izinkan mengontrol kecerahan dan volume video dengan gerakan vertikal</string>
<string name="show_media_count">Tampilkan jumlah folder media di tampilan utama</string>
<string name="show_extended_details">Tampilkan detail tambahan saat layar penuh</string>
<string name="manage_extended_details">Atur detail tambahan</string>
<string name="one_finger_zoom">Izinkan zoom satu jari di layar penuh</string>
<string name="allow_instant_change">Izinkan mengganti media dengan mengklik sisi layar</string>
<string name="allow_deep_zooming_images">Izinkan zoom gambar lebih dalam</string>
<string name="hide_extended_details">Sembunyikan detail tambahan ketika status bar disembunyikan</string>
<string name="show_at_bottom">Tampilkan beberapa tombol tindakan dibawah layar</string>
<string name="show_recycle_bin">Tampilkan Sampah di layar folder</string>
<string name="deep_zoomable_images">Zoom gambar mendalam</string>
<string name="show_highest_quality">Tampilkan gambar dalam kualitas tertinggi</string>
<string name="show_recycle_bin_last">Tampilkan Sampah sebagai item terakhir di layar utama</string>
<string name="allow_down_gesture">Izinkan keluar dari layar penuh dengan menggeser kebawah</string>
<string name="allow_one_to_one_zoom">Izinkan pembesaran 1:1 dengan dua kali ketuk</string>
<string name="open_videos_on_separate_screen">Selalu buka video pada layar terpisah dengan gestur horizontal baru</string>
<string name="show_notch">Tampilkan notch jika tersedia</string>
<string name="allow_rotating_gestures">Izinkan memutar gambar dengan gestur</string>
<string name="file_loading_priority">Prioritas pemuatan berkas</string>
<string name="speed">Kecepatan</string>
<string name="compromise">Kompromi</string>
<string name="avoid_showing_invalid_files">Hindari menampilkan berkas yang tidak valid</string>
<!-- Setting sections -->
<string name="thumbnails">Thumbnail</string>
<string name="fullscreen_media">Media layar penuh</string>
<string name="extended_details">Detail tambahan</string>
<string name="bottom_actions">Tindakan bawah</string>
<!-- Bottom actions -->
<string name="manage_bottom_actions">Sesuaikan tombol tindakan bawah</string>
<string name="toggle_favorite">Favorit</string>
<string name="toggle_file_visibility">Tampil/sembunyikan berkas</string>
<!-- FAQ -->
<string name="faq_1_title">Bagaimana cara menjadikan Simple Gallery sebagai aplikasi galeri default?</string>
<string name="faq_1_text">Pertama anda harus menemukan galeri default saat ini di bagian Aplikasi di Pengaturan perangkat, lihatlah tombol yang seperti \"Buka secara default\", klik itu, lalu pilih \"Hapus default\".
Lain kali anda mencoba membuka gambar atau video, anda akan disuruh memilih aplikasi, dan anda bisa memilih Simple Gallery dan menjadikannya default.</string>
<string name="faq_2_title">Saya mengunci aplikasi dengan sandi, tapi saya lupa. Apa yang harus dilakukan?</string>
<string name="faq_2_text">Anda bisa menyelesaikannya dengan 2 cara. Anda bisa pasang ulang aplikasi, atau cari aplikasi ini di Pengaturan perangkat dan pilih \"Hapus data\". Ini akan menyetel ulang semua pengaturan anda, dan tidak akan menghapus berkas media apapun.</string>
<string name="faq_3_title">Bagaimana agar sebuah album selalu muncul paling atas di daftar?</string>
<string name="faq_3_text">Anda bisa menekan lama album tersebut dan pilih ikon Pin di menu tindakan, itu akan menaruhnya di 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">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_5_title">Apa perbedaan antara menyembunyikan dan mengecualikan folder?</string>
<string name="faq_5_text">Mengecualikan tidak akan menampilkan folder di Simple Gallery, sedangkan Sembunyikan bekerja sesuai aturan sistem dan akan menyembunyikan folder juga 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>
<string name="faq_6_text">Kadang anda melihat beberapa album yang tidak biasa muncul. Anda bisa dengan mudah menyembunyikannya dengan menekan lama dan pilih Kecualikan. Pada dialog berikutnya, anda lalu bisa memilih folder induk, yang akan mencegah album terkait muncul kembali.</string>
<string name="faq_7_title">Ada folder berisi gambar namun tidak muncul, apa yang harus dilakukan?</string>
<string name="faq_7_text">Itu bisa disebabkan berbagai alasan, namun solusinya mudah. Pergi ke Pengaturan -> Atur folder yang disertakan, pilih Tambah dan cari folder yang diinginkan.</string>
<string name="faq_8_title">Bagaimana jika saya hanya ingin beberapa folder saja yang terlihat?</string>
<string name="faq_8_text">Menambahkan folder di Folder yang Disertakan tidak otomatis mengecualikan folder yang lain. Yang bisa anda lakukan adalah pergi ke Pengaturan -> Atur Folder yang Dikecualikan, lalu kecualikan folder root \"/\", lalu tambahkan folder yang diinginkan di Pengaturan -> Atur Folder yang Disertakan.
Itu akan membuat folder yang dipilih saja yang muncul, dan jika sebuah folder disertakan dan dikecualikan secara bersamaan, folder tersebut akan muncul.</string>
<string name="faq_10_title">Bisakah saya meng-crop gambar dengan aplikasi ini?</string>
<string name="faq_10_text">Ya, anda bisa melakukannya di Penyunting, dengan menyeret sudut gambar. Anda bisa masuk ke penyunting dengan menekan lama thumbnail gambar dan memilih Sunting, atau pilih Sunting dari tampilan layar penuh.</string>
<string name="faq_11_title">Bisakah saya mengelompokkan thumbnail berkas media?</string>
<string name="faq_11_text">Bisa, gunakan menu \"Kelompokkan menurut\" pada tampilan thumbnail. Anda bisa mengelompokkan berkas dengan berbagai kriteria, termasuk Tanggal Diambil. Jika anda menggunakan fungsi \"Tampilkan semua isi folder\", anda juga bisa mengelompokkan berdasarkan foldernya.</string>
<string name="faq_12_title">Tidak bisa mengurutkan berdasarkan Tanggal Diambil, bagaimana cara memperbaikinya?</string>
<string name="faq_12_text">Itu umumnya disebabkan karena berkas yang disalin dari tempat lain. Anda bisa memperbaikinya dengan memilih berkas thumbnail dan pilih \"Perbaiki Tanggal Diambil\".</string>
<string name="faq_13_title">Saya melihat beberapa pita warna pada gambar. Bagaimana saya meningkatkan kualitasnya?</string>
<string name="faq_13_text">Solusi saat ini untuk menampilkan gambar berfungsi dengan baik dalam sebagian besar kasus, namun jika anda ingin kualitas gambar yang lebih baik, anda bisa mengaktifkan \"Tampilkan gambar dalam kualitas tertinggi\" di pengaturan aplikasi, pada bagian \"Zoom gambar mendalam\".</string>
<string name="faq_14_title">Saya punya berkas/folder tersembunyi. Bagaimana cara memunculkannya?</string>
<string name="faq_14_text">Anda bisa memilih menu \"Tampilkan sementara berkas tersembunyi\" di layar utama, atau \"Tampilkan berkas tersembunyi\" di pengaturan aplikasi untuk menampilkannya. Jika anda tidak ingin menyembunyikannya, tekan lama dan pilih \"Jangan sembunyikan\". Folder disembunyikan dengan menambahkan berkas \".nomedia\" di dalamnya, anda bisa menghapus berkas tersebut dengan aplikasi pengelola berkas.</string>
<string name="faq_15_title">Kenapa aplikasi menggunakan sangat banyak ruang kosong?</string>
<string name="faq_15_text">Cache aplikasi bisa mencapai 250MB, ini untuk menjamin pemuatan gambar yang lebih cepat. Jika aplikasi menggunakan lebih banyak lagi ruang kosong, sangat memungkinkan anda memiliki item di dalam Keranjang Sampah. Berkas tersebut akan menambah ukuran aplikasi. Anda bisa mengosongkan Keranjang sampah dengan cara membukanya dan menghapus semua berkas, atau dari pengaturan aplikasi. Semua berkas di dalam keranjang sampah akan otomatis dihapus setelah 30 hari.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro: Pengelola &amp; Penyunting Foto</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Galeri luring tanpa iklan. Kelola, sunting, pulihkan dan lindungi foto &amp; video</string>
<string name="app_long_description">
Simple Gallery Pro adalah aplikasi galeri luring yang sangat mudah diubahsuai. Mengelola &amp; menyunting foto anda, memulihkan berkas yang terhapus dari keranjang sampah, melindungi &amp; menyembunyikan berkas, dan menampilkan banyak format foto &amp; video, diantaranya RAW, SVG dan masih banyak lainnya.
Aplikasi sama sekali tidak berisi iklan dan tidak membutuhkan perizinan yang tidak perlu. Dan karena aplikasi juga tidak membutuhkan akses internet, privasi anda terlindungi.
-------------------------------------------------
<b>SIMPLE GALLERY PRO FEATURES</b>
-------------------------------------------------
• Offline gallery with no ads or popups
• Simple gallery photo editor crop, rotate, resize, draw, filters &amp; more
• No internet access needed, giving you more privacy and security
• No unnecessary permissions required
• Quickly search images, videos &amp; files
• Open &amp; view many different photo and video types (RAW, SVG, panoramic etc)
• A variety of intuitive gestures to easily edit &amp; organize files
• Lots of ways to filter, group &amp; sort files
• Customize the appearance of Simple Gallery Pro
• Available in 32 languages
• Mark files as favorites for quick access
• Protect your photos &amp; videos with a pattern, pin or fingerprint
• Use pin, pattern &amp; fingerprint to protect the app launch or specific functions too
• Recover deleted photos &amp; videos from the recycle bin
• Toggle visibility of files to hide photos &amp; videos
• Create a customizable slideshow of your files
• View detailed information of your files (resolution, EXIF values etc)
• Simple Gallery Pro is open source
… and much much more!
<b>PHOTO GALLERY EDITOR</b>
Simple Gallery Pro makes it easy to edit your pictures on the fly. Crop, flip, rotate and resize your pictures. If youre feeling a little more creative you can add filters and draw on your pictures!
<b>SUPPORT FOR MANY FILE TYPES</b>
Unlike some other gallery viewers &amp; photo organizers, Simple Gallery Pro supports a huge range of different file types including JPEG, PNG, MP4, MKV, RAW, SVG, Panoramic photos, Panoramic videos and many more.
<b>HIGHLY CUSTOMIZABLE GALLERY MANAGER</b>
From the UI to the function buttons on the bottom toolbar, Simple Gallery Pro is highly customizable and works the way you want it to. No other gallery manager has this kind of flexibility! Thanks to being open source, were also available in 32 languages!
<b>RECOVER DELETED PHOTOS &amp; VIDEOS</b>
Accidentally deleted a precious photo or video? Dont worry! Simple Gallery Pro features a handy recycle bin where you can recover deleted photos &amp; videos easily.
<b>PROTECT &amp; HIDE PHOTOS, VIDEOS &amp; FILES</b>
Using pin, pattern or your devices fingerprint scanner you can protect and hide photos, videos &amp; entire albums. You can protect the app itself or place locks on specific functions of the app. For example, you cant delete a file without a fingerprint scan, helping to protect your files from accidental deletion.
<b>Check out the full suite of Simple Tools here:</b>
https://www.simplemobiletools.com
<b>Facebook:</b>
https://www.facebook.com/simplemobiletools
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Gestisci le cartelle incluse</string>
<string name="add_folder">Aggiungi cartella</string>
<string name="included_activity_placeholder">Se si hanno alcune cartelle che contengono media, ma non sono state riconosciute dall\'app, si possono aggiungerle manualmente qui.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Ridimensiona</string>
@ -112,12 +113,14 @@
<string name="include_videos">Includi video</string>
<string name="include_gifs">Includi GIF</string>
<string name="random_order">Ordine sparso</string>
<string name="use_fade">Usa animazioni a dissolvenza</string>
<string name="move_backwards">Scorri al contrario</string>
<string name="loop_slideshow">Ripeti presentazione</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">La presentazione è terminata</string>
<string name="no_media_for_slideshow">Nessun file trovato per la presentazione</string>
<string name="use_crossfade_animation">Usa le animazioni in dissolvenza</string>
<!-- View types -->
<string name="change_view_type">Cambia modalità visualizzazione</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Non raggruppare i file</string>
<string name="by_folder">Cartella</string>
<string name="by_last_modified">Ultima modifica</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Data creazione</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Tipo di file</string>
<string name="by_extension">Estensione</string>
<string name="grouping_and_sorting">Notare che il raggruppamento e l\'ordinamento sono due campi indipendenti</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">追加フォルダの管理</string>
<string name="add_folder">フォルダを追加</string>
<string name="included_activity_placeholder">メディア入りのフォルダがアプリで認識されない場合は手動で追加します。</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">リサイズ</string>
@ -112,12 +113,14 @@
<string name="include_videos">ビデオを含める</string>
<string name="include_gifs">GIFを含める</string>
<string name="random_order">ランダムな順序</string>
<string name="use_fade">フェードアニメーションを使用する</string>
<string name="move_backwards">逆方向に進む</string>
<string name="loop_slideshow">スライドショーをリピート再生する</string>
<string name="animation">アニメーション</string>
<string name="no_animation">なし</string>
<string name="fade">フェード</string>
<string name="slide">スライド</string>
<string name="slideshow_ended">スライドショーが終了しました</string>
<string name="no_media_for_slideshow">スライドショーに表示するメディアがありません</string>
<string name="use_crossfade_animation">クロスフェードアニメーションを使用する</string>
<!-- View types -->
<string name="change_view_type">表示形式の変更</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">何もしない</string>
<string name="by_folder">フォルダ</string>
<string name="by_last_modified">更新日時</string>
<string name="by_last_modified_daily">更新日時 (毎日)</string>
<string name="by_last_modified_monthly">更新日時 (毎月)</string>
<string name="by_date_taken">撮影日時</string>
<string name="by_date_taken_daily">撮影日時 (毎日)</string>
<string name="by_date_taken_monthly">撮影日時 (毎月)</string>
<string name="by_file_type">ファイル形式</string>
<string name="by_extension">拡張子</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">포함된 폴더 관리</string>
<string name="add_folder">폴더 추가</string>
<string name="included_activity_placeholder">미디어가 포함되어 있지만 앱에서 인식하지 못하는 폴더가있는 경우 여기에서 수동으로 추가 할 수 있습니다. \n\n여기에 항목을 추가해도 원본 폴더에서 제외되지 않습니다.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">크기 변경</string>
@ -112,12 +113,14 @@
<string name="include_videos">포함된 비디오</string>
<string name="include_gifs">포함된 GIFs</string>
<string name="random_order">랜덤 순서</string>
<string name="use_fade">페이드 애니메이션 사용</string>
<string name="move_backwards">뒤로 이동</string>
<string name="loop_slideshow">슬라이드 쇼 반복</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">슬라이드 쇼 종료</string>
<string name="no_media_for_slideshow">슬라이드 쇼를 위한 미디어를 찾을 수 없음</string>
<string name="use_crossfade_animation">Use crossfade animations</string>
<!-- View types -->
<string name="change_view_type">보기방식 변경</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Do not group files</string>
<string name="by_folder">Folder</string>
<string name="by_last_modified">Last modified</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Date taken</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">File type</string>
<string name="by_extension">Extension</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Tvarkyti įtrauktus aplankus</string>
<string name="add_folder">Įtraukti aplanką</string>
<string name="included_activity_placeholder">Jei turite tam tikrų aplankų, kuriuose yra medijos , bet kurių neneatpažįsta programėlė, galite juos pridėti rankiniu būdu. \ N \ nPridedant kai kuriuos elementus, neišskirsite jokio kito aplanko.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Keisti dydį</string>
@ -112,12 +113,14 @@
<string name="include_videos">Įtraukti vaizdo įrašus</string>
<string name="include_gifs">Itraukti GIF\'us</string>
<string name="random_order">Atsitiktinė tvarka</string>
<string name="use_fade">Naudoti išblukimo animacijas</string>
<string name="move_backwards">Sukti atgal</string>
<string name="loop_slideshow">Klipuoti skaidrių demonstraciją</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Skaidrių demonstracija pasibaigė</string>
<string name="no_media_for_slideshow">Nerasta medijos skaidrių demonstracijai</string>
<string name="use_crossfade_animation">Use crossfade animations</string>
<!-- View types -->
<string name="change_view_type">Keisti peržiūros tipą</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Do not group files</string>
<string name="by_folder">Folder</string>
<string name="by_last_modified">Last modified</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Date taken</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">File type</string>
<string name="by_extension">Extension</string>
<string name="grouping_and_sorting">Please note that grouping and sorting are 2 independent fields</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Håndter inkluderte mapper</string>
<string name="add_folder">Legg til mappe</string>
<string name="included_activity_placeholder">Hvis du har noen mapper som inneholder media, men ikke ble gjenkjent av appen, kan du legge dem til manuelt her.\n\nÅ legge til noen elementer her, ekskluderer ikke noen annen mappe.</string>
<string name="no_media_add_included">Ingen mediafiler er funnet. Dette kan løses ved å legge til mapper som inneholder mediafiler manuelt.</string>
<!-- Resizing -->
<string name="resize">Endre størrelse</string>
@ -112,12 +113,14 @@
<string name="include_videos">Inkluder videoer</string>
<string name="include_gifs">Inkluder GIF-bilder</string>
<string name="random_order">Tilfeldig rekkefølge</string>
<string name="use_fade">Bruk toningseffekt</string>
<string name="move_backwards">Avspill bakover</string>
<string name="loop_slideshow">Gjenta lysbildeshow</string>
<string name="animation">Animasjon</string>
<string name="no_animation">Ingen</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Lysbildeshowet er slutt</string>
<string name="no_media_for_slideshow">Ingen media for lysbildeshowet er funnet</string>
<string name="use_crossfade_animation">Bruk krysstoningsanimasjon</string>
<!-- View types -->
<string name="change_view_type">Endre visningstype</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Ikke grupper filer</string>
<string name="by_folder">Mappe</string>
<string name="by_last_modified">Sist endret</string>
<string name="by_last_modified_daily">Sist endret (daglig)</string>
<string name="by_last_modified_monthly">Sist endret (månedlig)</string>
<string name="by_date_taken">Dato tatt</string>
<string name="by_date_taken_daily">Dato tatt (daglig)</string>
<string name="by_date_taken_monthly">Dato tatt (månedlig)</string>
<string name="by_file_type">Filtype</string>
<string name="by_extension">Endelse</string>
<string name="grouping_and_sorting">Vær oppmerksom på at gruppering og sortering er to uavhengige områder</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Toegevoegde mappen beheren</string>
<string name="add_folder">Map toevoegen</string>
<string name="included_activity_placeholder">Als er mappen zijn die wel media bevatten, maar niet door de galerij worden herkend, voeg deze mappen dan hier handmatig toe.\n\nHet hier toevoegen van mappen zal andere mappen niet uitsluiten.</string>
<string name="no_media_add_included">Er zijn geen mediabestanden gevonden. Dit kan worden opgelost door de mappen met mediabestanden handmatig toe te voegen.</string>
<!-- Resizing -->
<string name="resize">Grootte aanpassen</string>
@ -112,12 +113,14 @@
<string name="include_videos">Videos weergeven</string>
<string name="include_gifs">GIF-bestanden weergeven</string>
<string name="random_order">Willekeurige volgorde</string>
<string name="use_fade">Animaties gebruiken (vervagen)</string>
<string name="move_backwards">Omgekeerde volgorde</string>
<string name="loop_slideshow">Voorstelling herhalen</string>
<string name="animation">Overgangseffect</string>
<string name="no_animation">Geen</string>
<string name="fade">Overvloeien</string>
<string name="slide">Verschuiven</string>
<string name="slideshow_ended">De diavoorstelling is beëindigd</string>
<string name="no_media_for_slideshow">Geen media gevonden voor diavoorstelling</string>
<string name="use_crossfade_animation">Crossfade-animaties gebruiken</string>
<!-- View types -->
<string name="change_view_type">Weergave</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Bestanden niet groeperen</string>
<string name="by_folder">Map</string>
<string name="by_last_modified">Laatst gewijzigd</string>
<string name="by_last_modified_daily">Laatst gewijzigd (per dag)</string>
<string name="by_last_modified_monthly">Laatst gewijzigd (per maand)</string>
<string name="by_date_taken">Datum opname</string>
<string name="by_date_taken_daily">Datum opname (per dag)</string>
<string name="by_date_taken_monthly">Datum opname (per maand)</string>
<string name="by_file_type">Bestandstype</string>
<string name="by_extension">Extensie</string>
<string name="grouping_and_sorting">Groeperen en sorteren zijn twee aparte opties</string>

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Prosta Galeria</string>
   <string name="app_launcher_name">Galeria</string>
<string name="app_launcher_name">Galeria</string>
<string name="edit">Edytuj</string>
<string name="open_camera">Uruchom aplikację aparatu</string>
<string name="hidden">(ukryty)</string>
<string name="excluded">(wykluczony)</string>
<string name="pin_folder">Przypnij folder</string>
<string name="unpin_folder">Odepnij folder</string>
   <string name="pin_to_the_top">Przypnij na górze</string>
<string name="pin_to_the_top">Przypnij na górze</string>
<string name="show_all">Pokaż wszystko</string>
<string name="all_folders">Wszystkie foldery</string>
<string name="folder_view">Przełącz na widok folderów</string>
@ -51,11 +51,11 @@
<string name="manage_excluded_folders">Zarządzaj wykluczonymi folderami</string>
<string name="exclude_folder_description">Działa na folderach galerii. Możesz zarządzać wykluczonymi folderami w ustawieniach aplikacji.</string>
<string name="exclude_folder_parent">Wykluczyć folder nadrzędny?</string>
   <string name="excluded_activity_placeholder">Wykluczenie folderów ukryje je tylko w niniejszej aplikacji, w innych aplikacjach będą one wciąż widoczne.\n\nJeśli chcesz je ukryć także w innych aplikacjach, użyj funkcji ukrywania.</string>
<string name="excluded_activity_placeholder">Wykluczenie folderów ukryje je tylko w niniejszej aplikacji, w innych aplikacjach będą one wciąż widoczne.\n\nJeśli chcesz je ukryć także w innych aplikacjach, użyj funkcji ukrywania.</string>
<string name="remove_all">Usuń wszystko</string>
<string name="remove_all_description">Usunąć wszystkie foldery z listy wykluczonych? Foldery nie zostaną fizycznie usunięte.</string>
<string name="hidden_folders">Ukryte foldery</string>
   <string name="manage_hidden_folders">Zarządzaj ukrytymi folderami</string>
<string name="manage_hidden_folders">Zarządzaj ukrytymi folderami</string>
<string name="hidden_folders_placeholder">Zdaje się, że nie masz żadnych folderów z plikiem \'.nomedia\'.</string>
<!-- Include folders -->
@ -63,6 +63,7 @@
<string name="manage_included_folders">Zarządzaj dołączonymi folderami</string>
<string name="add_folder">Dodaj folder</string>
<string name="included_activity_placeholder">Jeśli masz jakieś foldery z multimediami, ale aplikacja ich nie wykryła, możesz je dodać ręcznie tutaj.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Zmień rozmiar</string>
@ -70,7 +71,7 @@
<string name="width">Szerokość</string>
<string name="height">Wysokość</string>
<string name="keep_aspect_ratio">Zachowaj proporcje</string>
   <string name="invalid_values">Podaj poprawną rozdzielczość</string>
<string name="invalid_values">Podaj poprawną rozdzielczość</string>
<!-- Editor -->
<string name="editor">Edycja</string>
@ -101,9 +102,9 @@
<string name="wallpaper_set_successfully">Tapeta została ustawiona</string>
<string name="portrait_aspect_ratio">Proporcje ekranu w trybie pionowym</string>
<string name="landscape_aspect_ratio">Proporcje ekranu w trybie poziomym</string>
   <string name="home_screen">Pulpit</string>
   <string name="lock_screen">Ekran blokady</string>
   <string name="home_and_lock_screen">Pulpit i ekran blokady</string>
<string name="home_screen">Pulpit</string>
<string name="lock_screen">Ekran blokady</string>
<string name="home_and_lock_screen">Pulpit i ekran blokady</string>
<!-- Slideshow -->
<string name="slideshow">Pokaz slajdów</string>
@ -112,17 +113,19 @@
<string name="include_videos">Dołączaj filmy</string>
<string name="include_gifs">Dołączaj GIFy</string>
<string name="random_order">Losowa kolejność</string>
<string name="use_fade">Używaj płynnych przejść</string>
   <string name="move_backwards">Odwrotna kolejność</string>
   <string name="loop_slideshow">Zapętlaj</string>
<string name="move_backwards">Odwrotna kolejność</string>
<string name="loop_slideshow">Zapętlaj</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Pokaz slajdów zakończony</string>
<string name="no_media_for_slideshow">Nie znalazłem multimediów do pokazu slajdów</string>
<string name="use_crossfade_animation">Używaj animacji przejścia</string>
<!-- View types -->
   <string name="change_view_type">Zmień typ widoku</string>
   <string name="grid">Siatka</string>
   <string name="list">Lista</string>
<string name="change_view_type">Zmień typ widoku</string>
<string name="grid">Siatka</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Grupuj bezpośrednie podfoldery</string>
<!-- Grouping at media thumbnails -->
@ -130,7 +133,11 @@
<string name="do_not_group_files">Nie grupuj plików</string>
<string name="by_folder">Folderu</string>
<string name="by_last_modified">Daty ostatniej modyfikacji</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Daty utworzenia</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Typu</string>
<string name="by_extension">Rozszerzenia</string>
<string name="grouping_and_sorting">Uwaga: grupowanie i sortowanie to dwa niezależne pola</string>
@ -152,21 +159,19 @@
<string name="screen_rotation_system_setting">Ustawień systemowych</string>
<string name="screen_rotation_device_rotation">Orientacji urządzenia</string>
<string name="screen_rotation_aspect_ratio">Proporcji</string>
   <string name="black_background_at_fullscreen">Czarne tło i pasek stanu przy widoku pełnoekranowym</string>
<string name="black_background_at_fullscreen">Czarne tło i pasek stanu przy widoku pełnoekranowym</string>
<string name="scroll_thumbnails_horizontally">Przewijaj miniatury poziomo</string>
<string name="hide_system_ui_at_fullscreen">Ukrywaj interfejs przy pełnoekranowym podglądzie</string>
<string name="delete_empty_folders">Usuwaj puste foldery po usunięciu ich zawartości</string>
   <string name="allow_photo_gestures">Zezwalaj na kontrolowanie jasności zdjęcia pionowymi gestami</string>
   <string name="allow_video_gestures">Zezwalaj na kontrolowanie jasności i głośności filmów pionowymi gestami</string>
<string name="allow_photo_gestures">Zezwalaj na kontrolowanie jasności zdjęcia pionowymi gestami</string>
<string name="allow_video_gestures">Zezwalaj na kontrolowanie jasności i głośności filmów pionowymi gestami</string>
<string name="show_media_count">Pokazuj liczbę elementów w folderach w głównym widoku</string>
<string name="show_extended_details">Dodatkowe szczegóły przy podglądzie pełnoekranowym</string>
<string name="manage_extended_details">Zarządzaj dodatkowymi szczegółami</string>
   <string name="one_finger_zoom">Zezwalaj na powiększanie jednym palcem w widoku pełnoekranowym</string>
   <string name="allow_instant_change">Zezwalaj na natychmiastową zmianę multimediów po kliknięciu boków ekranu</string>
<string name="one_finger_zoom">Zezwalaj na powiększanie jednym palcem w widoku pełnoekranowym</string>
<string name="allow_instant_change">Zezwalaj na natychmiastową zmianę multimediów po kliknięciu boków ekranu</string>
<string name="allow_deep_zooming_images">Zezwalaj na duże powiększanie obrazów</string>
<string name="hide_extended_details">Ukrywaj dodatkowe szczegóły, gdy pasek stanu jest ukryty</string><![CDATA[
   
]]>
<string name="hide_extended_details">Ukrywaj dodatkowe szczegóły, gdy pasek stanu jest ukryty</string>
<string name="show_at_bottom">Pokazuj niektóre przyciski akcji na dole ekranu</string>
<string name="show_recycle_bin">Pokazuj kosz w widoku folderów</string>
<string name="deep_zoomable_images">Duże powiększanie obrazów</string>
@ -183,9 +188,9 @@
<string name="avoid_showing_invalid_files">Unikaj pokazywania niewłaściwych plików</string>
<!-- Setting sections -->
   <string name="thumbnails">Miniatury</string>
   <string name="fullscreen_media">Widok pełnoekranowy</string>
   <string name="extended_details">Dodatkowe szczegóły</string>
<string name="thumbnails">Miniatury</string>
<string name="fullscreen_media">Widok pełnoekranowy</string>
<string name="extended_details">Dodatkowe szczegóły</string>
<string name="bottom_actions">Przyciski na dolnym pasku</string>
<!-- Bottom actions -->
@ -194,22 +199,22 @@
<string name="toggle_file_visibility">Widoczność plików</string>
<!-- FAQ -->
   <string name="faq_1_title">Jak mogę ustawić tą aplikację jako domyślną aplikację galerii?</string>
   <string name="faq_1_text">Znajdź obecną domyślną aplikację galerii w ustawieniach systemowych (sekcja \'Aplikacje\'). Na ekranie z informacjami o niej kliknij \'Otwórz domyślnie\', a następnie \'Wyczyść domyślne\'. Gdy podczas następnej próby otwarcia zdjęcia czy filmu system zapyta Cię jaką aplikacją to zrobić, wybierz Prostą Galerię i opcję zapamiętania tego wyboru.</string>
   <string name="faq_2_title">Zablokowałem(-am) aplikację hasłem i wyleciało mi ono z głowy. Co mogę zrobić?</string>
   <string name="faq_2_text">Masz dwie opcje: przeinstalowanie aplikacji lub wyczyszczenie jej ustawień. Niezależnie od wyboru, pliki pozostaną nienaruszone.</string>
   <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_1_title">Jak mogę ustawić tą aplikację jako domyślną aplikację galerii?</string>
<string name="faq_1_text">Znajdź obecną domyślną aplikację galerii w ustawieniach systemowych (sekcja \'Aplikacje\'). Na ekranie z informacjami o niej kliknij \'Otwórz domyślnie\', a następnie \'Wyczyść domyślne\'. Gdy podczas następnej próby otwarcia zdjęcia czy filmu system zapyta Cię jaką aplikacją to zrobić, wybierz Prostą Galerię i opcję zapamiętania tego wyboru.</string>
<string name="faq_2_title">Zablokowałem(-am) aplikację hasłem i wyleciało mi ono z głowy. Co mogę zrobić?</string>
<string name="faq_2_text">Masz dwie opcje: przeinstalowanie aplikacji lub wyczyszczenie jej ustawień. Niezależnie od wyboru, pliki pozostaną nienaruszone.</string>
<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_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>
<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>
<string name="faq_6_text">Aplikacja nie wie, czy dany obraz jest okładką od piosenki czy czymś innym. Aby ukryć niechciane rzeczy, przytrzymaj je i wybierz opcję \'Wyklucz\' z paska akcji.</string>
   <string name="faq_7_title">Nie pokazuje(-ą) mi się folder(y) ze zdjęciami / filmami. Co mogę zrobić?</string>
   <string name="faq_7_text">Wejdź do ustawień aplikacji i w sekcji z dołączonymi folderami dodaj tenże folder do listy.</string>
<string name="faq_7_title">Nie pokazuje(-ą) mi się folder(y) ze zdjęciami / filmami. Co mogę zrobić?</string>
<string name="faq_7_text">Wejdź do ustawień aplikacji i w sekcji z dołączonymi folderami dodaj tenże folder do listy.</string>
<string name="faq_8_title">Co jeśli chcę widzieć tylko wybrane foldery?</string>
   <string name="faq_8_text">Przejdź do sekcji z wykluczonymi folderami w ustawieniach aplikacji, dodaj tam folder główny (\"/\"), a następnie dodaj pożądane foldery w sekcji z dołączonymi folderami.</string>
<string name="faq_8_text">Przejdź do sekcji z wykluczonymi folderami w ustawieniach aplikacji, dodaj tam folder główny (\"/\"), a następnie dodaj pożądane foldery w sekcji z dołączonymi folderami.</string>
<string name="faq_10_title">Czy mogę w tej aplikacji przycinać obrazy?</string>
<string name="faq_10_text">Tak, możesz to zrobić w edytorze, przeciągając krawędzie obrazu. Edytor otworzysz przytrzymując miniaturę obrazu i wybierając opcję \'Edytuj\', bądź wybierając tą samą opcję w menu pełnoekranowym.</string>
<string name="faq_11_title">Czy mogę jakoś grupować miniatury plików?</string>

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Gallery</string>
<string name="app_name">Simple Galeria</string>
<string name="app_launcher_name">Galeria</string>
<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="pin_folder">Fixar pasta</string>
<string name="unpin_folder">Desfixar 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="all_folders">Todas as pastas</string>
@ -24,45 +24,46 @@
<string name="brightness">Brilho</string>
<string name="lock_orientation">Travar orientação</string>
<string name="unlock_orientation">Destravar orientação</string>
<string name="change_orientation">Mudar orientação</string>
<string name="change_orientation">Alterar orientação</string>
<string name="force_portrait">Forçar modo retrato</string>
<string name="force_landscape">Forçar modo paisagem</string>
<string name="use_default_orientation">Usar orientação padrão</string>
<string name="fix_date_taken">Fix Date Taken value</string>
<string name="fixing">Fixing</string>
<string name="dates_fixed_successfully">Dates fixed successfully</string>
<string name="share_resized">Share a resized version</string>
<string name="upgraded_from_free">Hey,\n\nparece que você atualizou o antigo aplicativo gratuito. Agora você poderá desinstalar a velha versão que tem o botão \'Atualize 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="fix_date_taken">Corrigir data da foto</string>
<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>
<!-- Filter -->
<string name="filter_media">Filtrar mídia</string>
<string name="images">Imagens</string>
<string name="videos">Vídeos</string>
<string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="raw_images">Imagens RAW</string>
<string name="svgs">SVGs</string>
<string name="no_media_with_filters">Nenhum arquivo de mídia encontrado a partir dos filtros selecionados.</string>
<string name="change_filters_underlined"><u>Mudar filtros</u></string>
<string name="change_filters_underlined"><u>Alterar filtros</u></string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Esta opção oculta uma pasta com a adição de um arquivo \'.nomedia\' dentro dela, e irá ocultar todas as subpastas que estejam dentro da mesma. Você poderá rever essas pastas com a opção \'Mostrar pastas ocultas\'. Continuar?</string>
<string name="exclude">Excluir</string>
<string name="excluded_folders">Pastas excluídas</string>
<string name="manage_excluded_folders">Gerenciar pastas excluídas</string>
<string name="exclude_folder_description">Esta ação irá excluir as pastas selecionadas apenas dentro deste aplicativo. Você pode gerenciar as pastas excuídas nas Configurações do aplicativo.</string>
<string name="exclude_folder_parent">Excluir antes a pasta raiz?</string>
<string name="excluded_activity_placeholder">A exclusão de uma pasta apenas oculta o seu conteúdo da galeria, pois todos os outros aplicativos poderão acessá-las.\\n\\nSe quiser ocultar de todos os aplicativos, utilize a função ocultar.</string>
<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="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_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="remove_all">Remover todas</string>
<string name="remove_all_description">Remover todas as pastas da lista de exclusões? Esta ação não apaga as pastas.</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 oculta com um arquivo \".nomedia\".</string>
<string name="hidden_folders_placeholder">Parece que você não tem nenhuma pasta ocultada 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="add_folder">Adicionar pasta</string>
<string name="included_activity_placeholder">Se possuir pastas com dados multimídia não reconhecidos pelo aplicativo, aqui você pode adicioná-las manualmente.</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>
<!-- Resizing -->
<string name="resize">Redimensionar</string>
@ -89,16 +90,16 @@
<string name="flip">Inverter</string>
<string name="flip_horizontally">Horizontalmente</string>
<string name="flip_vertically">Verticalmente</string>
<string name="free_aspect_ratio">Gratuito</string> <!-- available as an option: 1:1, 4:3, 16:9, free -->
<string name="free_aspect_ratio">Livre</string> <!-- available as an option: 1:1, 4:3, 16:9, free -->
<string name="other_aspect_ratio">Outro</string> <!-- available as an option: 1:1, 4:3, 16:9, free, other -->
<!-- Set wallpaper -->
<string name="simple_wallpaper">Simple Wallpaper</string>
<string name="simple_wallpaper">Simple Papel de Parede</string>
<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="wallpaper_set_successfully">Papel de parede com sucesso</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>
<string name="home_screen">Tela inicial</string>
@ -109,34 +110,40 @@
<string name="slideshow">Apresentação</string>
<string name="interval">Intervalo (segundos):</string>
<string name="include_photos">Incluir fotos</string>
<string name="include_videos">Incluir videos</string>
<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="use_fade">Usar animação de esmaecimento</string>
<string name="move_backwards">Retroceder</string>
<string name="loop_slideshow">Apresentação em ciclo</string>
<string name="animation">Animação</string>
<string name="no_animation">Nenhuma</string>
<string name="fade">Esmaecer</string>
<string name="slide">Deslizar</string>
<string name="slideshow_ended">Fim da apresentação</string>
<string name="no_media_for_slideshow">Nenhuma mídia encontrada para a apresentação</string>
<string name="use_crossfade_animation">Usar animações crossfade</string>
<!-- View types -->
<string name="change_view_type">Alterar modo de visualização</string>
<string name="grid">Grade</string>
<string name="list">Lista</string>
<string name="group_direct_subfolders">Agrupar subpastas do diretório</string>
<string name="group_direct_subfolders">Agrupar subpastas diretas</string>
<!-- Grouping at media thumbnails -->
<string name="group_by">Agrupar por</string>
<string name="do_not_group_files">Não agrupar arquivos</string>
<string name="by_folder">Pasta</string>
<string name="by_last_modified">Última modificação</string>
<string name="by_date_taken">Data de criação</string>
<string name="by_last_modified_daily">Última modificação (por dia)</string>
<string name="by_last_modified_monthly">Última modificação (por mês)</string>
<string name="by_date_taken">Data da foto</string>
<string name="by_date_taken_daily">Data da foto (por dia)</string>
<string name="by_date_taken_monthly">Data da foto (por mês)</string>
<string name="by_file_type">Tipo de arquivo</string>
<string name="by_extension">Extensão</string>
<string name="grouping_and_sorting">Por favor, note que o agrupamento e classificação são 2 campos independentes</string>
<string name="grouping_and_sorting">Por favor, lembre-se que o agrupamento e classificação são configurados por dois campos independentes</string>
<!-- Widgets -->
<string name="folder_on_widget">Exibição da Pasta no widget:</string>
<string name="folder_on_widget">Pasta exibida no widget:</string>
<string name="show_folder_name">Exibir nome da pasta</string>
<!-- Settings -->
@ -144,135 +151,132 @@
<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="loop_videos">Reproduzir vídeos em ciclo</string>
<string name="animate_gifs">Animação de GIFs nas miniaturas</string>
<string name="max_brightness">Brilho máximo ao visualizar mídia</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>
<string name="crop_thumbnails">Recortar miniaturas em quadrados</string>
<string name="show_thumbnail_video_duration">Exibir durações de vídeo</string>
<string name="show_thumbnail_video_duration">Exibir duração dos vídeos</string>
<string name="screen_rotation_by">Critério para rotação de tela</string>
<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="scroll_thumbnails_horizontally">Rolar miniaturas horizontalmente</string>
<string name="hide_system_ui_at_fullscreen">Esconder interface do sistema automaticamente quando em tela cheia</string>
<string name="delete_empty_folders">Apagar pastas vazias após deleter seu conteúdo</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 das pastas</string>
<string name="show_extended_details">Exibir detalhes extendidos quando em tela cheia</string>
<string name="manage_extended_details">Gerenciar detalhes extendidos</string>
<string name="show_media_count">Mostrar 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">Permitir alternância instantânia de mídia clicando nas laterais da tela</string>
<string name="allow_deep_zooming_images">Permitir zoom aprofundado em imagens</string>
<string name="hide_extended_details">Ocultar detalhes extendidos quando a barra de status estiver oculta</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">Mostar a Lixeira na tela de pastas</string>
<string name="deep_zoomable_images">Imagens com zoom aprofundado</string>
<string name="show_highest_quality">Mostrar imagens com a maior qualidade possível</string>
<string name="show_recycle_bin_last">Mostrar a Lixeira como o último item na tela principal</string>
<string name="allow_down_gesture">Permitir fechar a exibição em tela cheia com um gesto para baixo</string>
<string name="allow_one_to_one_zoom">Permitir zoom 1:1 com dois toques duplos</string>
<string name="show_recycle_bin">Mostrar 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="open_videos_on_separate_screen">Sempre abrir vídeos em uma tela separada com novos gestos horizontais</string>
<string name="show_notch">Mostrar um encaixe, se disponível</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="file_loading_priority">Prioridade de carregamento de arquivos</string>
<string name="speed">Velocidade</string>
<string name="compromise">Compromise</string>
<string name="avoid_showing_invalid_files">Evite exibit arquivos inválidos</string>
<string name="compromise">Meio termo</string>
<string name="avoid_showing_invalid_files">Evitar a exibição de arquivos inválidos</string>
<!-- Setting sections -->
<string name="thumbnails">Miniaturas</string>
<string name="fullscreen_media">Mídia em tela cheia</string>
<string name="extended_details">Detalhes extendidos</string>
<string name="bottom_actions">Bottom actions</string>
<string name="extended_details">Detalhes adicionais</string>
<string name="bottom_actions">Botões de ação</string>
<!-- Bottom actions -->
<string name="manage_bottom_actions">Manage visible bottom actions</string>
<string name="toggle_favorite">Toggle favorite</string>
<string name="toggle_file_visibility">Toggle file visibility</string>v
<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>v
<!-- FAQ -->
<string name="faq_1_title">Como eu posso tornar o Simple Gallery como galeria padrão do meu aparelho?</string>
<string name="faq_1_text">First you have to find the currently default gallery in the Apps section of your device settings, look for a button that says something like \"Open by default\", click on it, then select \"Clear defaults\".
The next time you will try opening an image or video you should see an app picker, where you can select Simple Gallery and make it the default app.</string>
<string name="faq_2_title">I locked the app with a password, but I forgot it. What can I do?</string>
<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_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>
<string name="faq_6_text">It can happen that you will see some unusual albums show up. You can easily exclude them by long pressing them and selecting Exclude. In the next dialog you can then select the parent folder, chances are it will prevent the other related albums showing up too.</string>
<string name="faq_7_title">A folder with images isn\'t showing up, or it doesn\'t show all items. What can I do?</string>
<string name="faq_7_text">That can have multiple reasons, but solving it is easy. Just go in Settings -> Manage Included Folders, select Plus and navigate to the required folder.</string>
<string name="faq_8_title">What if I want just a few particular folders visible?</string>
<string name="faq_8_text">Adding a folder at the Included Folders doesn\'t automatically exclude anything. What you can do is go in Settings -> Manage Excluded Folders, exclude the root folder \"/\", then add the desired folders at Settings -> Manage Included Folders.
That will make only the selected folders visible, as both excluding and including are recursive and if a folder is both excluded and included, it will show up.</string>
<string name="faq_10_title">Can I crop images with this app?</string>
<string name="faq_10_text">Yes, you can crop images in the editor, by dragging the image corners. You can get to the editor either by long pressing an image thumbnail and selecting Edit, or selecting Edit from the fullscreen view.</string>
<string name="faq_11_title">Can I somehow group media file thumbnails?</string>
<string name="faq_11_text">Sure, just use the \"Group by\" menu item while at the thumbnails view. You can group files by multiple criteria, including Date Taken. If you use the \"Show all folders content\" function you can group them by folders too.</string>
<string name="faq_12_title">Sorting by Date Taken doesn\'t seem to work properly, how can I fix it?</string>
<string name="faq_12_text">It is most likely caused by the files being copied from somewhere. You can fix it by selecting the file thumbnails and selecting \"Fix Date Taken value\".</string>
<string name="faq_13_title">I see some color banding on the images. How can I improve the quality?</string>
<string name="faq_13_text">The current solution for displaying images works fine in the vast majority of cases, but if you want even better image quality, you can enable the \"Show images in the highest possible quality\" at the app settings, in the \"Deep zoomable images\" section.</string>
<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_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_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_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_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_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_14_title">I have hidden a file/folder. How can I unhide it?</string>
<string name="faq_14_text">You can either press the \"Temporarily show hidden items\" menu item at the main screen, or toggle \"Show hidden items\" in the app settings to see the hidden item. If you want to unhide it, just long press it and select \"Unhide\". Folders are hidden by adding a hidden \".nomedia\" file into them, you can delete the file with any file manager too.</string>
<string name="faq_15_title">Why does the app take up so much space?</string>
<string name="faq_15_text">App cache can take up to 250MB, it ensures quicker image loading. If the app is taking up even more space, it is most likely caused by you having items in the Recycle Bin. Those files count to the app size. You can clear the Recycle bin by opening it and deleting all files, or from the app settings. Every file in the Bin is deleted automatically after 30 days.</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>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro: Photo Manager &amp; Editor</string>
<string name="app_title">Simple Galeria Pro: Gerenciador de Imagens</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Offline gallery without ads. Organize, edit, recover and protect photos &amp; videos</string>
<string name="app_short_description">Galeria offline sem anúncios. Organize, edite, e proteja fotos e vídeos.</string>
<string name="app_long_description">
Simple Gallery Pro is a highly customizable offline gallery. Organize &amp; edit your photos, recover deleted files with the recycle bin, protect &amp; hide files and view a huge variety of different photo &amp; video formats including RAW, SVG and much more.
The app contains no ads and unnecessary permissions. As the app doesnt require internet access either, your privacy is protected.
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.
-------------------------------------------------
<b>SIMPLE GALLERY PRO FEATURES</b>
<b>SIMPLE GALERIA PRO FUNCIONALIDADES</b>
-------------------------------------------------
• Offline gallery with no ads or popups
• Simple gallery photo editor crop, rotate, resize, draw, filters &amp; more
• No internet access needed, giving you more privacy and security
• No unnecessary permissions required
• Quickly search images, videos &amp; files
• Open &amp; view many different photo and video types (RAW, SVG, panoramic etc)
• A variety of intuitive gestures to easily edit &amp; organize files
• Lots of ways to filter, group &amp; sort files
• Customize the appearance of Simple Gallery Pro
• Available in 32 languages
• Mark files as favorites for quick access
• Protect your photos &amp; videos with a pattern, pin or fingerprint
• Use pin, pattern &amp; fingerprint to protect the app launch or specific functions too
• Recover deleted photos &amp; videos from the recycle bin
• Toggle visibility of files to hide photos &amp; videos
• Create a customizable slideshow of your files
• View detailed information of your files (resolution, EXIF values etc)
• Simple Gallery Pro is open source
… and much much more!
• Galeria offline sem anúncios ou popups
• Editor de imagens recorte, rotacione, redimensione, desenhe, adicione filtros, e muito mais
• Não requer acesso à internet. Mais privacidade e segurança.
• Não pede permissões desnecessárias
• Pesquise por imagens, vídeos e arquivos rapidamente
• Visualize diversos formatos de arquivos de imagem ou vídeo (RAW, SVG, imagens panorâmicas, etc)
• Use uma variedade de gestos intuitivos para editar e organizar seus arquivos
• Varias maneiras de filtrar, agrupar, e ordenar seus arquivos
• Customize a aparência da Simple Galeria Pro
• Disponível em 32 idiomas
• Marque seus arquivos favoritos para acesso mais rápido
• Proteja suas imagens e vídeos com um padrão, PIN, ou impressão digital
• Recupere imagens e vídeos que foram excluídos para a lixeira
• Oculte arquivos para deixar de exibir certas imagens ou vídeos no app.
• Crie um slideshow customizado com os seus arquivos
• Exiba informações avançadas sobre seus arquivos (resolução, metadados EXIF, etc)
• A Simple Galeria Pro tem código aberto!
… e muito mais!
<b>PHOTO GALLERY EDITOR</b>
Simple Gallery Pro makes it easy to edit your pictures on the fly. Crop, flip, rotate and resize your pictures. If youre feeling a little more creative you can add filters and draw on your pictures!
<b>EDITOR DE IMAGENS</b>
Com a Simple Galeria Pro é bem fácil editar suas imagens na hora. Recorte, rotacione, e redimensione suas imagens. Se você estiver se sentindo mais criativo, você também pode desenhar ou adicionar filtros!
<b>SUPPORT FOR MANY FILE TYPES</b>
Unlike some other gallery viewers &amp; photo organizers, Simple Gallery Pro supports a huge range of different file types including JPEG, PNG, MP4, MKV, RAW, SVG, Panoramic photos, Panoramic videos and many more.
<b>SUPORTE A VÁRIOS FORMATOS DE ARQUIVO</b>
Ao contrário de alguns outros aplicativos de organização de imagens, a Simple Galeria Pro é capaz de exibir uma grande variedade de formatos de arquivo, incluindo JPEG, PNG, MP4, MKV, RAW, SVG, fotos panorâmicas, vídeos panorâmicos e muito mais.
<b>HIGHLY CUSTOMIZABLE GALLERY MANAGER</b>
From the UI to the function buttons on the bottom toolbar, Simple Gallery Pro is highly customizable and works the way you want it to. No other gallery manager has this kind of flexibility! Thanks to being open source, were also available in 32 languages!
<b>GERENCIADOR DE IMAGENS ALTAMENTE CUSTOMIZÁVEL</b>
Desde a interface de usuário, até os botões da barra de ferramentas, a Simple Galeria Pro é altamente customizável, e você pode fazer com que ela funcione exatamente do seu jeito. Nenhum outro app de galeria de imagens é tão flexível! Além disso, por ter o código aberto, a Simple Galeria está disponível em 32 idiomas!
<b>RECOVER DELETED PHOTOS &amp; VIDEOS</b>
Accidentally deleted a precious photo or video? Dont worry! Simple Gallery Pro features a handy recycle bin where you can recover deleted photos &amp; videos easily.
<b>RECUPERE IMAGENS E VÍDEOS EXCLUÍDOS</b>
Acidentalmente excluiu uma preciosa imagem ou vídeo? Não se preocupe! A Simple Galeria Pro vem com uma lixeira que permite facilmente recuperar fotos ou vídeos excluídos nos últimos 30 dias.
<b>PROTEJA E OCULTE FOTOS, VÍDEOS E ARQUIVOS</b>
Usando um PIN, padrão, ou sua impressão digital, você pode proteger ou ocultar imagens, vídeos ou até álbuns inteiros. Você também pode proteger o app como um todo por senha, ou apenas funções específicas. Por exemplo, você pode fazer com que a Simple Galeria verifique a impressão digital antes de excluir arquivos, para ajudar a evitar que arquivos sejam excluí.
<b>PROTECT &amp; HIDE PHOTOS, VIDEOS &amp; FILES</b>
Using pin, pattern or your devices fingerprint scanner you can protect and hide photos, videos &amp; entire albums. You can protect the app itself or place locks on specific functions of the app. For example, you cant delete a file without a fingerprint scan, helping to protect your files from accidental deletion.
<b>Check out the full suite of Simple Tools here:</b>
<b>Dê uma olhada nos nossos outros aplicativos Simple:</b>
https://www.simplemobiletools.com
<b>Facebook:</b>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Gerir pastas incluídas</string>
<string name="add_folder">Adicionar pasta</string>
<string name="included_activity_placeholder">Se possuir pastas com dados multimédia não reconhecidos pela aplicação, aqui pode adicioná-las manualmente.</string>
<string name="no_media_add_included">Não foram encontrados ficheiros multimédia. Pode adicionar manualmente as pastas que contenham esses ficheiros.</string>
<!-- Resizing -->
<string name="resize">Redimensionar</string>
@ -112,12 +113,14 @@
<string name="include_videos">Incluir vídeos</string>
<string name="include_gifs">Incluir GIF</string>
<string name="random_order">Ordem aleatória</string>
<string name="use_fade">Utilizar animações</string>
<string name="move_backwards">Mover para trás</string>
<string name="loop_slideshow">Apresentação em ciclo</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Apresentação terminada</string>
<string name="no_media_for_slideshow">Não foram encontrados ficheiros para a apresentação</string>
<string name="use_crossfade_animation">Utilizar animação de transição</string>
<!-- View types -->
<string name="change_view_type">Tipo de exibição</string>
@ -130,10 +133,14 @@
<string name="do_not_group_files">Não agrupar ficheiros</string>
<string name="by_folder">Pasta</string>
<string name="by_last_modified">Última modificação</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Data de obtenção</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Tipo de ficheiro</string>
<string name="by_extension">Extensão</string>
<string name="grouping_and_sorting">Tenha em atenção de que o agrupamento e a ordenação são campos independentes</string>
<string name="grouping_and_sorting">Tenha em atenção de que agrupamento e ordenação são campos independentes</string>
<!-- Widgets -->
<string name="folder_on_widget">Pasta mostrada no widget:</string>
@ -155,7 +162,7 @@
<string name="black_background_at_fullscreen">Fundo escuro e barra de estado no modo de ecrã completo</string>
<string name="scroll_thumbnails_horizontally">Deslocação horizontal de miniaturas</string>
<string name="hide_system_ui_at_fullscreen">Ocultar interface do sistema se em ecrã completo</string>
<string name="delete_empty_folders">Apagar as pastas vazias depois de remover o seu conteúdo</string>
<string name="delete_empty_folders">Apagar pastas vazias depois de remover o seu conteúdo</string>
<string name="allow_photo_gestures">Permitir controlo do brilho das fotos com gestos verticais</string>
<string name="allow_video_gestures">Permitir controlo do volume e do brilho dos vídeos através de gestos verticais</string>
<string name="show_media_count">Mostrar número de ficheiros na vista principal</string>
@ -169,14 +176,14 @@
<string name="show_recycle_bin">Mostrar reciclagem no ecrã de pastas</string>
<string name="deep_zoomable_images">Ampliação de imagens</string>
<string name="show_highest_quality">Mostrar fotos com a melhor qualidade possível</string>
<string name="show_recycle_bin_last">Mostrar a reciclagem como o último item do ecrã principal</string>
<string name="show_recycle_bin_last">Mostrar reciclagem como o último item do ecrã principal</string>
<string name="allow_down_gesture">Sair de ecrã completo com um gesto para baixo</string>
<string name="allow_one_to_one_zoom">Permitir ampliação 1:1 com dois toques</string>
<string name="open_videos_on_separate_screen">Abrir vídeos em ecrã distinto com os novos toques horizontais</string>
<string name="show_notch">Mostrar \"notch\", se disponível</string>
<string name="allow_rotating_gestures">Permitir rotação de imagens com gestos</string>
<string name="file_loading_priority">Prioridade de carregamento dos ficheiros</string>
<string name="speed">velocidade</string>
<string name="speed">Velocidade</string>
<string name="compromise">Compromisso</string>
<string name="avoid_showing_invalid_files">Não mostrar ficheiros inválidos</string>
@ -225,16 +232,16 @@
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro: Photo Manager &amp; Editor</string>
<string name="app_title">Simple Gallery Pro: Editor e gestor de fotos</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Offline gallery without ads. Organize, edit, recover and protect photos &amp; videos</string>
<string name="app_short_description">Sem anúncios. Organize, edite, recupere e protega os seus vídeos e fotos</string>
<string name="app_long_description">
Simple Gallery Pro is a highly customizable offline gallery. Organize &amp; edit your photos, recover deleted files with the recycle bin, protect &amp; hide files and view a huge variety of different photo &amp; video formats including RAW, SVG and much more.
Simple Gallery Pro é 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.
The app contains no ads and unnecessary permissions. As the app doesnt require internet access either, your privacy is protected.
A aplicação não tem anúncios nem pede permissões desnecessárias. uma vez que também não precisa de aceder à Internet, os seus ficheiros estão protegidos.
-------------------------------------------------
<b>SIMPLE GALLERY PRO FEATURES</b>
<b>SIMPLE GALLERY PRO FUNCIONALIDADES</b>
-------------------------------------------------
• Offline gallery with no ads or popups

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Управление включёнными папками</string>
<string name="add_folder">Добавить папку</string>
<string name="included_activity_placeholder">Если у вас есть папки, содержащие медиафайлы, но не распознанные приложением, вы можете добавить их вручную.\n\nДобавление папки не приводит к исключению каких-либо других.</string>
<string name="no_media_add_included">Медиафайлы не найдены. Вы можете исправить данную проблему, добавив папки с медиафайлами вручную.</string>
<!-- Resizing -->
<string name="resize">Изменить размер</string>
@ -112,12 +113,14 @@
<string name="include_videos">Видео</string>
<string name="include_gifs">GIF</string>
<string name="random_order">В случайном порядке</string>
<string name="use_fade">Эффект затухания</string>
<string name="move_backwards">В обратном порядке</string>
<string name="loop_slideshow">Зациклить</string>
<string name="animation">Анимация</string>
<string name="no_animation">Нет</string>
<string name="fade">Затухание</string>
<string name="slide">Сдвиг</string>
<string name="slideshow_ended">Слайдшоу завершено</string>
<string name="no_media_for_slideshow">Медиафайлов для слайдшоу не найдено</string>
<string name="use_crossfade_animation">Эффект плавного перехода</string>
<!-- View types -->
<string name="change_view_type">Вид</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Не группировать</string>
<string name="by_folder">Папка</string>
<string name="by_last_modified">Последнее изменение</string>
<string name="by_last_modified_daily">Последнее изменение (по дням)</string>
<string name="by_last_modified_monthly">Последнее изменение (по месяцам)</string>
<string name="by_date_taken">Дата съёмки</string>
<string name="by_date_taken_daily">Дата съёмки (по дням)</string>
<string name="by_date_taken_monthly">Дата съёмки (по месяцам)</string>
<string name="by_file_type">Тип файла</string>
<string name="by_extension">Расширение</string>
<string name="grouping_and_sorting">Обратите внимание, что группировка и сортировка — это два независимых поля</string>
@ -225,7 +232,7 @@
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Gallery Pro: Photo Manager &amp; Editor</string>
<string name="app_title">Галерея: управление и редактирование изображений</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Галерея без рекламы. Управление, изменение, восстановление и защита фото и видео</string>
<string name="app_long_description">

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Spravovať pridané priečinky</string>
<string name="add_folder">Pridať priečinok</string>
<string name="included_activity_placeholder">Ak máte nejaké priečinky obsahujúce médiá, ale neboli rozpoznané aplikáciou, môžete ich tu manuálne pridať.\n\nPridanie nových položiek sem nevylúči žiadny iný priečinok.</string>
<string name="no_media_add_included">Nenašli sa žiadne súbory s médiami. Viete to napraviť manuálnym pridaním priečinkov, ktoré obsahujú médiá.</string>
<!-- Resizing -->
<string name="resize">Zmeniť veľkosť</string>
@ -112,12 +113,14 @@
<string name="include_videos">Zahrnúť videá</string>
<string name="include_gifs">Zahrnúť GIFy</string>
<string name="random_order">Náhodné poradie</string>
<string name="use_fade">Používať miznúce animácie</string>
<string name="move_backwards">Ísť opačným smerom</string>
<string name="loop_slideshow">Automaticky reštartovať prezentáciu</string>
<string name="animation">Animácia:</string>
<string name="no_animation">Žiadna</string>
<string name="fade">Prelínanie</string>
<string name="slide">Posúvanie</string>
<string name="slideshow_ended">Prezentácia skončila</string>
<string name="no_media_for_slideshow">Pre prezentáciu sa nenašli žiadne vhodné súbory</string>
<string name="use_crossfade_animation">Použiť prelínacie animácie</string>
<!-- View types -->
<string name="change_view_type">Zmeniť typ zobrazenia</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Nezoskupovať súbory</string>
<string name="by_folder">Priečinka</string>
<string name="by_last_modified">Dátumu poslednej úpravy</string>
<string name="by_last_modified_daily">Dátumu poslednej úpravy (denne)</string>
<string name="by_last_modified_monthly">Dátumu poslednej úpravy (mesačne)</string>
<string name="by_date_taken">Dátumu vytvorenia</string>
<string name="by_date_taken_daily">Dátumu vytvorenia (denne)</string>
<string name="by_date_taken_monthly">Dátumu vytvorenia (mesačne)</string>
<string name="by_file_type">Typu súboru</string>
<string name="by_extension">Prípony</string>
<string name="grouping_and_sorting">Prosím vedzte, že radenie a zoskupovanie súborov sú 2 nezávislé hodnoty</string>

View file

@ -63,6 +63,7 @@
<string name="manage_included_folders">Urejaj vključene mape</string>
<string name="add_folder">Dodaj mapo</string>
<string name="included_activity_placeholder">Če imate mape, ki vsebujejo medijske datoteke, ki jih aplikacija ni prepoznala, jih lahko ročno dodate tukaj.\n\nDodajanje novih elementov ne bo izključilo drugih.</string>
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
<!-- Resizing -->
<string name="resize">Spremeni velikost</string>
@ -112,12 +113,14 @@
<string name="include_videos">Vključi videoposnetke</string>
<string name="include_gifs">Vključi GIFe</string>
<string name="random_order">Naključni vrstni red</string>
<string name="use_fade">Uporabi zameglitev animacij</string>
<string name="move_backwards">Premik nazaj</string>
<string name="loop_slideshow">Ponavljaj diaprojekcijo</string>
<string name="animation">Animation</string>
<string name="no_animation">None</string>
<string name="fade">Fade</string>
<string name="slide">Slide</string>
<string name="slideshow_ended">Diaprojekcija se je zaključila</string>
<string name="no_media_for_slideshow">Ne najdem datotek za diaprojekcijo</string>
<string name="use_crossfade_animation">Uporabi križanje animacij</string>
<!-- View types -->
<string name="change_view_type">Spremeni tip pogleda</string>
@ -130,7 +133,11 @@
<string name="do_not_group_files">Ne združuj datotek</string>
<string name="by_folder">Mapa</string>
<string name="by_last_modified">Zadnjič spremenjeno</string>
<string name="by_last_modified_daily">Last modified (daily)</string>
<string name="by_last_modified_monthly">Last modified (monthly)</string>
<string name="by_date_taken">Posneto</string>
<string name="by_date_taken_daily">Date taken (daily)</string>
<string name="by_date_taken_monthly">Date taken (monthly)</string>
<string name="by_file_type">Tip datoteke</string>
<string name="by_extension">Končnica</string>
<string name="grouping_and_sorting">Združevanje in sortiranje sta dve neodvisni polji.</string>

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