diff --git a/app/build.gradle b/app/build.gradle index 943214ec9..9dbe061d3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -62,7 +62,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.17.17' + implementation 'com.simplemobiletools:commons:5.17.19' 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' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt index b29dff33b..a1b3c8028 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt @@ -149,6 +149,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList filename.isGif() -> TYPE_GIFS filename.isRawFast() -> TYPE_RAWS filename.isSvg() -> TYPE_SVGS + file.isPortrait() -> TYPE_PORTRAITS else -> TYPE_IMAGES } @@ -280,7 +281,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList path.isVideoFast() && filter and TYPE_VIDEOS == 0 || path.isGif() && filter and TYPE_GIFS == 0 || path.isRawFast() && filter and TYPE_RAWS == 0 || - path.isSvg() && filter and TYPE_SVGS == 0) + path.isSvg() && filter and TYPE_SVGS == 0 || + path.isPortrait() && filter and TYPE_PORTRAITS == 0) } private fun initBottomActions() { 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 53276bf15..7a7f98fb0 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 @@ -336,6 +336,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View mPath.isGif() -> TYPE_GIFS mPath.isSvg() -> TYPE_SVGS mPath.isRawFast() -> TYPE_RAWS + mPath.isPortrait() -> TYPE_PORTRAITS else -> TYPE_IMAGES } 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 9d4201e3a..e43800976 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 @@ -448,7 +448,7 @@ fun Context.getFolderNameFromPath(path: String): String { fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList? = null) { target.isHorizontalScrolling = horizontalScroll - if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS) { + if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS || type == TYPE_PORTRAITS) { if (type == TYPE_IMAGES && path.isPng()) { loadPng(path, target, cropThumbnails, skipMemoryCacheAtPaths) } else { @@ -814,6 +814,7 @@ fun Context.addPathToDB(path: String) { path.isGif() -> TYPE_GIFS path.isRawFast() -> TYPE_RAWS path.isSvg() -> TYPE_SVGS + path.isPortrait() -> TYPE_PORTRAITS else -> TYPE_IMAGES } 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 ad7070351..fd9ba54ce 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 @@ -97,6 +97,11 @@ class MediaFetcher(val context: Context) { } } + if (filterMedia and TYPE_PORTRAITS != 0) { + query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ") + query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ") + } + if (filterMedia and TYPE_VIDEOS != 0) { videoExtensions.forEach { query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ") @@ -130,6 +135,11 @@ class MediaFetcher(val context: Context) { } } + if (filterMedia and TYPE_PORTRAITS != 0) { + args.add("%.jpg") + args.add("%.jpeg") + } + if (filterMedia and TYPE_VIDEOS != 0) { videoExtensions.forEach { args.add("%$it") @@ -208,7 +218,10 @@ class MediaFetcher(val context: Context) { 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 + + // used only for Portrait photos starting with "IMG_" for now + val subdirs = ArrayList() + val covers = ArrayList() val files = when (folder) { FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toMutableList() as ArrayList @@ -234,6 +247,7 @@ class MediaFetcher(val context: Context) { val portraitFiles = subdir.listFiles() ?: continue val cover = portraitFiles.firstOrNull { it.name.contains("cover", true) } ?: portraitFiles.first() files.add(cover) + covers.add(cover.absolutePath) } for (file in files) { @@ -242,13 +256,14 @@ class MediaFetcher(val context: Context) { } val path = file.absolutePath - val isImage = path.isImageFast() - val isVideo = if (isImage) false else path.isVideoFast() - val isGif = if (isImage || isVideo) false else path.isGif() - val isRaw = if (isImage || isVideo || isGif) false else path.isRawFast() - val isSvg = if (isImage || isVideo || isGif || isRaw) false else path.isSvg() + val isPortrait = covers.contains(path) + val isImage = if (isPortrait) false else path.isImageFast() + val isVideo = if (isPortrait || isImage) false else path.isVideoFast() + val isGif = if (isPortrait || isImage || isVideo) false else path.isGif() + val isRaw = if (isPortrait || isImage || isVideo || isGif) false else path.isRawFast() + val isSvg = if (isPortrait || isImage || isVideo || isGif || isRaw) false else path.isSvg() - if (!isImage && !isVideo && !isGif && !isRaw && !isSvg) + if (!isPortrait && !isImage && !isVideo && !isGif && !isRaw && !isSvg) continue if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0)) @@ -297,6 +312,7 @@ class MediaFetcher(val context: Context) { isGif -> TYPE_GIFS isRaw -> TYPE_RAWS isSvg -> TYPE_SVGS + isPortrait -> TYPE_PORTRAITS else -> TYPE_IMAGES }