diff --git a/CHANGELOG.md b/CHANGELOG.md index 9337e8609..e82275519 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,60 @@ Changelog ========== +Version 4.6.1 *(2018-08-21)* +---------------------------- + + * Added a crashfix at loading fullscreen images + +Version 4.6.0 *(2018-08-20)* +---------------------------- + + * Added support for SVGs + * Improved fullscreen image quality and performance + * Properly show files with hastags and percentage signs in their paths + * Many other smaller UX improvements + +Version 4.5.2 *(2018-08-08)* +---------------------------- + + * Adding a toggle for disabling deep zoomable images + * Fix displaying third party images + * Couple smaller UX fixes + +Version 4.5.1 *(2018-08-07)* +---------------------------- + + * Adding a crashfix + +Version 4.5.0 *(2018-08-07)* +---------------------------- + + * Use real Move instead of the old copy/delete if both source and destination are on the internal storage + * Remake the fullscreen view, always use deep zoomable images with good quality + * Couple stability improvements + +Version 4.4.4 *(2018-08-02)* +---------------------------- + + * Adding a crashfix + +Version 4.4.3 *(2018-08-01)* +---------------------------- + + * Removed the More Donating Options from the Purchase Thank You dialog + +Version 4.4.2 *(2018-08-01)* +---------------------------- + + * Removed the homepage from About section + +Version 4.4.1 *(2018-07-30)* +---------------------------- + + * Hide both Play and Pause video buttons after 2 secs + * Improved Immersive mode fullscreen behaviour + * Some other stability improvements + Version 4.4.0 *(2018-07-26)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index 41d150111..492a94415 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.simplemobiletools.gallery" minSdkVersion 16 targetSdkVersion 27 - versionCode 188 - versionName "4.4.0" + versionCode 197 + versionName "4.6.1" multiDexEnabled true setProperty("archivesBaseName", "gallery") } @@ -47,17 +47,19 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.5.10' + implementation 'com.simplemobiletools:commons:4.6.14' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.12' - implementation 'com.github.chrisbanes:PhotoView:2.1.3' implementation 'com.android.support.constraint:constraint-layout:1.1.2' implementation 'com.google.android.exoplayer:exoplayer-core:2.8.2' implementation 'com.google.vr:sdk-panowidget:1.150.0' implementation 'org.apache.sanselan:sanselan:0.97-incubator' implementation 'info.androidhive:imagefilters:1.0.7' + implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'com.caverock:androidsvg-aar:1.3' + kapt 'com.github.bumptech.glide:compiler:4.8.0' // keep it here too, not just in Commons, else loading SVGs wont work kapt "android.arch.persistence.room:compiler:1.1.1" implementation "android.arch.persistence.room:runtime:1.1.1" @@ -66,6 +68,9 @@ dependencies { //implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.9.0' implementation 'com.github.tibbi:subsampling-scale-image-view:v3.10.0-fork' + // implementation 'com.github.chrisbanes:PhotoView:2.1.4' + implementation 'com.github.tibbi:PhotoView:2.1.4-fork' + debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion" releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion" } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 9bd07e413..efaa38cf9 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,3 +1,9 @@ -keep class com.simplemobiletools.** { *; } -dontwarn com.simplemobiletools.** -dontwarn org.apache.** + +# Picasso +-dontwarn javax.annotation.** +-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase +-dontwarn org.codehaus.mojo.animal_sniffer.* +-dontwarn okhttp3.internal.platform.ConscryptPlatform diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt index b4434fc41..6ed9d73dc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -33,6 +33,7 @@ import com.simplemobiletools.gallery.extensions.* import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.interfaces.DirectoryDao import com.simplemobiletools.gallery.interfaces.DirectoryOperationsListener +import com.simplemobiletools.gallery.interfaces.MediumDao import com.simplemobiletools.gallery.models.AlbumCover import com.simplemobiletools.gallery.models.Directory import com.simplemobiletools.gallery.models.Medium @@ -73,13 +74,23 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private var mStoredTextColor = 0 private var mStoredPrimaryColor = 0 + private lateinit var mMediumDao: MediumDao + private lateinit var mDirectoryDao: DirectoryDao + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) appLaunched(BuildConfig.APPLICATION_ID) - config.temporarilyShowHidden = false - config.tempSkipDeleteConfirmation = false + mMediumDao = galleryDB.MediumDao() + mDirectoryDao = galleryDB.DirectoryDao() + + if (savedInstanceState == null) { + config.temporarilyShowHidden = false + config.tempSkipDeleteConfirmation = false + removeTempFolder() + } + mIsPickImageIntent = isPickImageIntent(intent) mIsPickVideoIntent = isPickVideoIntent(intent) mIsGetImageContentIntent = isGetImageContentIntent(intent) @@ -90,7 +101,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { mIsThirdPartyIntent = mIsPickImageIntent || mIsPickVideoIntent || mIsGetImageContentIntent || mIsGetVideoContentIntent || mIsGetAnyContentIntent || mIsSetWallpaperIntent - removeTempFolder() directories_refresh_layout.setOnRefreshListener { getDirectories() } storeStateVariables() checkWhatsNewDialog() @@ -123,6 +133,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { config.saveFolderGrouping(SHOW_ALL, GROUP_BY_DATE_TAKEN or GROUP_DESCENDING) } + if (!config.wasSVGShowingHandled) { + config.wasSVGShowingHandled = true + if (config.filterMedia and TYPE_SVGS == 0) { + config.filterMedia += TYPE_SVGS + } + } + checkRecycleBinItems() } @@ -209,11 +226,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { override fun onDestroy() { super.onDestroy() - config.temporarilyShowHidden = false - config.tempSkipDeleteConfirmation = false - mTempShowHiddenHandler.removeCallbacksAndMessages(null) - removeTempFolder() if (!isChangingConfigurations) { + config.temporarilyShowHidden = false + config.tempSkipDeleteConfirmation = false + mTempShowHiddenHandler.removeCallbacksAndMessages(null) + removeTempFolder() GalleryDatabase.destroyInstance() } } @@ -329,7 +346,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val getImagesOnly = mIsPickImageIntent || mIsGetImageContentIntent val getVideosOnly = mIsPickVideoIntent || mIsGetVideoContentIntent - getCachedDirectories(getVideosOnly, getImagesOnly) { + getCachedDirectories(getVideosOnly, getImagesOnly, mDirectoryDao) { gotDirectories(addTempFolderIfNeeded(it)) } } @@ -413,10 +430,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val pathsToDelete = ArrayList() fileDirItems.filter { it.isDirectory }.forEach { val files = File(it.path).listFiles() - files?.filter { it.absolutePath.isImageVideoGif() }?.mapTo(pathsToDelete) { it.absolutePath } + files?.filter { it.absolutePath.isMediaFile() }?.mapTo(pathsToDelete) { it.absolutePath } } - movePathsInRecycleBin(pathsToDelete) { + movePathsInRecycleBin(pathsToDelete, mMediumDao) { if (it) { deleteFilteredFolders(fileDirItems, folders) } else { @@ -435,9 +452,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } Thread { - val directoryDao = galleryDB.DirectoryDao() folders.filter { !it.exists() }.forEach { - directoryDao.deleteDirPath(it.absolutePath) + mDirectoryDao.deleteDirPath(it.absolutePath) } }.start() } @@ -693,8 +709,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val albumCovers = config.parseAlbumCovers() val includedFolders = config.includedFolders val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0 - val mediumDao = galleryDB.MediumDao() - val directoryDao = galleryDB.DirectoryDao() val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 val favoritePaths = getFavoritePaths() @@ -729,16 +743,16 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { showSortedDirs(dirs) // update directories and media files in the local db, delete invalid items - updateDBDirectory(directory) + updateDBDirectory(directory, mDirectoryDao) if (!directory.isRecycleBin()) { - mediumDao.insertAll(curMedia) + mMediumDao.insertAll(curMedia) } - getCachedMedia(directory.path, getVideosOnly, getImagesOnly) { + getCachedMedia(directory.path, getVideosOnly, getImagesOnly, mMediumDao) { it.forEach { if (!curMedia.contains(it)) { val path = (it as? Medium)?.path if (path != null) { - mediumDao.deleteMediumPath(path) + mMediumDao.deleteMediumPath(path) } } } @@ -782,9 +796,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, isSortingAscending) dirs.add(newDir) showSortedDirs(dirs) - directoryDao.insert(newDir) + mDirectoryDao.insert(newDir) if (folder != RECYCLE_BIN) { - mediumDao.insertAll(newMedia) + mMediumDao.insertAll(newMedia) } } @@ -795,7 +809,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { directories_refresh_layout.isRefreshing = false checkPlaceholderVisibility(dirs) } - checkInvalidDirectories(dirs, directoryDao) + checkInvalidDirectories(dirs) val everShownFolders = config.everShownFolders as HashSet dirs.mapTo(everShownFolders) { it.path } @@ -895,14 +909,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } } - private fun checkInvalidDirectories(dirs: ArrayList, directoryDao: DirectoryDao) { + private fun checkInvalidDirectories(dirs: ArrayList) { val invalidDirs = ArrayList() dirs.filter { !it.areFavorites() && !it.isRecycleBin() }.forEach { if (!getDoesFilePathExist(it.path)) { invalidDirs.add(it) } else if (it.path != config.tempFolderPath) { val children = if (it.path.startsWith(OTG_PATH)) getOTGFolderChildrenNames(it.path) else File(it.path).list()?.asList() - val hasMediaFile = children?.any { it.isImageVideoGif() } ?: false + val hasMediaFile = children?.any { it.isMediaFile() } ?: false if (!hasMediaFile) { invalidDirs.add(it) } @@ -918,7 +932,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { if (config.useRecycleBin) { val binFolder = dirs.firstOrNull { it.path == RECYCLE_BIN } - if (binFolder != null && galleryDB.MediumDao().getDeletedMedia().isEmpty()) { + if (binFolder != null && mMediumDao.getDeletedMedia().isEmpty()) { invalidDirs.add(binFolder) } } @@ -927,7 +941,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { dirs.removeAll(invalidDirs) showSortedDirs(dirs) invalidDirs.forEach { - directoryDao.deleteDirPath(it.path) + mDirectoryDao.deleteDirPath(it.path) } } } @@ -971,11 +985,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun checkRecycleBinItems() { if (config.useRecycleBin) { Thread { - val mediumDao = galleryDB.MediumDao() - val deletedMedia = mediumDao.getDeletedMedia() + val deletedMedia = mMediumDao.getDeletedMedia() deletedMedia.forEach { if (System.currentTimeMillis() > it.deletedTS + MONTH_MILLISECONDS) { - mediumDao.deleteMediumPath(it.path) + mMediumDao.deleteMediumPath(it.path) } } }.start() @@ -994,7 +1007,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { override fun updateDirectories(directories: ArrayList) { Thread { - storeDirectoryItems(directories) + storeDirectoryItems(directories, mDirectoryDao) removeInvalidDBDirectories() }.start() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt index 5dc69d41e..5107c3d21 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt @@ -39,7 +39,9 @@ import com.simplemobiletools.gallery.dialogs.ExcludeFolderDialog import com.simplemobiletools.gallery.dialogs.FilterMediaDialog import com.simplemobiletools.gallery.extensions.* import com.simplemobiletools.gallery.helpers.* +import com.simplemobiletools.gallery.interfaces.DirectoryDao import com.simplemobiletools.gallery.interfaces.MediaOperationsListener +import com.simplemobiletools.gallery.interfaces.MediumDao import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.ThumbnailItem import com.simplemobiletools.gallery.models.ThumbnailSection @@ -75,6 +77,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private var mStoredTextColor = 0 private var mStoredPrimaryColor = 0 + private lateinit var mMediumDao: MediumDao + private lateinit var mDirectoryDao: DirectoryDao + companion object { var mMedia = ArrayList() } @@ -82,6 +87,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_media) + + mMediumDao = galleryDB.MediumDao() + mDirectoryDao = galleryDB.DirectoryDao() + intent.apply { mIsGetImageIntent = getBooleanExtra(GET_IMAGE_INTENT, false) mIsGetVideoIntent = getBooleanExtra(GET_VIDEO_INTENT, false) @@ -179,7 +188,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { override fun onDestroy() { super.onDestroy() - if (config.showAll) { + if (config.showAll && !isChangingConfigurations) { config.temporarilyShowHidden = false config.tempSkipDeleteConfirmation = false } @@ -445,9 +454,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private fun restoreAllFiles() { val paths = mMedia.filter { it is Medium }.map { (it as Medium).path } as ArrayList - restoreRecycleBinPaths(paths) { + restoreRecycleBinPaths(paths, mMediumDao) { Thread { - galleryDB.DirectoryDao().deleteDirPath(RECYCLE_BIN) + mDirectoryDao.deleteDirPath(RECYCLE_BIN) }.start() finish() } @@ -524,7 +533,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } private fun deleteDirectoryIfEmpty() { - val fileDirItem = FileDirItem(mPath, mPath.getFilenameFromPath()) + val fileDirItem = FileDirItem(mPath, mPath.getFilenameFromPath(), true) if (config.deleteEmptyFolders && !fileDirItem.isDownloadsFolder() && fileDirItem.isDirectory && fileDirItem.getProperFileCount(applicationContext, true) == 0) { tryDeleteFileDirItem(fileDirItem, true, true) } @@ -537,7 +546,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { mIsGettingMedia = true if (!mLoadedInitialPhotos) { - getCachedMedia(mPath, mIsGetVideoIntent, mIsGetImageIntent) { + getCachedMedia(mPath, mIsGetVideoIntent, mIsGetImageIntent, mMediumDao) { if (it.isEmpty()) { runOnUiThread { media_refresh_layout.isRefreshing = true @@ -575,7 +584,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { if (mPath == FAVORITES) { Thread { - galleryDB.DirectoryDao().deleteDirPath(FAVORITES) + mDirectoryDao.deleteDirPath(FAVORITES) }.start() } @@ -588,7 +597,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private fun deleteDBDirectory() { Thread { - galleryDB.DirectoryDao().deleteDirPath(mPath) + mDirectoryDao.deleteDirPath(mPath) }.start() } @@ -815,17 +824,20 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { mLatestMediaDateId = getLatestMediaByDateId() if (!isFromCache) { val mediaToInsert = (mMedia).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium } - galleryDB.MediumDao().insertAll(mediaToInsert) + try { + mMediumDao.insertAll(mediaToInsert) + } catch (e: Exception) { + } } } override fun tryDeleteFiles(fileDirItems: ArrayList) { - val filtered = fileDirItems.filter { it.path.isImageVideoGif() } as ArrayList + val filtered = fileDirItems.filter { it.path.isMediaFile() } as ArrayList val deletingItems = resources.getQuantityString(R.plurals.deleting_items, filtered.size, filtered.size) toast(deletingItems) if (config.useRecycleBin && !filtered.first().path.startsWith(filesDir.absolutePath)) { - movePathsInRecycleBin(filtered.map { it.path } as ArrayList) { + movePathsInRecycleBin(filtered.map { it.path } as ArrayList, mMediumDao) { if (it) { deleteFilteredFiles(filtered) } else { @@ -847,11 +859,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { mMedia.removeAll { filtered.map { it.path }.contains((it as? Medium)?.path) } Thread { - val mediumDao = galleryDB.MediumDao() val useRecycleBin = config.useRecycleBin filtered.forEach { if (!useRecycleBin) { - mediumDao.deleteMediumPath(it.path) + mMediumDao.deleteMediumPath(it.path) } } }.start() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt index a3657295d..602130cac 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -91,7 +91,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList filename.isImageFast() -> TYPE_IMAGES filename.isVideoFast() -> TYPE_VIDEOS filename.isGif() -> TYPE_GIFS - else -> TYPE_RAWS + filename.isRawFast() -> TYPE_RAWS + else -> TYPE_SVGS } mMedium = Medium(null, filename, mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type, false, 0L) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt index 13a79370e..596b79ffc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt @@ -66,9 +66,9 @@ class SettingsActivity : SimpleActivity() { setupKeepLastModified() setupShowInfoBubble() setupEnablePullToRefresh() + setupAllowZoomingImages() setupOneFingerZoom() setupAllowInstantChange() - setupReplaceZoomableImages() setupShowExtendedDetails() setupHideExtendedDetails() setupManageExtendedDetails() @@ -335,6 +335,15 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupAllowZoomingImages() { + settings_allow_zooming_images.isChecked = config.allowZoomingImages + settings_allow_zooming_images_holder.setOnClickListener { + settings_allow_zooming_images.toggle() + config.allowZoomingImages = settings_allow_zooming_images.isChecked + settings_one_finger_zoom_holder.beVisibleIf(config.allowZoomingImages) + } + } + private fun setupOneFingerZoom() { settings_one_finger_zoom.isChecked = config.oneFingerZoom settings_one_finger_zoom_holder.setOnClickListener { @@ -351,14 +360,6 @@ class SettingsActivity : SimpleActivity() { } } - private fun setupReplaceZoomableImages() { - settings_replace_zoomable_images.isChecked = config.replaceZoomableImages - settings_replace_zoomable_images_holder.setOnClickListener { - settings_replace_zoomable_images.toggle() - config.replaceZoomableImages = settings_replace_zoomable_images.isChecked - } - } - private fun setupShowExtendedDetails() { settings_show_extended_details.isChecked = config.showExtendedDetails settings_show_extended_details_holder.setOnClickListener { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt index f6756927b..644db9dde 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.gallery.activities import android.animation.Animator import android.animation.ValueAnimator +import android.annotation.SuppressLint import android.annotation.TargetApi import android.app.Activity import android.content.Intent @@ -70,14 +71,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private var mAreSlideShowMediaVisible = false private var mIsOrientationLocked = false - private var mStoredReplaceZoomableImages = false private var mMediaFiles = ArrayList() private var mFavoritePaths = ArrayList() companion object { var screenWidth = 0 var screenHeight = 0 - var wasDecodedByGlide = false } override fun onCreate(savedInstanceState: Bundle?) { @@ -94,7 +93,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } } - storeStateVariables() initFavorites() } @@ -114,11 +112,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View setTranslucentNavigation() } - if (mStoredReplaceZoomableImages != config.replaceZoomableImages) { - mPrevHashcode = 0 - refreshViewPager() - } - initBottomActions() supportActionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.actionbar_gradient_background)) @@ -139,7 +132,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun onPause() { super.onPause() stopSlideshow() - storeStateVariables() } override fun onDestroy() { @@ -245,7 +237,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } window.decorView.setOnSystemUiVisibilityChangeListener { visibility -> - mIsFullScreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0 + mIsFullScreen = if (visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE == 0) { + false + } else { + visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0 + } + view_pager.adapter?.let { (it as MyPagerAdapter).toggleFullscreen(mIsFullScreen) checkSystemUI() @@ -293,13 +290,13 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View findItem(R.id.menu_properties).isVisible = visibleBottomActions and BOTTOM_ACTION_PROPERTIES == 0 findItem(R.id.menu_delete).isVisible = visibleBottomActions and BOTTOM_ACTION_DELETE == 0 findItem(R.id.menu_share).isVisible = visibleBottomActions and BOTTOM_ACTION_SHARE == 0 - findItem(R.id.menu_edit).isVisible = visibleBottomActions and BOTTOM_ACTION_EDIT == 0 - findItem(R.id.menu_rename).isVisible = visibleBottomActions and BOTTOM_ACTION_RENAME == 0 + findItem(R.id.menu_edit).isVisible = visibleBottomActions and BOTTOM_ACTION_EDIT == 0 && !currentMedium.isSVG() + findItem(R.id.menu_rename).isVisible = visibleBottomActions and BOTTOM_ACTION_RENAME == 0 && !currentMedium.getIsInRecycleBin() findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() && visibleBottomActions and BOTTOM_ACTION_ROTATE == 0 findItem(R.id.menu_set_as).isVisible = visibleBottomActions and BOTTOM_ACTION_SET_AS == 0 findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0 - findItem(R.id.menu_hide).isVisible = !currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 - findItem(R.id.menu_unhide).isVisible = currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 + findItem(R.id.menu_hide).isVisible = !currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin() + findItem(R.id.menu_unhide).isVisible = currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin() findItem(R.id.menu_add_to_favorites).isVisible = !currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 findItem(R.id.menu_remove_from_favorites).isVisible = currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 findItem(R.id.menu_restore_file).isVisible = currentMedium.path.startsWith(filesDir.absolutePath) @@ -353,12 +350,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View return true } - private fun storeStateVariables() { - config.apply { - mStoredReplaceZoomableImages = replaceZoomableImages - } - } - private fun updatePagerItems(media: MutableList) { val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, media) if (!isActivityDestroyed()) { @@ -468,7 +459,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun scheduleSwipe() { mSlideshowHandler.removeCallbacksAndMessages(null) if (mIsSlideshowActive) { - if (getCurrentMedium()!!.isImage() || getCurrentMedium()!!.isGif()) { + if (getCurrentMedium()!!.isImage() || getCurrentMedium()!!.isGIF()) { mSlideshowHandler.postDelayed({ if (mIsSlideshowActive && !isActivityDestroyed()) { swipeToNextMedium() @@ -491,11 +482,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } if (!config.slideshowIncludeVideos) { - mSlideshowMedia = mSlideshowMedia.filter { it.isImage() || it.isGif() } as MutableList + mSlideshowMedia = mSlideshowMedia.filter { it.isImage() || it.isGIF() } as MutableList } if (!config.slideshowIncludeGIFs) { - mSlideshowMedia = mSlideshowMedia.filter { !it.isGif() } as MutableList + mSlideshowMedia = mSlideshowMedia.filter { !it.isGIF() } as MutableList } if (config.slideshowRandomOrder) { @@ -785,7 +776,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View toggleFavorite() } - bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0) + bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && getCurrentMedium()?.isSVG() == false) bottom_edit.setOnClickListener { openEditor(getCurrentPath()) } @@ -839,7 +830,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } } - bottom_rename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0) + bottom_rename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 && getCurrentMedium()?.getIsInRecycleBin() == false) bottom_rename.setOnClickListener { renameFile() } @@ -922,7 +913,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun deleteConfirmed() { val path = getCurrentMedia().getOrNull(mPos)?.path ?: return - if (getIsPathDirectory(path) || !path.isImageVideoGif()) { + if (getIsPathDirectory(path) || !path.isMediaFile()) { return } @@ -975,9 +966,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View initBottomActionsLayout() } + @SuppressLint("NewApi") private fun measureScreen() { val metrics = DisplayMetrics() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + if (isJellyBean1Plus()) { windowManager.defaultDisplay.getRealMetrics(metrics) screenWidth = metrics.widthPixels screenHeight = metrics.heightPixels @@ -1104,7 +1096,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun getCurrentMedia() = if (mAreSlideShowMediaVisible) mSlideshowMedia else mMediaFiles - private fun getCurrentPath() = getCurrentMedium()!!.path + private fun getCurrentPath() = getCurrentMedium()?.path ?: "" private fun getCurrentFile() = File(getCurrentPath()) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index d10ee9244..b419b121c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -350,7 +350,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList { val paths = ArrayList() activity.getOTGFolderChildren(path)?.forEach { - if (!it.isDirectory && it.name.isImageVideoGif() && (showHidden || !it.name.startsWith('.'))) { + if (!it.isDirectory && it.name.isMediaFile() && (showHidden || !it.name.startsWith('.'))) { val relativePath = it.uri.path.substringAfterLast("${activity.config.OTGPartition}:") paths.add("$OTG_PATH$relativePath") } @@ -524,7 +524,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList TYPE_IMAGES directory.tmb.isVideoFast() -> TYPE_VIDEOS directory.tmb.isGif() -> TYPE_GIFS - else -> TYPE_RAWS + directory.tmb.isRawFast() -> TYPE_RAWS + else -> TYPE_SVGS } activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt index 780552920..990a2cf9d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt @@ -113,7 +113,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList 0 findItem(R.id.cab_restore_recycle_bin_files).isVisible = getSelectedPaths().all { it.startsWith(activity.filesDir.absolutePath) } @@ -292,9 +292,11 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList() + val mediumDao = activity.galleryDB.MediumDao() val paths = getSelectedPaths() for (path in paths) { - val dateTime = ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME) ?: continue + val dateTime = ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL) + ?: ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME) val format = "yyyy:MM:dd kk:mm:ss" val formatter = SimpleDateFormat(format, Locale.getDefault()) val timestamp = formatter.parse(dateTime).time @@ -312,6 +314,8 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList Unit) { @@ -21,6 +18,7 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result: filter_media_videos.isChecked = filterMedia and TYPE_VIDEOS != 0 filter_media_gifs.isChecked = filterMedia and TYPE_GIFS != 0 filter_media_raws.isChecked = filterMedia and TYPE_RAWS != 0 + filter_media_svgs.isChecked = filterMedia and TYPE_SVGS != 0 } AlertDialog.Builder(activity) @@ -41,6 +39,8 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result: result += TYPE_GIFS if (view.filter_media_raws.isChecked) result += TYPE_RAWS + if (view.filter_media_svgs.isChecked) + result += TYPE_SVGS activity.config.filterMedia = result callback(result) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ManageBottomActionsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ManageBottomActionsDialog.kt index 920c3c404..0bd797c54 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ManageBottomActionsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ManageBottomActionsDialog.kt @@ -21,7 +21,7 @@ class ManageBottomActionsDialog(val activity: BaseSimpleActivity, val callback: manage_bottom_actions_rotate.isChecked = actions and BOTTOM_ACTION_ROTATE != 0 manage_bottom_actions_properties.isChecked = actions and BOTTOM_ACTION_PROPERTIES != 0 manage_bottom_actions_change_orientation.isChecked = actions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0 - manage_bottom_actions_slideshow.isChecked = actions and BOTTOM_ACTION_PROPERTIES != 0 + manage_bottom_actions_slideshow.isChecked = actions and BOTTOM_ACTION_SLIDESHOW != 0 manage_bottom_actions_show_on_map.isChecked = actions and BOTTOM_ACTION_SHOW_ON_MAP != 0 manage_bottom_actions_toggle_visibility.isChecked = actions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0 manage_bottom_actions_rename.isChecked = actions and BOTTOM_ACTION_RENAME != 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt index 7ea8421e2..0aee81bfe 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt @@ -16,6 +16,7 @@ import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.activities.SimpleActivity import com.simplemobiletools.gallery.dialogs.PickDirectoryDialog import com.simplemobiletools.gallery.helpers.NOMEDIA +import com.simplemobiletools.gallery.interfaces.MediumDao import java.io.File import java.io.InputStream import java.io.OutputStream @@ -59,6 +60,9 @@ fun Activity.launchCamera() { } fun SimpleActivity.launchAbout() { + val licenses = LICENSE_GLIDE or LICENSE_CROPPER or LICENSE_MULTISELECT or LICENSE_RTL or LICENSE_SUBSAMPLING or LICENSE_PATTERN or + LICENSE_REPRINT or LICENSE_GIF_DRAWABLE or LICENSE_PHOTOVIEW or LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_FILTERS + val faqItems = arrayListOf( FAQItem(R.string.faq_5_title_commons, R.string.faq_5_text_commons), FAQItem(R.string.faq_1_title, R.string.faq_1_text), @@ -69,15 +73,12 @@ fun SimpleActivity.launchAbout() { FAQItem(R.string.faq_6_title, R.string.faq_6_text), FAQItem(R.string.faq_7_title, R.string.faq_7_text), FAQItem(R.string.faq_8_title, R.string.faq_8_text), - FAQItem(R.string.faq_9_title, R.string.faq_9_text), FAQItem(R.string.faq_10_title, R.string.faq_10_text), FAQItem(R.string.faq_11_title, R.string.faq_11_text), FAQItem(R.string.faq_12_title, R.string.faq_12_text), FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons)) - startAboutActivity(R.string.app_name, LICENSE_GLIDE or LICENSE_CROPPER or LICENSE_MULTISELECT or LICENSE_RTL - or LICENSE_SUBSAMPLING or LICENSE_PATTERN or LICENSE_REPRINT or LICENSE_GIF_DRAWABLE or LICENSE_PHOTOVIEW or LICENSE_EXOPLAYER or - LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_FILTERS, BuildConfig.VERSION_NAME, faqItems) + startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true) } fun AppCompatActivity.showSystemUI(toggleActionBarVisibility: Boolean) { @@ -200,9 +201,8 @@ fun BaseSimpleActivity.tryDeleteFileDirItem(fileDirItem: FileDirItem, allowDelet } } -fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList, callback: ((wasSuccess: Boolean) -> Unit)?) { +fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList, mediumDao: MediumDao = galleryDB.MediumDao(), callback: ((wasSuccess: Boolean) -> Unit)?) { Thread { - val mediumDao = galleryDB.MediumDao() var pathsCnt = paths.size paths.forEach { val file = File(it) @@ -220,12 +220,11 @@ fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList, callback: } fun BaseSimpleActivity.restoreRecycleBinPath(path: String, callback: () -> Unit) { - restoreRecycleBinPaths(arrayListOf(path), callback) + restoreRecycleBinPaths(arrayListOf(path), galleryDB.MediumDao(), callback) } -fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList, callback: () -> Unit) { +fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList, mediumDao: MediumDao = galleryDB.MediumDao(), callback: () -> Unit) { Thread { - val mediumDao = galleryDB.MediumDao() paths.forEach { val source = it val destination = it.removePrefix(filesDir.absolutePath) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/ArrayList.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/ArrayList.kt index 5d221bffa..b72d4cf52 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/ArrayList.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/ArrayList.kt @@ -1,9 +1,6 @@ package com.simplemobiletools.gallery.extensions -import com.simplemobiletools.gallery.helpers.TYPE_GIFS -import com.simplemobiletools.gallery.helpers.TYPE_IMAGES -import com.simplemobiletools.gallery.helpers.TYPE_RAWS -import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS +import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.models.Medium fun ArrayList.getDirMediaTypes(): Int { @@ -16,7 +13,7 @@ fun ArrayList.getDirMediaTypes(): Int { types += TYPE_VIDEOS } - if (any { it.isGif() }) { + if (any { it.isGIF() }) { types += TYPE_GIFS } @@ -24,5 +21,9 @@ fun ArrayList.getDirMediaTypes(): Int { types += TYPE_RAWS } + if (any { it.isSVG() }) { + types += TYPE_SVGS + } + return types } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt index 5fc78e20e..ea861a884 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt @@ -6,6 +6,7 @@ import android.content.res.Configuration import android.database.Cursor import android.database.sqlite.SQLiteException import android.graphics.Point +import android.graphics.drawable.PictureDrawable import android.media.AudioManager import android.os.Build import android.provider.MediaStore @@ -28,6 +29,7 @@ import com.simplemobiletools.gallery.interfaces.MediumDao import com.simplemobiletools.gallery.models.Directory import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.ThumbnailItem +import com.simplemobiletools.gallery.svg.SvgSoftwareLayerSetter import com.simplemobiletools.gallery.views.MySquareImageView import pl.droidsonroids.gif.GifDrawable import java.io.File @@ -181,9 +183,9 @@ fun Context.rescanFolderMediaSync(path: String) { } } -fun Context.storeDirectoryItems(items: ArrayList) { +fun Context.storeDirectoryItems(items: ArrayList, directoryDao: DirectoryDao) { Thread { - galleryDB.DirectoryDao().insertAll(items) + directoryDao.insertAll(items) }.start() } @@ -232,6 +234,8 @@ fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizo } catch (e: OutOfMemoryError) { loadJpg(path, target, cropThumbnails) } + } else if (type == TYPE_SVGS) { + loadSVG(path, target, cropThumbnails) } } @@ -277,12 +281,26 @@ fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boo .load(path) if (cropThumbnails) options.centerCrop() else options.fitCenter() - builder.apply(options).transition(DrawableTransitionOptions.withCrossFade()).into(target) + builder.apply(options) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(target) } -fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList) -> Unit) { +fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean) { + target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER + + val options = RequestOptions().signature(path.getFileSignature()) + Glide.with(applicationContext) + .`as`(PictureDrawable::class.java) + .listener(SvgSoftwareLayerSetter()) + .load(path) + .apply(options) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(target) +} + +fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, directoryDao: DirectoryDao = galleryDB.DirectoryDao(), callback: (ArrayList) -> Unit) { Thread { - val directoryDao = galleryDB.DirectoryDao() val directories = try { directoryDao.getAll() as ArrayList } catch (e: SQLiteException) { @@ -306,7 +324,8 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: (filterMedia and TYPE_IMAGES != 0 && it.types and TYPE_IMAGES != 0) || (filterMedia and TYPE_VIDEOS != 0 && it.types and TYPE_VIDEOS != 0) || (filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0) || - (filterMedia and TYPE_RAWS != 0 && it.types and TYPE_RAWS != 0) + (filterMedia and TYPE_RAWS != 0 && it.types and TYPE_RAWS != 0) || + (filterMedia and TYPE_SVGS != 0 && it.types and TYPE_SVGS != 0) } }) as ArrayList @@ -326,10 +345,10 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: }.start() } -fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList) -> Unit) { +fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, mediumDao: MediumDao = galleryDB.MediumDao(), + callback: (ArrayList) -> Unit) { Thread { val mediaFetcher = MediaFetcher(this) - val mediumDao = galleryDB.MediumDao() val foldersToScan = if (path.isEmpty()) mediaFetcher.getFoldersToScan() else arrayListOf(path) var media = ArrayList() if (path == FAVORITES) { @@ -361,7 +380,8 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag (filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES) || (filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS) || (filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS) || - (filterMedia and TYPE_RAWS != 0 && it.type == TYPE_RAWS) + (filterMedia and TYPE_RAWS != 0 && it.type == TYPE_RAWS) || + (filterMedia and TYPE_SVGS != 0 && it.type == TYPE_SVGS) } }) as ArrayList @@ -394,8 +414,8 @@ fun Context.updateDBMediaPath(oldPath: String, newPath: String) { galleryDB.MediumDao().updateMedium(oldPath, newParentPath, newFilename, newPath) } -fun Context.updateDBDirectory(directory: Directory) { - galleryDB.DirectoryDao().updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types) +fun Context.updateDBDirectory(directory: Directory, directoryDao: DirectoryDao) { + directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types) } fun Context.getOTGFolderChildren(path: String) = getDocumentFile(path)?.listFiles() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt index 4faa99247..7210bec36 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.gallery.fragments +import android.annotation.SuppressLint import android.content.Intent import android.content.res.Configuration import android.graphics.Bitmap @@ -7,11 +8,12 @@ import android.graphics.BitmapFactory import android.graphics.Color import android.graphics.Matrix import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.PictureDrawable import android.media.ExifInterface.* import android.net.Uri -import android.os.AsyncTask import android.os.Bundle import android.os.Handler +import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -22,22 +24,22 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.Target import com.davemorrissey.labs.subscaleview.ImageSource import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.OTG_PATH +import com.simplemobiletools.commons.helpers.isJellyBean1Plus import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.activities.PanoramaActivity import com.simplemobiletools.gallery.activities.PhotoActivity import com.simplemobiletools.gallery.activities.ViewPagerActivity import com.simplemobiletools.gallery.extensions.* -import com.simplemobiletools.gallery.helpers.GlideRotateTransformation -import com.simplemobiletools.gallery.helpers.MEDIUM -import com.simplemobiletools.gallery.helpers.PATH -import com.simplemobiletools.gallery.helpers.ROTATE_BY_ASPECT_RATIO +import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.models.Medium +import com.simplemobiletools.gallery.svg.SvgSoftwareLayerSetter +import com.squareup.picasso.Callback +import com.squareup.picasso.Picasso import it.sephiroth.android.library.exif2.ExifInterface import kotlinx.android.synthetic.main.pager_photo_item.view.* import org.apache.sanselan.common.byteSources.ByteSourceInputStream @@ -48,12 +50,11 @@ import java.io.FileOutputStream class PhotoFragment : ViewPagerFragment() { private val DEFAULT_DOUBLE_TAP_ZOOM = 2f - private val ZOOMABLE_VIEW_LOAD_DELAY = 1500L + private val ZOOMABLE_VIEW_LOAD_DELAY = 300L private var isFragmentVisible = false private var isFullscreen = false private var wasInit = false - private var useHalfResolution = false private var isPanorama = false private var imageOrientation = -1 private var gifDrawable: GifDrawable? = null @@ -88,6 +89,10 @@ class PhotoFragment : ViewPagerFragment() { } } + if (ViewPagerActivity.screenWidth == 0 || ViewPagerActivity.screenHeight == 0) { + measureScreen() + } + storeStateVariables() if (!isFragmentVisible && activity is PhotoActivity) { isFragmentVisible = true @@ -152,6 +157,7 @@ class PhotoFragment : ViewPagerFragment() { photo_brightness_controller.beVisibleIf(allowPhotoGestures) instant_prev_item.beVisibleIf(allowInstantChange) instant_next_item.beVisibleIf(allowInstantChange) + photo_view.setAllowFingerDragZoom(activity!!.config.oneFingerZoom) } storeStateVariables() @@ -161,7 +167,7 @@ class PhotoFragment : ViewPagerFragment() { super.setMenuVisibility(menuVisible) isFragmentVisible = menuVisible if (wasInit) { - if (medium.isGif()) { + if (medium.isGIF()) { gifFragmentVisibilityChanged(menuVisible) } else { photoFragmentVisibilityChanged(menuVisible) @@ -177,6 +183,20 @@ class PhotoFragment : ViewPagerFragment() { } } + @SuppressLint("NewApi") + private fun measureScreen() { + val metrics = DisplayMetrics() + if (isJellyBean1Plus()) { + activity!!.windowManager.defaultDisplay.getRealMetrics(metrics) + ViewPagerActivity.screenWidth = metrics.widthPixels + ViewPagerActivity.screenHeight = metrics.heightPixels + } else { + activity!!.windowManager.defaultDisplay.getMetrics(metrics) + ViewPagerActivity.screenWidth = metrics.widthPixels + ViewPagerActivity.screenHeight = metrics.heightPixels + } + } + private fun gifFragmentVisibilityChanged(isVisible: Boolean) { if (isVisible) { gifDrawable?.start() @@ -189,6 +209,8 @@ class PhotoFragment : ViewPagerFragment() { if (isVisible) { scheduleZoomableView() } else { + view.subsampling_view.recycle() + view.subsampling_view.beGone() loadZoomableViewHandler.removeCallbacksAndMessages(null) } } @@ -213,10 +235,10 @@ class PhotoFragment : ViewPagerFragment() { private fun loadImage() { imageOrientation = getImageOrientation() - if (medium.isGif()) { - loadGif() - } else { - loadBitmap() + when { + medium.isGIF() -> loadGif() + medium.isSVG() -> loadSVG() + else -> loadBitmap() } } @@ -243,64 +265,77 @@ class PhotoFragment : ViewPagerFragment() { } } + private fun loadSVG() { + Glide.with(this) + .`as`(PictureDrawable::class.java) + .listener(SvgSoftwareLayerSetter()) + .load(medium.path) + .into(view.photo_view) + } + private fun loadBitmap(degrees: Int = 0) { - if (degrees == 0) { - var targetWidth = if (ViewPagerActivity.screenWidth == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenWidth - var targetHeight = if (ViewPagerActivity.screenHeight == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenHeight - if (useHalfResolution) { - targetWidth /= 2 - targetHeight /= 2 + var pathToLoad = if (medium.path.startsWith("content://")) medium.path else "file://${medium.path}" + pathToLoad = pathToLoad.replace("%", "%25").replace("#", "%23") + + try { + val picasso = Picasso.get() + .load(pathToLoad) + .centerInside() + .resize(ViewPagerActivity.screenWidth, ViewPagerActivity.screenHeight) + + if (degrees != 0) { + picasso.rotate(degrees.toFloat()) } - if (imageOrientation == ORIENTATION_ROTATE_90) { - targetWidth = targetHeight - targetHeight = Target.SIZE_ORIGINAL - } + picasso.into(view.photo_view, object : Callback { + override fun onSuccess() { + view.photo_view.isZoomable = degrees != 0 || context?.config?.allowZoomingImages == false + if (isFragmentVisible && degrees == 0) { + scheduleZoomableView() + } + } - val options = RequestOptions() - .signature(medium.path.getFileSignature()) - .format(DecodeFormat.PREFER_ARGB_8888) - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) - .override(targetWidth, targetHeight) - - Glide.with(this) - .asBitmap() - .load(getPathToLoad(medium)) - .apply(options) - .listener(object : RequestListener { - override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { - if (!useHalfResolution && e?.rootCauses?.firstOrNull() is OutOfMemoryError) { - useHalfResolution = true - Handler().post { - if (activity?.isActivityDestroyed() == false) { - loadBitmap(degrees) - } - } - } - return false - } - - override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { - if (isFragmentVisible) { - scheduleZoomableView() - } - return false - } - }).into(view.photo_view) - } else { - val options = RequestOptions() - .diskCacheStrategy(DiskCacheStrategy.NONE) - .transform(GlideRotateTransformation(degrees)) - - Glide.with(this) - .asBitmap() - .load(getPathToLoad(medium)) - .thumbnail(0.2f) - .apply(options) - .into(view.photo_view) + override fun onError(e: Exception) { + if (context != null) { + tryLoadingWithGlide() + } + } + }) + } catch (ignored: Exception) { } } + private fun tryLoadingWithGlide() { + var targetWidth = if (ViewPagerActivity.screenWidth == 0) com.bumptech.glide.request.target.Target.SIZE_ORIGINAL else ViewPagerActivity.screenWidth + var targetHeight = if (ViewPagerActivity.screenHeight == 0) com.bumptech.glide.request.target.Target.SIZE_ORIGINAL else ViewPagerActivity.screenHeight + + if (imageOrientation == ORIENTATION_ROTATE_90) { + targetWidth = targetHeight + targetHeight = com.bumptech.glide.request.target.Target.SIZE_ORIGINAL + } + + val options = RequestOptions() + .signature(medium.path.getFileSignature()) + .format(DecodeFormat.PREFER_ARGB_8888) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .override(targetWidth, targetHeight) + + Glide.with(context!!) + .asBitmap() + .load(getPathToLoad(medium)) + .apply(options) + .listener(object : RequestListener { + override fun onLoadFailed(e: GlideException?, model: Any?, target: com.bumptech.glide.request.target.Target?, isFirstResource: Boolean): Boolean = false + + override fun onResourceReady(resource: Bitmap?, model: Any?, target: com.bumptech.glide.request.target.Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { + if (isFragmentVisible) { + scheduleZoomableView() + } + return false + } + }).into(view.photo_view) + } + private fun openPanorama() { Intent(context, PanoramaActivity::class.java).apply { putExtra(PATH, medium.path) @@ -311,23 +346,25 @@ class PhotoFragment : ViewPagerFragment() { private fun scheduleZoomableView() { loadZoomableViewHandler.removeCallbacksAndMessages(null) loadZoomableViewHandler.postDelayed({ - if (isFragmentVisible && !context!!.config.replaceZoomableImages && medium.isImage() && view.subsampling_view.isGone()) { + if (isFragmentVisible && context?.config?.allowZoomingImages == true && medium.isImage() && view.subsampling_view.isGone()) { addZoomableView() } }, ZOOMABLE_VIEW_LOAD_DELAY) } private fun addZoomableView() { - ViewPagerActivity.wasDecodedByGlide = false + val rotation = degreesForRotation(imageOrientation) view.subsampling_view.apply { + background = ColorDrawable(Color.TRANSPARENT) + setBitmapDecoderFactory { PicassoDecoder(medium.path, Picasso.get(), rotation) } + setRegionDecoderFactory { PicassoRegionDecoder() } maxScale = 10f beVisible() isQuickScaleEnabled = context.config.oneFingerZoom setResetScaleOnSizeChange(context.config.screenRotation != ROTATE_BY_ASPECT_RATIO) setImage(ImageSource.uri(getPathToLoad(medium))) - orientation = if (imageOrientation == -1) SubsamplingScaleImageView.ORIENTATION_USE_EXIF else degreesForRotation(imageOrientation) + orientation = rotation setEagerLoadingEnabled(false) - setExecutor(AsyncTask.SERIAL_EXECUTOR) setOnImageEventListener(object : SubsamplingScaleImageView.OnImageEventListener { override fun onImageLoaded() { } @@ -346,6 +383,7 @@ class PhotoFragment : ViewPagerFragment() { } override fun onImageLoadError(e: Exception) { + view.photo_view.isZoomable = true background = ColorDrawable(Color.TRANSPARENT) beGone() } @@ -400,8 +438,6 @@ class PhotoFragment : ViewPagerFragment() { return if (context == null || bitmapAspectRatio == screenAspectRatio) { DEFAULT_DOUBLE_TAP_ZOOM - } else if (ViewPagerActivity.wasDecodedByGlide) { - 1f } else if (context!!.portrait && bitmapAspectRatio <= screenAspectRatio) { ViewPagerActivity.screenHeight / height.toFloat() } else if (context!!.portrait && bitmapAspectRatio > screenAspectRatio) { @@ -416,6 +452,7 @@ class PhotoFragment : ViewPagerFragment() { } fun rotateImageViewBy(degrees: Int) { + loadZoomableViewHandler.removeCallbacksAndMessages(null) view.subsampling_view.beGone() loadBitmap(degrees) } @@ -444,7 +481,6 @@ class PhotoFragment : ViewPagerFragment() { override fun onDestroyView() { super.onDestroyView() if (activity?.isActivityDestroyed() == false) { - Glide.with(context!!).clear(view.photo_view) view.subsampling_view.recycle() } loadZoomableViewHandler.removeCallbacksAndMessages(null) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index 5b5ce0d04..2c6927ea9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -89,7 +89,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } mIsFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN - mView!!.video_play_outline.alpha = if (mIsFullscreen) 0f else PLAY_PAUSE_VISIBLE_ALPHA setupPlayer() if (savedInstanceState != null) { @@ -411,9 +410,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mExoPlayer?.playWhenReady = true mView!!.video_play_outline.setImageResource(R.drawable.ic_pause) activity!!.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - mHidePauseHandler.postDelayed({ - mView!!.video_play_outline.animate().alpha(0f).start() - }, HIDE_PAUSE_DELAY) + schedulePlayPauseFadeOut() } private fun pauseVideo() { @@ -429,6 +426,14 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mView?.video_play_outline?.setImageResource(R.drawable.ic_play) mView?.video_play_outline?.alpha = PLAY_PAUSE_VISIBLE_ALPHA activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + schedulePlayPauseFadeOut() + } + + private fun schedulePlayPauseFadeOut() { + mHidePauseHandler.removeCallbacksAndMessages(null) + mHidePauseHandler.postDelayed({ + mView!!.video_play_outline.animate().alpha(0f).start() + }, HIDE_PAUSE_DELAY) } private fun videoEnded() = mExoPlayer?.currentPosition ?: 0 >= mExoPlayer?.duration ?: 0 @@ -618,17 +623,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } } } - - mView!!.video_play_outline.animate().alpha(if (isFullscreen && mIsPlaying) 0f else PLAY_PAUSE_VISIBLE_ALPHA).start() - if (isFullscreen) { - mHidePauseHandler.removeCallbacksAndMessages(null) - } else { - mHidePauseHandler.postDelayed({ - if (mExoPlayer?.currentPosition ?: 0 > 0) { - mView!!.video_play_outline.animate().alpha(0f).start() - } - }, HIDE_PAUSE_DELAY) - } } private fun getExtendedDetailsY(height: Int): Float { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt index ff80bbe58..9916efcee 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt @@ -174,7 +174,7 @@ class Config(context: Context) : BaseConfig(context) { set(darkBackground) = prefs.edit().putBoolean(DARK_BACKGROUND, darkBackground).apply() var filterMedia: Int - get() = prefs.getInt(FILTER_MEDIA, TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS) + get() = prefs.getInt(FILTER_MEDIA, TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS or TYPE_SVGS) set(filterMedia) = prefs.edit().putInt(FILTER_MEDIA, filterMedia).apply() var dirColumnCnt: Int @@ -189,10 +189,6 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getBoolean(ALLOW_INSTANT_CHANGE, false) set(allowInstantChange) = prefs.edit().putBoolean(ALLOW_INSTANT_CHANGE, allowInstantChange).apply() - var replaceZoomableImages: Boolean - get() = prefs.getBoolean(REPLACE_ZOOMABLE_IMAGES, false) - set(replaceZoomableImages) = prefs.edit().putBoolean(REPLACE_ZOOMABLE_IMAGES, replaceZoomableImages).apply() - private fun getDirectoryColumnsField(): String { val isPortrait = context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT return if (isPortrait) { @@ -350,6 +346,10 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getBoolean(WAS_RECYCLE_BIN_PINNED, false) set(wasRecycleBinPinned) = prefs.edit().putBoolean(WAS_RECYCLE_BIN_PINNED, wasRecycleBinPinned).apply() + var wasSVGShowingHandled: Boolean + get() = prefs.getBoolean(WAS_SVG_SHOWING_HANDLED, false) + set(wasSVGShowingHandled) = prefs.edit().putBoolean(WAS_SVG_SHOWING_HANDLED, wasSVGShowingHandled).apply() + var groupBy: Int get() = prefs.getInt(GROUP_BY, GROUP_BY_NONE) set(groupBy) = prefs.edit().putInt(GROUP_BY, groupBy).apply() @@ -380,4 +380,8 @@ class Config(context: Context) : BaseConfig(context) { var showRecycleBinAtFolders: Boolean get() = prefs.getBoolean(SHOW_RECYCLE_BIN_AT_FOLDERS, true) set(showRecycleBinAtFolders) = prefs.edit().putBoolean(SHOW_RECYCLE_BIN_AT_FOLDERS, showRecycleBinAtFolders).apply() + + var allowZoomingImages: Boolean + get() = prefs.getBoolean(ALLOW_ZOOMING_IMAGES, true) + set(allowZoomingImages) = prefs.edit().putBoolean(ALLOW_ZOOMING_IMAGES, allowZoomingImages).apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt index 0a74ddbd3..3fecd735f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt @@ -45,7 +45,6 @@ const val EXTENDED_DETAILS = "extended_details" const val HIDE_EXTENDED_DETAILS = "hide_extended_details" const val ONE_FINGER_ZOOM = "one_finger_zoom" const val ALLOW_INSTANT_CHANGE = "allow_instant_change" -const val REPLACE_ZOOMABLE_IMAGES = "replace_zoomable_images" const val DO_EXTRA_CHECK = "do_extra_check" const val WAS_NEW_APP_SHOWN = "was_new_app_shown_clock" const val LAST_FILEPICKER_PATH = "last_filepicker_path" @@ -59,6 +58,8 @@ const val USE_RECYCLE_BIN = "use_recycle_bin" const val GROUP_BY = "group_by" const val EVER_SHOWN_FOLDERS = "ever_shown_folders" const val SHOW_RECYCLE_BIN_AT_FOLDERS = "show_recycle_bin_at_folders" +const val ALLOW_ZOOMING_IMAGES = "allow_zooming_images" +const val WAS_SVG_SHOWING_HANDLED = "was_svg_showing_handled" // slideshow const val SLIDESHOW_INTERVAL = "slideshow_interval" @@ -120,6 +121,7 @@ const val TYPE_IMAGES = 1 const val TYPE_VIDEOS = 2 const val TYPE_GIFS = 4 const val TYPE_RAWS = 8 +const val TYPE_SVGS = 16 const val LOCAITON_INTERNAL = 1 const val LOCATION_SD = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt index c63840b80..41b5f899d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt @@ -78,6 +78,10 @@ class MediaFetcher(val context: Context) { } } + if (filterMedia and TYPE_SVGS != 0) { + query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ") + } + var selectionQuery = query.toString().trim().removeSuffix("OR") selectionQuery += ") AND " return selectionQuery @@ -107,6 +111,10 @@ class MediaFetcher(val context: Context) { } } + if (filterMedia and TYPE_SVGS != 0) { + args.add("%.svg") + } + return args } @@ -188,8 +196,9 @@ class MediaFetcher(val context: Context) { val isVideo = if (isImage) false else filename.isVideoFast() val isGif = if (isImage || isVideo) false else filename.isGif() val isRaw = if (isImage || isVideo || isGif) false else filename.isRawFast() + val isSvg = if (isImage || isVideo || isGif || isRaw) false else filename.isSvg() - if (!isImage && !isVideo && !isGif && !isRaw) + if (!isImage && !isVideo && !isGif && !isRaw && !isSvg) continue if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0)) @@ -204,6 +213,9 @@ class MediaFetcher(val context: Context) { if (isRaw && filterMedia and TYPE_RAWS == 0) continue + if (isSvg && filterMedia and TYPE_SVGS == 0) + continue + if (!showHidden && filename.startsWith('.')) continue @@ -228,7 +240,8 @@ class MediaFetcher(val context: Context) { isImage -> TYPE_IMAGES isVideo -> TYPE_VIDEOS isGif -> TYPE_GIFS - else -> TYPE_RAWS + isRaw -> TYPE_RAWS + else -> TYPE_SVGS } val isFavorite = favoritePaths.contains(path) @@ -255,8 +268,9 @@ class MediaFetcher(val context: Context) { val isVideo = if (isImage) false else filename.isVideoFast() val isGif = if (isImage || isVideo) false else filename.isGif() val isRaw = if (isImage || isVideo || isGif) false else filename.isRawFast() + val isSvg = if (isImage || isVideo || isGif || isRaw) false else filename.isSvg() - if (!isImage && !isVideo && !isGif || !isRaw) + if (!isImage && !isVideo && !isGif && !isRaw && !isSvg) continue if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0)) @@ -271,6 +285,9 @@ class MediaFetcher(val context: Context) { if (isRaw && filterMedia and TYPE_RAWS == 0) continue + if (isSvg && filterMedia and TYPE_SVGS == 0) + continue + if (!showHidden && filename.startsWith('.')) continue @@ -285,7 +302,8 @@ class MediaFetcher(val context: Context) { isImage -> TYPE_IMAGES isVideo -> TYPE_VIDEOS isGif -> TYPE_GIFS - else -> TYPE_RAWS + isRaw -> TYPE_RAWS + else -> TYPE_SVGS } val path = Uri.decode(file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", OTG_PATH)) @@ -417,7 +435,8 @@ class MediaFetcher(val context: Context) { TYPE_IMAGES -> R.string.images TYPE_VIDEOS -> R.string.videos TYPE_GIFS -> R.string.gifs - else -> R.string.raw_images + TYPE_RAWS -> R.string.raw_images + else -> R.string.svgs } return context.getString(stringId) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/PicassoDecoder.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/PicassoDecoder.kt new file mode 100644 index 000000000..16dd85760 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/PicassoDecoder.kt @@ -0,0 +1,21 @@ +package com.simplemobiletools.gallery.helpers + +import android.content.Context +import android.graphics.Bitmap +import android.net.Uri +import com.davemorrissey.labs.subscaleview.decoder.ImageDecoder +import com.squareup.picasso.MemoryPolicy +import com.squareup.picasso.Picasso + +class PicassoDecoder(val tag: String, val picasso: Picasso, val degrees: Int) : ImageDecoder { + + override fun decode(context: Context, uri: Uri): Bitmap { + return picasso + .load(uri) + .tag(tag) + .config(Bitmap.Config.ARGB_8888) + .memoryPolicy(MemoryPolicy.NO_CACHE) + .rotate(-degrees.toFloat()) + .get() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/PicassoRegionDecoder.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/PicassoRegionDecoder.kt new file mode 100644 index 000000000..778b380b6 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/PicassoRegionDecoder.kt @@ -0,0 +1,33 @@ +package com.simplemobiletools.gallery.helpers + +import android.content.Context +import android.graphics.* +import android.net.Uri +import com.davemorrissey.labs.subscaleview.decoder.ImageRegionDecoder + +class PicassoRegionDecoder : ImageRegionDecoder { + private var decoder: BitmapRegionDecoder? = null + private val decoderLock = Any() + + override fun init(context: Context, uri: Uri): Point { + val inputStream = context.contentResolver.openInputStream(uri) + decoder = BitmapRegionDecoder.newInstance(inputStream, false) + return Point(decoder!!.width, decoder!!.height) + } + + override fun decodeRegion(rect: Rect, sampleSize: Int): Bitmap { + synchronized(decoderLock) { + val options = BitmapFactory.Options() + options.inSampleSize = sampleSize + options.inPreferredConfig = Bitmap.Config.ARGB_8888 + val bitmap = decoder!!.decodeRegion(rect, options) + return bitmap ?: throw RuntimeException("Region decoder returned null bitmap - image format may not be supported") + } + } + + override fun isReady() = decoder != null && !decoder!!.isRecycled + + override fun recycle() { + decoder!!.recycle() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt index 7af0bd085..03090d6b5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt @@ -38,6 +38,9 @@ interface MediumDao { @Query("UPDATE media SET deleted_ts = :deletedTS WHERE full_path = :path COLLATE NOCASE") fun updateDeleted(path: String, deletedTS: Long) + @Query("UPDATE media SET date_taken = :dateTaken WHERE full_path = :path COLLATE NOCASE") + fun updateFavoriteDateTaken(path: String, dateTaken: Long) + @Query("DELETE FROM media WHERE deleted_ts != 0") fun clearRecycleBin() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt index 09cd72e85..14d804178 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt @@ -32,7 +32,7 @@ data class Medium( private const val serialVersionUID = -6553149366975655L } - fun isGif() = type == TYPE_GIFS + fun isGIF() = type == TYPE_GIFS fun isImage() = type == TYPE_IMAGES @@ -40,6 +40,8 @@ data class Medium( fun isRaw() = type == TYPE_RAWS + fun isSVG() = type == TYPE_SVGS + fun isHidden() = name.startsWith('.') fun getBubbleText(sorting: Int) = when { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt index 25dc4aa5f..010aa8c27 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt @@ -6,10 +6,7 @@ import android.content.Intent import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.REFRESH_PATH import com.simplemobiletools.gallery.extensions.galleryDB -import com.simplemobiletools.gallery.helpers.TYPE_GIFS -import com.simplemobiletools.gallery.helpers.TYPE_IMAGES -import com.simplemobiletools.gallery.helpers.TYPE_RAWS -import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS +import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.models.Medium import java.io.File @@ -28,6 +25,7 @@ class RefreshMediaReceiver : BroadcastReceiver() { path.isImageFast() -> TYPE_IMAGES path.isVideoFast() -> TYPE_VIDEOS path.isGif() -> TYPE_GIFS - else -> TYPE_RAWS + path.isRawFast() -> TYPE_RAWS + else -> TYPE_SVGS } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgDecoder.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgDecoder.kt new file mode 100644 index 000000000..3765db0e3 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgDecoder.kt @@ -0,0 +1,26 @@ +package com.simplemobiletools.gallery.svg + +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.ResourceDecoder +import com.bumptech.glide.load.engine.Resource +import com.bumptech.glide.load.resource.SimpleResource +import com.caverock.androidsvg.SVG +import com.caverock.androidsvg.SVGParseException + +import java.io.IOException +import java.io.InputStream + +class SvgDecoder : ResourceDecoder { + + override fun handles(source: InputStream, options: Options) = true + + @Throws(IOException::class) + override fun decode(source: InputStream, width: Int, height: Int, options: Options): Resource? { + try { + val svg = SVG.getFromInputStream(source) + return SimpleResource(svg) + } catch (ex: SVGParseException) { + throw IOException("Cannot load SVG from stream", ex) + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgDrawableTranscoder.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgDrawableTranscoder.kt new file mode 100644 index 000000000..96dbe3492 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgDrawableTranscoder.kt @@ -0,0 +1,17 @@ +package com.simplemobiletools.gallery.svg + +import android.graphics.drawable.PictureDrawable +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.engine.Resource +import com.bumptech.glide.load.resource.SimpleResource +import com.bumptech.glide.load.resource.transcode.ResourceTranscoder +import com.caverock.androidsvg.SVG + +class SvgDrawableTranscoder : ResourceTranscoder { + override fun transcode(toTranscode: Resource, options: Options): Resource? { + val svg = toTranscode.get() + val picture = svg.renderToPicture() + val drawable = PictureDrawable(picture) + return SimpleResource(drawable) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgModule.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgModule.kt new file mode 100644 index 000000000..a6e4f3efb --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgModule.kt @@ -0,0 +1,21 @@ +package com.simplemobiletools.gallery.svg + +import android.content.Context +import android.graphics.drawable.PictureDrawable + +import com.bumptech.glide.Glide +import com.bumptech.glide.Registry +import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.module.AppGlideModule +import com.caverock.androidsvg.SVG + +import java.io.InputStream + +@GlideModule +class SvgModule : AppGlideModule() { + override fun registerComponents(context: Context, glide: Glide, registry: Registry) { + registry.register(SVG::class.java, PictureDrawable::class.java, SvgDrawableTranscoder()).append(InputStream::class.java, SVG::class.java, SvgDecoder()) + } + + override fun isManifestParsingEnabled() = false +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgSoftwareLayerSetter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgSoftwareLayerSetter.kt new file mode 100644 index 000000000..043d26e27 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/svg/SvgSoftwareLayerSetter.kt @@ -0,0 +1,25 @@ +package com.simplemobiletools.gallery.svg + +import android.graphics.drawable.PictureDrawable +import android.widget.ImageView + +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.ImageViewTarget +import com.bumptech.glide.request.target.Target + +class SvgSoftwareLayerSetter : RequestListener { + + override fun onLoadFailed(e: GlideException?, model: Any, target: Target, isFirstResource: Boolean): Boolean { + val view = (target as ImageViewTarget<*>).view + view.setLayerType(ImageView.LAYER_TYPE_NONE, null) + return false + } + + override fun onResourceReady(resource: PictureDrawable, model: Any, target: Target, dataSource: DataSource, isFirstResource: Boolean): Boolean { + val view = (target as ImageViewTarget<*>).view + view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null) + return false + } +} diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index 1368debc3..b490a77ea 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -10,13 +10,15 @@ android:id="@+id/default_image_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="@dimen/bottom_filters_thumbnail_size"/> + android:layout_above="@+id/bottom_editor_crop_rotate_actions" + android:layout_marginBottom="@dimen/activity_margin"/> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 822fc4989..b543aaa68 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -1,6 +1,7 @@ @@ -74,7 +75,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/use_english_language"/> + android:text="@string/use_english_language" + app:switchPadding="@dimen/medium_margin"/> @@ -97,7 +99,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/avoid_whats_new"/> + android:text="@string/avoid_whats_new" + app:switchPadding="@dimen/medium_margin"/> @@ -204,7 +207,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/show_hidden_items"/> + android:text="@string/show_hidden_items" + app:switchPadding="@dimen/medium_margin"/> @@ -227,7 +231,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/do_extra_check"/> + android:text="@string/do_extra_check" + app:switchPadding="@dimen/medium_margin"/> @@ -268,7 +273,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/autoplay_videos"/> + android:text="@string/autoplay_videos" + app:switchPadding="@dimen/medium_margin"/> @@ -291,7 +297,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/loop_videos"/> + android:text="@string/loop_videos" + app:switchPadding="@dimen/medium_margin"/> @@ -314,7 +321,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/allow_video_gestures"/> + android:text="@string/allow_video_gestures" + app:switchPadding="@dimen/medium_margin"/> @@ -355,7 +363,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/animate_gifs"/> + android:text="@string/animate_gifs" + app:switchPadding="@dimen/medium_margin"/> @@ -378,7 +387,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/crop_thumbnails"/> + android:text="@string/crop_thumbnails" + app:switchPadding="@dimen/medium_margin"/> @@ -401,7 +411,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/show_media_count"/> + android:text="@string/show_media_count" + app:switchPadding="@dimen/medium_margin"/> @@ -442,7 +453,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/show_info_bubble"/> + android:text="@string/show_info_bubble" + app:switchPadding="@dimen/medium_margin"/> @@ -465,7 +477,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/scroll_thumbnails_horizontally"/> + android:text="@string/scroll_thumbnails_horizontally" + app:switchPadding="@dimen/medium_margin"/> @@ -488,7 +501,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/enable_pull_to_refresh"/> + android:text="@string/enable_pull_to_refresh" + app:switchPadding="@dimen/medium_margin"/> @@ -529,7 +543,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/max_brightness"/> + android:text="@string/max_brightness" + app:switchPadding="@dimen/medium_margin"/> @@ -552,7 +567,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/black_background_at_fullscreen"/> + android:text="@string/black_background_at_fullscreen" + app:switchPadding="@dimen/medium_margin"/> @@ -575,7 +591,32 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/hide_system_ui_at_fullscreen"/> + android:text="@string/hide_system_ui_at_fullscreen" + app:switchPadding="@dimen/medium_margin"/> + + + + + + @@ -598,7 +639,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/one_finger_zoom"/> + android:text="@string/one_finger_zoom" + app:switchPadding="@dimen/medium_margin"/> @@ -621,30 +663,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/allow_instant_change"/> - - - - - - + android:text="@string/allow_instant_change" + app:switchPadding="@dimen/medium_margin"/> @@ -667,7 +687,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/allow_photo_gestures"/> + android:text="@string/allow_photo_gestures" + app:switchPadding="@dimen/medium_margin"/> @@ -743,7 +764,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/show_extended_details"/> + android:text="@string/show_extended_details" + app:switchPadding="@dimen/medium_margin"/> + android:text="@string/hide_extended_details" + app:switchPadding="@dimen/medium_margin"/> + android:text="@string/password_protect_hidden_items" + app:switchPadding="@dimen/medium_margin"/> @@ -850,7 +874,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/password_protect_whole_app"/> + android:text="@string/password_protect_whole_app" + app:switchPadding="@dimen/medium_margin"/> @@ -891,7 +916,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/delete_empty_folders"/> + android:text="@string/delete_empty_folders" + app:switchPadding="@dimen/medium_margin"/> @@ -914,7 +940,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/keep_last_modified"/> + android:text="@string/keep_last_modified" + app:switchPadding="@dimen/medium_margin"/> @@ -937,7 +964,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/skip_delete_confirmation"/> + android:text="@string/skip_delete_confirmation" + app:switchPadding="@dimen/medium_margin"/> @@ -978,7 +1006,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/show_at_bottom"/> + android:text="@string/show_at_bottom" + app:switchPadding="@dimen/medium_margin"/> @@ -1041,7 +1070,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/move_items_into_recycle_bin"/> + android:text="@string/move_items_into_recycle_bin" + app:switchPadding="@dimen/medium_margin"/> @@ -1064,7 +1094,8 @@ android:clickable="false" android:paddingLeft="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin" - android:text="@string/show_recycle_bin"/> + android:text="@string/show_recycle_bin" + app:switchPadding="@dimen/medium_margin"/> diff --git a/app/src/main/res/layout/dialog_filter_media.xml b/app/src/main/res/layout/dialog_filter_media.xml index 1554adec9..f2ccc2559 100644 --- a/app/src/main/res/layout/dialog_filter_media.xml +++ b/app/src/main/res/layout/dialog_filter_media.xml @@ -41,4 +41,12 @@ android:paddingTop="@dimen/activity_margin" android:text="@string/raw_images"/> + + diff --git a/app/src/main/res/layout/pager_photo_item.xml b/app/src/main/res/layout/pager_photo_item.xml index 8d35ed318..96cb2b6c3 100644 --- a/app/src/main/res/layout/pager_photo_item.xml +++ b/app/src/main/res/layout/pager_photo_item.xml @@ -9,8 +9,7 @@ + android:layout_height="match_parent"/> الفديوهات الصور المتحركة RAW images + SVGs لم يتم العثور على ملفات وسائط مع الفلاتر المحددة تغيير الفلاتر @@ -157,7 +158,7 @@ إدارة المجلدات المستبعدة السماح بتكبير الوسائط بأصبع واحد في وضع ملء الشاشة السماح بتغيير الوسائط على الفور من خلال النقر على جوانب الشاشة - استبدل الصور التي يمكن تكبيرها بعمق باستخدام صور ذات جودة أفضل + Allow deep zooming images إخفاء التفاصيل الموسعة عند إخفاء شريط الحالة قم بإجراء فحص إضافي لتجنب إظهار الملفات التالفة Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 88597b80a..e6fe577da 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -38,6 +38,7 @@ Vídeos GIFs Imatges RAW + SVGs No s\'han tronat arxius amb els filtres seleccionats. Canviar filtres @@ -153,7 +154,7 @@ Gestioneu els detalls ampliats Permet fer zoom amb un sol dit a pantalla complerta Permet canviar els mitjans de manera instantània fent clic als costats de la pantalla - Substituïr imatges ampliades per les de millor quialitat + Allow deep zooming images Amaga els detalls estesos quan la barra d\'estat està amagada Fer una verificació addicional per evitar que es mostrin fitxers no vàlids Mostra alguns botons d\'acció a la part inferior de la pantalla diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index f6884c948..2649e53fb 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -38,6 +38,7 @@ Videos GIFs RAW images + SVGs No media files have been found with the selected filters. Change filters @@ -153,7 +154,7 @@ Manage extended details Allow one finger zoom at fullscreen media Allow instantly changing media by clicking on screen sides - Replace deep zoomable images with better quality ones + Allow deep zooming images Hide extended details when status bar is hidden Do an extra check to avoid showing invalid files Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 7caf6d01a..aaa7023d8 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -38,6 +38,7 @@ Videoer GIF\'er RAW images + SVGs Der blev ikke fundet nogen filer med det valgte filter. Skift filter @@ -153,7 +154,7 @@ Manage extended details Tillad zoom med en finger når medier er i fuldskærm Tillad skift af medie ved klik på skærmens sider - Erstat stærkt zoombare billeder med nogle i bedre kvalitet + Allow deep zooming images Skjul udvidede oplysninger når statuslinjen er skjult Tjek en ekstra gang for at undgå visning af ugyldige filer Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 53bf36786..92fc25072 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -22,15 +22,15 @@ Standard Lautstärke Helligkeit - Bildschirmausrichtung sperren - Bildschirmausrichtung entsperren - Bildschirmausrichtung ändern - Hochkant erzwingen - Breitbild erzwingen - Standard Ausrichtung benutzen - Fix Date Taken value - Fixing… - Dates fixed successfully + Bildausrichtung sperren + Bildausrichtung entsperren + Bildausrichtung ändern + Bildausrichtung im Hochformat + Bildausrichtung im Querformat + automatische Bildausrichtung + Aufnahmedatum korrigieren + Korrigiere… + Datum erfolgreich korrigiert. Filter @@ -38,11 +38,12 @@ Videos GIFs RAW images - Keine Medien für die ausgewählten Filter gefunden + SVGs + Keine Medien für die ausgewählten Filter gefunden. Filter ändern - Diese Funktion versteckt die ausgewählten Ordner (auch für andere Apps), indem dort im Dateisystem eine \'.nomedia\'-Datei abgelegt wird. Dadurch werden auch deren Unterordner versteckt. Solche Ordner werden nur gezeigt, wenn die Einstellung \'Versteckte Elemente anzeigen\' aktiv ist (auch andere Apps bieten üblicherweise eine solche Option). Fortfahren? + Diese Funktion versteckt die ausgewählten Ordner, indem im Dateisystem eine \'.nomedia\'-Datei abgelegt wird. Dadurch werden die ausgewählten Ordner und alle Unterverzeichnisse auch in anderen Apps nicht angezeigt. Solche Ordner werden nur gezeigt, wenn die Einstellung \'Versteckte Elemente anzeigen\' aktiv ist (auch andere Apps bieten üblicherweise eine solche Option).\\nFortfahren? Ordner ausschließen Ausgeschlossene Ordner Ausgeschlossene Ordner verwalten @@ -50,7 +51,7 @@ Möchtest du stattdessen einen höherliegenden Ordner ausschließen? \'Ordner ausschließen\' wird ausgewählte Ordner und deren Unterordner nur in dieser App ausblenden. Andere Apps werden solche Ordner weiterhin anzeigen.\\n\\nWenn du Ordner auch für andere Apps verstecken willst, verwende dafür die Funktion \'Ordner verstecken\'. Alle entfernen - Alle Ordner aus der Ausgeblendet-Liste entfernen? Die Ordner selbst werden nicht gelöscht. + Alle Ordner aus der Liste ausgeblendeter Ordner entfernen? Die Ordner selbst werden nicht gelöscht. Versteckte Ordner Versteckte Ordner verwalten Keinen mit einer \".nomedia\"-Datei versteckten Ordner gefunden. @@ -67,40 +68,40 @@ Breite Höhe Seitenverhältnis beibehalten - Bitte eine gültige Auflösung eingeben + Bitte eine gültige Auflösung eingeben. Editor Speichern Drehen Pfad - Ungültiger Dateipfad - Bildbearbeitung fehlgeschlagen - Bild bearbeiten mit - Keine Bildeditor-App gefunden - Unbekannter Dateipfad - Konnte Quelldatei nicht überschreiben + Ungültiger Dateipfad. + Bildbearbeitung fehlgeschlagen. + Bild bearbeiten mit: + Keine Bildeditor-App gefunden. + Unbekannter Dateipfad. + Konnte Quelldatei nicht überschreiben. Nach links drehen Nach rechts drehen Um 180° drehen Spiegeln Horizontal spiegeln Vertikal spiegeln - Bearbeiten mit - Frei + Bearbeiten mit: + Beliebiges Seitenverhältnis Schlichter Hintergrund Als Hintergrund festlegen - Hintergrundbild festlegen fehlgeschlagen + Hintergrundbild festlegen fehlgeschlagen. Als Hintergrund festlegen mit Hintergrund festlegen… - Hintergrundbild erfolgreich festgelegt + Hintergrundbild erfolgreich festgelegt. Hochformat Querformat - Homescreen + Startbildschirm Sperrbildschirm - Home- und Sperrbildschirm + Start- und Sperrbildschirm Diashow @@ -112,91 +113,90 @@ Übergänge animieren Rückwärts abspielen Endlos abspielen - Diashow beendet - Keine Medien für Diashow gefunden + Diashow beendet. + Keine Medien für Diashow gefunden. Darstellung ändern - Gitter + Gitternetz Liste Direkte Unterordner gruppieren - Gruppieren bei + Gruppieren nach Dateien nicht gruppieren Ordner - Zuletzt geändert - Erstelldatum - Dateityp - Extension + Datum der letzten Änderung + Aufnahmedatum + Dateityp (Bilder/Videos) + Dateierweiterung Videos automatisch abspielen Beschriftungen ein/aus - Videos in Endlosschleife spielen + Videos in Endlosschleife abspielen Kacheln von GIFs animieren Helligkeit beim Betrachten maximieren Kacheln quadratisch zuschneiden - Im Vollbild ausrichten nach + Im Vollbild ausrichten nach: Systemeinstellung Gerätedrehung Seitenverhältnis Schwarzer Hintergrund & schwarze Systemleiste im Vollbild Kacheln horizontal scrollen Systemleiste im Vollbild ausblenden - Nach Löschen leere Ordner löschen + Leere Ordner automatisch löschen Fotohelligkeit mit vertikalen Gesten ändern Gesten für Videolautstärke/Helligkeit zulassen Medienanzahl bei Ordnern anzeigen Teilen/Drehen im Vollbild-Menü vertauschen - Eigenschaften im Vollbild anzeigen + Dateieigenschaften in Vollbild-Anzeige einblenden Eigenschaften auswählen Ein-Finger-Zoom im Vollbild zulassen Beim Tippen auf eine Bildschirmseite sofort zwischen Medien wechseln - Stark zoombare Bilder durch Bilder mit hoher Qualität ersetzen - Erweiterte Details nicht anzeigen, wenn die Systemleiste versteckt ist + Starkes Zoomen zulassen + Dateieigenschaften im Vollbild nicht anzeigen, wenn die Systemleiste versteckt ist Zusätzliche Überprüfung, um ungültige Dateien nicht anzuzeigen - Einige Aktionstasten am unteren Bildschirmrand anzeigen + Ausgewählte Funktionen am unteren Bildschirmrand anzeigen Papierkorb auf dem Ordnerbildschirm anzeigen Thumbnails - Vollbild-Medien + Vollbild-Anzeige von Medien Erweiterte Details - Untere Aktionen + Funktionen am unteren Bildschirmrand - Sichtbare untere Aktionen verwalten + Funktionen auswählen Favoriten umschalten Schaltet die Sichtbarkeit von Dateien um Wie kann ich Schlichte Galerie als Standardanwendung auswählen? Zunächst musst du unter \"Apps\" in den Geräteeinstellungen die aktuelle Standardgalerie finden. Suche nach einer Bedienfläche wie \"Standardmässig öffnen\", betätige diese und wähle \"Standardeinstellungen löschen\". - Das nächste Mal, wenn du ein Bild oder ein Video öffnest, sollte ein Appwähler erscheinen und Schlichte Gallerie als Standard ausgewählt werden können. - Ich habe die App mit einem Passwort geschützt, aber ich habe es vergessen. Was kann ich tun? - Es gibt zwei Möglichkeiten: Entweder du installierst die App erneut oder du gehst unter Apps in den Geräteeinstellungen und wählst \"Daten löschen\". Alle Einstellungen werden zurückgesetzt, alle Mediendateien bleiben unberührt. + Das nächste Mal, wenn du ein Bild oder ein Video öffnest, sollte ein Auswahlfenster erscheinen und es möglich sein, Schlichte Gallerie als Standard-App auszuwählen. + Ich habe die App mit einem Passwort geschützt und es vergessen. Was kann ich tun? + Es gibt zwei Möglichkeiten: Entweder du installierst die App erneut oder du wählst in den Geräteeinstellungen \'Apps\' aus und dann \"Daten löschen\". Alle Einstellungen werden zurückgesetzt, alle Mediendateien bleiben unberührt. Wie kann ich ein Album immer zuoberst erscheinen lassen? Du kannst lange auf das gewünschte Album drücken und im Aktionsmenü das Stecknadelsymbol auswählen; es wird nun zuoberst angepinnt. Ebenso kannst du mehrere Ordner anpinnen. Angepinnte Objekte werden nach der Standardmethode sortiert. - Wie kann ich Videos vorspulen? - Du kannst auf den Text der aktuellen oder der maximalen Dauer nahe der Suchleiste drücken, um das Video zurück- oder vorzuspulen. - Was ist der Unterschied zwischen Verstecken und Ausschliessen eines Ordners? - Ausschliessen verhindert lediglich, dass der Ordner in Schlichte Galerie angezeigt, Verstecken hingegen funktioniert systemweit und versteckt den Ordner auch vor anderen Gallerieapps. Dies funktioniert durch das Erstellen einer leeren \".nomedia\"-Datei im betroffenen Ordner, welche du mit jedem Dateimanager löschen kannst. + Wie kann ich in Videos vor- oder zurückspringen? + Du kannst auf den Text der aktuellen oder der maximalen Dauer nahe der Suchleiste drücken, um im Video vor- oder zurück zu springen. + Was ist der Unterschied zwischen \'Verstecken\' und \'Ausschließen\' eines Ordners? + \'Ausschließen\' verhindert lediglich, dass der Ordner in Schlichte Galerie angezeigt wird. \'Verstecken\' hingegen versteckt den Ordner auch vor anderen Apps. Dies funktioniert durch das Erstellen einer leeren \".nomedia\"-Datei im betroffenen Ordner, welche du mit jedem Dateimanager wieder löschen kannst. Wieso erscheinen Ordner mit Musik-Cover oder Stickers? Es kann geschehen, dass manche ungewöhnliche Alben erscheinen. Diese kannst du ausschliessen durch gedrückt halten und Auswählen von Ausschliessen. Im nächsten Dialog kannst du den übergeordneten Ordner auswählen und dadurch sollten die anderen zugehörigen Alben auch nicht auftauchen. - Ein Ordner mit Bilder wird nicht angezeigt. Was kann ich tun? - Dies kann mehrere Gründe haben, aber es zu lösen ist einfach. Gehe einfach zu Einstellungen -> Einbezogene Ordner verwalten, wähle das Plus aus und navigiere zum gewünschten Ordner. - Was ist, wenn ich nur ein paar definierte Ordner sichtbar haben will? - Einen Ordner zu den einbezogenen Ordner hinzuzufügen schliesst nicht automatisch alle anderen aus. Eine Möglichkeit ist, in Einstellungen -> Ausgeschlossene Ordner verwalten den Stammordner \"/\" auszuschliessen und dann alle gewünschten Ordner in Einstellungen -> Einbezogene Ordner verwalten hinzuzufügen. - Dadurch werden nur die ausgewählten Ordner sichtbar, da Auschliessen und Einbeziehen rekursiv erfolgen und wenn ein Ordner ausgeschlossen und einbezogen wurde, wird er dennoch angezeigt. - Vollbildfotos haben seltsame Artefakte. Kann ich die Qualität verbessern? - Ja, es gibt einen Schalter in den Einstellungen gekennzeichnet mit \"Stark zoombare Bilder durch Bilder mit hoher Qualität ersetzen\". Dieser wird die Bildqualität verbessern, aber sie werden bei sehr hoher Zoomstufe unscharf. + Ein Ordner mit Bildern wird nicht angezeigt. Was kann ich tun? + Öffne die Galerie-Einstellungen, wähle dort \'Einbezogene Ordner verwalten\', dann das Plus-Zeichen oben rechts und navigiere zum gewünschten Ordner. + Wie kann ich erreichen, dass nur ein paar definierte Ordner sichtbar sind? + Einen Ordner zu den \'einbezogenen Ordnern\' hinzuzufügen, schließt nicht automatisch alle anderen aus. Eine Möglichkeit ist, in den Galerie-Einstellungen \'Ausgeschlossene Ordner verwalten\' zu wählen, den Stammordner \"/\" auszuschliessen und dann alle gewünschten Ordner in \'Einbezogene Ordner verwalten\' hinzuzufügen. + Als Vollbild angezeigte Bilder haben seltsame Artefakte. Kann ich die Qualität verbessern? + Ja, es gibt einen Schalter in den Einstellungen, gekennzeichnet mit \"Stark zoombare Bilder durch Bilder mit hoher Qualität ersetzen\". Dieser wird die Bildqualität verbessern, aber sie werden bei sehr hoher Zoomstufe unscharf. Kann ich mit dieser App Bilder zuschneiden? Ja, du kannst Bilder über das Ziehen der Bildecken im Editor zuschneiden. Du gelangst zum Editor indem du lange auf ein Vorschaubild drückst und Bearbeiten auswählst oder durch Auswählen von Bearbeiten in der Vollbildansicht. Kann ich Mediendatei-Thumbnails irgendwie gruppieren? - Verwenden Sie einfach den Menüeintrag \"Gruppieren nach\" in der Miniaturansicht. Sie können Dateien nach mehreren Kriterien gruppieren, einschließlich Aufnahmedatum. Wenn Sie die Funktion \"Alle Ordnerinhalte anzeigen\" verwenden, können Sie sie auch nach Ordnern gruppieren. - 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\". + Verwende dazu den Menüeintrag \"Gruppieren nach\" in der Miniaturansicht. Du kannst Dateien nach mehreren Kriterien gruppieren, einschließlich Aufnahmedatum. Wenn Du die Funktion \"Alle Ordnerinhalte anzeigen\" verwendest, kannst du sie auch nach Ordnern gruppieren. + Die Sortierung nach Datum ist nicht korrekt, wie kann ich das korrigieren? + Die wahrscheinliche Ursache ist, dass deine Bilder von woanders kopiert worden sind. In diesem Fall solltest du die Miniatur-Ansichten der Bilder durch etwas längeres Antippen markieren und dann im Menü oben rechts die Funktion \'Aufnahmedatum korrigieren\' ausführen. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 35b67555f..e73d44a09 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -4,45 +4,46 @@ Gallery Επεξεργασία Άνοιγμα κάμερας - (κρυμμένο) - (εξαιρεθέν) + (κρυφά) + (εξαιρούνται) Καρφίτσωμα φακέλου Ξεκαρφίτσωμα φακέλου Καρφίτσωμα στην κορυφή - Εμφάνιση περιεχομένου όλων των φακέλων + Προβολή όλων στο φάκελο Όλοι οι φάκελοι - Αλλαγή στην εμφάνιση των φακέλων + Αλλαγή σε προβολή φακέλων Άλλος φάκελος Εμφάνιση στο χάρτη Άγνωστη τοποθεσία Αύξηση αριθμού στηλών Μείωση αριθμού στηλών - Αλλαγή εικόνας εξώφυλλου + Αλλαγή εξώφυλλου φακέλου Επιλογή φωτογραφίας - Χρήση προκαθορισμένου + Χρήση προεπιλεγμένης Ένταση Φωτεινότητα Κλείδωμα προσανατολισμού Ξεκλείδωμα προσανατολισμού - Change orientation - Force portrait - Force landscape - Use default orientation - Fix Date Taken value - Fixing… - Dates fixed successfully + Αλλαγή προσανατολισμού + Εξαναγκασμός σε πορτρέτο + Εξαναγκασμός σε τοπίο + Χρήση προεπιλογής + Διόρθωση ημερ. λήψης + Διορθώνεται… + Ημερ. διορθώθηκε με επιτυχία Φιλτράρισμα πολυμέσων Εικόνες Βίντεο GIFs - RAW images + RAW Εικόνες + SVGs Δεν βρέθηκε κανένα αρχείο πολυμέσων με τα επιλεγμένα φίλτρα. Αλλαγή φίλτρων - Αυτή η λειτουργικότητα κρύβει τον φάκελο προσθέτοντας ένα \'.nomedia\' αρχείο μέσα του, θα κρύψει και όλους τους υποφακέλους επίσης. Μπορείτε να τους δείτε με την επιλογή του \'Εμφάνιση κρυφών δεδομένων\' στις Ρυθμίσεις. Συνέχεια? + Αυτή η λειτουργία κρύβει τον φάκελο προσθέτοντας ένα \".nomedia\" αρχείο μέσα του, θα κρύψει και όλους τους υποφακέλους επίσης. Μπορείτε να τους δείτε με την επιλογή του \'Εμφάνιση κρυφών δεδομένων\' στις Ρυθμίσεις. Συνέχεια? Εξαίρεση Εξαίρεση φακέλων Διαχείριση εξαιρεμένων φακέλων @@ -72,30 +73,30 @@ Επεξεργαστής Αποθήκευση - Γύρισμα - Μονοπάτι - Λάθος μονοπάτι εικόνας + Περιστροφή + Διαδρομή + Μη έγκυρη διαδρομή εικόνας Η επεξεργασία εικόνας απέτυχε Επεξεργασία εικόνας με: - Δεν βρέθηκε επεργαστής για τις εικόνες + Δεν βρέθηκε επεργαστής εικόνων Άγνωστη τοποθεσία αρχείου Δεν ήταν δυνατή η αντικατάσταση του αρχείου πηγής - Στροφή αριστερά - Στροφή δεξιά - Στροφή κατά 180º + Περιστροφή αριστερά + Περιστροφή δεξιά + Περιστροφή κατά 180º Αναποδογύρισμα Οριζόντιο αναποδογύρισμα Κατακόρυφο αναποδογύρισμα Επεξεργασία με - Free + Ελεύθερο Simple Wallpaper Εφαρμογή ως ταπετσαρία Η εφαρμογή ως ταπετσαρία απέτυχε Εφαρμογή ως ταπετσαρία με: - Εφαρμογή ταπετσαρίας… - Εφαρμογή ταπετσαρίας επιτυχώς + Η ταπετσαρία εφαρμόζεται... + Η ταπετσαρία εφαρμόστηκε Αναλογία σε κατακόρυφη προβολή Αναλογία σε οριζόντια προβολή Αρχική οθόνη @@ -103,8 +104,8 @@ Αρχική οθόνη και κλειδώματος - Προβολή εικόνων - Χρόνος επανάληψης (δευτερόλεπτα): + Παρουσίαση διαφανιών + Χρόνος επανάληψης (δευτ.) : Συμπερίληψη φωτογραφιών Συμπερίληψη βίντεο Συμπερίληψη GIFs6 @@ -122,22 +123,22 @@ Ομαδοποίηση υποφακέλων - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + Ομαδοποίηση κατά + Χωρίς + Φάκελο + Τελευταία τροποποίηση + Ημερομηνία λήψης + Τύπο αρχείου + Επέκταση Αυτόματη αναπαραγωγή βίντεο - Αλλαγή ορατότητας ονόματος αρχείων + Αλλαγή προβολής ονόματος αρχείων Επανάληψη βίντεο Εμφάνιση κινούμενων GIFs στα εικονίδια - Μέγιστη φωτεινότητα κατά την θέαση πλήρους οθόνης + Μέγιστη φωτεινότητα κατά την προβολή πλήρους οθόνης Κόψιμο εικονιδίων σε τετράγωνα - Γύρισμα των πολυμέσων πλήρους οθόνης με + Περιστροφή σε πλήρη οθόνη απο Ρυθμίσεις συστήματος Περιστροφή συσκευής Αναλογία εικόνας @@ -148,28 +149,28 @@ Να επιτρέπεται ο έλεγχος φωτεινότητας με κατακόρυφες κινήσεις Να επιτρέπεται ο έλεγχος έντασης του βίντεο και φωτεινότητας με κατακόρυφες κινήσεις (gestures) - Εμφάνιση του πλήθους των πολυμέσων σε φάκελο, στην κύρια οθόνη + Εμφάνιση του αριθμού πολυμέσων στον φάκελο, στην κύρια οθόνη Αντικατάσταση της "Κοινής χρήσης" με "Περιστροφή" στο μενού πλήρους οθόνης Εμφάνιση λεπτομερειών στα πολυμέσα σε κατάσταση πλήρους οθόνης Διαχείριση εκτεταμένων λεπτομερειών Να επιτρέπεται μεγένθυση με ένα δάχτυλο σε πλήρη οθόνη Να επιτρέπεται η άμεση αλλαγή των μέσων με το άγγιγμα στις άκρες της οθόνης - Αντικατάσταση των φωτογραφιών που απαιτούν ζούμ με άλλες καλύτερης ποιότητας + Επιτρέπει βαθύ ζουμ στις εικόνες Απόκρυψη λεπτομερειών όταν η μπάρα κατάστασης είναι κρυμμένη Επιπλέον έλεγχος για την αποφυγή εμφάνισης λανθασμένων αρχείων - Show some action buttons at the bottom of the screen - Show the Recycle Bin at the folders screen + Εμφάνιση μερικών κουμπιών λειτουργιών στο κάτω μέρος της οθόνης + Εμφάνιση του κάδου ανακύκλωσης στην οθόνη φακέλων Εικονίδια Πολυμέσα πλήρους οθόνης Περισσότερες λεπτομέρειες - Bottom actions + Λειτουργίες στο κάτω μέρος - Manage visible bottom actions - Toggle favorite - Toggle file visibility + Διαχείρηση εμφάνισης λειτουργιών + Εναλλαγή αγαπημένων + Εναλλαγή προβολής αρχείου Πώς μπορώ να κάνω το Simple Gallery προκαθορισμένη εφαρμογή συλλογής πολυμέσων; @@ -192,24 +193,26 @@ Αυτό θα κάνει ορατούς μόνο τους επιλεγμένους φακέλους, καθώς η εξαίρεση και η συμπερίληψη λειτουργούν αναδρομικά και αν ενας φάκελος ανήκει και στα δύο, θα εμφανιστεί. Οι εικόνες πλήρους οθόνης έχουν κάποια περίεργα σημάδια. Μπορώ κάπως να βελτιώσω την ποιότητα; Ναι. Υπάρχει ένας διακόπτης στις Ρυθμίσεις με το κείμενο \"Αντικατάσταση των φωτογραφιών που απαιτούν ζούμ με άλλες καλύτερης ποιότητας\". Μπορείτε να χρησιμοποιήσετε αυτό. Θα βελτιώσει την ποιότητα των φωτογραφιών, αλλά θα θολώσουν στο μεγάλο ζουμ. - 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\". + Μπορώ να περικόψω εικόνες με την εφαρμογή; + Ναι, μπορείτε να περικόψετε εικόνες στον επεξεργαστή, σύροντας τις γωνίες εικόνας. Μπορείτε να μεταβείτε στον επεξεργαστή είτε πατώντας παρατεταμένα μια μικρογραφία εικόνας και επιλέγοντας Επεξεργασία, είτε επιλέγοντας Επεξεργασία από την προβολή πλήρους οθόνης. + Μπορώ να ομαδοποιήσω κάπως τις μικρογραφίες των αρχείων πολυμέσων? + Σίγουρα, απλά με την χρήση \"Ομαδοποίηση κατά\" Επέκταση ή Τύπο αρχείου. Μπορείτε την ομαδοποίηση με πολλά κριτήρια, συμπεριλαμβανομένης της ημερομηνίας λήψης. Εάν χρησιμοποιείτε τη λειτουργία \"Εμφάνιση όλων των περιεχομένων στο φάκελο\" μπορείτε να ομαδοποιήσετε και τους φακέλους επίσης. + Η ταξινόμηση κατά ημερομηνία δεν φαίνεται να λειτουργεί σωστά, πώς μπορώ να τη διορθώσω? + Αυτό πιθανότατα προκαλείται από την αντιγραφή των αρχείων από κάπου. Μπορείτε να το διορθώσετε επιλέγοντας τις μικρογραφίες αρχείων και επιλέγοντας \"Επιδιόρθωση ημερ. λήψης\". - Μία γκάλερι για την προβολή φωτογραφιών και βίντεο χωρίς διαφημίσεις. + Μία Gallery για την προβολή φωτογραφιών και βίντεο χωρίς διαφημίσεις. - Μία απλή εφαρμογή για την εμφάνιση φωτογραφιών και βίντεο. Τα αντικείμενα μπορούνα να ταξινομηθούν με βάση την ημερ/νία, το μέγεθος και το όνομα με αύξουσα ή φθήνουσα σειρά, οι φωτογραφίες μπορούν να μεγεθυνθούν. Τα αρχεία πολυμέσων εμφανίζονται σε πολλαπλές στήλες ανάλογα με τον μέγεθος της οθόνης και μπορείτε να αλλάξετε το πλήθος των στηλών με τα 2 δάχτυλα (pintch). Μπορούν να μετονομαστούν, να μοιραστούν, να διαγραφούν, να αντιγραφούν και να μετακινηθούν. Οι εικόνες επίσης μπορούν να κοπούν, να περιστραφούν, να αντιστραφούν ή να οριστούν ως ταπετσαρίες κατευθείαν από την εφαρμογή. + Μία απλή εφαρμογή για την προβολή φωτογραφιών και βίντεο. Τα αντικείμενα μπορούνα να ταξινομηθούν με βάση την ημερ/νία, το μέγεθος και το όνομα με αύξουσα ή φθήνουσα σειρά, οι φωτογραφίες μπορούν να μεγεθυνθούν. Τα αρχεία πολυμέσων εμφανίζονται σε πολλαπλές στήλες ανάλογα με τον μέγεθος της οθόνης και μπορείτε να αλλάξετε τον αριθμό των στηλών με τα 2 δάχτυλα (pintch). Μπορούν να μετονομαστούν, να μοιραστούν, να διαγραφούν, να αντιγραφούν και να μετακινηθούν. Οι εικόνες επίσης μπορούν να κοπούν, να περιστραφούν, να αντιστραφούν ή να οριστούν ως ταπετσαρίες κατευθείαν από την εφαρμογή. - Η γκάλερι επίσης μπορεί να χρησιμοποιηθεί από άλλες εφαρμογές για προεμφάνιση φωτογραφιών / βίντεο, να μπουν ως επισυνάψεις σε εφαρμογές email κλπ. Είναι τέλεια για καθημερινή χρήση. + Η Gallery επίσης μπορεί να χρησιμοποιηθεί από άλλες εφαρμογές για προεμφάνιση φωτογραφιών / βίντεο, να μπουν ως επισυνάψεις σε εφαρμογές email κλπ. Είναι τέλεια για καθημερινή χρήση. - Το δικαίωμα δαχτυλικού αποτυπώματος χρειάζεται για το κλείδωμα των κρυφών αντικειμένων ή ολόκληρης της εφαρμογής. + Η εξουσιοδότηση δαχτυλικού αποτυπώματος χρειάζεται για το κλείδωμα των κρυφών αντικειμένων ή ολόκληρης της εφαρμογής. - Δεν περιέχει διαφημίσεις ή περιττά δικαιώματα. Έιναι όλη ανοιχτού κώδικα και δίνει την δυνατότητα επιλογής των χρωμάτων της εφαρμογής. + Δεν περιέχει διαφημίσεις ή περιττά δικαιώματα. Έιναι όλη ανοιχτού κώδικα και παρέχει προσαρμόσιμα χρώματα για την εφαρμογή. - Αυτή η εφαργμογή είναι κομμάτι μιας σειρά εφαρμογών. Μπορείτε να βρείτε τις υπόλοιπες στο https://www.simplemobiletools.com + Αυτή η εφαρμογή είναι μέρος μιας σειράς εφαρμογών. Μπορείτε να βρείτε τις υπόλοιπες στο https://www.simplemobiletools.com Miniaturas - Medios a pantalla compelta + Medios a pantalla completa Detalles ampliados Acciones en la parte inferior @@ -173,9 +174,9 @@ ¿Cómo puedo hacer que Simple Gallery sea la galería de dispositivos predeterminada? Primero tiene que encontrar la galería predeterminada actualmente en la sección Aplicaciones de la configuración de su dispositivo, busque un botón que diga algo como \"Abrir por defecto \", haga clic en él, luego seleccione \"Borrar valores predeterminados \". - La próxima vez que intente abrir una imagen o video, debería ver un selector de aplicaciones, donde puede seleccionar Galería simple y convertirla en la aplicación predeterminada. + La próxima vez que intente abrir una imagen o video, debería ver un selector de aplicaciones, donde puede seleccionar Galería Simple y convertirla en la aplicación predeterminada. He protegido la aplicación con una contraseña, pero la he olvidado. ¿Que puedo hacer? - Puedes resolverlo de 2 maneras. Puede reinstalar la aplicación o encontrar la aplicación en la configuración de su dispositivo y seleccionar \"Borrar datos \". Restablecerá todas sus configuraciones, no eliminará ningún archivo multimedia. + Puede resolverlo de 2 maneras. Puede reinstalar la aplicación o encontrar la aplicación en la configuración de su dispositivo y seleccionar \"Borrar datos \". Restablecerá todas sus configuraciones, no eliminará ningún archivo multimedia. ¿Cómo puedo hacer que un álbum siempre aparezca en la parte superior? Puede aguantar pulsado el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado. ¿Cómo puedo avanzar videos? @@ -190,7 +191,7 @@ Agregar una carpeta en las carpetas incluidas no excluye automáticamente nada. Lo que puede hacer es ir a Ajustes -> Administrar carpetas excluidas, excluir la carpeta raíz \"/\", luego agregar las carpetas deseadas en Configuración -> Administrar carpetas incluidas. Esto hará que solo las carpetas seleccionadas sean visibles, ya que tanto la exclusión como la inclusión son recursivas y si una carpeta está excluida e incluida, aparecerá. Las imágenes a pantalla completa tienen artefactos extraños, ¿puedo de alguna manera mejorar la calidad? - Sí, hay una alternancia en Configuración que dice \"Reemplazar imágenes con zoom profundo con las de mejor calidad\", puedes usar eso. Mejorará la calidad de las imágenes, pero se volverán borrosas una vez que intente ampliar demasiado. + Sí, hay una alternancia en Ajustes que dice \"Reemplazar imágenes con zoom profundo con las de mejor calidad\", puede usar eso. Mejorará la calidad de las imágenes, pero se volverán borrosas una vez que intente ampliar demasiado. ¿Puedo recortar imágenes con esta aplicación? Sí, puede recortar imágenes en el editor arrastrando las esquinas de la imagen. Puede acceder al editor pulsando prolongadamente una imagen en miniatura y seleccionando Editar, o seleccionando Editar en la vista de pantalla completa. ¿Puedo de alguna manera agrupar miniaturas de archivos multimedia? diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index de53e5492..323755c16 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -38,6 +38,7 @@ Videot GIFit RAW images + SVGs Mediaa ei löytynyt valituilla suotimilla. Muuta suotimia @@ -153,7 +154,7 @@ Hallitse yksityiskohtaisia tietoja Salli lähentäminen yhdellä sormella täyden ruudun tilassa Salli median selaaminen ruudun reunoja koskettamalla - Korvaa syvälle lähennettävät kuvat parempilaatuisella + Allow deep zooming images Piilota yksityiskohtaiset tiedot kun tilapalkki on piilotettu Tee ylimääräinen tarkistus rikkinäisten tiedostojen varalta Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index dc5f31733..0e96c9eee 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -38,6 +38,7 @@ Vidéos GIF RAW images + SVGs Aucun fichier média trouvé avec les filtres sélectionnés. Changer les filtres @@ -153,7 +154,7 @@ Gérer les détails supplémentaires Autoriser le zoom avec un doigt sur un média en plein écran Autoriser le changement instantané de média en cliquant sur les côtés de l\'écran - Remplacer les images zoomables profondes par des images de meilleure qualité + Allow deep zooming images Masquer les détails supplémentaires lorsque la barre d\'état est masquée Faire une vérification supplémentaire pour éviter de montrer des fichiers invalides Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 70490384b..127191765 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -38,6 +38,7 @@ Vídeos GIFs RAW images + SVGs Non se atoparon medios dos indicados polo filtro. Cambiar filtro @@ -153,7 +154,7 @@ Xestionar información polo miúdo Permitir zoom con un dedo a pantalla completa Permitir o cambio instantáneo de medios pulsando nos lados da pantalla - Substituír imaxes con un gran zoom por por outras con mellor calidade + Allow deep zooming images Agochar detalles extendidos cando a barra de estado está oculta Facer unha comprobación extra para evitar mostrar ficheiros non válidos Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 15180ae8e..037c281da 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -38,6 +38,7 @@ Video GIF-ovi RAW images + SVGs Nije pronađena nijedna datoteka s odabranim filtrom. Promijeni filter @@ -153,7 +154,7 @@ Upravljaj proširenim pojedinostima Omogući zumiranje jednim prstom na mediju cijelog zaslona Dopusti trenutačno mijenjanje medija dodirom na stranice zaslona - Zamijenite slike s dubokim zumom za one s boljom kvalitetom + Allow deep zooming images Sakrij proširene pojedinosti kada je traka statusa skrivena Napravite dodatnu provjeru da biste izbjegli prikazivanje nevažećih datoteka Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 994b4544e..6be796647 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -38,6 +38,7 @@ Videos GIFs RAW images + SVGs No media files have been found with the selected filters. Change filters @@ -153,7 +154,7 @@ Manage extended details Allow one finger zoom at fullscreen media Allow instantly changing media by clicking on screen sides - Replace deep zoomable images with better quality ones + Allow deep zooming images Hide extended details when status bar is hidden Do an extra check to avoid showing invalid files Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 15dfb6bc3..843238031 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -28,9 +28,9 @@ Forza verticale Forza orizzontale Usa l\'orientamento predefinito - Fix Date Taken value - Fixing… - Dates fixed successfully + Correggi valore Data acquisizione + Correzione… + Date aggiornate correttamente Filtra i media @@ -38,6 +38,7 @@ Video GIF Immagini RAW + SVGs Nessun file trovato per il filtro selezionato. Cambia filtro @@ -87,7 +88,7 @@ Capovolgi orizzontalmente Capovolgi verticalmente Modifica con - Free + Libero Sfondo semplice @@ -153,11 +154,11 @@ Gestisci le informazioni estese Abilita zoom con un dito su media a schermo intero Cambia media istantaneamente toccando sui lati dello schermo - Sostituisci le immagini ingrandibili a fondo con altre di migliore qualità + Permetti zoom immagini profondo Nascondi i dettagli estesi quando la barra di stato è nascosta Fai un controllo ulteriore per evitare di mostrare file non validi Mostra alcuni pulsanti azione in fondo allo schermo - Show the Recycle Bin at the folders screen + Mostra il cestino nella schermata delle cartelle Miniature @@ -195,8 +196,8 @@ Sì, puoi ritagliare le immagini nell\'editor, trascinando gli angoli dell\'immagine. Puoi usare l\'editor sia premendo a lungo la miniatura di un\'immagine e selezionando Modifica, o selezionando Modifica mentre la vedi a schermo intero. Posso raggruppare in qualche modo le miniature dei file? Certo, usa il menu \"Raggruppa per\" mentre visualizzi le miniature. Puoi raggruppare i file con diversi criteri, incluso la data di creazione. Se utilizzi la funzione \"Mostra tutti i contenuti\" puoi anche raggrupparli per cartelle. - 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\". + L\'ordinamento per data acquisizione sembra non funzionare bene, come posso risolvere? + Probabilmente è causato dai file copiati da altre parti. Puoi risolvere selezionando le miniature dei file e scegliendo \"Correggi valore Data acquisizione\". diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 87ac44d5a..035a2df7f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -28,9 +28,9 @@ 縦で固定 横で固定 デフォルト仕様 - Fix Date Taken value - Fixing… - Dates fixed successfully + 撮影日の値を修正 + 修正中… + 撮影日が正常に修正されました 表示する形式 @@ -38,6 +38,7 @@ ビデオ GIF RAW + SVGs 条件に該当するメディアがありません。 絞り込み条件を変更 @@ -82,7 +83,7 @@ 元のファイルを上書きできません 左に回転 右に回転 - 180o回転 + 180度回転 反転 水平方向に反転 垂直方向に反転 @@ -153,7 +154,7 @@ 詳細表示を管理する メディアを指ひとつでズーム可能にする 画面の端を押してメディアをスライドする - ズームが可能な画像を高画質な物にする + Allow deep zooming images ステータスバーが非表示の時は詳細を隠す 無効なファイルを見せない調整を行う 画面下部にアクションボタンを表示する diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index b1f627ab9..2287242a1 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -38,6 +38,7 @@ 비디오 GIFs RAW images + SVGs 설정된 필터와 일치하는 컨텐츠가 존재하지 않습니다. 필터 변경 @@ -153,7 +154,7 @@ 확장된 세부정보 관리 전체화면 모드에서 한 손가락으로 확대 및 축소 측면 클릭으로 미디어 즉시변경 - 확대 축소 가능한 이미지를 더 좋은 품질로 교체 + Allow deep zooming images 상태 표시 줄이 숨겨져있을 때 확장 된 세부 정보 숨김 잘못된 파일 표시를 방지하기 위해 추가 검사 수행 Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 4252465cd..d5c4ebb04 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -38,6 +38,7 @@ Vaizdo įrašai GIF\'ai RAW images + SVGs Su pasirinktais filtrais nerasta medijos bylų. Pakeisti filtrus @@ -153,7 +154,7 @@ Tvarkykite išsamią informaciją Leisti vienu pirštu pritraukti viso ekrano rėžime Leiskite akimirksniu keisti mediją spustelėdami ekrano šonuose - Pakeisti giliai priartinamus atvaizdus su geresnės kokybės atvaizdais + Allow deep zooming images Slėpti išsamią informaciją, kai būsenos juosta yra paslėpta Atlikti papildomą patikrinimą, kad nebūtų rodomos sugadintos bylos Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 412809ce1..c83c2b99d 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -24,20 +24,21 @@ Lysstyrke Lås skjermorientering Lås opp skjermorientering - Change orientation - Force portrait - Force landscape - Use default orientation - Fix Date Taken value - Fixing… - Dates fixed successfully + Endre orientering + Framtving portrett + Framtving landskap + Bruk standardorientering + Korriger Dato tatt-verdi + Korrigerer… + Datoer er korrigerte Filtrer media Bilder Videoer GIF-bilder - RAW images + RAW-format-bilder + SVGs Ingen media-filer er funnet med de valgte filtrene. Endre filtere @@ -87,7 +88,7 @@ Speilvend horisontalt Speilvend vertikalt Rediger med - Free + Fri Bakgrunnsbilde @@ -122,13 +123,13 @@ Group direct subfolders - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + Grupper etter + Ikke grupper filer + Mappe + Sist endret + Dato tatt + Filtype + Endelse Avspill videoer automatisk @@ -153,22 +154,22 @@ Velg detaljer Tillat en-finger-zoom i mediavisningen Tillat å skifte media øyeblikkelig ved å trykke på kanten av skjermen - Erstatt dyp-zoombare bilder med bilder av bedre kvalitet + Tillat dyp bildezooming Skjul utvidede detaljer når statuslinjen er skjult Gjør en ekstra sjekk for å unngå visning av ugyldige filer - Show some action buttons at the bottom of the screen - Show the Recycle Bin at the folders screen + Vis noen handlingsknapper nederst på skjermen + Vis papirkurven på mappeskjermen Minibilder Mediavisning Utvidede detaljer - Bottom actions + Handlinger nederst - Manage visible bottom actions - Toggle favorite - Toggle file visibility + Behandle nedre handlingsknapper + Favoritt av/på + Filsynlighet av/på How can I make Simple Gallery the default device gallery? diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index cc848c5e3..68b177cad 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -28,9 +28,9 @@ Portretmodus forceren Landschapsmodus forceren Standaardmodus gebruiken - Fix Date Taken value - Fixing… - Dates fixed successfully + Datum opname corrigeren + Corrigeren… + Datums zijn gecorrigeerd Media filteren @@ -38,6 +38,7 @@ Video\'s GIF-bestanden RAW-afbeeldingen + SVG-vectorafbeeldingen Er zijn geen bestanden gevonden met de huidige filters. Filters aanpassen @@ -153,7 +154,7 @@ Uitgebreide informatie Met één vinger zoomen in volledig scherm Direct naar vorige/volgende door op de zijkanten van het scherm te tikken - In hoge kwaliteit weergeven (ten koste van ver inzoomen) + Verder inzoomen mogelijk maken Uitgebreide informatie niet tonen als de statusbalk is verborgen Ongeldige bestanden verbergen Enkele actieknoppen onderaan het scherm tonen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f6c38477f..dbc0a7494 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -28,9 +28,9 @@ Wymuś pionową Wymuś poziomą Używaj systemowej - Fix Date Taken value - Fixing… - Dates fixed successfully + Napraw datę utworzenia + Naprawiam… + Daty zostały naprawione Filtruj multimedia @@ -38,11 +38,12 @@ Filmy GIFy Obrazy RAW + SVGs Nie znalazłem multimediów z wybranymi filtrami. Zmień filtry - Ta funkcja ukrywa foldery, dodając do nich pusty plik .nomedia. Aby móc je zobaczyć, należy włączyć opcję \'Pokazuj ukryte foldery\' w ustawieniach. Kontynuować? + Ta funkcja ukrywa foldery, dodając do nich pusty plik \'.nomedia\'. Aby móc je zobaczyć, należy włączyć opcję \'Pokazuj ukryte foldery\' w ustawieniach. Kontynuować? Wyklucz Wykluczone foldery Zarządzaj wykluczonymi folderami @@ -53,7 +54,7 @@ Usunąć wszystkie foldery z listy wykluczonych? Foldery nie zostaną fizycznie usunięte.   Ukryte foldery    Zarządzaj ukrytymi folderami -    Zdaje się, że nie masz żadnych folderów z plikiem \".nomedia\". + Zdaje się, że nie masz żadnych folderów z plikiem \'.nomedia\'. Dołączone foldery @@ -153,8 +154,8 @@ Zarządzaj dodatkowymi szczegółami    Zezwalaj na powiększanie jednym palcem w widoku pełnoekranowym    Zezwalaj na natychmiastową zmianę multimediów po kliknięciu boków ekranu -    Zamieniaj powiększalne obrazy na te o lepszej jakości -    Ukrywaj dodatkowe szczegóły gdy pasek stanu jest ukryty + Zezwalaj na duże powiększanie obrazów + Ukrywaj dodatkowe szczegóły, gdy pasek stanu jest ukryty    Dodatkowe sprawdzenie w celu uniknięcia pokazywania niewłaściwych plików Pokazuj niektóre przyciski akcji na dole ekranu Pokazuj kosz w widoku folderów @@ -182,10 +183,10 @@    Jaka jest różnica między ukryciem, a wykluczeniem folderu?    Wykluczenie działa tylko w obrębie niniejszej aplikacji (wszędzie indziej pliki są normalnie widoczne), ukrywanie - w obrębie całego systemu (nie widać ich nigdzie), dodawany jest wtedy do folderu pusty plik \'.nomedia\', który możesz usunąć w dowolnym menedżerze plików.    Dlaczego pokazują mi się foldery z okładkami do piosenek i tym podobne rzeczy? - Aplikacja niestety nie wie, czy dane zdjęcie jest okładką od piosenki czy czymś innym. Aby ukryć niechciane rzeczy, przytrzymaj je i wybierz opcję \'Wyklucz\' z paska akcji. + Aplikacja nie wie, czy dany obraz jest okładką od piosenki czy czymś innym. Aby ukryć niechciane rzeczy, przytrzymaj je i wybierz opcję \'Wyklucz\' z paska akcji.    Nie pokazuje(-ą) mi się folder(y) ze zdjęciami / filmami. Co mogę zrobić?    Wejdź do ustawień aplikacji i w sekcji z dołączonymi folderami dodaj tenże folder do listy. -    Co jeśli chcę widzieć tylko.wybrane foldery? + Co jeśli chcę widzieć tylko wybrane foldery?    Przejdź do sekcji z wykluczonymi folderami w ustawieniach aplikacji, dodaj tam folder główny (\"/\"), a następnie dodaj pożądane foldery w sekcji z dołączonymi folderami.    Zdjęcia w widoku pełnoekranowym mają dziwne artefakty. Jak mogę to naprawić? W ustawieniach aplikacji włącz opcję \'Zamieniaj powiększalne obrazy na te o lepszej jakości\'. Poprawi ona jakość zdjęć, jednak przy bardzo dużych powiększeniach mogą się stać one zbyt rozmazane. @@ -193,8 +194,8 @@ Tak, możesz to zrobić w edytorze, przeciągając krawędzie obrazu. Edytor otworzysz przytrzymując miniaturę obrazu i wybierając opcję \'Edytuj\', bądź wybierając tą samą opcję w menu pełnoekranowym. Czy mogę jakoś grupować miniatury plików? Tak. Użyj opcji \'Grupuj według\', gdy jesteś w widoku miniatur. Grupować je możesz według wielu kryteriów, włącznie z datą ich utworzenia. Ponadto, jeśli użyjesz opcji \'Pokazuj całą zawartość folderów\', możesz je także grupować według folderów. - 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\". + Sortowanie według daty utworzenia nie działa poprawnie. Dlaczego tak się dzieje i jak mogę to naprawić? + Dzieje się tak, gdyż prawdopodobnie pliki zostały skądś do urządzenia skopiowane. Naprawić to można wybierając miniatury plików, a następnie opcję \'Napraw datę utworzenia\'. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 44028df83..5f9804afa 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -38,6 +38,7 @@ Vídeos GIFs RAW images + SVGs Nenhum arquivo de mídia encontrado a partir dos filtros selecionados. Mudar filtros @@ -153,7 +154,7 @@ Gerenciar detalhes extendidos Permitir zoom com um dedo quando em exibição de tela cheia Permitir alternância instantânia de mídia clicando nas laterais da tela - Substituir imagens aptas a grande quantitade de zoom por imagens de melhor qualidade + Allow deep zooming images Ocultar detalhes extendidos quando a barra de status estiver oculta Realizar verificação extra para evitar mostrar arquivos inválidos Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 23226010d..dc672792d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -24,20 +24,21 @@ Brilho Bloquear orientação Desbloquear orientação - Change orientation - Force portrait - Force landscape - Use default orientation - Fix Date Taken value - Fixing… - Dates fixed successfully + Alterar orientação + Impor modo vertical + Impor modo horizontal + Usar predefinição + Corrigir data de obtenção + A corrigir… + Dados corrigidos com sucesso Filtrar multimédia Imagens Vídeos GIF - RAW images + Imagens RAW + SVGs Não foram encontrados ficheiros que cumpram os requisitos. Alterar filtros @@ -87,7 +88,7 @@ Horizontalmente Verticalmente Editar com - Free + Livre Simple Wallpaper @@ -119,16 +120,16 @@ Tipo de exibição Grelha Lista - Group direct subfolders + Agrupar sub-pastas - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + Agrupar por + Não agrupar ficheiros + Pasta + Última modificação + Data de obtenção + Tipo de ficheiro + Extensão Reproduzir vídeos automaticamente @@ -153,22 +154,22 @@ Gerir detalhes exibidos Permitir ampliação com um dedo se em ecrã completo Permitir troca imediata de ficheiro ao tocar nas margens do ecrã - Replace deep zoomable images with better quality ones + Allow deep zooming images Ocultar detalhes extra se a barra de estado estiver oculta Efetuar uma dupla verificação para evitar mostrar os ficheiros inválidos - Show some action buttons at the bottom of the screen - Show the Recycle Bin at the folders screen + Mostrar alguns botões de ação na base do ecrã + Mostrar reciclagem no ecrã de pastas Miniaturas Multimédia em ecrã completo Detalhes extra - Bottom actions + Ações em baixo - Manage visible bottom actions - Toggle favorite - Toggle file visibility + Gerir botões de ação + Alternar favoritos + Alternar visibilidade dos ficheiros How can I make Simple Gallery the default device gallery? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f2967a2d7..0871f6612 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -38,6 +38,7 @@ Видео GIF Изображения RAW + SVGs При заданных фильтрах медиафайлы не найдены Изменить фильтры @@ -153,7 +154,7 @@ Выбрать подробности файла Масштабирование одним пальцем при просмотре изображения Мгновенное переключение медиафайлов нажатием по краю экрана - Заменять масштабируемые изображения высококачественными + Allow deep zooming images Не показывать подробности при скрытой строке состояния Делать дополнительную проверку, чтобы избежать показа неподдерживаемых файлов Показывать кнопки действий в нижней части экрана diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 5bb5d7536..abec90613 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -38,6 +38,7 @@ Videá GIFká RAW obrázky + SVGčká So zvolenými filtrami sa nenašli žiadne média súbory. Zmeniť filtre @@ -153,7 +154,7 @@ Spravovať rozšírené vlastnosti Povoliť približovanie jedným prstom v celoobrazovkovom režime Povoliť instantné prepínanie médií kliknutím na okraj obrazovky - Nahradiť hlboko priblížiteľné obrázky s obrázkami s lepšou kvalitou + Povoliť hlboké približovanie obrázkov Skryť rozšírené vlastnosti ak je skrytá stavová lišta Predísť zobrazovaniu neplatných súborov dodatočnou kontrolou Zobraziť niektoré akčné tlačidlá na spodku obrazovky diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index fc4b4e294..a0dc8f579 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -38,6 +38,7 @@ Videor GIF-bilder RAW images + SVGs Inga mediefiler hittades med valda filter. Ändra filter @@ -153,7 +154,7 @@ Hantera utökad information Tillåt zoomning med ett finger när media visas i helskärmsläge Tillåt snabbyte av media genom tryckning på skärmens kanter - Ersätt djupt zoombara bilder med bilder av bättre kvalitet + Allow deep zooming images Dölj utökad information när statusfältet är dolt Gör en extra kontroll för att hindra ogiltiga filer från att visas Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9bf18310a..9db6e91dc 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -38,6 +38,7 @@ Videos GIFs RAW images + SVGs No media files have been found with the selected filters. Change filters @@ -153,7 +154,7 @@ Manage extended details Allow one finger zoom at fullscreen media Allow instantly changing media by clicking on screen sides - Replace deep zoomable images with better quality ones + Allow deep zooming images Hide extended details when status bar is hidden Do an extra check to avoid showing invalid files Show some action buttons at the bottom of the screen diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 32b143cba..710d0ef86 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -38,6 +38,7 @@ 视频 GIFs RAW 图片 + SVGs 所选的过滤器没有找到媒体文件。 更改过滤器 @@ -153,7 +154,7 @@ 要显示的详细信息项目 单指缩放 通过单击屏幕边缘来切换媒体 - 用质量更好的图像替换可深度缩放的图像 + Allow deep zooming images 当状态栏隐藏时隐藏扩展详情 额外检查以避免显示无效的文件 在屏幕底部显示一些操作按钮 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 21415b300..e930cba69 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -28,9 +28,9 @@ 強制直向 強制橫向 使用預設方向 - Fix Date Taken value - Fixing… - Dates fixed successfully + 修復拍照日期數值 + 修復中… + 日期修復成功 篩選媒體檔案 @@ -38,6 +38,7 @@ 影片 GIF RAW圖檔 + SVGs 選擇的篩選條件未發現媒體檔案。 更改篩選條件 @@ -87,7 +88,7 @@ 水平翻轉 垂直翻轉 用其他程式編輯 - Free + 自由 簡易桌布 @@ -153,11 +154,11 @@ 管理詳細資訊 全螢幕時允許單指縮放 允許點擊螢幕邊緣來快速切換媒體檔案 - 可深度縮放的圖片用品質更佳的來取代 + Allow deep zooming images 狀態欄隱藏時,同時隱藏詳細資訊 進行額外檢查,避免顯示無效的檔案 在螢幕底部顯示一些操作按鈕 - Show the Recycle Bin at the folders screen + 在資料夾畫面顯示回收桶 縮圖 @@ -166,9 +167,9 @@ 底部操作 - 管理可見的底部操作 - 加入/移除我的最愛 - 檔案顯示/隱藏 + 管理要顯示的底部操作 + 我的最愛 + 檔案顯示 我如何將簡易相簿設為預設相簿? @@ -195,8 +196,8 @@ 是的,你能夠在編輯器內拉動圖片角落來裁剪圖片。要進入編輯器,你可以長按圖片縮圖然後選擇[編輯],或是在全螢幕檢視下選擇[編輯]。 我可以歸類媒體檔案的縮圖嗎? 當然,只要在縮圖瀏覽中使用[歸類]選單項目就可以了。你能依多種條件歸類檔案,包含拍照日期。如果你使用了[資料夾內容全部顯示]功能,你還能以資料夾來歸類。 - 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\". + 依拍照日期排序似乎沒正確運作,我該如何修復? + 那很可能是由於檔案從某處複製過來所造成的。你可以選擇檔案縮圖,然後選擇\"修復拍照日期數值\"來進行修復。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 79e076e58..e22f466a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,6 +38,7 @@ Videos GIFs RAW images + SVGs No media files have been found with the selected filters. Change filters @@ -153,7 +154,7 @@ Manage extended details Allow one finger zoom at fullscreen media Allow instantly changing media by clicking on screen sides - Replace deep zoomable images with better quality ones + Allow deep zooming images Hide extended details when status bar is hidden Do an extra check to avoid showing invalid files Show some action buttons at the bottom of the screen diff --git a/build.gradle b/build.gradle index 82672aab8..b7a332342 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.2.51' + ext.kotlin_version = '1.2.60' repositories { jcenter() @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' + classpath 'com.android.tools.build:gradle:3.1.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong