diff --git a/CHANGELOG.md b/CHANGELOG.md index d75fcddde..8bf95193a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,38 @@ Changelog ========== +Version 6.19.0 *(2021-01-21)* +---------------------------- + + * Allow easily clearing the app cache from the app settings + * Allow customizing the spacing between file thumbnails, or using rounded corners + * Many other performance, UI, UX, translation and stability improvements + +Version 6.18.3 *(2021-01-14)* +---------------------------- + + * Speed up fullscreen medium loading a bit too + +Version 6.18.2 *(2021-01-14)* +---------------------------- + + * Improve the performance at scrolling media thumbnails + * Speed up cached folder fetching + * Some stability and translation improvements + +Version 6.18.1 *(2021-01-03)* +---------------------------- + + * Updated the photo and video editor to fix some glitches + * Added some translation and stability improvements + +Version 6.18.0 *(2020-12-08)* +---------------------------- + + * Added a Video Editor + * Added Stickers and Overlays to the Photo Editor + * Some translation, stability and UI improvements + Version 6.17.3 *(2020-11-10)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index fe52e34f8..096eddbd6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.simplemobiletools.gallery.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 328 - versionName "6.17.3" + versionCode 335 + versionName "6.19.0" setProperty("archivesBaseName", "gallery-$versionCode") vectorDrawables.useSupportLibrary = true } @@ -77,7 +77,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.32.4' + implementation 'com.simplemobiletools:commons:5.33.7' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation 'it.sephiroth.android.exif:library:1.0.1' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19' @@ -96,9 +96,9 @@ dependencies { kapt 'com.github.bumptech.glide:compiler:4.10.0' - kapt 'androidx.room:room-compiler:2.2.5' - implementation 'androidx.room:room-runtime:2.2.5' - annotationProcessor 'androidx.room:room-compiler:2.2.5' + kapt 'androidx.room:room-compiler:2.2.6' + implementation 'androidx.room:room-runtime:2.2.6' + annotationProcessor 'androidx.room:room-compiler:2.2.6' } // Apply the PESDKPlugin diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt index 853264d71..26cea909e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt @@ -7,7 +7,6 @@ import android.graphics.Bitmap import android.graphics.Bitmap.CompressFormat import android.graphics.Color import android.graphics.Point -import android.media.ExifInterface import android.net.Uri import android.os.Build import android.os.Bundle @@ -16,6 +15,7 @@ import android.provider.MediaStore import android.view.Menu import android.view.MenuItem import android.widget.RelativeLayout +import androidx.exifinterface.media.ExifInterface import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt index 9234794c1..496f0968d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt @@ -524,7 +524,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { invalidateOptionsMenu() setupLayoutManager() directories_grid.adapter = null - setupAdapter(mDirs) + setupAdapter(getRecyclerAdapter()?.dirs ?: mDirs) } } @@ -761,9 +761,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun columnCountChanged() { invalidateOptionsMenu() - directories_grid.adapter?.notifyDataSetChanged() - getRecyclerAdapter()?.dirs?.apply { - measureRecyclerViewContent(this) + getRecyclerAdapter()?.apply { + notifyItemRangeChanged(0, dirs.size) + measureRecyclerViewContent(dirs) } } @@ -936,7 +936,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0 val favoritePaths = getFavoritePaths() val dirPathsToRemove = ArrayList() - val lastModifieds = if (isRPlus()) mLastMediaFetcher!!.getLastModifieds() else HashMap() + val lastModifieds = mLastMediaFetcher!!.getLastModifieds() val dateTakens = mLastMediaFetcher!!.getDateTakens() try { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt index 31275b592..731ac3e6d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt @@ -46,6 +46,7 @@ import kotlinx.android.synthetic.main.activity_media.* import java.io.File import java.io.IOException import java.util.* +import kotlin.collections.ArrayList class MediaActivity : SimpleActivity(), MediaOperationsListener { private val LAST_MEDIA_CHECK_PERIOD = 3000L @@ -74,8 +75,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private var mStoredCropThumbnails = true private var mStoredScrollHorizontally = true private var mStoredShowFileTypes = true + private var mStoredRoundedCorners = false private var mStoredTextColor = 0 private var mStoredPrimaryColor = 0 + private var mStoredThumbnailSpacing = 0 companion object { var mMedia = ArrayList() @@ -153,6 +156,16 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { media_vertical_fastscroller.updatePrimaryColor() } + if (mStoredThumbnailSpacing != config.thumbnailSpacing) { + media_grid.adapter = null + setupAdapter() + } + + if (mStoredRoundedCorners != config.fileRoundedCorners) { + media_grid.adapter = null + setupAdapter() + } + media_horizontal_fastscroller.updateBubbleColors() media_vertical_fastscroller.updateBubbleColors() media_refresh_layout.isEnabled = config.enablePullToRefresh @@ -298,6 +311,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { mStoredShowFileTypes = showThumbnailFileTypes mStoredTextColor = textColor mStoredPrimaryColor = primaryColor + mStoredThumbnailSpacing = thumbnailSpacing + mStoredRoundedCorners = fileRoundedCorners mShowAll = showAll } } @@ -356,6 +371,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { media_empty_text_placeholder.beGone() } + handleGridSpacing(grouped) getMediaAdapter()?.updateMedia(grouped) measureRecyclerViewContent(grouped) } @@ -404,9 +420,11 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { media_grid.adapter = this } setupLayoutManager() + handleGridSpacing() measureRecyclerViewContent(mMedia) } else if (mLastSearchedText.isEmpty()) { (currAdapter as MediaAdapter).updateMedia(mMedia) + handleGridSpacing() measureRecyclerViewContent(mMedia) } else { searchQueryChanged(mLastSearchedText) @@ -691,7 +709,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private fun calculateContentWidth(media: ArrayList) { val layoutManager = media_grid.layoutManager as MyGridLayoutManager val thumbnailWidth = layoutManager.getChildAt(0)?.width ?: 0 - val fullWidth = ((media.size - 1) / layoutManager.spanCount + 1) * thumbnailWidth + val spacing = config.thumbnailSpacing + val fullWidth = ((media.size - 1) / layoutManager.spanCount + 1) * (thumbnailWidth + spacing) - spacing media_horizontal_fastscroller.setContentWidth(fullWidth) media_horizontal_fastscroller.setScrollToX(media_grid.computeHorizontalScrollOffset()) } @@ -718,11 +737,35 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } } - fullHeight += ((curSectionItems - 1) / layoutManager.spanCount + 1) * thumbnailHeight + val spacing = config.thumbnailSpacing + fullHeight += ((curSectionItems - 1) / layoutManager.spanCount + 1) * (thumbnailHeight + spacing) - spacing media_vertical_fastscroller.setContentHeight(fullHeight) media_vertical_fastscroller.setScrollToY(media_grid.computeVerticalScrollOffset()) } + private fun handleGridSpacing(media: ArrayList = mMedia) { + val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) + if (viewType == VIEW_TYPE_GRID) { + val spanCount = config.mediaColumnCnt + val spacing = config.thumbnailSpacing + val useGridPosition = media.firstOrNull() is ThumbnailSection + + var currentGridDecoration: GridSpacingItemDecoration? = null + if (media_grid.itemDecorationCount > 0) { + currentGridDecoration = media_grid.getItemDecorationAt(0) as GridSpacingItemDecoration + currentGridDecoration.items = media + } + + val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition) + if (currentGridDecoration.toString() != newGridDecoration.toString()) { + if (currentGridDecoration != null) { + media_grid.removeItemDecoration(currentGridDecoration) + } + media_grid.addItemDecoration(newGridDecoration) + } + } + } + private fun initZoomListener() { val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) if (viewType == VIEW_TYPE_GRID) { @@ -773,9 +816,12 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } private fun columnCountChanged() { + handleGridSpacing() invalidateOptionsMenu() - media_grid.adapter?.notifyDataSetChanged() - measureRecyclerViewContent(mMedia) + getMediaAdapter()?.apply { + notifyItemRangeChanged(0, media.size) + measureRecyclerViewContent(media) + } } private fun isSetWallpaperIntent() = intent.getBooleanExtra(SET_WALLPAPER_INTENT, false) @@ -945,6 +991,22 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { finish() } + override fun updateMediaGridDecoration(media: ArrayList) { + var currentGridPosition = 0 + media.forEach { + if (it is Medium) { + it.gridPosition = currentGridPosition++ + } else if (it is ThumbnailSection) { + currentGridPosition = 0 + } + } + + if (media_grid.itemDecorationCount > 0) { + val currentGridDecoration = media_grid.getItemDecorationAt(0) as GridSpacingItemDecoration + currentGridDecoration.items = media + } + } + private fun setAsDefaultFolder() { config.defaultFolder = mPath invalidateOptionsMenu() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt index d79790cb3..769d65e90 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt @@ -26,7 +26,12 @@ 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_media.* import kotlinx.android.synthetic.main.activity_search.* +import kotlinx.android.synthetic.main.activity_search.media_empty_text_placeholder +import kotlinx.android.synthetic.main.activity_search.media_grid +import kotlinx.android.synthetic.main.activity_search.media_horizontal_fastscroller +import kotlinx.android.synthetic.main.activity_search.media_vertical_fastscroller import java.io.File class SearchActivity : SimpleActivity(), MediaOperationsListener { @@ -119,6 +124,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener { media_empty_text_placeholder.beGone() } + handleGridSpacing(grouped) getMediaAdapter()?.updateMedia(grouped) measureRecyclerViewContent(grouped) } @@ -139,9 +145,11 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener { media_grid.adapter = this } setupLayoutManager() + handleGridSpacing(mAllMedia) measureRecyclerViewContent(mAllMedia) } else if (mLastSearchedText.isEmpty()) { (currAdapter as MediaAdapter).updateMedia(mAllMedia) + handleGridSpacing(mAllMedia) measureRecyclerViewContent(mAllMedia) } else { textChanged(mLastSearchedText) @@ -150,6 +158,20 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener { setupScrollDirection() } + private fun handleGridSpacing(media: ArrayList) { + val viewType = config.getFolderViewType(SHOW_ALL) + if (viewType == VIEW_TYPE_GRID) { + if (media_grid.itemDecorationCount > 0) { + media_grid.removeItemDecorationAt(0) + } + + val spanCount = config.mediaColumnCnt + val spacing = config.thumbnailSpacing + val decoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, true) + media_grid.addItemDecoration(decoration) + } + } + private fun getMediaAdapter() = media_grid.adapter as? MediaAdapter private fun toggleFilenameVisibility() { @@ -357,4 +379,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener { override fun selectedPaths(paths: ArrayList) { } + + override fun updateMediaGridDecoration(media: ArrayList) { + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt index 84e089a88..45279a23d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt @@ -12,7 +12,8 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.gallery.pro.R -import com.simplemobiletools.gallery.pro.dialogs.ChangeThumbnailStyleDialog +import com.simplemobiletools.gallery.pro.dialogs.ChangeFileThumbnailStyleDialog +import com.simplemobiletools.gallery.pro.dialogs.ChangeFolderThumbnailStyleDialog import com.simplemobiletools.gallery.pro.dialogs.ManageBottomActionsDialog import com.simplemobiletools.gallery.pro.dialogs.ManageExtendedDetailsDialog import com.simplemobiletools.gallery.pro.extensions.config @@ -53,7 +54,6 @@ class SettingsActivity : SimpleActivity() { setupRememberLastVideo() setupLoopVideos() setupOpenVideosOnSeparateScreen() - setupAnimateGifs() setupMaxBrightness() setupCropThumbnails() setupDarkBackground() @@ -64,14 +64,11 @@ class SettingsActivity : SimpleActivity() { setupAppPasswordProtection() setupFileDeletionPasswordProtection() setupDeleteEmptyFolders() - setupAllowPhotoGestures() - setupAllowVideoGestures() setupAllowDownGesture() setupAllowRotatingWithGestures() setupShowNotch() setupBottomActions() - setupThumbnailVideoDuration() - setupThumbnailFileTypes() + setupFileThumbnailStyle() setupFolderThumbnailStyle() setupKeepLastModified() setupEnablePullToRefresh() @@ -90,6 +87,7 @@ class SettingsActivity : SimpleActivity() { setupEmptyRecycleBin() updateTextColors(settings_holder) setupSectionColors() + setupClearCache() setupExportSettings() setupImportSettings() invalidateOptionsMenu() @@ -231,14 +229,6 @@ class SettingsActivity : SimpleActivity() { } } - private fun setupAnimateGifs() { - settings_animate_gifs.isChecked = config.animateGifs - settings_animate_gifs_holder.setOnClickListener { - settings_animate_gifs.toggle() - config.animateGifs = settings_animate_gifs.isChecked - } - } - private fun setupMaxBrightness() { settings_max_brightness.isChecked = config.maxBrightness settings_max_brightness_holder.setOnClickListener { @@ -255,22 +245,6 @@ class SettingsActivity : SimpleActivity() { } } - private fun setupThumbnailVideoDuration() { - settings_show_thumbnail_video_duration.isChecked = config.showThumbnailVideoDuration - settings_show_thumbnail_video_duration_holder.setOnClickListener { - settings_show_thumbnail_video_duration.toggle() - config.showThumbnailVideoDuration = settings_show_thumbnail_video_duration.isChecked - } - } - - private fun setupThumbnailFileTypes() { - settings_show_thumbnail_file_types.isChecked = config.showThumbnailFileTypes - settings_show_thumbnail_file_types_holder.setOnClickListener { - settings_show_thumbnail_file_types.toggle() - config.showThumbnailFileTypes = settings_show_thumbnail_file_types.isChecked - } - } - private fun setupDarkBackground() { settings_black_background.isChecked = config.blackBackground settings_black_background_holder.setOnClickListener { @@ -374,22 +348,6 @@ class SettingsActivity : SimpleActivity() { } } - private fun setupAllowPhotoGestures() { - settings_allow_photo_gestures.isChecked = config.allowPhotoGestures - settings_allow_photo_gestures_holder.setOnClickListener { - settings_allow_photo_gestures.toggle() - config.allowPhotoGestures = settings_allow_photo_gestures.isChecked - } - } - - private fun setupAllowVideoGestures() { - settings_allow_video_gestures.isChecked = config.allowVideoGestures - settings_allow_video_gestures_holder.setOnClickListener { - settings_allow_video_gestures.toggle() - config.allowVideoGestures = settings_allow_video_gestures.isChecked - } - } - private fun setupAllowDownGesture() { settings_allow_down_gesture.isChecked = config.allowDownGesture settings_allow_down_gesture_holder.setOnClickListener { @@ -415,10 +373,16 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupFileThumbnailStyle() { + settings_file_thumbnail_style_holder.setOnClickListener { + ChangeFileThumbnailStyleDialog(this) + } + } + private fun setupFolderThumbnailStyle() { settings_folder_thumbnail_style.text = getFolderStyleText() settings_folder_thumbnail_style_holder.setOnClickListener { - ChangeThumbnailStyleDialog(this) { + ChangeFolderThumbnailStyleDialog(this) { settings_folder_thumbnail_style.text = getFolderStyleText() } } @@ -624,6 +588,23 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupClearCache() { + ensureBackgroundThread { + runOnUiThread { + settings_clear_cache_size.text = cacheDir.getProperSize(true).formatSize() + } + } + + settings_clear_cache_holder.setOnClickListener { + ensureBackgroundThread { + cacheDir.deleteRecursively() + runOnUiThread { + settings_clear_cache_size.text = cacheDir.getProperSize(true).formatSize() + } + } + } + } + private fun setupExportSettings() { settings_export_holder.setOnClickListener { val configItems = LinkedHashMap().apply { @@ -650,6 +631,7 @@ class SettingsActivity : SimpleActivity() { put(ANIMATE_GIFS, config.animateGifs) put(CROP_THUMBNAILS, config.cropThumbnails) put(SHOW_THUMBNAIL_VIDEO_DURATION, config.showThumbnailVideoDuration) + put(SHOW_THUMBNAIL_FILE_TYPES, config.showThumbnailFileTypes) put(SCROLL_HORIZONTALLY, config.scrollHorizontally) put(ENABLE_PULL_TO_REFRESH, config.enablePullToRefresh) put(MAX_BRIGHTNESS, config.maxBrightness) @@ -706,6 +688,8 @@ class SettingsActivity : SimpleActivity() { put(FOLDER_THUMBNAIL_STYLE, config.folderStyle) put(FOLDER_MEDIA_COUNT, config.showFolderMediaCount) put(LIMIT_FOLDER_TITLE, config.limitFolderTitle) + put(THUMBNAIL_SPACING, config.thumbnailSpacing) + put(FILE_ROUNDED_CORNERS, config.fileRoundedCorners) } exportSettings(configItems) @@ -787,6 +771,7 @@ class SettingsActivity : SimpleActivity() { ANIMATE_GIFS -> config.animateGifs = value.toBoolean() CROP_THUMBNAILS -> config.cropThumbnails = value.toBoolean() SHOW_THUMBNAIL_VIDEO_DURATION -> config.showThumbnailVideoDuration = value.toBoolean() + SHOW_THUMBNAIL_FILE_TYPES -> config.showThumbnailFileTypes = value.toBoolean() SCROLL_HORIZONTALLY -> config.scrollHorizontally = value.toBoolean() ENABLE_PULL_TO_REFRESH -> config.enablePullToRefresh = value.toBoolean() MAX_BRIGHTNESS -> config.maxBrightness = value.toBoolean() @@ -842,6 +827,8 @@ class SettingsActivity : SimpleActivity() { FOLDER_THUMBNAIL_STYLE -> config.folderStyle = value.toInt() FOLDER_MEDIA_COUNT -> config.showFolderMediaCount = value.toInt() LIMIT_FOLDER_TITLE -> config.limitFolderTitle = value.toBoolean() + THUMBNAIL_SPACING -> config.thumbnailSpacing = value.toInt() + FILE_ROUNDED_CORNERS -> config.fileRoundedCorners = value.toBoolean() ALBUM_COVERS -> { val existingCovers = config.parseAlbumCovers() val existingCoverPaths = existingCovers.map { it.path }.toMutableList() as ArrayList diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt index 93380634b..264133ecd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt @@ -15,19 +15,18 @@ 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.Build import android.os.Bundle import android.os.Handler import android.provider.MediaStore.Images -import android.text.Html import android.view.Menu import android.view.MenuItem import android.view.View import android.view.WindowManager import android.view.animation.DecelerateInterpolator import android.widget.Toast +import androidx.exifinterface.media.ExifInterface import androidx.print.PrintHelper import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/WidgetConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/WidgetConfigureActivity.kt index 34d427655..4521e64a1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/WidgetConfigureActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/WidgetConfigureActivity.kt @@ -8,6 +8,7 @@ import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.widget.RelativeLayout import android.widget.RemoteViews +import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.dialogs.ColorPickerDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ensureBackgroundThread @@ -167,7 +168,8 @@ class WidgetConfigureActivity : SimpleActivity() { val path = directoryDao.getDirectoryThumbnail(folderPath) if (path != null) { runOnUiThread { - loadJpg(path, config_image, config.cropThumbnails, ROUNDED_CORNERS_NONE) + val signature = ObjectKey(System.currentTimeMillis().toString()) + loadJpg(path, config_image, config.cropThumbnails, ROUNDED_CORNERS_NONE, signature) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt index f3a041c71..177bb91e8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt @@ -156,8 +156,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList) { - menu.findItem(R.id.cab_hide).isVisible = selectedPaths.any { !it.doesThisOrParentHaveNoMedia() } - menu.findItem(R.id.cab_unhide).isVisible = selectedPaths.any { it.doesThisOrParentHaveNoMedia() } + menu.findItem(R.id.cab_hide).isVisible = selectedPaths.any { !it.doesThisOrParentHaveNoMedia(HashMap(), null) } + menu.findItem(R.id.cab_unhide).isVisible = selectedPaths.any { it.doesThisOrParentHaveNoMedia(HashMap(), null) } } private fun checkPinBtnVisibility(menu: Menu, selectedPaths: ArrayList) { @@ -327,7 +327,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList() val includedFolders = config.includedFolders val newDirs = dirs.filterIndexed { index, directory -> - val removeDir = directory.path.doesThisOrParentHaveNoMedia() && !includedFolders.contains(directory.path) + val removeDir = directory.path.doesThisOrParentHaveNoMedia(HashMap(), null) && !includedFolders.contains(directory.path) if (removeDir) { affectedPositions.add(index) } @@ -680,6 +680,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList ROUNDED_CORNERS_BIG } - activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners) + activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, directory.getKey()) } dir_pin.beVisibleIf(pinnedFolders.contains(directory.path)) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt index 1f693c96c..9139e10f9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt @@ -18,10 +18,7 @@ import com.simplemobiletools.commons.dialogs.PropertiesDialog import com.simplemobiletools.commons.dialogs.RenameDialog import com.simplemobiletools.commons.dialogs.RenameItemDialog import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.FAVORITES -import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST -import com.simplemobiletools.commons.helpers.ensureBackgroundThread -import com.simplemobiletools.commons.helpers.isOreoPlus +import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView @@ -38,7 +35,7 @@ import kotlinx.android.synthetic.main.photo_video_item_grid.view.* import kotlinx.android.synthetic.main.thumbnail_section.view.* import java.util.* -class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, val listener: MediaOperationsListener?, val isAGetIntent: Boolean, +class MediaAdapter(activity: BaseSimpleActivity, var media: ArrayList, val listener: MediaOperationsListener?, val isAGetIntent: Boolean, val allowMultiplePicks: Boolean, val path: String, recyclerView: MyRecyclerView, fastScroller: FastScroller? = null, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { @@ -442,7 +439,9 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList if (thumbnailItems.hashCode() != currentMediaHash) { currentMediaHash = thumbnailItems.hashCode() - Handler().postDelayed({ - media = thumbnailItems - enableInstantLoad() - notifyDataSetChanged() - finishActMode() - }, 100L) + media = thumbnailItems + enableInstantLoad() + notifyDataSetChanged() + finishActMode() } } @@ -502,6 +499,14 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList ROUNDED_CORNERS_SMALL + config.fileRoundedCorners -> ROUNDED_CORNERS_BIG + else -> ROUNDED_CORNERS_NONE + } + if (loadImageInstantly) { - activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, rotatedImagePaths) + activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, medium.getKey(), + rotatedImagePaths) } else { medium_thumbnail.setImageDrawable(null) medium_thumbnail.isHorizontalScrolling = scrollHorizontally delayHandler.postDelayed({ val isVisible = visibleItemPaths.contains(medium.path) if (isVisible) { - activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, rotatedImagePaths) + activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, + medium.getKey(), rotatedImagePaths) } }, IMAGE_LOAD_DELAY) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt index 9817db535..07cfd49f1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt @@ -30,7 +30,7 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage val getProperFileSize = fileSorting and SORT_BY_SIZE != 0 val favoritePaths = context.getFavoritePaths() val getVideoDurations = context.config.showThumbnailVideoDuration - val lastModifieds = if (isRPlus() && getProperLastModified) mediaFetcher.getLastModifieds() else HashMap() + val lastModifieds = if (getProperLastModified) mediaFetcher.getLastModifieds() else HashMap() val dateTakens = if (getProperDateTaken) mediaFetcher.getDateTakens() else HashMap() val media = if (showAll) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeFileThumbnailStyleDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeFileThumbnailStyleDialog.kt new file mode 100644 index 000000000..5498c66b8 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeFileThumbnailStyleDialog.kt @@ -0,0 +1,70 @@ +package com.simplemobiletools.gallery.pro.dialogs + +import android.content.DialogInterface +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.setupDialogStuff +import com.simplemobiletools.commons.models.RadioItem +import com.simplemobiletools.gallery.pro.R +import com.simplemobiletools.gallery.pro.extensions.config +import kotlinx.android.synthetic.main.dialog_change_file_thumbnail_style.view.* + +class ChangeFileThumbnailStyleDialog(val activity: BaseSimpleActivity) : DialogInterface.OnClickListener { + private var config = activity.config + private var view: View + private var thumbnailSpacing = config.thumbnailSpacing + + init { + view = activity.layoutInflater.inflate(R.layout.dialog_change_file_thumbnail_style, null).apply { + dialog_file_style_rounded_corners.isChecked = config.fileRoundedCorners + dialog_file_style_animate_gifs.isChecked = config.animateGifs + dialog_file_style_show_thumbnail_video_duration.isChecked = config.showThumbnailVideoDuration + dialog_file_style_show_thumbnail_file_types.isChecked = config.showThumbnailFileTypes + + dialog_file_style_rounded_corners_holder.setOnClickListener { dialog_file_style_rounded_corners.toggle() } + dialog_file_style_animate_gifs_holder.setOnClickListener { dialog_file_style_animate_gifs.toggle() } + dialog_file_style_show_thumbnail_video_duration_holder.setOnClickListener { dialog_file_style_show_thumbnail_video_duration.toggle() } + dialog_file_style_show_thumbnail_file_types_holder.setOnClickListener { dialog_file_style_show_thumbnail_file_types.toggle() } + + dialog_file_style_spacing_holder.setOnClickListener { + val items = arrayListOf( + RadioItem(0, "0x"), + RadioItem(1, "1x"), + RadioItem(2, "2x"), + RadioItem(4, "4x"), + RadioItem(8, "8x"), + RadioItem(16, "16x"), + RadioItem(32, "32x"), + RadioItem(64, "64x")) + + RadioGroupDialog(activity, items, thumbnailSpacing) { + thumbnailSpacing = it as Int + updateThumbnailSpacingText() + } + } + } + + updateThumbnailSpacingText() + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, this) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) + } + } + + override fun onClick(dialog: DialogInterface, which: Int) { + config.fileRoundedCorners = view.dialog_file_style_rounded_corners.isChecked + config.animateGifs = view.dialog_file_style_animate_gifs.isChecked + config.showThumbnailVideoDuration = view.dialog_file_style_show_thumbnail_video_duration.isChecked + config.showThumbnailFileTypes = view.dialog_file_style_show_thumbnail_file_types.isChecked + config.thumbnailSpacing = thumbnailSpacing + } + + private fun updateThumbnailSpacingText() { + view.dialog_file_style_spacing.text = "${thumbnailSpacing}x" + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeThumbnailStyleDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeFolderThumbnailStyleDialog.kt similarity index 70% rename from app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeThumbnailStyleDialog.kt rename to app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeFolderThumbnailStyleDialog.kt index 10e5129da..b41b4b23e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeThumbnailStyleDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeFolderThumbnailStyleDialog.kt @@ -15,16 +15,16 @@ import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.config import com.simplemobiletools.gallery.pro.helpers.* -import kotlinx.android.synthetic.main.dialog_change_thumbnail_style.view.* +import kotlinx.android.synthetic.main.dialog_change_folder_thumbnail_style.view.* import kotlinx.android.synthetic.main.directory_item_grid_square.view.* -class ChangeThumbnailStyleDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) : DialogInterface.OnClickListener { +class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) : DialogInterface.OnClickListener { private var config = activity.config private var view: View init { - view = activity.layoutInflater.inflate(R.layout.dialog_change_thumbnail_style, null).apply { - dialog_limit_title.isChecked = config.limitFolderTitle + view = activity.layoutInflater.inflate(R.layout.dialog_change_folder_thumbnail_style, null).apply { + dialog_folder_limit_title.isChecked = config.limitFolderTitle } AlertDialog.Builder(activity) @@ -40,29 +40,29 @@ class ChangeThumbnailStyleDialog(val activity: BaseSimpleActivity, val callback: } private fun setupStyle() { - val styleRadio = view.dialog_radio_style + val styleRadio = view.dialog_radio_folder_style styleRadio.setOnCheckedChangeListener { group, checkedId -> updateSample() } val styleBtn = when (config.folderStyle) { - FOLDER_STYLE_SQUARE -> styleRadio.dialog_radio_square - else -> styleRadio.dialog_radio_rounded_corners + FOLDER_STYLE_SQUARE -> styleRadio.dialog_radio_folder_square + else -> styleRadio.dialog_radio_folder_rounded_corners } styleBtn.isChecked = true } private fun setupMediaCount() { - val countRadio = view.dialog_radio_count_holder + val countRadio = view.dialog_radio_folder_count_holder countRadio.setOnCheckedChangeListener { group, checkedId -> updateSample() } val countBtn = when (config.showFolderMediaCount) { - FOLDER_MEDIA_CNT_LINE -> countRadio.dialog_radio_count_line - FOLDER_MEDIA_CNT_BRACKETS -> countRadio.dialog_radio_count_brackets - else -> countRadio.dialog_radio_count_none + FOLDER_MEDIA_CNT_LINE -> countRadio.dialog_radio_folder_count_line + FOLDER_MEDIA_CNT_BRACKETS -> countRadio.dialog_radio_folder_count_brackets + else -> countRadio.dialog_radio_folder_count_none } countBtn.isChecked = true @@ -72,23 +72,23 @@ class ChangeThumbnailStyleDialog(val activity: BaseSimpleActivity, val callback: val photoCount = 36 val folderName = "Camera" view.apply { - val useRoundedCornersLayout = dialog_radio_style.checkedRadioButtonId == R.id.dialog_radio_rounded_corners - dialog_sample_holder.removeAllViews() + val useRoundedCornersLayout = dialog_radio_folder_style.checkedRadioButtonId == R.id.dialog_radio_folder_rounded_corners + dialog_folder_sample_holder.removeAllViews() val layout = if (useRoundedCornersLayout) R.layout.directory_item_grid_rounded_corners else R.layout.directory_item_grid_square val sampleView = activity.layoutInflater.inflate(layout, null) - dialog_sample_holder.addView(sampleView) + dialog_folder_sample_holder.addView(sampleView) sampleView.layoutParams.width = activity.resources.getDimension(R.dimen.sample_thumbnail_size).toInt() (sampleView.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.CENTER_HORIZONTAL) - when (dialog_radio_count_holder.checkedRadioButtonId) { - R.id.dialog_radio_count_line -> { + when (dialog_radio_folder_count_holder.checkedRadioButtonId) { + R.id.dialog_radio_folder_count_line -> { dir_name.text = folderName photo_cnt.text = photoCount.toString() photo_cnt.beVisible() } - R.id.dialog_radio_count_brackets -> { + R.id.dialog_radio_folder_count_brackets -> { photo_cnt.beGone() dir_name.text = "$folderName ($photoCount)" } @@ -115,20 +115,20 @@ class ChangeThumbnailStyleDialog(val activity: BaseSimpleActivity, val callback: } override fun onClick(dialog: DialogInterface, which: Int) { - val style = when (view.dialog_radio_style.checkedRadioButtonId) { - R.id.dialog_radio_square -> FOLDER_STYLE_SQUARE + val style = when (view.dialog_radio_folder_style.checkedRadioButtonId) { + R.id.dialog_radio_folder_square -> FOLDER_STYLE_SQUARE else -> FOLDER_STYLE_ROUNDED_CORNERS } - val count = when (view.dialog_radio_count_holder.checkedRadioButtonId) { - R.id.dialog_radio_count_line -> FOLDER_MEDIA_CNT_LINE - R.id.dialog_radio_count_brackets -> FOLDER_MEDIA_CNT_BRACKETS + val count = when (view.dialog_radio_folder_count_holder.checkedRadioButtonId) { + R.id.dialog_radio_folder_count_line -> FOLDER_MEDIA_CNT_LINE + R.id.dialog_radio_folder_count_brackets -> FOLDER_MEDIA_CNT_BRACKETS else -> FOLDER_MEDIA_CNT_NONE } config.folderStyle = style config.showFolderMediaCount = count - config.limitFolderTitle = view.dialog_limit_title.isChecked + config.limitFolderTitle = view.dialog_folder_limit_title.isChecked callback() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt index 5a0057a91..389f2fb7a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt @@ -10,7 +10,6 @@ import android.graphics.BitmapFactory import android.graphics.Matrix import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable -import android.media.ExifInterface import android.net.Uri import android.os.Build import android.provider.MediaStore @@ -19,6 +18,7 @@ import android.provider.MediaStore.Images import android.util.DisplayMetrics import android.view.View import androidx.appcompat.app.AppCompatActivity +import androidx.exifinterface.media.ExifInterface import com.bumptech.glide.Glide import com.bumptech.glide.load.DecodeFormat import com.bumptech.glide.load.engine.DiskCacheStrategy @@ -36,10 +36,7 @@ import com.simplemobiletools.gallery.pro.dialogs.PickDirectoryDialog import com.simplemobiletools.gallery.pro.helpers.RECYCLE_BIN import com.simplemobiletools.gallery.pro.models.DateTaken import com.squareup.picasso.Picasso -import java.io.File -import java.io.FileOutputStream -import java.io.InputStream -import java.io.OutputStream +import java.io.* import java.text.SimpleDateFormat import java.util.* @@ -281,7 +278,7 @@ fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList, callback: out?.flush() - if (fileDocument?.getItemSize(true) == copiedSize && getDoesFilePathExist(destination)) { + if (fileDocument.getItemSize(true) == copiedSize && getDoesFilePathExist(destination)) { mediaDB.updateDeleted("$RECYCLE_BIN$source", System.currentTimeMillis(), source) pathsCnt-- } @@ -598,7 +595,7 @@ fun Activity.fileRotatedSuccessfully(path: String, lastModified: Long) { updateLastModified(path, lastModified) } - Picasso.get().invalidate(path.getFileKey()) + Picasso.get().invalidate(path.getFileKey(lastModified)) // we cannot refresh a specific image in Glide Cache, so just clear it all val glide = Glide.get(applicationContext) glide.clearDiskCache() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt index 03b5ad783..f2d55eb95 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt @@ -18,6 +18,7 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.gallery.pro.R @@ -379,7 +380,12 @@ fun Context.storeDirectoryItems(items: ArrayList) { fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: MutableSet, noMediaFolders: ArrayList): String { val dirName = getFolderNameFromPath(path) - return if (path.doesThisOrParentHaveNoMedia(noMediaFolders) && !path.isThisOrParentIncluded(includedFolders)) { + val folderNoMediaStatuses = java.util.HashMap() + noMediaFolders.forEach { folder -> + folderNoMediaStatuses["$folder/$NOMEDIA"] = true + } + + return if (path.doesThisOrParentHaveNoMedia(folderNoMediaStatuses, null) && !path.isThisOrParentIncluded(includedFolders)) { "$dirName $hidden" } else { dirName @@ -398,17 +404,17 @@ fun Context.getFolderNameFromPath(path: String): String { } fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean, - roundCorners: Int, skipMemoryCacheAtPaths: ArrayList? = null) { + roundCorners: Int, signature: ObjectKey, skipMemoryCacheAtPaths: ArrayList? = null) { target.isHorizontalScrolling = horizontalScroll if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS || type == TYPE_PORTRAITS) { if (type == TYPE_IMAGES && path.isPng()) { - loadPng(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths) + loadPng(path, target, cropThumbnails, roundCorners, signature, skipMemoryCacheAtPaths) } else { - loadJpg(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths) + loadJpg(path, target, cropThumbnails, roundCorners, signature, skipMemoryCacheAtPaths) } } else if (type == TYPE_GIFS) { if (!animateGifs) { - loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths) + loadStaticGIF(path, target, cropThumbnails, roundCorners, signature, skipMemoryCacheAtPaths) return } @@ -419,12 +425,12 @@ fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizo target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER } catch (e: Exception) { - loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths) + loadStaticGIF(path, target, cropThumbnails, roundCorners, signature, skipMemoryCacheAtPaths) } catch (e: OutOfMemoryError) { - loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths) + loadStaticGIF(path, target, cropThumbnails, roundCorners, signature, skipMemoryCacheAtPaths) } } else if (type == TYPE_SVGS) { - loadSVG(path, target, cropThumbnails, roundCorners) + loadSVG(path, target, cropThumbnails, roundCorners, signature) } } @@ -449,9 +455,9 @@ fun Context.getPathLocation(path: String): Int { } } -fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList? = null) { +fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, skipMemoryCacheAtPaths: ArrayList? = null) { val options = RequestOptions() - .signature(path.getFileSignature()) + .signature(signature) .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .priority(Priority.LOW) @@ -472,9 +478,9 @@ fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boo builder.into(target) } -fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList? = null) { +fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, skipMemoryCacheAtPaths: ArrayList? = null) { val options = RequestOptions() - .signature(path.getFileSignature()) + .signature(signature) .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) .priority(Priority.LOW) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) @@ -494,9 +500,9 @@ fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boo builder.into(target) } -fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList? = null) { +fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, skipMemoryCacheAtPaths: ArrayList? = null) { val options = RequestOptions() - .signature(path.getFileSignature()) + .signature(signature) .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) .priority(Priority.LOW) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) @@ -516,10 +522,10 @@ fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnail builder.into(target) } -fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int) { +fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey) { target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER - val options = RequestOptions().signature(path.getFileSignature()) + val options = RequestOptions().signature(signature) var builder = Glide.with(applicationContext) .`as`(PictureDrawable::class.java) .listener(SvgSoftwareLayerSetter()) @@ -552,10 +558,14 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: val excludedPaths = config.excludedFolders val includedPaths = config.includedFolders - val noMediaFolders = getNoMediaFoldersSync() val folderNoMediaStatuses = HashMap() + val noMediaFolders = getNoMediaFoldersSync() + noMediaFolders.forEach { folder -> + folderNoMediaStatuses["$folder/$NOMEDIA"] = true + } + var filteredDirectories = directories.filter { - it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNoMediaStatuses, noMediaFolders) { path, hasNoMedia -> + it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNoMediaStatuses) { path, hasNoMedia -> folderNoMediaStatuses[path] = hasNoMedia } } as ArrayList @@ -574,12 +584,24 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: } }) as ArrayList - val hiddenString = resources.getString(R.string.hidden) - filteredDirectories.forEach { - it.name = if (it.path.doesThisOrParentHaveNoMedia(noMediaFolders) && !it.path.isThisOrParentIncluded(includedPaths)) { - "${it.name.removeSuffix(hiddenString).trim()} $hiddenString" - } else { - it.name.removeSuffix(hiddenString).trim() + if (shouldShowHidden) { + val hiddenString = resources.getString(R.string.hidden) + filteredDirectories.forEach { + val noMediaPath = "${it.path}/$NOMEDIA" + val hasNoMedia = if (folderNoMediaStatuses.keys.contains(noMediaPath)) { + folderNoMediaStatuses[noMediaPath]!! + } else { + it.path.doesThisOrParentHaveNoMedia(folderNoMediaStatuses) { path, hasNoMedia -> + val newPath = "$path/$NOMEDIA" + folderNoMediaStatuses[newPath] = hasNoMedia + } + } + + it.name = if (hasNoMedia && !it.path.isThisOrParentIncluded(includedPaths)) { + "${it.name.removeSuffix(hiddenString).trim()} $hiddenString" + } else { + it.name.removeSuffix(hiddenString).trim() + } } } @@ -924,7 +946,7 @@ fun Context.updateDirectoryPath(path: String) { val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0 - val lastModifieds = if (isRPlus() && getProperLastModified) mediaFetcher.getFolderLastModifieds(path) else HashMap() + val lastModifieds = if (getProperLastModified) mediaFetcher.getFolderLastModifieds(path) else HashMap() val dateTakens = mediaFetcher.getFolderDateTakens(path) val favoritePaths = getFavoritePaths() val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ExifInterface.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ExifInterface.kt index 6c1ba0b0b..26d923fc0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ExifInterface.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ExifInterface.kt @@ -1,6 +1,6 @@ package com.simplemobiletools.gallery.pro.extensions -import android.media.ExifInterface +import androidx.exifinterface.media.ExifInterface import java.lang.reflect.Field import java.lang.reflect.Modifier diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt index 1c18f2ef0..2a4f646c6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt @@ -11,8 +11,7 @@ fun String.isThisOrParentExcluded(excludedPaths: MutableSet) = excludedP // cache which folders contain .nomedia files to avoid checking them over and over again fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPaths: MutableSet, showHidden: Boolean, - folderNoMediaStatuses: HashMap, noMediaFolders: ArrayList = ArrayList(), - callback: (path: String, hasNoMedia: Boolean) -> Unit): Boolean { + folderNoMediaStatuses: HashMap, callback: (path: String, hasNoMedia: Boolean) -> Unit): Boolean { if (isEmpty()) { return false } @@ -37,7 +36,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath val containsNoMedia = if (showHidden) { false } else { - noMediaFolders.contains(this) || File(this, NOMEDIA).exists() + folderNoMediaStatuses.getOrElse("$this/$NOMEDIA", { false }) || File(this, NOMEDIA).exists() } return if (!showHidden && containsNoMedia) { @@ -54,14 +53,14 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath var curPath = this for (i in 0 until count { it == '/' } - 1) { curPath = curPath.substringBeforeLast('/') - val pathToCheck = "$curPath/${NOMEDIA}" + val pathToCheck = "$curPath/$NOMEDIA" if (folderNoMediaStatuses.contains(pathToCheck)) { if (folderNoMediaStatuses[pathToCheck] == true) { containsNoMediaOrDot = true break } } else { - val noMediaExists = noMediaFolders.contains(pathToCheck) || File(pathToCheck).exists() + val noMediaExists = folderNoMediaStatuses.getOrElse(pathToCheck, { false }) || File(pathToCheck).exists() callback(pathToCheck, noMediaExists) if (noMediaExists) { containsNoMediaOrDot = true diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt index 8a2da324e..4e22c5b14 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt @@ -9,7 +9,6 @@ import android.graphics.Matrix import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.PictureDrawable -import android.media.ExifInterface.* import android.net.Uri import android.os.Build import android.os.Bundle @@ -20,6 +19,7 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.RelativeLayout +import androidx.exifinterface.media.ExifInterface.* import com.alexvasilkov.gestures.GestureController import com.alexvasilkov.gestures.State import com.bumptech.glide.Glide @@ -410,7 +410,7 @@ class PhotoFragment : ViewPagerFragment() { private fun loadWithGlide(path: String, addZoomableView: Boolean) { val priority = if (mIsFragmentVisible) Priority.IMMEDIATE else Priority.NORMAL val options = RequestOptions() - .signature(getFilePathToShow().getFileSignature()) + .signature(mMedium.getKey()) .format(DecodeFormat.PREFER_ARGB_8888) .priority(priority) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) @@ -450,7 +450,7 @@ class PhotoFragment : ViewPagerFragment() { val picasso = Picasso.get() .load(pathToLoad) .centerInside() - .stableKey(mMedium.path.getFileKey()) + .stableKey(mMedium.getSignature()) .resize(mScreenWidth, mScreenHeight) if (mCurrentRotationDegrees != 0) { @@ -617,7 +617,7 @@ class PhotoFragment : ViewPagerFragment() { val minTileDpi = if (showHighestQuality) -1 else getMinTileDpi() val bitmapDecoder = object : DecoderFactory { - override fun make() = MyGlideImageDecoder(rotation, mMedium.getSignature()) + override fun make() = MyGlideImageDecoder(rotation, mMedium.getKey()) } val regionDecoder = object : DecoderFactory { @@ -715,7 +715,7 @@ class PhotoFragment : ViewPagerFragment() { val tag = exif.getTag(ExifInterface.TAG_ORIENTATION) tag?.getValueAsInt(defaultOrientation) ?: defaultOrientation } else { - val exif = android.media.ExifInterface(path) + val exif = androidx.exifinterface.media.ExifInterface(path) exif.getAttributeInt(TAG_ORIENTATION, defaultOrientation) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt index 535aad447..66fbd8df5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt @@ -1,10 +1,10 @@ package com.simplemobiletools.gallery.pro.fragments -import android.media.ExifInterface import android.provider.MediaStore import android.provider.MediaStore.Files import android.provider.MediaStore.Images import android.view.MotionEvent +import androidx.exifinterface.media.ExifInterface import androidx.fragment.app.Fragment import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.gallery.pro.extensions.config diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt index 9f0e82bfd..bc5e2f9a2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt @@ -269,7 +269,7 @@ class Config(context: Context) : BaseConfig(context) { set(deleteEmptyFolders) = prefs.edit().putBoolean(DELETE_EMPTY_FOLDERS, deleteEmptyFolders).apply() var allowPhotoGestures: Boolean - get() = prefs.getBoolean(ALLOW_PHOTO_GESTURES, false) + get() = prefs.getBoolean(ALLOW_PHOTO_GESTURES, true) set(allowPhotoGestures) = prefs.edit().putBoolean(ALLOW_PHOTO_GESTURES, allowPhotoGestures).apply() var allowVideoGestures: Boolean @@ -507,4 +507,12 @@ class Config(context: Context) : BaseConfig(context) { var limitFolderTitle: Boolean get() = prefs.getBoolean(LIMIT_FOLDER_TITLE, false) set(limitFolderTitle) = prefs.edit().putBoolean(LIMIT_FOLDER_TITLE, limitFolderTitle).apply() + + var thumbnailSpacing: Int + get() = prefs.getInt(THUMBNAIL_SPACING, 1) + set(thumbnailSpacing) = prefs.edit().putInt(THUMBNAIL_SPACING, thumbnailSpacing).apply() + + var fileRoundedCorners: Boolean + get() = prefs.getBoolean(FILE_ROUNDED_CORNERS, false) + set(fileRoundedCorners) = prefs.edit().putBoolean(FILE_ROUNDED_CORNERS, fileRoundedCorners).apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt index df613f6f8..7f622edd2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt @@ -86,6 +86,8 @@ const val WERE_FAVORITES_MIGRATED = "were_favorites_migrated" const val FOLDER_THUMBNAIL_STYLE = "folder_thumbnail_style" const val FOLDER_MEDIA_COUNT = "folder_media_count" const val LIMIT_FOLDER_TITLE = "folder_limit_title" +const val THUMBNAIL_SPACING = "thumbnail_spacing" +const val FILE_ROUNDED_CORNERS = "file_rounded_corners" // slideshow const val SLIDESHOW_INTERVAL = "slideshow_interval" diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/GridSpacingItemDecoration.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/GridSpacingItemDecoration.kt new file mode 100644 index 000000000..7b082fe78 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/GridSpacingItemDecoration.kt @@ -0,0 +1,60 @@ +package com.simplemobiletools.gallery.pro.helpers + +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.gallery.pro.models.Medium +import com.simplemobiletools.gallery.pro.models.ThumbnailItem + +class GridSpacingItemDecoration(val spanCount: Int, val spacing: Int, val isScrollingHorizontally: Boolean, val addSideSpacing: Boolean, + var items: ArrayList, val useGridPosition: Boolean) : RecyclerView.ItemDecoration() { + + override fun toString() = "spanCount: $spanCount, spacing: $spacing, isScrollingHorizontally: $isScrollingHorizontally, addSideSpacing: $addSideSpacing, " + + "items: ${items.hashCode()}, useGridPosition: $useGridPosition" + + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + if (spacing <= 1) { + return + } + + val position = parent.getChildAdapterPosition(view) + val medium = items.getOrNull(position) as? Medium ?: return + val gridPositionToUse = if (useGridPosition) medium.gridPosition else position + val column = gridPositionToUse % spanCount + + if (isScrollingHorizontally) { + if (addSideSpacing) { + outRect.top = spacing - column * spacing / spanCount + outRect.bottom = (column + 1) * spacing / spanCount + outRect.right = spacing + + if (position < spanCount) { + outRect.left = spacing + } + } else { + outRect.top = column * spacing / spanCount + outRect.bottom = spacing - (column + 1) * spacing / spanCount + if (position >= spanCount) { + outRect.left = spacing + } + } + } else { + if (addSideSpacing) { + outRect.left = spacing - column * spacing / spanCount + outRect.right = (column + 1) * spacing / spanCount + outRect.bottom = spacing + + if (position < spanCount && !useGridPosition) { + outRect.top = spacing + } + } else { + outRect.left = column * spacing / spanCount + outRect.right = spacing - (column + 1) * spacing / spanCount + + if (gridPositionToUse >= spanCount) { + outRect.top = spacing + } + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt index 4c4daa180..25d2ffb60 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt @@ -69,7 +69,7 @@ class MediaFetcher(val context: Context) { val excludedPaths = config.excludedFolders val includedPaths = config.includedFolders - val folderNomediaStatuses = HashMap() + val folderNoMediaStatuses = HashMap() val distinctPathsMap = HashMap() val distinctPaths = folders.distinctBy { when { @@ -83,9 +83,13 @@ class MediaFetcher(val context: Context) { } val noMediaFolders = context.getNoMediaFoldersSync() + noMediaFolders.forEach { folder -> + folderNoMediaStatuses["$folder/$NOMEDIA"] = true + } + distinctPaths.filter { - it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNomediaStatuses, noMediaFolders) { path, hasNoMedia -> - folderNomediaStatuses[path] = hasNoMedia + it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNoMediaStatuses) { path, hasNoMedia -> + folderNoMediaStatuses[path] = hasNoMedia } }.toMutableList() as ArrayList } catch (e: Exception) { @@ -319,18 +323,16 @@ class MediaFetcher(val context: Context) { media.add(this) } } else { - var lastModified = 0L - if (getProperLastModified) { - if (isRPlus()) { - var newLastModified = lastModifieds.remove(path) - if (newLastModified == null) { - newLastModified = file.lastModified() - } - lastModified = newLastModified + var lastModified: Long + var newLastModified = lastModifieds.remove(path) + if (newLastModified == null) { + newLastModified = if (getProperLastModified) { + file.lastModified() } else { - lastModified = file.lastModified() + 0L } } + lastModified = newLastModified var dateTaken = lastModified val videoDuration = if (getVideoDurations && isVideo) context.getDuration(path) ?: 0 else 0 @@ -590,7 +592,7 @@ class MediaFetcher(val context: Context) { return } - media.sortWith(Comparator { o1, o2 -> + media.sortWith { o1, o2 -> o1 as Medium o2 as Medium var result = when { @@ -617,7 +619,7 @@ class MediaFetcher(val context: Context) { result *= -1 } result - }) + } } fun groupMedia(media: ArrayList, path: String): ArrayList { @@ -662,8 +664,14 @@ class MediaFetcher(val context: Context) { val today = formatDate(System.currentTimeMillis().toString(), true) val yesterday = formatDate((System.currentTimeMillis() - DAY_SECONDS * 1000).toString(), true) for ((key, value) in mediumGroups) { + var currentGridPosition = 0 val sectionKey = getFormattedKey(key, currentGrouping, today, yesterday) thumbnailItems.add(ThumbnailSection(sectionKey)) + + value.forEach { + it.gridPosition = currentGridPosition++ + } + thumbnailItems.addAll(value) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/MediaOperationsListener.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/MediaOperationsListener.kt index 7e384003c..997adc44f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/MediaOperationsListener.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/MediaOperationsListener.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.gallery.pro.interfaces import com.simplemobiletools.commons.models.FileDirItem +import com.simplemobiletools.gallery.pro.models.ThumbnailItem interface MediaOperationsListener { fun refreshItems() @@ -8,4 +9,6 @@ interface MediaOperationsListener { fun tryDeleteFiles(fileDirItems: ArrayList) fun selectedPaths(paths: ArrayList) + + fun updateMediaGridDecoration(media: ArrayList) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt index 1be81a8bf..5f51940e6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.gallery.pro.models import android.content.Context import androidx.room.* +import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.extensions.formatDate import com.simplemobiletools.commons.extensions.formatSize import com.simplemobiletools.commons.helpers.* @@ -39,4 +40,6 @@ data class Directory( fun areFavorites() = path == FAVORITES fun isRecycleBin() = path == RECYCLE_BIN + + fun getKey() = ObjectKey("$path-$modified") } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt index d392bc1a1..05adfa524 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt @@ -1,10 +1,7 @@ package com.simplemobiletools.gallery.pro.models import android.content.Context -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room.* import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.extensions.formatDate import com.simplemobiletools.commons.extensions.formatSize @@ -15,6 +12,7 @@ import com.simplemobiletools.commons.helpers.SORT_BY_NAME import com.simplemobiletools.commons.helpers.SORT_BY_PATH import com.simplemobiletools.commons.helpers.SORT_BY_SIZE import com.simplemobiletools.gallery.pro.helpers.* +import java.io.File import java.io.Serializable import java.util.* @@ -24,13 +22,18 @@ data class Medium( @ColumnInfo(name = "filename") var name: String, @ColumnInfo(name = "full_path") var path: String, @ColumnInfo(name = "parent_path") var parentPath: String, - @ColumnInfo(name = "last_modified") val modified: Long, + @ColumnInfo(name = "last_modified") var modified: Long, @ColumnInfo(name = "date_taken") var taken: Long, - @ColumnInfo(name = "size") val size: Long, - @ColumnInfo(name = "type") val type: Int, - @ColumnInfo(name = "video_duration") val videoDuration: Int, + @ColumnInfo(name = "size") var size: Long, + @ColumnInfo(name = "type") var type: Int, + @ColumnInfo(name = "video_duration") var videoDuration: Int, @ColumnInfo(name = "is_favorite") var isFavorite: Boolean, - @ColumnInfo(name = "deleted_ts") var deletedTS: Long) : Serializable, ThumbnailItem() { + @ColumnInfo(name = "deleted_ts") var deletedTS: Long, + + @Ignore var gridPosition: Int = 0 // used at grid view decoration at Grouping enabled +) : Serializable, ThumbnailItem() { + + constructor() : this(null, "", "", "", 0L, 0L, 0L, 0, 0, false, 0L, 0) companion object { private const val serialVersionUID = -6553149366975655L @@ -91,5 +94,15 @@ data class Medium( return calendar.timeInMillis.toString() } - fun getSignature() = ObjectKey("$path-$modified-$size") + fun getSignature(): String { + val lastModified = if (modified > 1) { + modified + } else { + File(path).lastModified() + } + + return "$path-$lastModified-$size" + } + + fun getKey() = ObjectKey(getSignature()) } diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml index cee91220e..6ab0974b7 100644 --- a/app/src/main/res/layout/activity_search.xml +++ b/app/src/main/res/layout/activity_search.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/media_holder" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="match_parent"> - - - - - - - - - - - - + android:paddingBottom="@dimen/bigger_margin"> - - - - - - - + android:paddingEnd="@dimen/medium_margin" + android:text="@string/file_thumbnail_style" /> @@ -625,29 +555,6 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_change_thumbnail_style.xml b/app/src/main/res/layout/dialog_change_folder_thumbnail_style.xml similarity index 86% rename from app/src/main/res/layout/dialog_change_thumbnail_style.xml rename to app/src/main/res/layout/dialog_change_folder_thumbnail_style.xml index 34d935527..e29763f1a 100644 --- a/app/src/main/res/layout/dialog_change_thumbnail_style.xml +++ b/app/src/main/res/layout/dialog_change_folder_thumbnail_style.xml @@ -14,19 +14,19 @@ android:paddingRight="@dimen/activity_margin"> - @@ -14,7 +14,7 @@ + android:layout_height="@dimen/list_view_folder_thumbnail_size" /> + android:visibility="gone" /> + android:visibility="gone" /> + android:textSize="@dimen/bigger_text_size" /> + android:textSize="@dimen/smaller_text_size" /> + android:textSize="@dimen/smaller_text_size" /> + android:visibility="gone" /> + android:visibility="gone" /> diff --git a/app/src/main/res/layout/photo_video_item_grid.xml b/app/src/main/res/layout/photo_video_item_grid.xml index 64dbbf88f..cc3fc718d 100644 --- a/app/src/main/res/layout/photo_video_item_grid.xml +++ b/app/src/main/res/layout/photo_video_item_grid.xml @@ -5,8 +5,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="true" - android:focusable="true" - android:padding="1px"> + android:focusable="true"> - @@ -15,7 +15,7 @@ + android:layout_height="@dimen/list_view_folder_thumbnail_size" /> + android:visibility="gone" /> + tools:text="My photo" /> + android:visibility="gone" /> + tools:text="00:05" /> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 4252008f4..a1ca5707b 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -193,6 +193,8 @@ إظهار أنواع ملفات الصور Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 5be3581d8..0333af35f 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -193,6 +193,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml new file mode 100644 index 000000000..0dcc3984e --- /dev/null +++ b/app/src/main/res/values-bn/strings.xml @@ -0,0 +1,414 @@ + + + সিম্পল গ্যালারি + গ্যালারি + সম্পাদনা + ক্যামেরা খুলুন + (লুকানো) + (বাদ) + ফোল্ডার পিন করুন + ফোল্ডার আনপিন করুন + একদম উপরে পিন করুন + সব ফোল্ডারের ভেতরে কি আছে দেখান + সব ফোল্ডার + ফোল্ডার ভিউতে সুইচ করুন + অন্যান্য ফোল্ডার + মানচিত্রে দেখান + অজানা স্থান + শব্দ + উজ্জ্বলতা + ওরিয়েন্টেশন বন্ধ + ওরিয়েন্টেশন খুলুন + ওরিয়েন্টেশন পরিবর্তন + পোট্রেট ওরিয়েন্টেশন + অবতল ওরিয়েন্টেশন + ডিফল্ট ওরিয়েন্টেশন + তারিখ ঠিক করুন + ঠিক করা হচ্ছে… + তারিখ সফলভাবে ঠিক করা হয়েছে + তোলার তারিখ নেই + পরিবর্তিত একা সংস্করণ নিন + অই,\n\n মনে হচ্ছে আপনি অ্যাপটি পুরোনো মুক্ত সংস্করণ থেকে হালনাগাদ করেছেন, যেটার সেটিংসে \'প্রোতে হালনাগাদ করুন\' বাটন রয়েছে। \n\nধন্যবাদ! + সব দেখা যাওয়া ফোল্ডারে ফাইল সার্চে চলে যান + ডিফল্ট ফোল্ডার হিশেবে সেট করুন + ডিফল্ট ফোল্ডার হিশেবে আর রাখবেন না + + + মিডিয়া ফিল্টার করুন + ছবিসমূহ + ভিডিওসমূহ + গিফসমূহ + র ছবিসমূহ + এসভিজি সমূহ + পোট্রেইট + এ নির্দিষ্ট ফিল্টারে কোন মিডিয়া ফাইল পাওয়া যায়নি। + ফিল্টার পরিবর্তন করুন + + + This function hides the folder by adding a \'.nomedia\' file into it, it will hide all subfolders too. You can see them by toggling the \'Show hidden items\' option in Settings. Continue? + বাদ দিন + বাদ দেওয়া ফোল্ডারসমূহ + বাদ দেওয়া ফোল্ডারগুলোর ব্যবস্থাপনা + This will exclude the selection together with its subfolders from Simple Gallery only. You can manage excluded folders in Settings. + Exclude a parent instead? + Excluding folders will make them together with their subfolders hidden just in Simple Gallery, they will still be visible in other applications.\n\nIf you want to hide them from other apps too, use the Hide function. + সবগুলো সরান + বাদ দেওয়া তালিকা থেকে সমস্ত ফোল্ডার সরাবেন? এটি ফোল্ডারগুলি মুছবে না। + লুকানো ফোল্ডারগুলো + লুকানো ফোল্ডারগুলি পরিচালনা করুন + দেখে মনে হচ্ছে আপনার সাথে কোনও ফোল্ডার লুকানো নেই \".nomedia\" ফাইল। + + + অন্তর্ভুক্ত ফোল্ডার + অন্তর্ভুক্ত ফোল্ডার ব্যবস্থাপনা করুন + ফোল্ডার যোগ করুন + 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. + No media files have been found. You can solve it by adding the folders containing media files manually. + + + আকার পরিবর্তন + নির্বাচিতগুলোর আকার পরিবর্তন ও সংরক্ষণ করুন। + প্রস্থ + দৈর্ঘ্য + অনুপাত রাখুন + দয়া করে একটি বৈধ রেজোলিউশন দিন। + + + সম্পাদক + ঘোরান + ভুল ছবির পথ + ভুল ভিডিওর পথ + ছবি সম্পাদনা ব্যর্থ + ভিডিও সম্পাদনা ব্যর্থ + ছবি সম্পাদনা বাতিল + ভিডিও সম্পাদনা বাতিল + ফাইল সফলভাবি সম্পাদিত হয়েছে + ছবি সফলভাবি সম্পাদিত হয়েছে + ভিডিও সফলভাবি সম্পাদিত হয়েছে + ছবি সম্পাদনা করুন: + ভিডিও সম্পাদনা করুন: + কোন ছবি সম্পাদক পাওয়া যায়নি + কোন ভিডিও সম্পাদক পাওয়া যায়নি + অজানা অবস্থান ফাইল + উৎস ফাইল প্রতিস্থাপন করা যায়নি + বামে ঘোরান + ডানে ঘোরান + ১৮০º ঘোরান + ঘোরান + অবতলভাবে ঘোরান + খাড়াখাড়িভাবে ঘোরান + মুক্ত + অন্যান্য + + + সিম্পল ওয়ালপেপার + ওয়ালপেপার হিশেবে সেট করুন + ওয়ালপেপার সেট করা ব্যর্থ হয়েছে + ওয়ালপেপার সেট করুন: + ওয়ালপেপার সেট করা হচ্ছে… + সফলভাবে ওয়ালপেপার সেট হয়েছে + খাড়াখারি আকৃতিগত অনুপাত + অবতল আকৃতিগত অনুপাত + হোম স্ক্রিন + লক স্ক্রিন + হোম ও লক স্ক্রিন + + + স্লাইডশো + বিরতি (সেকেন্ডে): + ছবিগুলো যোগ করুন + ভিডিওগুলো যোগ করুন + গিফগুলো যোগ করুন + বিক্ষিপ্তভাবে + পেছনে নিয়ে যান + স্লাইডশো লুপ করুন + অ্যানিমেশন + কিছু না + বিবর্ণ + স্লাইড + স্লাইডশো শেষ হয়েছে + স্লাইডশোর জন্য কোন মিডিয়া পাওয়া যায়নি + + + Group direct subfolders + + + একত্রিত করুন + Do not group files + ফোল্ডার + শেষ পরিবর্তন করা হয়েছে + শেষ পরিবর্তন (দৈনিক) + শেষ পরিবর্তন (মাসিক) + তোলার তারিখ + তোলার তারিখ (দৈনিক) + তোলার তারিখ (মাসিক) + ফাইল টাইপ + এক্সটেনশন + Please note that grouping and sorting are 2 independent fields + + + উইজেটে দেখানো ফোল্ডার: + ফোল্ডারের নাম দেখান + + + স্বয়ংক্রিয়ভাবে ভিডিও চালান + Remember last video playback position + Toggle filename visibility + Loop videos + Animate GIFs at thumbnails + Max brightness when viewing fullscreen media + Crop thumbnails into squares + Show video durations + Rotate fullscreen media by + সিস্টেম সেটিংস + Device rotation + অ্যাস্পেক্ট রেশিও + Black background at fullscreen media + Scroll thumbnails horizontally + Automatically hide system UI at fullscreen media + Delete empty folders after deleting their content + Allow controlling photo brightness with vertical gestures + Allow controlling video volume and brightness with vertical gestures + Show folder media count on the main view + Show extended details over fullscreen media + Manage extended details + Allow one finger zoom at fullscreen media + Allow instantly changing media by clicking on screen sides + Allow deep zooming images + Hide extended details when status bar is hidden + Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen + Deep zoomable images + Show images in the highest possible quality + Show the Recycle Bin as the last item on the main screen + Allow closing the fullscreen view with a down gesture + Allow 1:1 zooming in with two double taps + Always open videos on a separate screen with new horizontal gestures + Show a notch if available + Allow rotating images with gestures + File loading priority + গতি + সমঝোতা + Avoid showing invalid files + Show image file types + Allow zooming videos with double tapping them + Folder thumbnail style + File thumbnail style + Thumbnail spacing + Show file count on a separate line + Show file count in brackets + Do not show file count + Limit long folder titles to 1 line + বর্গ + Rounded corners + + + থাম্বনেল + পুরো স্ক্রিনের মিডিয়া + বর্ধিত বিশদ + নিচের অংশের ক্রিয়াগুলো + + + Manage visible bottom actions + Toggle favorite + Toggle file visibility + + + কাস্টম + রিসেট + বর্গ + রূপান্তর + ফিল্টার + কিছু না + সামঞ্জস্য করুন + ছায়া + অনাবৃত করুন + হাইলাইটসমূহ + উজ্জ্বলতা + Contrast + স্যাচুরেশন + নির্মলতা + গামা + কালো + শাদা + উষ্ণতা + তীক্ষ্ণতা + রিসেট + ফোকাস + কিছু না + রশ্মীবৎ + লিনিয়ার + আয়না + গাউসিয়ান + লেখা + লেখার অপশন + লেখার রঙ + ফন্ট + যোগ করুন + সম্পাদনা করুন + সোজা করা + ফন্ট + রঙ + পেছনের রঙ + প্রান্তিককরণ + সামনে আনুন + মুছে ফেলুন + আপনার লেখা + ব্রাশ + রঙ + আয়তন + কঠোরতা + সামনে আনুন + মুছে ফেলুন + ব্রাশের রঙ + সম্পাদক + সম্পাদক বন্ধ করুন? + আপনি কি সত্যিই পরিবর্তনগুলো বাদ দিতে চান? + হ্যাঁ + না + বাতিল + গ্রহণ + সংরক্ষণ + এক্সপোর্ট হচ্ছে… + এক্সপোর্ট হচ্ছে %s. + স্টিকার + স্টিকারের রঙ + Sticker Options + যোগ + রঙ + মুছে ফেলা + সামনে + সোজা করুন + প্রতিস্থাপন + অস্বচ্ছতা + বৈপরীত্য + সম্পৃক্তি + উজ্জ্বলতা + আপলোডসমূহ + ওভারলে + সাধারণ + অন্ধকারাচ্ছন্ন করা + স্ক্রিন + ওভারলে + হালকা করা + গুণ + পোড়া রঙ + নরম আলো + কড়া আলো + কিছু না + সোনালী + লাইটলিক ১ + মোজাইক + কাগন + বৃষ্টি + ভিন্টেজ + পাশাপাশি ঘুরান + খাড়াখাড়ি ঘুরান + পূর্বাবস্থায় ফেরত যান + পুনরায় আনুন + রঙ নির্বাচক + স্বচ্ছ + শাদা + ধুসর + কালো + হালকা নীল + নীল + বেগুনী + অর্কিড + গোলাপী + লাল + কমলা + সোনালী + হলুদ + জলপাই রঙ + নীল + সামুদ্রিক নীল + পাইপেটেবল রঙ + কাটুন + + + How can I make Simple Gallery the default device gallery? + 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. + I locked the app with a password, but I forgot it. What can I do? + 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. + How can I make an album always appear at the top? + 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. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. + What is the difference between hiding and excluding a folder? + 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. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + Why do folders with music cover art or stickers show up? + 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. + A folder with images isn\'t showing up, or it doesn\'t show all items. What can I do? + 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. + What if I want just a few particular folders visible? + 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. + Can I crop images with this app? + 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. + Can I somehow group media file thumbnails? + 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. + Sorting by Date Taken doesn\'t seem to work properly, how can I fix it? + 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\". + I see some color banding on the images. How can I improve the quality? + 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. + I have hidden a file/folder. How can I unhide it? + 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. + Why does the app take up so much space? + 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. + + + + সিম্পল গ্যালারি প্রো - ছবি ম্যানেজার ও সম্পাদক + + কোন বিজ্ঞাপন ছাড়া ছবি, ভিডিও ও গিফ সম্পাদনা, ব্যবস্থাপনার একটি প্রিমিয়াম অ্যাপ + + সিম্পল গ্যালারি প্রো একটি অত্যন্ত সম্পাদনাযোগ্য অফলাইন গ্যালারি। + + অ্যাপটিতে কোনও বিজ্ঞাপন এবং অপ্রয়োজনীয় অনুমতি নেই। অ্যাপ্লিকেশনটিকে যেহেতু ইন্টারনেট সংযোগের প্রয়োজন নেই, তাই আপনার গোপনীয়তা সুরক্ষিত। + + ------------------------------------------------- + সহজ গ্যালারি প্রো - বৈশিষ্ট্যসমূহ + ------------------------------------------------- + + • কোন বিজ্ঞাপন বা পপআপ ছাড়া অফলাইন গ্যালারী + • সাধারণ গ্যলারি ফটো সম্পাদক - ক্রপ করুন, ঘোরান, পুনরায় আকার দিন, অঙ্কন করুন, ফিল্টার প্রয়োগ করুন এবং আরও অনেক কিছু। + • কোন ইন্টারনেট সংযোগ প্রয়োজন নেই + • কোন অপ্রয়োজনীয় অনুমতি চায় না + • ছবি, ভিডিও ও অন্যান্য ফাইলসমূহ দ্রুত অনুসন্ধান করুন + • সিম্পল গ্যালারি প্রো এর ধরন পরিবর্তন করুন + • ৩২টি ভাষায় রয়েছে + • সিম্পল গ্যালারি প্রো উন্মুক্ত উৎসের + … এবং আরও অনেক অনেক বেশী! + + ছবি গ্যালারি সম্পাদক + সিম্পল গ্যালারি প্রো আপনার ছবি যেকোন সময় সম্পাদনা সহজ করে দেয়। আপনার ছবি কাটুন, ফ্লিপ করুন বা আকার পরিবর্তন করুন। আপনি আরেকটু সৃজনশীল হলে, নতুন ফিল্টার যুক্ত করতে পারবেন এবং আপনার ছবির উপর আঁকতেও পারবেন। + + অনেকধরণের ফাইল ঘরানার জন্য সমর্থন রয়েছে + জেপিইজি, পিএনজি, এমপি৪, এমকেভি, আরএডাব্লু, এসভিজি, প্যানোরামিক ফটো, প্যানোরামিক ভিডিও এবং আরও অনেক ফাইল টাইপ সিম্পল গ্যালারি প্রো সমর্থন করে। + + মুছে ফেলা ছবি ও ভিডিও পুনরুদ্ধার করুন + ভুল করে গুরুত্বপূর্ণ ছবি বা ভিডিও মুছে ফেললেন? চিন্তার কারণ নেই। সিম্পল গ্যালারি প্রোর নিজস্ব রিসাইকেল বিন আপনাকে এ বিপদ থেকে বাঁচাবে। + + ছবি, ভিডিও এবং ফাইল লুকান ও নিরাপদ রাখুন: + পিন, প্যাটার্ন, অথবা ফিঙ্গারপ্রিন্ট ব্যবহার করে আপনি আপনার ছবি, ভিডিও এবং পুরো অ্যালবামই নিরাপদে রাখতে পারবেন। আপনি পুরো অ্যাপটাই নিরাপদে রাখতে পারবে, অথবা নির্দিষ্ট কিছু ফাংশনে লক দিতে পারবেন। যেমন ধরুন, ফিঙ্গারপ্রিন্ট ছাড়া কোন ফাইল মুছতে না পারাটা ভুল করে ফাইল হারানো থেকে আপনাকে বাঁচাবে। + + সিম্পল টুলসমূহের পরিপূর্ণ স্যুট: + https://www.simplemobiletools.com + + সিম্পল গ্যালারি প্রোর আলাদা ওয়েবসাইট + https://www.simplemobiletools.com/gallery + + ফেসবুক: + https://www.facebook.com/simplemobiletools + + রেডিট: + https://www.reddit.com/r/SimpleMobileTools + + + + diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 2a2a66d67..58e0d5c34 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -192,13 +192,15 @@ Eviteu mostrar fitxers no vàlids Mostra els tipus de fitxers d\’imatges Permet fer zoom als vídeos amb dos cops - Folder thumbnail style - Show file count on a separate line - Show file count in brackets - Do not show file count - Limit long folder titles to 1 line - Square - Rounded corners + Estil de miniatura de carpeta + Estil de miniatura del fitxer + Espai entre miniatures + Mostra el recompte de fitxers en una línia diferent + Mostra el recompte de fitxers entre claudàtors + No mostreu el recompte de fitxers + Limiteu els títols de carpeta llarga a 1 línia + Quadrat + Cantonades arrodonides Miniatures @@ -288,7 +290,7 @@ Enfosquir Pantalla Superposició - Lighten + Alleugerir Multiplicar Color cremat Llum suau diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index f2c196cee..aa9d59296 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -193,6 +193,8 @@ Zobrazit typ obrázkových souborů Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 227bd429c..6bbafcf90 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -193,6 +193,8 @@ Vis billeders filtyper Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 53c0ef761..d42212487 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -193,6 +193,8 @@ Bilddateitypen anzeigen Erlaube Zoomen in Videos mit doppeltem Antippen Ordner-Miniaturbildstil + File thumbnail style + Thumbnail spacing Zeige Anzahl der Dateien in einer seperaten Zeile an Anzahl der Dateien in Klammern anzeigen Anzahl der Dateien nicht anzeigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 230ffea25..be972dde6 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -193,6 +193,8 @@ Εμφάνιση τύπου αρχείου εικόνας Επιτρέπει την μεγέθυνση βίντεο με διπλό πάτημα Στυλ μικρογραφίας φακέλου + Στυλ μικρογραφίας αρχείου + Απόσταση μικρογραφιών Εμφάνιση πλήθους αρχείων σε ξεχωριστή γραμμή Εμφάνιση πλήθους αρχείων σε αγκύλες Χωρίς εμφάνιση μέτρησης αρχείων diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 72e819957..764dbcf7c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -28,7 +28,7 @@ Fecha fijada correctamente No se han encontrado valores de fechas tomadas Comparte una versión redimensionada - Oye,\n\nParece que actualizaste de la aplicación gratuita vieja. Ahora puedes desinstalar la versión vieja, que tiene un botón \'Actualizar a Pro\' en la aprte superior de los ajustes de la app.\n\nSolo tendrás los elementos de la Papelera de Reciclaje eliminados, favoritos desmarcados y también tendrás que reiniciar los ajustes de la app.\n\n¡Gracias! + Oye,\n\nParece que actualizaste de la aplicación gratuita vieja. Ahora puedes desinstalar la versión vieja, que tiene un botón \'Actualizar a Pro\' en la parte superior de los ajustes de la app.\n\nSólo tendrás los elementos de la Papelera de Reciclaje eliminados, favoritos desmarcados y también tendrás que reiniciar los ajustes de la app.\n\n¡Gracias! Cambiar a la búsqueda de archivos en todas las carpetas visibles Poner como carpeta predeterminada Quitar como carpeta predeterminada @@ -38,7 +38,7 @@ Imágenes Videos GIFs - Imagenes RAW + Imágenes RAW SVGs Retratos No se han encontrado ficheros con los filtros seleccionados. @@ -117,7 +117,7 @@ Presentación de diapositivas Intervalo (segundos): Incluir fotos - Incluir vídeos + Incluir videos Incluir GIFs Orden aleatorio Mover hacia atrás @@ -166,21 +166,21 @@ Fondo y barra de estado negra en medios de pantalla completa Desplazar miniaturas horizontalmente Ocultar la interfaz del sistema en pantalla completa - Eliminar carpetas vacias despues de borrar su contenido + Eliminar carpetas vacias después de borrar su contenido Permite controlar el brillo en las fotos con gestos verticales Permite controlar el volumen y el brillo del video con gestos verticales Mostrar el número de archivos dentro de las carpetas en la página principal Mostrar información de los archivos en pantalla completa - Información de lo archivos a mostrar + Información de los archivos a mostrar Permitir zoom con un dedo en pantalla completa - Deslpazarse en los medios haciendo clic en los lados de la pantalla + Desplazarse en los medios haciendo clic en los lados de la pantalla Permitir zoom profundo Ocultar detalles ampliados cuando la barra de estado está oculta Mostrar botones de acción en la parte inferior de la pantalla Mostrar la papelera de reciclaje en la pantalla de carpetas Imágenes ampliables con zoom Mostrar imágenes con la mayor calidad posible - Mostrar la Papelera de reciclaje como el último elemento en la pantalla principal + Mostrar la papelera de reciclaje como el último elemento en la pantalla principal Permite cerrar la vista de pantalla completa con un gesto hacia abajo. Permitir zoom 1:1 con un toque doble Abrir videos en una pantalla separada con nuevos gestos horizontales @@ -192,13 +192,15 @@ Evita mostrar archivos inválidos Mostrar tipos de archivo de imagen Permitir hacer zoom en videos con doble toque - Folder thumbnail style - Show file count on a separate line - Show file count in brackets - Do not show file count - Limit long folder titles to 1 line - Square - Rounded corners + Estilo de las miniaturas de las carpetas + File thumbnail style + Thumbnail spacing + Mostrar el recuento de archivos en una línea separada + Mostrar el recuento de archivos entre paréntesis + No mostrar el recuento de archivos + Limitar los títulos largos de las carpetas a 1 línea + Cuadrado + Esquinas redondeadas Miniaturas @@ -261,7 +263,7 @@ Color del pincel Editor ¿Cerrar editor? - ¿Realmente queires descartar los cambios? + ¿Realmente quieres descartar los cambios? No Cancelar @@ -285,7 +287,7 @@ Subidas Modo de fusión Normal - Más obscuro + Más oscuro Pantalla Superpuesto Más claro diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml new file mode 100644 index 000000000..6bbac8b15 --- /dev/null +++ b/app/src/main/res/values-eu/strings.xml @@ -0,0 +1,427 @@ + + + Galeria sinplea + Galeria + Editatu + Ireki kamera + (ezkutatuta) + (baztertuta) + Ainguratu karpeta + Kendu aingura karpetari + Ainguratu goian + Erakutsi karpeta guztien edukia + Karpeta guztiak + Aldatu karpeta-ikuspegira + Bestelako karpeta + Erakutsi mapan + Kokapen ezezaguna + Bolumena + Distira + Blokeatu orientazioa + Desblokeatu orientazioa + Aldatu orientazioa + Behartu bertikala + Behartu horizontala + Erabili lehenetsitako orientazioa + Konpondu ateratze-dataren balioa + Konpontzen… + Datak ongi konpondu dira + Ateratze-dataren baliorik ez da aurkitu + Partekatu tamaina aldatutako bertsioa + Kaixo,\n\nbadirudi doako aplikazio zaharra eguneratu duzula. Orain bertsio zaharra desinstalatu dezakezu aplikazioaren ezarpenen goiko aldean dagoen \'Eskuratu Pro bertsioa\' botoiarekin. Azkenik, zakarrontzian dituzun elementuak ezabatuko dira, gogoko elementuei marka kenduko zaie eta zure azplikazio-ezarpenak berrezarri beharko dituzu.\n\nEskerrik asko! + Aldatu fitxategi-bilaketa ikusgai dauden karpeta guztien artean + Ezarri lehenetsitako karpeta gisa + Kendu karpeta lehenetsitako karpeta gisa + + + Iragazi multimedia + Irudiak + Bideoak + GIFak + RAW irudiak + SVGak + Erretratuak + Hautatutako filtroa duen multimedia fitxategirik ez da aurkitu. + Aldatu filtroak + + + Funtzio honek karpeta \'.nomedia\' fitxategi bat gehituz ezkutatzen du, azpikarpeta guztiak ere ezkutatuko ditu. Ezarpenetako \'Erakutsi ezkutatutako elementuak\' aukera aldatuz ikus ditzakezu. Jarraitu? + Baztertu + Baztertutako karpetak + Kudeatu baztertutako karpetak + Honek hautatutakoa bere azpikarpetekin baztertutako ditu Galeria Sinpletik soilik. Baztertutako karpetak ezarpenetan kudeatu ditzakezu. + Baztertu nagusia horren ordez? + Karpetak baztertzeak hauek eta beren azpikarpetak Galeria Sinplean soilik ezkutatuko ditu, beste aplikazioetan oraindik ikusgai egongo dira.\n\nBeste aplikazioetatik ere ezkutatu nahi badituzu, erabili Ezkutatu funtzioa. + Kendu guztiak + Kendu karpeta guztiak baztertutako zerrendatik? Honek ez ditu karpetak ezabatuko. + Ezkutatutako karpetak + Kudeatu ezkutatutako karpetak + Badirudi \".nomedia\" fitxategia duen ezkutatutako karpetarik ez duzula. + + + Sartutako karpetak + Kudeatu sartutako karpetak + Gehitu karpeta + Multimedia duen karpetarik baduzu, baina aplikazioak ez badu hauteman, hemen eskuz gehitu dezakezu.\n\nHainbat elementu hemen gehitzeak ez du beste karpetarik baztertuko. + Multimedia fitxategirik ez da aurkitu. Fitxategi horiek dituzten karpetak eskuz gehituz konpondu dezakezu. + + + Aldatu tamaina + Aldatu hautatutakoaren tamaina eta gorde + Zabalera + Altuera + Mantendu aspektu-erlazioa + Sartu baliozko bereizmena + + + Editorea + Biratu + Irudiaren bide-izen baliogabea + Bideoaren bide-izen baliogabea + Irudia editatzeak huts egin du + Bideoa editatzeak huts egin du + Irudia editatzea utzi da + Bideoa editatzea utzi da + Fitxategia ongi editatu da + Irudia ongi editatu da + Bideoa ongi editatu da + Editatu irudia honekin: + Editatu bideoa honekin: + Irudi-editorerik ez da aurkitu + Bideo-editorerik ez da aurkitu + Fitxategi kokapen ezezaguna + Ezin izan da jatorrizko fitxategia gainidatzi + Biratu ezkerrera + Biratu eskuinera + Biratu 180º + Irauli + Irauli horizontalki + Irauli bertikalki + Askea + Bestelakoa + + + Horma-paper sinplea + Ezarri horma-paper gisa + Horma-paper gisa ezartzeak huts egin du + Ezarri horma-paper gis honekin: + Horma-papera ezartzen… + Horma-papera ongi ezarri da + Aspektu-erlazio bertikala + Aspektu-erlazio horizontala + Hasierako pantaila + Blokeatutako pantaila + Hasierako eta blokeatutako pantaila + + + Diaporama + Tartea (segunduak): + Sartu argazkiak + Sartu bideoak + Sartu GIFak + Ausazko ordena + Mugitu atzera + Errepikatu diaporama + Animazioa + Bat ere ez + Lausotu + Diapositiba + Diaporama bukatu da + Diaporamarako multimediarik ez da aurkitu + + + Taldekatu zuzeneko azpikarpetak + + + Taldekatu + Ez taldekatu fitxategiak + Karpeta + Azken aldaketa + Azken aldaketa (egunero) + Azken aldaketa (hilero) + Ateratze-data + Ateratze-data (egunero) + Ateratze-data (hilero) + Fitxategi mota + Luzapena + Kontuan hartu taldekatzea eta ordenatzea bi eremu independente direla. + + + Widgetean erakutsitako karpeta: + Erakutsi karpetaren izena + + + Erreproduzitu bideoak automatikoki + Gogoratu azken bideoaren erreprodukzio-posizioa + Aldatu fitxategi-izenaren ikusgaitasuna + Errepikatu bideoak + Animatu GIFak iruditxoetan + Gehienezko distira multimedia pantaila osoan ikustean + Moztu iruditxoak karratutan + Erakutsi bideoen iraupena + Biratu pantaila osoko multimedia: + Sistemaren ezarpena + Gailu-biratzea + Aspektu-erlazioa + Hondo beltza pantaila osoko multimediarekin + Korritu iruditxoak horizontalki + Automatikoki ezkutatu sistemaren EI pantaila osoko multimediarekin + Ezabatu hutsik dauden karpetak beren edukia ezabatu ondoren + Baimendu argazkiaren distira kontrolatzea keinu bertikalekin + Baimendu bideoaren bolumena eta distira kontrolatzea keinu bertikalekin + Erakutsi karpetaren multimedia-kopurua ikuspegi nagusian + Erakutsi xehetasun hedatuak pantaila osoko multimedian + Kudeatu xehetasun hedatuak + Baimendu zooma hatz bakarrarekin pantaila osoko multimedian + Baimendu multimedia berehala aldatzea pantaila-ertzeetan klik eginez + Baimendu zoom sakona irudietan + Ezkutatu xehetasun hedatuak egoera-barra ezkutatuta dagoenean + Erakutsi ekintza-botoiak pantailaren beheko aldean + Erakutsi zakarrontzia karpeten pantailan + Zoom sakona egin daitezkeen irudiak + Erakutsi irudiak ahal den kalitate handienean + Erakutsi zakarrontzia azken elementu gisa pantaila nagusian + Baimendu pantaila osoko ikuspegia ixtea beherako keinuarekin + Baimendu 1:1 zooma bi aldiz birritan ukitzean + Ireki bideoak beste pantaila betean keinu horizontalekin + Erakutsi koska bat erabilgarri badago + Baimendu irudiak keinuekin biratzea + Fitxategien kargatze-lehentasuna + Abiadura + Konpromisoa + Ekidin fitxategi baliogabeak erakustea + Erakutsi irudi-fitxategi motak + Baimendu bideoen zooma birritan ukitzean + Karpeta-iruditxoaren estiloa + Fitxategi-iruditxoaren estiloa + Iruditxoen arteko tartea + Erakutsi fitxategi kopurua beste lerro batean + Erakutsi fitxategi kopurua parentesi artean + Ez erakutsi fitxategi kopurua + Mugatu karpeten izenburu luzeak lerro batera + Karratua + Ertz biribilduak + + + Iruditxoak + Pantaila osoko multimedia + Xehetasun hedatuak + Beheko ekintzak + + + Kudeatu ikusgai dauden beheko ekintzak + Aldatu gogokoa + Aldatu fitxategien ikusgaitasuna + + + Pertsonalizatu + Berrezarri + Karratua + Eraldatu + Filtroa + Bat ere ez + Doitu + Itzalak + Esposizio + Eremu distiratsuak + Distira + Kontrastea + Saturazioa + Argitasuna + Gamma + Beltzak + Zuriak + Tenperatura + Zorroztasuna + Berrezarri + Fokatzea + Bat ere ez + Erradiala + Lineala + Ispilua + Gaussiarra + Testua + Testu-aukerak + Testuaren kolorea + Letra-tipoa + Gehitu + Editatu + Zuzendu + Letra-tipoa + Kolorea + HP kolorea + Lerrokatzea + Aurrera + Ezabatu + Zure testua + Pintzela + Kolorea + Tamaina + Gogortasuna + Aurrera + Ezabatu + Pintzelaren kolorea + Editorea + Itxi editorea? + Ziur zaude aldaketak baztertu nahi dituzula? + Bai + Ez + Utzi + Onartu + Gorde + Esportatzen… + Esportatzen %s. + Eranskailua + Eranskailuaren kolorea + Eranskailu-aukerakSticker Options + Gehitu + Kolorea + Ezabatu + Aurrera + Zuzendu + Ordeztu + Opakutasuna + Kontrastea + Saturazioa + Distira + Igotakoak + Gainjarri + Normala + Ilundu + Pantaila + Gainjarri + Argitu + Biderkatu + Kolore erreta + Argi leuna + Argi gogorra + Bat ere ez + Urrea + Argi-filtrazioa 1 + Mosaikoa + Papera + Euria + Vintage + Biratu H + Biratu B + Desegin + Berregin + Kolore-hautatzailea + Gardena + Zuria + Grisa + Beltza + Urdin argia + Urdina + Morea + Orkidea + Arrosa + Gorria + Laranja + Urrea + Horia + Oliba + Berdea + Akuamarinoa + Hautatu kolorea (pipeta) + Moztu + + + How can I make Simple Gallery the default device gallery? + 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. + I locked the app with a password, but I forgot it. What can I do? + 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. + How can I make an album always appear at the top? + 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. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. + What is the difference between hiding and excluding a folder? + 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. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + Why do folders with music cover art or stickers show up? + 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. + A folder with images isn\'t showing up, or it doesn\'t show all items. What can I do? + 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. + What if I want just a few particular folders visible? + 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. + Can I crop images with this app? + 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. + Can I somehow group media file thumbnails? + 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. + Sorting by Date Taken doesn\'t seem to work properly, how can I fix it? + 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\". + I see some color banding on the images. How can I improve the quality? + 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. + I have hidden a file/folder. How can I unhide it? + 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. + Why does the app take up so much space? + 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. + + + + Simple Gallery Pro - Photo Manager & Editor + + A premium app for managing and editing your photos, videos, GIFs without ads + + Simple Gallery Pro is a highly customizable offline gallery. Organize & edit your photos, recover deleted files with the recycle bin, protect & hide files and view a huge variety of different photo & video formats including RAW, SVG and much more. + + The app contains no ads and unnecessary permissions. As the app doesn’t require internet access either, your privacy is protected. + + ------------------------------------------------- + SIMPLE GALLERY PRO – FEATURES + ------------------------------------------------- + + • Offline gallery with no ads or popups + • Simple gallery photo editor – crop, rotate, resize, draw, filters & more + • No internet access needed, giving you more privacy and security + • No unnecessary permissions required + • Quickly search images, videos & files + • Open & view many different photo and video types (RAW, SVG, panoramic etc) + • A variety of intuitive gestures to easily edit & organize files + • Lots of ways to filter, group & sort files + • Customize the appearance of Simple Gallery Pro + • Available in 32 languages + • Mark files as favorites for quick access + • Protect your photos & videos with a pattern, pin or fingerprint + • Use pin, pattern & fingerprint to protect the app launch or specific functions too + • Recover deleted photos & videos from the recycle bin + • Toggle visibility of files to hide photos & videos + • Create a customizable slideshow of your files + • View detailed information of your files (resolution, EXIF values etc) + • Simple Gallery Pro is open source + … and much much more! + + PHOTO GALLERY EDITOR + Simple Gallery Pro makes it easy to edit your pictures on the fly. Crop, flip, rotate and resize your pictures. If you’re feeling a little more creative you can add filters and draw on your pictures! + + SUPPORT FOR MANY FILE TYPES + Unlike some other gallery viewers & photo organizers, Simple Gallery Pro supports a huge range of different file types including JPEG, PNG, MP4, MKV, RAW, SVG, Panoramic photos, Panoramic videos and many more. + + HIGHLY CUSTOMIZABLE GALLERY MANAGER + From the UI to the function buttons on the bottom toolbar, Simple Gallery Pro is highly customizable and works the way you want it to. No other gallery manager has this kind of flexibility! Thanks to being open source, we’re also available in 32 languages! + + RECOVER DELETED PHOTOS & VIDEOS + Accidentally deleted a precious photo or video? Don’t worry! Simple Gallery Pro features a handy recycle bin where you can recover deleted photos & videos easily. + + PROTECT & HIDE PHOTOS, VIDEOS & FILES + Using pin, pattern or your device’s fingerprint scanner you can protect and hide photos, videos & entire albums. You can protect the app itself or place locks on specific functions of the app. For example, you can’t delete a file without a fingerprint scan, helping to protect your files from accidental deletion. + + Ikusi Simple Tools-en sorta osoa hemen: + https://www.simplemobiletools.com + + Simple Gallery Pro-ren webgune autonomoa: + https://www.simplemobiletools.com/gallery + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 836a4c0c0..4c46af20d 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -193,6 +193,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 0dfe42f3b..e87c78775 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -30,7 +30,7 @@ Partager une version redimensionnée Hé,\n\nvous avez apparemment fait une mise à niveau à partir de l\'ancienne application gratuite. Vous pouvez maintenant désinstaller l\'ancienne version avec le bouton \'Mettre à niveau vers Pro\' en haut des paramètres de l\'application.\n\nVos éléments de la corbeille seront supprimés, les éléments favoris seront non marqués et vous devrez également restaurer les paramètres de votre application.\n\nMerci ! Basculer vers la recherche de fichiers - Définir comme défaut + Dossier par défaut Oublier le dossier @@ -192,7 +192,9 @@ Éviter l\'affichage de fichiers invalides Afficher les types d\'image Zoomer les vidéos par un double appui - Style des miniatures + Style des miniatures des dossiers + Style des miniatures des fichiers + Espacement des miniatures Afficher le nombre de fichiers sur une autre ligne Afficher le nombre de fichiers entre parenthèses Ne pas afficher le nombre de fichiers @@ -270,8 +272,8 @@ Exportation… Exportation %s Sticker - Couleur de Sticker - Options de Sticker + Couleur du Sticker + Options du Sticker Ajouter Couleur Supprimer @@ -322,7 +324,7 @@ Vert Aquamarin Couleur de la pipette - Trim + Couper Comment faire de Simple Gallery ma galerie par défaut ? diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 8dede9d61..002b595ef 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -193,6 +193,8 @@ Mostrar tipos de ficheiros de imaxe Permitir zoom nos vídeos co dobre-toque sobre eles Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index ba760dffe..61dbb91cc 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -193,6 +193,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index a9bf048fe..4e54d4201 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -193,6 +193,8 @@ Mutassa a kép fájl típusokat A videók nagyításának engedélyezése dupla koppintással Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 813b690a4..885c4d401 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -193,6 +193,8 @@ Tampilkan tipe berkas gambar Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index de85d8122..3b8a0edd4 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -193,6 +193,8 @@ Tampilkan tipe berkas gambar Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 17beb2909..1908edd11 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -193,6 +193,8 @@ Mostra i tipi di file immagine Permetti l\'ingrandimento dei video con un doppio tocco Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f0b3b3f33..dc46fe46d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -193,6 +193,8 @@ 画像ファイルの種類を表示 ダブルタップで動画ズームを設定 フォルダサムネイルのスタイル + File thumbnail style + Thumbnail spacing ファイル数を別の行に表示 ファイル数を括弧内に表示 ファイル数を非表示 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index f784d15dd..55568d1bf 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -193,6 +193,8 @@ 사진 파일 종류 표시 Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index fcc53f487..2ce6815d9 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -193,6 +193,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 87bbc384b..3c3622cf2 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -77,18 +77,18 @@ Redigering Roter Ugyldig bildebane - Invalid video path + Ugyldig videobane Bilderedigering feilet - Video editing failed + Videoredigering feilet Bilderedigering avbrutt - Video editing cancelled + Videoredigering avbrutt Fil vellykket redigert - Image edited successfully - Video edited successfully + Bilde vellykket redigert + Video vellykket redigert Rediger bilde med: - Edit video with: + Rediger video med: Ingen bilderedigeringsapp funnet - No video editor found + Ingen videoredigeringsapp funnet Ukjent filplassering Kunne ikke overskrive kildefilen Roter til venstre @@ -193,6 +193,8 @@ Vis bildefiltyper Tillat zooming av videoer ved å dobbelttrykke dem Minibildestil for mapper + File thumbnail style + Thumbnail spacing Vis antall filer på en separat linje Vis antall filer i parentes Ikke vis antall filer @@ -261,7 +263,7 @@ Penselfarge Redigering Lukke Redigering? - Do you really want to discard the changes? + Vil du forkaste endringene? Ja Nei Avbryt diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index a3f89bca0..26f0cd5a0 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -193,6 +193,8 @@ तस्बिरको फाईल किसिम देखाउनुहोस Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 6d8d36991..b5469e360 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -30,13 +30,13 @@ Verkleinde versie delen Het lijkt erop dat dit een upgrade is vanaf de oude gratis versie. Deze oude versie, met de knop \"Upgraden naar Pro\" bovenaan de instellingen, kan nu gedeïnstalleerd worden.\n\nDe items in de prullenbak zullen dan wel worden verwijderd, favorieten en instellingen zullen ook opnieuw moeten worden geconfigureerd. Zoeken in alle zichtbare mappen - Set as default folder - Unset as default folder + Als standaardmap instellen + Standaardmap herstellen Media filteren Afbeeldingen - Video’s + Video\'s GIF-bestanden RAW-afbeeldingen SVG-vectorafbeeldingen @@ -77,18 +77,18 @@ Bewerken Draaien Ongeldig pad naar afbeelding - Invalid video path + Ongeldig pad naar video Fout bij bewerken van afbeelding - Video editing failed + Videobewerking mislukt Afbeelding bewerken is geannuleerd - Video editing cancelled + Videobewerking is geannuleerd Wijzigingen zijn opgeslagen - Image edited successfully - Video edited successfully + Bewerkte afbeelding is opgeslagen + Bewerkte video is opgeslagen Afbeelding bewerken met: - Edit video with: - Geen app gevonden voor fotobewerking - No video editor found + Video bewerken met: + Geen app voor fotobewerking gevonden + Geen app voor videobewerking gevonden Onbekende bestandslocatie Bronbestand kan niet worden overschreven Linksom draaien @@ -117,7 +117,7 @@ Diavoorstelling Interval (seconden): Afbeeldingen weergeven - Video’s weergeven + Video\'s weergeven GIF-bestanden weergeven Willekeurige volgorde Omgekeerde volgorde @@ -151,10 +151,10 @@ Mapnaam tonen - Video’s automatisch afspelen + Video\'s automatisch afspelen Laatste positie in video’s onthouden Bestandsnamen tonen - Video’s herhalen + Video\'s herhalen GIF-bestanden afspelen in overzicht Maximale helderheid in volledig scherm Miniatuurvoorbeelden bijsnijden @@ -183,7 +183,7 @@ Prullenbak als laatste item tonen Naar beneden vegen om volledig scherm af te sluiten 1:1 zoomen na 2x dubbelklikken - Video’s altijd in apart scherm met horizontale veeggebaren openen + Video\'s altijd in apart scherm met horizontale veeggebaren openen Inkeping scherm tonen indien aanwezig Afbeeldingen met veeggebaren draaien Prioriteit bij inladen bestanden @@ -192,13 +192,15 @@ Ongeldige bestanden verbergen Bestandstypen tonen Bij video\'s inzoomen met dubbelklikken - Folder thumbnail style - Show file count on a separate line - Show file count in brackets - Do not show file count - Limit long folder titles to 1 line - Square - Rounded corners + Stijl voor thumbnails mappen + Stijl voor thumbnails bestanden + Afstand tussen thumbnails + Aantal bestanden op aparte regel tonen + Aantal bestanden tussen rechte haken tonen + Aantal bestanden niet tonen + Lange mapnamen tot 1 regel limiteren + Vierkant + Afgeronde hoeken Miniatuurvoorbeelden @@ -261,7 +263,7 @@ Penseelkleur Bewerken Afsluiten - Do you really want to discard the changes? + Veranderingen niet opslaan? Ja Nee Annuleren @@ -270,35 +272,35 @@ Exporteren… %s exporteren. Sticker - Sticker Color - Sticker Options - Add - Color - Delete - To Front - Straighten - Replace - Opacity + Stickerkleur + Stickeropties + Toevoegen + Kleur + Verwijderen + Naar voorgrond + Rechttrekken + Vervangen + Ondoorzichtigheid Contrast - Saturation - Brightness + Verzadiging + Helderheid Uploads Overlay - Normal - Darken - Screen - Overlay - Lighten - Multiply - Color Burn - Soft Light - Hard Light - None - Golden - Lightleak 1 - Mosaic - Paper - Rain + Normaal + Donkerder + Raster + Bedekken + Lichter + Vermenigvuldigen + Kleur doordrukken + Zwak licht + Fel licht + Geen + Goud + Licht lekken 1 + Mozaïek + Papier + Regen Vintage Spiegelen H Spiegelen V @@ -322,7 +324,7 @@ Groen Aquamarijn Met pipet kiezen - Trim + Titel afkappen Hoe kan ik Eenvoudige Galerij instellen als standaard-app voor foto’s en video’s? @@ -353,7 +355,7 @@ In de meeste gevallen werkt de huidige methode voor het weergeven van afbeeldingen prima, maar met de instelling \"Afbeeldingen in de hoogst mogelijke kwaliteit weergeven\" onder \"Afbeeldingen ver inzoomen\" kan een nog betere kwaliteit worden bewerkstelligd. Ik heb een bestand of map verborgen. Hoe kan ik dit ongedaan maken? Kies het menu-item \"Verborgen items tijdelijk tonen\", of schakel de instelling \"Verborgen items tonen\" in om het verborgen item te kunnen zien. Druk vervolgens lang op het item en kies \"Tonen\" om het verbergen ongedaan te maken. Mappen worden verborgen door het bestand \".nomedia\" in de map te plaatsen; dit bestand kan ook handmatig in een andere app worden verwijderd. - Why does the app take up so much space? + Waarom neemt de app zoveel ruimte in beslag? De cache voor de app kan oplopen tot 250MB; dit garandeert snellere laadtijden van afbeeldingen. Indien de app nog meer ruimte inneemt, komt dat hoogstwaarschijnlijk door de items in de prullenbak. Ook deze bestanden worden meegerekend met de ingenomen ruimte. Verwijder deze items zelf vanuit de prullenbak of vanuit de instellingen van de app. Ieder item in de prullenbak zal na 30 dagen automatisch verwijderd worden. @@ -408,7 +410,7 @@ Kijk ook eens naar de hele collectie apps van Simple Tools: https://www.simplemobiletools.com - Standalone website of Simple Gallery Pro: + Website van Simple Gallery Pro: https://www.simplemobiletools.com/gallery Facebook: diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b7fe9a05e..8ee0ef88d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -193,6 +193,8 @@ Pokazuj rozszerzenia zdjęć Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c63e3e126..f912ab6bc 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -193,6 +193,8 @@ Exibir tipos de arquivo de imagem Permitir zoom de vídeos com um toque duplo neles Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 68f0b68e9..4c250cd4a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -77,18 +77,18 @@ Editor Rodar Caminho inválido - Invalid video path + Caminho de vídeo inválido Falha na edição da imagem - Video editing failed + Falha na edição do vídeo Edição de imagem cancelada - Video editing cancelled + Edição de vídeo cancelada Imagem editada com sucesso - Image edited successfully - Video edited successfully + Imagem editada com sucesso + Vídeo editado com sucesso Editar imagem com: - Edit video with: - Editor não encontrado - No video editor found + Editar vídeo com: + Editor de imagem não encontrado + Editor de vídeo não encontrado Localização desconhecida Não foi possível substituir o ficheiro original Rodar à esquerda @@ -193,9 +193,11 @@ Mostrar o tipo de imagem Permitir ampliação de vídeos com dois toques Estilo de miniatura das pastas + File thumbnail style + Thumbnail spacing Mostrar número de ficherios em linha distinta Mostrar número de ficheiros em chavetas - não mostrar número de ficheiros + Não mostrar número de ficheiros Restringir título das pastas a 1 linha Quadrado Cantos arredondados @@ -261,7 +263,7 @@ Cor do pincel Editor Fechar editor? - Do you really want to discard the changes? + Tem a certeza de que deseja descartar as alterações? Sim Não Cancelar @@ -270,35 +272,35 @@ A exportar… A exportar %s. Sticker - Sticker Color - Sticker Options - Add - Color - Delete - To Front - Straighten - Replace - Opacity - Contrast - Saturation - Brightness - Uploads - Overlay + Cor do sticker + Opções do sticker + Adicionar + Cor + Apagar + Para a frente + Endireitar + Substituir + Opacidade + Contraste + Saturação + Brilho + Carregamentos + Sobreposição Normal - Darken - Screen - Overlay - Lighten - Multiply + Escurecer + Ecrã + Sobreposição + Clarear + Multiplicar Color Burn - Soft Light - Hard Light - None - Golden + Luz suave + Luz forte + Nenhuma + Dourada Lightleak 1 - Mosaic - Paper - Rain + Mosaico + Papel + Chuva Vintage Inversão horizontal Inversão vertical diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 76d2905e1..c1a539949 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -193,6 +193,8 @@ Показывать типы файлов изображений Масштабировать видео двойным нажатием по нему Вид миниатюр папок + File thumbnail style + Thumbnail spacing Показывать количество файлов отдельной строкой Показывать количество файлов в скобках Не показывать количество файлов diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 25278cbc6..ddc2fa82b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -193,6 +193,8 @@ Zobraziť typ obrázkových súborov Povoliť približovanie videí dvojitým ťuknutím Štýl miniatúr priečinkov + Štýl miniatúr súborov + Medzery medzi miniatúrami Zobraziť počet súborov na samostatnom riadku Zobraziť počet súborov v zátvorkách Nezobrazovať počet súborov diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 3a9355789..a9a1d4e61 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -193,6 +193,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index deec05678..e2b6fe3ce 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -193,6 +193,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9715dd2a9..7957d91ea 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -193,6 +193,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f27c71691..a36fa5785 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -176,7 +176,7 @@ Ekran kenarlarına tıklayarak anında medya değiştirmeye izin ver Derin yakınlaştırma resimlerine izin ver Durum çubuğu gizlendiğinde genişletilmiş ayrıntıları gizle - Ekranın alt kısmındaki bazı eylem düğmelerini göster + Ekranın alt kısmında bazı eylem düğmelerini göster Geri dönüşüm kutusu\'nu klasörler ekranında gösterme Derin yakınlaştırılabilir resimler Resimleri mümkün olan en yüksek kalitede göster @@ -193,6 +193,8 @@ Resim dosyası türlerini göster Videoları iki kez dokunarak yakınlaştırmaya izin ver Klasör küçük resim stili + File thumbnail style + Thumbnail spacing Dosya sayısını ayrı bir satırda göster Dosya sayısını parantez içinde göster Dosya sayısını gösterme diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 44aab35eb..f33314c29 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -30,7 +30,7 @@ Поділитися зображенням іншого розміру Агов,\n\nздається, ви оновились зі старого безкоштовного додатка. Тепер ви можете видалити стару версію, у якій є кнопка \"Перейти на Pro\" вгорі налаштувань додатка.\n\nВи втратите лише елементи з Кошика, позначки улюблених елементів, а також потрібно буде скинути ваші налаштування додатка.\n\nДякую! Перейти до пошуку файла в усіх видимих теках - Set as default folder + Встановити теку за замовчуванням Unset as default folder @@ -77,18 +77,18 @@ Редактор Обернути Неприпустимий шлях до зображення - Invalid video path + Неприпустимий шлях до відео Не вдалося редагувати зображення - Video editing failed - Image editing cancelled - Video editing cancelled - File edited successfully - Image edited successfully - Video edited successfully + Не вдалося редагувати відео + Редагування зображення скасовано + Редагування відео скасовано + Файл вдало відредагован + Зображення вдало відредаговано + Відео вдало відредаговано Редагувати зображення за допомогою: - Edit video with: + Реданувати відео у: Не знайдено редакторів зображень - No video editor found + Не знайдено редакторів відео Невідоме розташування файлу Не вдалося перезаписати вихідний файл Обернути ліворуч @@ -191,14 +191,16 @@ Компроміс Запобігати показу пошкоджених файлів Показувати типи файлів зображень - Allow zooming videos with double tapping them - Folder thumbnail style - Show file count on a separate line - Show file count in brackets - Do not show file count - Limit long folder titles to 1 line - Square - Rounded corners + Масштабувати відео подвійним натисканням по ньому + Вид мініатюр тек + File thumbnail style + Thumbnail spacing + Показувати кількість файлів в окремому рядку + Показувати кількість файлів у дужках + Не показувати кількість файлів + Обмежити довгі назви тек одним рядком + Квадрат + Закруглені кути Ескізи @@ -238,50 +240,50 @@ Linear Mirrored Gaussian - Text - Text Options - Text Color - Font - Add - Edit + Текст + Параметри тексту + Колір тексту + Шрифт + Додати + Редагувати Straighten - Font - Color + Шрифт + Колір BG Color - Alignment + Вирівнювання To Front - Delete - Your text - Brush - Color - Size + Видалити + Ваш текст + Пензель + Колір + Розмір Hardness To Front - Delete - Brush Color - Editor - Close Editor? - Do you really want to discard the changes? - Yes - No - Cancel - Accept - Save + Видалити + Колір пензля + Редактор + Закрити редактор? + Ви дійсно хочете відмінити зміни? + Так + Ні + Відхилити + Прийняти + Зберегти Exporting… Exporting %s. Sticker Sticker Color Sticker Options - Add - Color - Delete + Додати + Колір + Видалити To Front Straighten Replace - Opacity - Contrast - Saturation - Brightness + Прозорість + Контрастність + Насиченість + Яскравість Uploads Overlay Normal @@ -300,27 +302,27 @@ Paper Rain Vintage - Flip H - Flip V - Undo - Redo - Color Picker - Transparent - White - Gray - Black - Light blue - Blue - Purple - Orchid - Pink - Red - Orange - Gold - Yellow - Olive - Green - Aquamarin + Горизонтальний переворот + Вертикальний переворот + Скасувати + Повторити + Вибрати колір + Прозорий + Білий + Сірий + Чорний + Блакитний + Синій + Фіолетовий + Бузковий + Рожевий + Червоний + Помаранчевий + Золотий + Жовтий + Оливковий + Зелений + Аквамариновий Pipettable color Trim diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index fb42e97c3..b6ba2dcd7 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -193,6 +193,8 @@ Hiển thị các loại tệp hình ảnh Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 7f47ea8b0..eee460a12 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -156,13 +156,13 @@ 显示文件名 循环播放视频 GIF 缩略图 - 全屏查看媒体文件时最大亮度 + 全屏时最高亮度 裁剪缩略图为正方形 显示视频时长 - 旋转全屏媒体文件依据 - 系统设置 - 设备旋转 - 高宽比 + 全屏时媒体文件旋转方向 + 跟随系统设置 + 跟随设备旋转 + 根据高宽比 全屏时使用黑色背景和状态栏 水平滚动缩略图 全屏时自动隐藏状态栏 @@ -171,9 +171,9 @@ 使用纵向滑动手势控制视频音量和亮度 在主界面显示文件夹媒体计数 全屏浏览媒体时显示详细信息 - 要显示的详细信息项目 + 管理详细信息项目 单指缩放 - 通过单击屏幕边缘来切换媒体 + 点击屏幕边缘来切换媒体 允许深度放大图像 当状态栏隐藏时隐藏扩展详情 显示底栏 @@ -181,18 +181,20 @@ 深度放大图像 以最高质量显示图像 在主屏幕界面的最后一项显示回收站 - 使用下滑手势关闭全屏视图 + 使用下滑手势退出全屏视图 双击两次后 1:1 放大图像 - 使用新的水平手势在独立页面播放视频 + 在单独的页面播放视频(可以左右滑动屏幕来快进/快退) 显示留海(如果可用) 允许使用手势旋转图像 文件加载优先级 快速 - 折中 - 避免显示无效的文件 + 避免显示空文件 + 避免显示任何无效的文件 显示图片文件类型 允许双击来放大视频 文件夹缩略图样式 + File thumbnail style + Thumbnail spacing 在单独一行中显示计数 在括号中显示计数 不显示计数 @@ -326,29 +328,29 @@ 如何把简易图库设置为设备的默认图库? - 首先,您需要在设备设置的“应用”菜单中找到您当前的默认图库,找到并点击“默认打开”按钮,然后点击“清除默认值”。下次当您再次打开图片或视频时,您应该会看到一个应用程序选择器,请在这里选择“简易图库”并将其设为默认应用程序。 - 我用密码锁定了本应用,但我忘记了密码。该怎么办? - 有两种方法。您可以重新安装本应用,也可以在设置中清除此应用的数据,这将会会重置您的所有设置,但不会删除任何媒体文件。 + 首先在系统设置中的“应用”菜单下找到您当前的默认图库,选择并点击“默认打开”按钮,然后点击“清除默认值”。下次再打开图片或视频时,您会看到一个应用程序选择器,在这里选择“简易图库”并将其设为默认应用程序即可。 + 我用密码锁定了本应用,但我忘记密码了。该怎么办? + 有两种方法。您可以重新安装本应用,也可以在设置中清除此应用的数据,这样会重置您的所有设置,但不会删除任何媒体文件。 如何让某个相册始终显示在最上面? - 您可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。您也可以固定多个文件夹,固定项目将按照默认排序方法排序。 + 您可以长按该相册并在操作栏中点击图钉图标,这样就可以将其固定在顶部了。您也可以固定多个文件夹,已固定的项目会按照默认排序方法进行排序。 如何快进/快退视频? - 您可以双击屏幕边缘或点击搜索栏附近的当前或总时长的文字。 如果您在应用设置中启用了在独立页面播放视频,则也可以使用水平手势。 + 您可以双击屏幕边缘或点击搜索栏附近的当前时间或总时长的文本。如果您在应用设置中启用了“在单独的页面播放视频”,就可以使用水平手势来快进/快退视频。 文件夹的隐藏和排除有什么区别? - 排除功能只是防止其在简易图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,您可以使用任何文件管理器删除它。请注意,某些设备不允许隐藏\"Camera\",\"Screenshots\"和\"Downloads\"等文件夹。 + 排除功能只是防止其在简易图库中显示,而隐藏功能则使用的是系统提供的方法,这样的话在其他的图库应用中也会隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,您可以使用任何文件管理器来删除它。请注意,某些设备不允许隐藏\"Camera\",\"Screenshots\"和\"Downloads\"等文件夹。 为什么会出现音乐艺术家封面或贴纸文件夹? - 您可能会看到一些不寻常的相册出现。您可以通过长按它们并选择“排除”来排除它们。在之后的对话框中,您可以选择父文件夹,这样也许就会阻止其他相关的相册出现。 + 您可能会看到一些不寻常的相册出现。可以通过长按并选择“排除”来排除它们。在之后的对话框中,您可以选择父文件夹,这样也许就会阻止其他相关的相册出现。 有的图片文件夹没有显示,怎么回事? - 原因可能有很多,但解决方法很简单。只需进入设置 -> 管理包含目录,点击+号并选择到所需的文件夹。 + 原因可能有很多,但解决方法很简单。只需进入设置 -> 管理包含目录,点击+号并选择该文件夹。 如果我只想显示几个特定的文件夹,该如何操作? - 在包含目录中添加文件夹不会自动排除其他的内容。您可以做的:进入设置 -> 管理排除目录,排除根目录\"/\",然后在设置 -> 管理包含目录中添加所需的文件夹。这样就只显示选定的文件夹了,由于排除和包含都是递归的,所以排除并包含的文件夹是会显示的。 - 可以裁剪图片吗? - 当然,通过长按图片缩略图并选择编辑,或在全屏视图中选择编辑来打开编辑器。您可以通过拖动图片边角来剪裁图像。 + 在包含目录中添加文件夹不会自动排除其他的内容。您可以这样做:进入设置 -> 管理排除目录,排除根目录\"/\",然后在设置 -> 管理包含目录中添加所需的文件夹。这样就可以只显示选定的文件夹了,由于排除和包含都是递归的,所以排除并包含的文件夹是会显示的。 + 我可以裁剪图片吗? + 当然可以,通过长按图片缩略图并选择编辑,或是在全屏视图中选择编辑来打开编辑器。您可以通过拖动图片边角来剪裁图片。 我能将媒体文件缩略图分组吗? - 当然,只需在缩略图视图中使用\"分组依据\"菜单项即可。您可以依据多个条件对文件进行分组,包括拍摄日期。如果您使用了\"显示所有文件夹内容\"功能,则可以按文件夹对它们进行分组。 + 当然可以,只需在缩略图视图中使用\"分组依据\"菜单项即可。您可以依据多个条件对文件进行分组,包括拍摄日期。如果您使用了\"显示所有文件夹内容\"功能,则可以按文件夹对它们进行分组。 按拍摄日期排序似乎有异常,我该如何解决? 很可能是因为图片是从某处复制过来的。您可以长按文件缩略图并选择\"修复拍摄日期\"来修复它。 - 我看到图像上有一些色带。如何提高提高质量? - 目前显示图像的方案在绝大多数情况下都能正常工作,如果您想要更好的图像质量,您可以在设置中启用\"以最高质量显示图像\"。 + 我看到图片上有一些色带。如何提高提高质量? + 目前显示图片的方案在绝大多数情况下都是正常的,如果您想要更好的图像质量,您可以在设置中启用\"以最高质量显示图像\"。 我隐藏了某个文件/文件夹。如何取消隐藏? 您可以点击主界面上的\"暂时显示隐藏的项目\"选项,或在设置中开启\"显示隐藏的项目\"。 如果您想取消隐藏它,长按它并选择\"取消隐藏\"即可。 我们是通过向文件夹中添加\".nomedia\"文件来隐藏文件夹的,使用文件管理器删除该文件也可以取消隐藏。 为什么应用占用了这么多的空间? @@ -360,7 +362,7 @@ 使用此照片和视频库来毫无阻碍地浏览您的回忆 - 简易图库 Pro 是一个高度可定制的图库。管理并编辑您的照片,从回收站中恢复已删除的照片,保护并隐藏文件,查看RAW,SVG等等多种照片和视频格式。 + 简易图库 Pro 是一个高度可定制的图库。你可以管理并编辑您的照片,从回收站中恢复已删除的照片,保护并隐藏文件,查看RAW,SVG等等多种照片和视频格式。 该应用不包含广告和不必要的权限。我们保护您的隐私,因为该应用不需要联网权限。 @@ -392,18 +394,18 @@ 简易图库 Pro 可以轻松地动态编辑图片。支持裁剪、翻转、旋转、或是调整图片大小。如果您希望更有创意的话,可以添加滤镜,或是直接在图片上绘制! 支持多种文件类型 - 与其他一些图库应用不同,简易图库 Pro 支持多种文件类型,包括JPEG,PNG,MP4,MKV,RAW,SVG,全景照片,全景视频等等。 + 不同于其他一些图库应用,简易图库 Pro 支持多种文件类型,包括JPEG,PNG,MP4,MKV,RAW,SVG,全景照片,全景视频等等。 高度可定制的图库 - 从UI到底部工具栏上的功能按钮,简易图库 Pro 可高度自定义并按您的要求工作。其他图库应用可没有这种灵活性!由于该应用是开源的,所以我们还提供 32 种语言! + 不论是UI还是底部工具栏上的功能按钮,简易图库 Pro 可按照您的要求高度自定义。其他图库应用可没有这种灵活性!由于该应用是开源的,所以我们还提供 32 种语言! 恢复已删除的照片和视频 - 意外删除了珍贵的照片或视频?别担心!简易图库 Pro 具有方便的回收站,您可以方便地恢复已删除的照片和视频。 + 不小心删除了珍贵的照片或视频?别担心!简易图库 Pro 具有方便的回收站,您可以轻松地恢复已删除的照片和视频。 保护并隐藏照片、视频和文件 使用密码、图案或指纹保护和隐藏照片、视频、或是整个相册。您也可以保护应用自身或禁用一些特定功能。 例如,只有指纹验证通过才可以删除文件,从而有效地防止您的文件被意外删除。 - 于此查看简易工具系列全套: + 在这里查看全套简易应用系列: https://www.simplemobiletools.com 简易图库 Pro 的独立网站: diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 0e723cc72..66d5292a1 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -200,6 +200,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ec87ab5af..c2c209025 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -193,6 +193,8 @@ 顯示圖片檔案類型 Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5c5c48d5f..1fa2aa552 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -193,6 +193,8 @@ Show image file types Allow zooming videos with double tapping them Folder thumbnail style + File thumbnail style + Thumbnail spacing Show file count on a separate line Show file count in brackets Do not show file count diff --git a/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewPhotoEditActivity.kt b/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewPhotoEditActivity.kt index 00e9ed203..f8c132069 100644 --- a/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewPhotoEditActivity.kt +++ b/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewPhotoEditActivity.kt @@ -3,7 +3,7 @@ package com.simplemobiletools.gallery.pro.activities import android.annotation.TargetApi import android.app.Activity import android.content.Intent -import android.media.ExifInterface +import androidx.exifinterface.media.ExifInterface import android.net.Uri import android.os.Build import android.os.Bundle diff --git a/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewVideoEditActivity.kt b/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewVideoEditActivity.kt index 017e0b7fc..b3f199880 100644 --- a/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewVideoEditActivity.kt +++ b/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewVideoEditActivity.kt @@ -3,11 +3,11 @@ package com.simplemobiletools.gallery.pro.activities import android.annotation.TargetApi import android.app.Activity import android.content.Intent -import android.media.ExifInterface import android.net.Uri import android.os.Build import android.os.Bundle import android.provider.MediaStore +import androidx.exifinterface.media.ExifInterface import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.REAL_FILE_PATH diff --git a/build.gradle b/build.gradle index 8183c6bd7..315b6f16f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.20' + ext.kotlin_version = '1.4.21' ext.is_proprietary = gradle.startParameter.taskNames.any { task -> task.contains("Proprietary") } repositories { @@ -16,7 +16,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.1.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" if (is_proprietary) { - classpath 'ly.img.android.pesdk:plugin:8.0.5' + classpath 'ly.img.android.pesdk:plugin:8.0.8' } // NOTE: Do not place your application dependencies here; they belong diff --git a/fastlane/metadata/android/en-US/changelogs/330.txt b/fastlane/metadata/android/en-US/changelogs/330.txt new file mode 100644 index 000000000..d73f420db --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/330.txt @@ -0,0 +1,3 @@ + * Added a Video Editor (not on F-droid) + * Added Stickers and Overlays to the Photo Editor (not on F-droid) + * Some translation, stability and UI improvements diff --git a/fastlane/metadata/android/en-US/changelogs/331.txt b/fastlane/metadata/android/en-US/changelogs/331.txt new file mode 100644 index 000000000..9bf5de94b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/331.txt @@ -0,0 +1,2 @@ + * Updated the photo and video editor to fix some glitches + * Added some translation and stability improvements diff --git a/fastlane/metadata/android/en-US/changelogs/332.txt b/fastlane/metadata/android/en-US/changelogs/332.txt new file mode 100644 index 000000000..1f7b2e834 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/332.txt @@ -0,0 +1,3 @@ + * Improve the performance at scrolling media thumbnails + * Speed up cached folder fetching + * Some stability and translation improvements diff --git a/fastlane/metadata/android/en-US/changelogs/334.txt b/fastlane/metadata/android/en-US/changelogs/334.txt new file mode 100644 index 000000000..6a22b376c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/334.txt @@ -0,0 +1 @@ + * Speed up fullscreen medium loading a bit too diff --git a/fastlane/metadata/android/en-US/changelogs/335.txt b/fastlane/metadata/android/en-US/changelogs/335.txt new file mode 100644 index 000000000..e356cf552 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/335.txt @@ -0,0 +1,3 @@ + * Allow easily clearing the app cache from the app settings + * Allow customizing the spacing between file thumbnails, or using rounded corners + * Many other performance, UI, UX, translation and stability improvements