diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c606839e..e563a11e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,21 @@ Changelog ========== +Version 6.9.6 *(2019-09-12)* +---------------------------- + + * Improved the performance of loading fullscreen images in some cases + * Properly handle some specific SD cards + * Properly fetch Date Taken value on Android 10 + +Version 6.9.5 *(2019-09-08)* +---------------------------- + + * Added optional thumbnail icons for showing GIF/SVG/RAW file types + * Properly handle Date Taken value at copy/move/edit + * Fixed a glitch with white top actionmenu at selecting items + * Fixed fullscreen mode toggling on Chromebooks + Version 6.9.4 *(2019-08-21)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index c67ed8ec4..943214ec9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.simplemobiletools.gallery.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 264 - versionName "6.9.4" + versionCode 266 + versionName "6.9.6" multiDexEnabled true setProperty("archivesBaseName", "gallery") vectorDrawables.useSupportLibrary = true @@ -62,7 +62,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.17.3' + implementation 'com.simplemobiletools:commons:5.17.17' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1' @@ -75,8 +75,8 @@ dependencies { implementation 'info.androidhive:imagefilters:1.0.7' implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.caverock:androidsvg-aar:1.3' - implementation 'com.github.tibbi:gestureviews:4444214285' - implementation 'com.github.tibbi:subsampling-scale-image-view:8341253173' + implementation 'com.github.tibbi:gestureviews:a2208ce9d9' + implementation 'com.github.tibbi:subsampling-scale-image-view:7810989016' kapt 'com.github.bumptech.glide:compiler:4.9.0' // keep it here too, not just in Commons, else loading SVGs wont work kapt 'androidx.room:room-compiler:2.1.0' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt index 2e6741f26..d96a77c50 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt @@ -39,6 +39,7 @@ import com.simplemobiletools.gallery.pro.dialogs.OtherAspectRatioDialog import com.simplemobiletools.gallery.pro.dialogs.ResizeDialog import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog import com.simplemobiletools.gallery.pro.extensions.config +import com.simplemobiletools.gallery.pro.extensions.fixDateTaken import com.simplemobiletools.gallery.pro.extensions.openEditor import com.simplemobiletools.gallery.pro.helpers.* import com.simplemobiletools.gallery.pro.models.FilterItem @@ -874,7 +875,9 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } private fun scanFinalPath(path: String) { - rescanPaths(arrayListOf(path)) { + val paths = arrayListOf(path) + rescanPaths(paths) { + fixDateTaken(paths, false) setResult(Activity.RESULT_OK, intent) toast(R.string.file_saved) finish() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt index 3f6993df1..2535031c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt @@ -409,14 +409,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { config.addIncludedFolder(otgPath) } - if (config.OTGPath.isEmpty()) { + // OTG handling has been changed again in SDK version 28, the old method no longer works + /*if (config.OTGPath.isEmpty()) { runOnUiThread { ConfirmationDialog(this, getString(R.string.usb_detected), positive = R.string.ok, negative = 0) { config.wasOTGHandled = true showOTGPermissionDialog() } } - } + }*/ } } } @@ -949,7 +950,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val foldersToScan = mediaFetcher.getFoldersToScan() foldersToScan.add(FAVORITES) - if (config.useRecycleBin && config.showRecycleBinAtFolders) { + if (config.showRecycleBinAtFolders) { foldersToScan.add(RECYCLE_BIN) } else { foldersToScan.remove(RECYCLE_BIN) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt index 7cf212687..53276bf15 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt @@ -323,19 +323,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0 } - view_pager.adapter?.let { - (it as MyPagerAdapter).toggleFullscreen(mIsFullScreen) - checkSystemUI() - val newAlpha = if (mIsFullScreen) 0f else 1f - top_shadow.animate().alpha(newAlpha).start() - if (bottom_actions.isVisible()) { - bottom_actions.animate().alpha(newAlpha).start() - arrayOf(bottom_favorite, bottom_edit, bottom_share, bottom_delete, bottom_rotate, bottom_properties, bottom_change_orientation, - bottom_slideshow, bottom_show_on_map, bottom_toggle_file_visibility, bottom_rename).forEach { - it.isClickable = !mIsFullScreen - } - } - } + checkSystemUI() + fullscreenToggled() } if (intent.action == "com.android.camera.action.REVIEW") { @@ -576,7 +565,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View val fileDirItems = arrayListOf(FileDirItem(currPath, currPath.getFilenameFromPath())) tryCopyMoveFilesTo(fileDirItems, isCopyOperation) { - fixDateTaken(arrayListOf(currPath), false) + val newPath = "$it/${currPath.getFilenameFromPath()}" + rescanPaths(arrayListOf(newPath)) { + fixDateTaken(arrayListOf(newPath), false) + } + config.tempFolderPath = "" if (!isCopyOperation) { refreshViewPager() @@ -1078,6 +1071,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun fragmentClicked() { mIsFullScreen = !mIsFullScreen checkSystemUI() + if (isChromebook()) { + fullscreenToggled() + } } override fun videoEnded(): Boolean { @@ -1134,6 +1130,21 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } } + private fun fullscreenToggled() { + view_pager.adapter?.let { + (it as MyPagerAdapter).toggleFullscreen(mIsFullScreen) + val newAlpha = if (mIsFullScreen) 0f else 1f + top_shadow.animate().alpha(newAlpha).start() + if (bottom_actions.isVisible()) { + bottom_actions.animate().alpha(newAlpha).start() + arrayOf(bottom_favorite, bottom_edit, bottom_share, bottom_delete, bottom_rotate, bottom_properties, bottom_change_orientation, + bottom_slideshow, bottom_show_on_map, bottom_toggle_file_visibility, bottom_rename).forEach { + it.isClickable = !mIsFullScreen + } + } + } + } + private fun updateActionbarTitle() { runOnUiThread { if (mPos < getCurrentMedia().size) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt index dafd0cc89..538b3ecb8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt @@ -442,7 +442,12 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList activity.tryCopyMoveFilesTo(fileDirItems, isCopyOperation) { - activity.fixDateTaken(paths, false) + val destinationPath = it + val newPaths = fileDirItems.map { "$destinationPath/${it.name}" }.toMutableList() as java.util.ArrayList + activity.rescanPaths(newPaths) { + activity.fixDateTaken(newPaths, false) + } + config.tempFolderPath = "" listener?.refreshItems() finishActMode() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt index f76fae3de..7c06e085d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt @@ -326,13 +326,18 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList + activity.rescanPaths(newPaths) { + activity.fixDateTaken(newPaths, false) + } if (!isCopyOperation) { listener?.refreshItems() - activity.updateFavoritePaths(fileDirItems, it) + activity.updateFavoritePaths(fileDirItems, destinationPath) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/FilterMediaDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/FilterMediaDialog.kt index 0802d5c67..b4c072021 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/FilterMediaDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/FilterMediaDialog.kt @@ -19,6 +19,7 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result: 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 + filter_media_portraits.isChecked = filterMedia and TYPE_PORTRAITS != 0 } AlertDialog.Builder(activity) @@ -41,6 +42,8 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result: result += TYPE_RAWS if (view.filter_media_svgs.isChecked) result += TYPE_SVGS + if (view.filter_media_portraits.isChecked) + result += TYPE_PORTRAITS activity.config.filterMedia = result callback(result) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt index bb271b7ac..34f617e6e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt @@ -292,7 +292,9 @@ fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList, mediumDa callback() } - fixDateTaken(newPaths, false) + rescanPaths(newPaths) { + fixDateTaken(newPaths, false) + } } } @@ -346,17 +348,19 @@ fun Activity.hasNavBar(): Boolean { return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels > 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels > 0) } -fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, callback: (() -> Unit)? = null) { +fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, hasRescanned: Boolean = false, callback: (() -> Unit)? = null) { val BATCH_SIZE = 50 if (showToasts) { toast(R.string.fixing) } + val pathsToRescan = ArrayList() try { var didUpdateFile = false val operations = ArrayList() val mediumDao = galleryDB.MediumDao() - rescanPaths(paths) { + + ensureBackgroundThread { for (path in paths) { val dateTime = ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL) ?: ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME) ?: continue @@ -385,6 +389,10 @@ fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, callbac mediumDao.updateFavoriteDateTaken(path, timestamp) didUpdateFile = true + + if (!hasRescanned && getFileDateTaken(path) == 0L) { + pathsToRescan.add(path) + } } val resultSize = contentResolver.applyBatch(MediaStore.AUTHORITY, operations).size @@ -392,12 +400,18 @@ fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, callbac didUpdateFile = false } - runOnUiThread { - if (showToasts) { - toast(if (didUpdateFile) R.string.dates_fixed_successfully else R.string.unknown_error_occurred) - } + if (hasRescanned || pathsToRescan.isEmpty()) { + runOnUiThread { + if (showToasts) { + toast(if (didUpdateFile) R.string.dates_fixed_successfully else R.string.unknown_error_occurred) + } - callback?.invoke() + callback?.invoke() + } + } else { + rescanPaths(pathsToRescan) { + fixDateTaken(paths, showToasts, true) + } } } } catch (e: Exception) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ArrayList.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ArrayList.kt index 27289c37f..551b47d61 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ArrayList.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ArrayList.kt @@ -25,5 +25,9 @@ fun ArrayList.getDirMediaTypes(): Int { types += TYPE_SVGS } + if (any { it.isPortrait() }) { + types += TYPE_PORTRAITS + } + return types } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt index a19e36606..86bd21488 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt @@ -143,7 +143,7 @@ fun Context.movePinnedDirectoriesToFront(dirs: ArrayList): ArrayList< } } - if (config.useRecycleBin && config.showRecycleBinAtFolders && config.showRecycleBinLast) { + if (config.showRecycleBinAtFolders && config.showRecycleBinLast) { val binIndex = dirs.indexOfFirst { it.isRecycleBin() } if (binIndex != -1) { val bin = dirs.removeAt(binIndex) @@ -566,7 +566,7 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: ArrayList() } - if (!config.showRecycleBinAtFolders || !config.useRecycleBin) { + if (!config.showRecycleBinAtFolders) { directories.removeAll { it.isRecycleBin() } } @@ -584,7 +584,8 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: (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_SVGS != 0 && it.types and TYPE_SVGS != 0) + (filterMedia and TYPE_SVGS != 0 && it.types and TYPE_SVGS != 0) || + (filterMedia and TYPE_PORTRAITS != 0 && it.types and TYPE_PORTRAITS != 0) } }) as ArrayList @@ -640,7 +641,8 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag (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_SVGS != 0 && it.type == TYPE_SVGS) + (filterMedia and TYPE_SVGS != 0 && it.type == TYPE_SVGS) || + (filterMedia and TYPE_PORTRAITS != 0 && it.type == TYPE_PORTRAITS) } }) as ArrayList @@ -852,3 +854,29 @@ fun Context.updateDirectoryPath(path: String) { val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize) updateDBDirectory(directory, galleryDB.DirectoryDao()) } + +fun Context.getFileDateTaken(path: String): Long { + val projection = arrayOf( + MediaStore.Images.Media.DATE_TAKEN + ) + + val uri = MediaStore.Files.getContentUri("external") + val selection = "${MediaStore.Images.Media.DATA} = ?" + val selectionArgs = arrayOf(path) + + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + do { + try { + return cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN) + } catch (e: Exception) { + } + } while (cursor.moveToNext()) + } + } + + return 0L +} + +fun Context.isChromebook() = packageManager.hasSystemFeature("org.chromium.arc.device_management") diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt index ac921defd..0d708ce1a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt @@ -16,6 +16,15 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath } val file = File(this) + if (file.name.startsWith("img_", true)) { + val files = file.list() + if (files != null) { + if (files.any { it.contains("portrait", true) && it.contains("burst", true) }) { + return false + } + } + } + if (!showHidden && file.isHidden) { return false } else if (includedPaths.contains(this)) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt index 9c39b95d0..51b7b7992 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt @@ -57,7 +57,7 @@ import java.util.* class PhotoFragment : ViewPagerFragment() { private val DEFAULT_DOUBLE_TAP_ZOOM = 2f - private val ZOOMABLE_VIEW_LOAD_DELAY = 150L + private val ZOOMABLE_VIEW_LOAD_DELAY = 100L private val SAME_ASPECT_RATIO_THRESHOLD = 0.01 // devices with good displays, but the rest of the hardware not good enough for them diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt index 134df275c..7f91dc21b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt @@ -162,7 +162,8 @@ const val TYPE_VIDEOS = 2 const val TYPE_GIFS = 4 const val TYPE_RAWS = 8 const val TYPE_SVGS = 16 -const val TYPE_DEFAULT_FILTER = TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS or TYPE_SVGS +const val TYPE_PORTRAITS = 32 +const val TYPE_DEFAULT_FILTER = TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS or TYPE_SVGS or TYPE_PORTRAITS const val LOCATION_INTERNAL = 1 const val LOCATION_SD = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt index 8d381eeed..ad7070351 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt @@ -178,7 +178,7 @@ class MediaFetcher(val context: Context) { val showHidden = config.shouldShowHidden val excludedFolders = config.excludedFolders foldersToScan = foldersToScan.filter { it.shouldFolderBeVisible(excludedFolders, includedFolders, showHidden) } as ArrayList - return foldersToScan.distinctBy { it.getDistinctPath() }.toSet() as LinkedHashSet + return foldersToScan.distinctBy { it.getDistinctPath() }.toMutableSet() as LinkedHashSet } private fun addFolder(curFolders: ArrayList, folder: String) { @@ -206,12 +206,34 @@ class MediaFetcher(val context: Context) { val checkProperFileSize = getProperFileSize || config.fileLoadingPriority == PRIORITY_COMPROMISE val checkFileExistence = config.fileLoadingPriority == PRIORITY_VALIDITY val showHidden = config.shouldShowHidden + val showPortraits = filterMedia and TYPE_PORTRAITS != 0 val dateTakens = if (getProperDateTaken && folder != FAVORITES && !isRecycleBin) getFolderDateTakens(folder) else HashMap() + val subdirs = ArrayList() // used only for Portrait photos starting with "IMG_" for now val files = when (folder) { - FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toTypedArray() - RECYCLE_BIN -> deletedMedia.map { File(it.path) }.toTypedArray() - else -> File(folder).listFiles() ?: return media + FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toMutableList() as ArrayList + RECYCLE_BIN -> deletedMedia.map { File(it.path) }.toMutableList() as ArrayList + else -> { + val allFiles = File(folder).listFiles() ?: return media + val notDirs = ArrayList() + allFiles.forEach { + if (it.isDirectory) { + if (showPortraits && it.name.startsWith("img_", true)) { + subdirs.add(it) + } + } else { + notDirs.add(it) + } + } + + notDirs + } + } + + for (subdir in subdirs) { + val portraitFiles = subdir.listFiles() ?: continue + val cover = portraitFiles.firstOrNull { it.name.contains("cover", true) } ?: portraitFiles.first() + files.add(cover) } for (file in files) { @@ -283,6 +305,7 @@ class MediaFetcher(val context: Context) { media.add(medium) } } + return media } @@ -302,9 +325,11 @@ class MediaFetcher(val context: Context) { if (cursor.moveToFirst()) { do { try { - val path = cursor.getStringValue(MediaStore.Images.Media.DISPLAY_NAME) val dateTaken = cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN) - dateTakens[path] = dateTaken + if (dateTaken != 0L) { + val path = cursor.getStringValue(MediaStore.Images.Media.DISPLAY_NAME) + dateTakens[path] = dateTaken + } } catch (e: Exception) { } } while (cursor.moveToNext()) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt index 6044219d7..04c685229 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt @@ -44,6 +44,8 @@ data class Medium( fun isSVG() = type == TYPE_SVGS + fun isPortrait() = type == TYPE_PORTRAITS + fun isHidden() = name.startsWith('.') fun getBubbleText(sorting: Int, context: Context) = when { diff --git a/app/src/main/res/drawable/ic_portrait_photo_vector.xml b/app/src/main/res/drawable/ic_portrait_photo_vector.xml new file mode 100644 index 000000000..e94d39587 --- /dev/null +++ b/app/src/main/res/drawable/ic_portrait_photo_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index dcf322124..3dffbf1bf 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -38,6 +38,10 @@ android:layout_alignParentBottom="true" android:background="@drawable/gradient_background"/> + + - - diff --git a/app/src/main/res/layout/dialog_filter_media.xml b/app/src/main/res/layout/dialog_filter_media.xml index b90fc9aeb..f707967a2 100644 --- a/app/src/main/res/layout/dialog_filter_media.xml +++ b/app/src/main/res/layout/dialog_filter_media.xml @@ -49,4 +49,12 @@ android:paddingBottom="@dimen/activity_margin" android:text="@string/svgs"/> + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index f0e7e674e..52217e9ef 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -42,6 +42,7 @@ الصور المتحركة RAW images SVGs + Portraits لم يتم العثور على ملفات وسائط مع الفلاتر المحددة تغيير الفلاتر diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 19c550c8c..4dc79a078 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -42,6 +42,7 @@ GIFs RAW images SVGs + Portraits No media files have been found with the selected filters. Change filters diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 9a97506aa..46859b3f0 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -42,6 +42,7 @@ GIFs Imatges RAW SVGs + Portraits No s’han tronat arxius amb els filtres seleccionats. Canviar filtres diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d5d0e769b..9a7976420 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -42,6 +42,7 @@ GIFy RAW obrázky SVGčka + Portraits Se zvolenými filtry nebyly nalezeny žádné médiální soubory. Změnit filtry diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e9452a427..ee4223671 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -42,6 +42,7 @@ GIF\'er RAW-billeder SVG\'er + Portraits Der blev ikke fundet nogen filer med det valgte filter. Skift filter diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index db3af073c..02940e5e8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -42,6 +42,7 @@ GIFs RAW-Bilder SVGs + Portraits Keine Medien für die ausgewählten Filter gefunden. Filter ändern @@ -180,7 +181,7 @@ Zeige den Papierkorb als letztes Element auf dem Hauptbildschirm Erlaube das Schließen der Vollbildansicht mit einer Abwärtsgeste Erlaube 1:1 Zoom mit zweimaligem, doppeltem Antippen - Öffne Videos immer auf einem speraten Bildschirm mit neuen horizontalen Gesten + Öffne Videos immer auf einem seperaten Bildschirm mit neuen horizontalen Gesten Show a notch if available Rotieren von Bildern mit Gesten zulassen Priorität beim Laden von Dateien diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index c4dc1e9cd..12a2da51e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -42,6 +42,7 @@ GIFs RAW Εικόνες SVGs + Portraits Δεν βρέθηκε κανένα αρχείο πολυμέσων με τα επιλεγμένα φίλτρα. Αλλαγή φίλτρων diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3081ab47c..4dba0c743 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -42,6 +42,7 @@ GIFs Imagenes RAW SVGs + Portraits No se han encontrado ficheros con los filtros seleccionados. Cambiar filtros diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 4242e9b45..0a1f2763e 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -42,6 +42,7 @@ GIFit RAW images SVGs + Portraits Mediaa ei löytynyt valituilla suotimilla. Muuta suotimia diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 19ef5b79b..71f01f2f4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -42,6 +42,7 @@ GIFs Images RAW SVGs + Portraits Aucun fichier média trouvé avec les filtres sélectionnés Modifier les filtres @@ -187,7 +188,7 @@ Rapide Compromis Eviter l\'affichage de fichiers invalides - Show image file types + Afficher les types d\'image Miniatures diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 2029b965c..dfda9beff 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -42,6 +42,7 @@ GIFs RAW images SVGs + Portraits Non se atoparon medios dos indicados polo filtro. Cambiar filtro diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 5e3835a4a..2a668a5b6 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -42,6 +42,7 @@ GIF-ovi RAW slike SVG-ovi + Portraits Nije pronađena nijedna datoteka s odabranim filtrom. Promijeni filter diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 5c58d71c2..afa7bce05 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -42,6 +42,7 @@ GIF RAW kép SVG + Portraits A kiválasztott szűrők nem találtak médiafájlokat. Szűrők változtatása diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 373ccc640..90c413baa 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -42,6 +42,7 @@ GIF Gambar RAW SVG + Portraits Tidak ditemukan berkas media yang sesuai dengan filter ini. Ubah filter diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 373ccc640..90c413baa 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -42,6 +42,7 @@ GIF Gambar RAW SVG + Portraits Tidak ditemukan berkas media yang sesuai dengan filter ini. Ubah filter diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 8d6ad7350..14b13152e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -42,6 +42,7 @@ GIF Immagini RAW SVG + Portraits Nessun file trovato con il filtro selezionato. Cambia filtro @@ -187,7 +188,7 @@ Veloce Compromesso Evita di mostrare file non validi - Show image file types + Mostra i tipi di file immagine Anteprime diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 607b80397..2ce11bb4c 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -42,6 +42,7 @@ GIF RAW SVG + Portraits 条件に該当するメディアがありません。 絞り込み条件を変更 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 39a8bc851..c7d7a61c6 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -42,6 +42,7 @@ GIFs RAW images SVGs + Portraits 설정된 필터와 일치하는 컨텐츠가 존재하지 않습니다. 필터 변경 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 658b2cd3f..1b6ca569d 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -42,6 +42,7 @@ GIF\'ai RAW images SVGs + Portraits Su pasirinktais filtrais nerasta medijos bylų. Pakeisti filtrus diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 468f37265..122fe3c21 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -42,6 +42,7 @@ GIF-bilder RAW-format-bilder SVG-bilder + Portraits Ingen media-filer er funnet med de valgte filtrene. Endre filtere diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index cb2217851..381064d46 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -42,6 +42,7 @@ GIF-bestanden RAW-afbeeldingen SVG-vectorafbeeldingen + Portraits Er zijn geen bestanden gevonden met de huidige filters. Filters aanpassen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0b3fa9f1c..eca4efc7c 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -42,6 +42,7 @@ GIFy Obrazy RAW Obrazy SVG + Portraits Nie znaleziono multimediów zgodnych z zastosowanymi filtrami. Zmień filtry diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 10378db4f..16b50c14e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -42,6 +42,7 @@ GIFs Imagens RAW SVGs + Portraits Nenhum arquivo de mídia encontrado a partir dos filtros selecionados. Alterar filtros diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 9a782ef15..2c7e35c9a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -33,7 +33,7 @@ Dados corrigidos com sucesso Partilhar foto redimensionada Olá,\n\nparece que você utilizou a opção de atualização existente na versão antiga. Agora já pode desinstalar essa versão antiga.\n\nApenas perderá os itens existentes na reciclagem e os favoritos não assinalados mas também terá que repor as predefinições da aplicação.\n\nObrigado! - Switch to file search across all visible folders + Trocar para pesquisa de ficheiros em todas as pastas visíveis Filtrar multimédia @@ -42,6 +42,7 @@ GIF Imagens RAW SVG + Portraits Não foram encontrados ficheiros que cumpram os requisitos. Alterar filtros @@ -187,7 +188,7 @@ Velocidade Compromisso Não mostrar ficheiros inválidos - Show image file types + Mostrar o tipo de imagem Miniaturas diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 800aeecae..af3760f3a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -42,6 +42,7 @@ GIF RAW SVG + Portraits При заданных фильтрах медиафайлы не найдены Изменить фильтры diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 29f2feeff..273768f37 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -42,6 +42,7 @@ GIFká RAW obrázky SVGčká + Portréty So zvolenými filtrami sa nenašli žiadne média súbory. Zmeniť filtre diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index e5586dc90..1cb5167d0 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -42,6 +42,7 @@ GIFi RAW slike SVGji + Portraits Na podlagi izbranih filtrov ne najdem nobenih medijskih datotek. Spremeni filtre diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 2f4cff456..1ad685593 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -42,6 +42,7 @@ ГИФови Сирове слике СВГови + Portraits Нема пронађених медија датотека са изабраним филтерима. Измени филтере diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 2b0520f23..3b9bd7220 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -42,6 +42,7 @@ GIF-bilder RAW-bilder SVG-bilder + Portraits Inga mediefiler hittades med valda filter. Ändra filter diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index a7e5c8108..c41109bd4 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -42,6 +42,7 @@ GIF\'ler RAW resimler SVG\'ler + Portraits Seçilen filtrelerle hiçbir medya dosyası bulunamadı. Filtreleri değiştir @@ -64,7 +65,7 @@ Dahil edilen klasörleri yönet Klasör ekle Medya içeren, ancak uygulama tarafından tanınmayan bazı klasörleriniz varsa, bunları elle ekleyebilirsiniz.\n\nBuraya bazı öğeler eklemek başka bir klasörü hariç tutmaz. - No media files have been found. You can solve it by adding the folders containing media files manually. + Hiçbir medya dosyası bulunamadı. Medya dosyalarını içeren klasörleri elle ekleyerek çözebilirsiniz. Yeniden boyutlandır @@ -116,8 +117,8 @@ Rastgele sırala Geriye doğru git Slayt gösterisini tekrarla - Animation - None + Animasyon + Hiçbiri Fade Slide Slayt gösterisi sona erdi @@ -134,14 +135,14 @@ Dosyaları gruplandırma Klasör Son değiştirilme - Last modified (daily) - Last modified (monthly) + Son değiştirilme (günlük) + Son değiştirilme (aylık) Çekildiği tarih - Date taken (daily) - Date taken (monthly) + Çekildiği tarih (günlük) + Çekildiği tarih (aylık) Dosya türü Uzantı - Please note that grouping and sorting are 2 independent fields + Lütfen gruplandırmanın ve sıralamanın 2 bağımsız alan olduğunu unutmayın Widget\'ta gösterilen klasör: @@ -183,11 +184,11 @@ Videoları yeni yatay hareketlerle daima ayrı bir ekranda aç Varsa bir çentik göster Hareketlerle resimlerin döndürülmesine izin ver - File loading priority - Speed - Compromise - Avoid showing invalid files - Show image file types + Dosya yükleme önceliği + Hız + Ödünsüz + Geçersiz dosyaları göstermekten kaçın + Resim dosyası türlerini göster Küçük resimler diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b56f7184a..d78bb72bb 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -42,6 +42,7 @@ GIF-зображення RAW-зображення SVG-зображення + Portraits З вибраними фільтрами мультимедійні файли не знайдено. Змінити фільтри @@ -187,7 +188,7 @@ Швидкість Компроміс Запобігати показу пошкоджених файлів - Show image file types + Показувати типи файлів зображень Ескізи diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 7a37636b6..7dd7e05e0 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,78 +1,79 @@ 简约图库 - 简约图库 + 图库 编辑 打开相机 - (隐藏) - (排除) - 锁定目录 - 解除锁定目录 - 固定到顶部 + (已隐藏) + (已排除) + 固定文件夹 + 取消固定文件夹 + 置顶固定 文件视图 - 所有目录 - 目录视图 - 其他目录 - 在地图中显示 + 所有文件夹 + 文件夹视图 + 其他文件夹 + 在地图上显示 未知位置 - 增加一栏 - 减少一栏 - 更改封面图片 + 显示更多项目 + 显示更少项目 + 更换封面图片 选择图片 使用默认 音量 亮度 - 锁定方向 - 解锁方向 - 改变方向 + 锁定屏幕方向 + 解锁屏幕方向 + 更改屏幕方向 强制竖屏 强制横屏 - 默认 + 使用默认屏幕方向 修复拍摄日期 正在修复… 日期修复成功 - 调整图像尺寸并分享 - 嘿,\n\n看起来您是从旧的免费版应用程序升级的。您现在可以卸载旧版本,在该版本应用的设置菜单顶部有一个“升级到专业版”按钮。\n\n此操作将会删除回收站项目,并取消收藏已收藏的项目,你的应用设置也将会重置。\n\n谢谢! - 切换文件搜索目标为所有可见的文件夹 + 调整尺寸并分享 + 嘿,\n\n你似乎已经从旧的免费版应用升级。你现在可以卸载旧版本,在该版本的应用设置顶部有一个“升级到专业版”按钮。\n\n此操作会删除回收站项目,取消标记收藏项目,并重置应用设置。\n\n谢谢! + 切换文件搜索范围为所有可见的文件夹 - 要显示的媒体文件 + 筛选媒体文件 图片 视频 - GIFs + GIF RAW 图片 - SVGs - 所选的过滤器没有找到媒体文件。 - 更改过滤器 + SVG + Portraits + 没有媒体文件匹配选定的筛选条件。 + 更改筛选条件 - 通过添加文件 \'.nomedia\' 到目录,可以防止目录及其子目录下的所有媒体被扫描。您可以通过设置中的 \'显示隐藏目录\' 选项改变设置,是否继续? + 该功能通过添加“.nomedia”文件到文件夹来隐藏它,这也会隐藏其所有子文件夹。您可以通过启用设置中的“显示隐藏的项目”选项来查看它们,是否继续? 排除 - 排除目录 - 管理排除目录 - 目录及其子目录中的媒体将不会在“简约图库”中显示,您可以在设置更改。 - 是否排除父目录? + 排除的文件夹 + 管理排除的文件夹 + 该操作仅会在“简约图库”中排除显示选定的文件夹及其子文件夹。您可以在设置中管理排除的文件夹。 + 是否排除父文件夹? 此目录及其子目录中的媒体将不会在“简约图库”中显示,但是其它应用可以访问。如果您想对其它应用隐藏,请使用隐藏功能。 - 移除全部 - 是否删除排除列表中的所有项目?此操作不会删除文件夹本身。 - 隐藏目录 - 管理隐藏目录 + 全部移除 + 是否移除排除列表中的所有项目?此操作不会删除文件夹本身。 + 隐藏的文件夹 + 管理隐藏的文件夹 看起来你没有任何使用“.nomedia”文件隐藏的目录。 - 包含目录 - 管理包含目录 - 添加目录 + 包含的文件夹 + 管理包含的文件夹 + 添加文件夹 如果您还有应用未扫描到的媒体文件,请添加所在目录路径。 没有找到媒体文件。请手动添加包含媒体文件的文件夹。 - 缩放 - 缩放选定区域并保存 + 调整尺寸 + 调整选定项目的尺寸并保存 宽度 高度 - 保持纵横比 - 请输入有效分辨率 + 保持高宽比 + 请输入有效的分辨率 编辑器 @@ -82,8 +83,8 @@ 无效的图片路径 图片编辑失败 编辑方式: - 未找到可用图片编辑器 - 未知的文件路径 + 没有找到图片编辑器 + 未知文件位置 无法覆盖源文件 向左旋转 向右旋转 @@ -96,32 +97,32 @@ 简约壁纸 - 设为壁纸 - 壁纸设置失败 - 设为壁纸... + 设置为壁纸 + 设置壁纸失败 + 设置壁纸方式: 正在设置壁纸… - 壁纸设置成功 - 纵向长宽比 - 横向长宽比 - 主屏幕壁纸 - 锁屏壁纸 - 主屏幕和锁屏壁纸 + 设置壁纸成功 + 纵向高宽比 + 横向高宽比 + 主屏幕 + 锁定屏幕 + 主屏幕和锁定屏幕 幻灯片 间隔(秒): - 包括照片 - 包括视频 - 包括 GIFs + 包含照片 + 包含视频 + 包含GIF 随机顺序 - 倒播 - 循环幻灯片 + 倒序播放 + 循环播放 动画 - 渐变 + 渐隐 滑动 幻灯片结束 - 未发现可用媒体 + 没有找到可播放幻灯片媒体文件 更改视图类型 @@ -131,35 +132,35 @@ 分组依据 - 禁用文件分组 - 目录 - 最近修改 - 最后修改(按日) - 最后修改(按月) + 不分组文件 + 文件夹 + 最后修改时间 + 最后修改时间(按日) + 最后修改时间(按月) 拍摄时间 - 拍摄日期(按日) - 拍摄日期(按月) + 拍摄时间(按日) + 拍摄时间(按月) 文件类型 扩展名 - 请注意,分组和排序是相互独立的 + 请注意,分组和排序是两种独立的组织方式 - 要在小部件上显示的文件夹: + 在小工具上显示的文件夹: 显示文件夹名称 - 自动播放 + 自动播放视频 记住上次视频播放位置 显示文件名 循环播放视频 GIF 缩略图 - 浏览时最大亮度 - 裁剪缩略图 + 全屏查看媒体文件时最大亮度 + 裁剪缩略图为正方形 显示视频时长 - 全屏方向 + 旋转全屏媒体文件依据 系统设置 - 设备方向 - 根据长宽比 + 设备旋转 + 高宽比 全屏时使用黑色背景和状态栏 水平滚动缩略图 全屏时自动隐藏状态栏 @@ -184,10 +185,10 @@ 显示留海(如果可用) 允许使用手势旋转图像 文件加载优先级 - 速度 + 快速 折中 避免显示无效的文件 - Show image file types + 显示图片文件类型 缩略图 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index c572d9da7..046c9eb2b 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -42,6 +42,7 @@ GIF RAW圖檔 SVG + Portraits 選擇的篩選條件未發現媒體檔案。 更改篩選條件 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a2c94d6c2..d011e8b4f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -42,6 +42,7 @@ GIF RAW圖檔 SVG + Portraits 選擇的篩選條件未發現媒體檔案。 更改篩選條件 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72a9d9e6a..6ecf9a26d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,6 +42,7 @@ GIFs RAW images SVGs + Portraits No media files have been found with the selected filters. Change filters diff --git a/gradlew b/gradlew old mode 100755 new mode 100644