chore: bump target SDK version to 35 (#595)

* chore: bump target SDK version to 35

* fix: address nullability issues

* chore: bump target SDK version to 36

* fix: avoid name clash with platform method

* refactor: update edge-to-edge implementation

* refactor: update edge-to-edge implementation

* refactor: update edge-to-edge implementation

* refactor: update edge-to-edge implementation

* refactor: migrate away from deprecated onBackPressed()

* fix: setup edge to edge in editor

* fix: replace removeFirst()/removeLast() with removeAt()

* fix: migrate away from deprecated `onBackPressed()`

* chore(deps): update org.fossify.commons to 5.5.0

* docs: update changelog

* docs: update changelog

* fix: add missing dependencies

* chore: update lint baselines
This commit is contained in:
Naveen Singh
2025-10-26 22:58:07 +05:30
committed by GitHub
parent 518e5bf40b
commit 179fc3b471
38 changed files with 818 additions and 873 deletions

View File

@@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Changed
- Compatibility updates for Android 15 & 16
### Fixed
- Fixed overlap between extended details and bottom actions ([#418])
## [1.7.0] - 2025-10-16
### Added
- Option to overwrite the original image when saving edits ([#62])
@@ -184,6 +190,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#365]: https://github.com/FossifyOrg/Gallery/issues/365
[#375]: https://github.com/FossifyOrg/Gallery/issues/375
[#379]: https://github.com/FossifyOrg/Gallery/issues/379
[#418]: https://github.com/FossifyOrg/Gallery/issues/418
[#447]: https://github.com/FossifyOrg/Gallery/issues/447
[#475]: https://github.com/FossifyOrg/Gallery/issues/475
[#525]: https://github.com/FossifyOrg/Gallery/issues/525

View File

@@ -141,10 +141,12 @@ detekt {
dependencies {
implementation(libs.fossify.commons)
implementation(libs.androidx.print)
implementation(libs.android.image.cropper)
implementation(libs.exif)
implementation(libs.android.gif.drawable)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.documentfile)
implementation(libs.androidx.media3.exoplayer)
implementation(libs.sanselan)
implementation(libs.androidphotofilters)

View File

@@ -53,6 +53,7 @@
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaInFolder( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean, lastModifieds: HashMap&lt;String, Long&gt;, dateTakens: HashMap&lt;String, Long&gt; ): ArrayList&lt;Medium&gt;</ID>
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaOnOTG( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean ): ArrayList&lt;Medium&gt;</ID>
<ID>CyclomaticComplexMethod:MediaSideScroll.kt$MediaSideScroll$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
<ID>CyclomaticComplexMethod:PhotoFragment.kt$PhotoFragment$override fun fullscreenToggled(isFullscreen: Boolean)</ID>
<ID>CyclomaticComplexMethod:PhotoFragment.kt$PhotoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
<ID>CyclomaticComplexMethod:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
<ID>CyclomaticComplexMethod:PickDirectoryDialog.kt$PickDirectoryDialog$private fun gotDirectories(newDirs: ArrayList&lt;Directory&gt;)</ID>
@@ -66,7 +67,6 @@
<ID>CyclomaticComplexMethod:ViewPagerFragment.kt$ViewPagerFragment$fun getMediumExtendedDetails(medium: Medium): String</ID>
<ID>EmptyCatchBlock:Activity.kt${ }</ID>
<ID>EmptyCatchBlock:Context.kt${ }</ID>
<ID>EmptyCatchBlock:EditActivity.kt$EditActivity${ }</ID>
<ID>EmptyCatchBlock:MainActivity.kt$MainActivity${ }</ID>
<ID>EmptyCatchBlock:MediaActivity.kt$MediaActivity${ }</ID>
<ID>EmptyCatchBlock:MediaFetcher.kt$MediaFetcher${ }</ID>
@@ -100,7 +100,6 @@
<ID>LargeClass:PhotoFragment.kt$PhotoFragment : ViewPagerFragment</ID>
<ID>LargeClass:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
<ID>LargeClass:VideoFragment.kt$VideoFragment : ViewPagerFragmentSurfaceTextureListenerOnSeekBarChangeListenerPlaybackSpeedListener</ID>
<ID>LargeClass:VideoPlayerActivity.kt$VideoPlayerActivity : SimpleActivityOnSeekBarChangeListenerSurfaceTextureListenerPlaybackSpeedListener</ID>
<ID>LargeClass:ViewPagerActivity.kt$ViewPagerActivity : SimpleActivityOnPageChangeListenerFragmentListener</ID>
<ID>LongMethod:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList&lt;Directory&gt;)</ID>
<ID>LongMethod:SettingsActivity.kt$SettingsActivity$private fun parseFile(inputStream: InputStream?)</ID>
@@ -281,18 +280,12 @@
<ID>MaxLineLength:EditActivity.kt$EditActivity$(binding.bottomEditorCropRotateActions.root.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1)</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$binding.bottomEditorDrawActions.bottomDrawWidth.setColors(getProperTextColor(), getProperPrimaryColor(), getProperBackgroundColor())</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$if</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$if (intent.extras?.containsKey(REAL_FILE_PATH) == true) intent.getStringExtra(REAL_FILE_PATH)?.getParentPath() else internalStoragePath</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true &amp;&amp; intent.extras!!.get(MediaStore.EXTRA_OUTPUT) is Uri -&gt; intent.extras!!.get(MediaStore.EXTRA_OUTPUT) as Uri</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$newPath = "$internalStoragePath/${getCurrentFormattedDateTime()}.${saveUri.toString().getFilenameExtension()}"</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$private fun getFiltersAdapter()</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$val layoutManager = binding.bottomEditorFilterActions.bottomActionsFilterList.layoutManager as LinearLayoutManager</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$val originalBitmap = Glide.with(applicationContext).asBitmap().load(uri).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$}</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity.&lt;no name provided&gt;$if</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity.&lt;no name provided&gt;$override</ID>
<ID>MaxLineLength:ExcludeFolderDialog.kt$ExcludeFolderDialog$radioGroup!!.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))</ID>
<ID>MaxLineLength:ExcludeFolderDialog.kt$ExcludeFolderDialog$val path = if (alternativePaths.isEmpty()) selectedPaths[0] else alternativePaths[radioGroup!!.checkedRadioButtonId]</ID>
<ID>MaxLineLength:ExcludedFoldersActivity.kt$ExcludedFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:FavoritesDao.kt$FavoritesDao$@Query("SELECT favorites.full_path FROM favorites INNER JOIN media ON favorites.full_path = media.full_path WHERE media.deleted_ts = 0")</ID>
<ID>MaxLineLength:FavoritesDao.kt$FavoritesDao$@Query("UPDATE OR REPLACE favorites SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath COLLATE NOCASE")</ID>
<ID>MaxLineLength:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$database.execSQL("CREATE TABLE IF NOT EXISTS `date_takens` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `full_path` TEXT NOT NULL, `filename` TEXT NOT NULL, `parent_path` TEXT NOT NULL, `date_taken` INTEGER NOT NULL, `last_fixed` INTEGER NOT NULL)")</ID>
@@ -302,8 +295,6 @@
<ID>MaxLineLength:GetMediaAsynctask.kt$GetMediaAsynctask$val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN &amp;&amp; it != FAVORITES &amp;&amp; !context.config.isFolderProtected(it) }</ID>
<ID>MaxLineLength:GrantAllFilesDialog.kt$GrantAllFilesDialog$.</ID>
<ID>MaxLineLength:GridSpacingItemDecoration.kt$GridSpacingItemDecoration$override</ID>
<ID>MaxLineLength:HiddenFoldersActivity.kt$HiddenFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:IncludedFoldersActivity.kt$IncludedFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:InstantItemSwitch.kt$InstantItemSwitch$if</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$// exclude probably unwanted folders, for example facebook stickers are split between hundreds of separate folders like</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$// recyclerview sometimes becomes empty at init/update, triggering an invisible refresh like this seems to work fine</ID>
@@ -359,12 +350,9 @@
<ID>MaxLineLength:MyWidgetProvider.kt$MyWidgetProvider$val pendingIntent = PendingIntent.getActivity(context, widget.widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:NewPhotoFetcher.kt$NewPhotoFetcher$if</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$if</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$mIsFullscreen = requireActivity().window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$orient = exif2.getTag(ExifInterface.TAG_ORIENTATION)?.getValueAsInt(defaultOrientation) ?: defaultOrientation</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$resources.getDimension(R.dimen.portrait_photos_stripe_height).toInt()</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$val actionsHeight = if (requireContext().config.bottomActions &amp;&amp; !mIsFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$val imageParser = JpegImageParser().getXmpXml(ByteSourceInputStream(it, mMedium.name), HashMap&lt;String, Any&gt;())</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$var bottomMargin = requireContext().navigationBarHeight + resources.getDimension(org.fossify.commons.R.dimen.normal_margin).toInt()</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$var pathToLoad = if (getFilePathToShow().startsWith("content://")) getFilePathToShow() else "file://${getFilePathToShow()}"</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$binding.gesturesView.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || allowZoomingImages == false</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$override</ID>
@@ -373,7 +361,6 @@
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$val useWidth = if (mImageOrientation == ORIENTATION_ROTATE_90 || mImageOrientation == ORIENTATION_ROTATE_270) sHeight else sWidth</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.bottomEdit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 &amp;&amp; mMedium?.isImage() == true)</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.bottomSetAs.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0 &amp;&amp; mMedium?.isImage() == true)</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.fragmentViewerToolbar.title = Html.fromHtml("&lt;font color='${Color.WHITE.toHex()}'&gt;${mMedium!!.name}&lt;/font&gt;")</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true &amp;&amp; mUri?.scheme == "file" &amp;&amp; visibleBottomActions and BOTTOM_ACTION_EDIT == 0</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" &amp;&amp; visibleBottomActions and BOTTOM_ACTION_PROPERTIES == 0</ID>
@@ -398,11 +385,8 @@
<ID>MaxLineLength:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$toast(resources.getQuantityString(R.plurals.failed_to_resize_images, failureCount, failureCount))</ID>
<ID>MaxLineLength:ResizeWithPathDialog.kt$ResizeWithPathDialog$class</ID>
<ID>MaxLineLength:ResizeWithPathDialog.kt$ResizeWithPathDialog$val title = String.format(activity.getString(org.fossify.commons.R.string.file_already_exists_overwrite), newFilename)</ID>
<ID>MaxLineLength:SaveAsDialog.kt$SaveAsDialog$val activity: BaseSimpleActivity</ID>
<ID>MaxLineLength:SaveAsDialog.kt$SaveAsDialog$val title = String.format(activity.getString(org.fossify.commons.R.string.file_already_exists_overwrite), newFilename)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$binding.searchGrid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$binding.searchGrid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$updateMaterialActivityViews(binding.searchCoordinator, binding.searchGrid, useTransparentNavigation = true, useTopSearchMenu = true)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val decoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, true)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val deletingItems = resources.getQuantityString(org.fossify.commons.R.plurals.deleting_items, filtered.size, filtered.size)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val movingItems = resources.getQuantityString(org.fossify.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)</ID>
@@ -417,7 +401,6 @@
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$org.fossify.commons.R.string.fingerprint_setup_successfully</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$toast(if (configValues.size &gt; 0) org.fossify.commons.R.string.settings_imported_successfully else org.fossify.commons.R.string.no_entries_for_importing)</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$toast(if (importedItems &gt; 0) org.fossify.commons.R.string.importing_successful else org.fossify.commons.R.string.no_entries_for_importing)</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$}</ID>
<ID>MaxLineLength:SlideshowDialog.kt$SlideshowDialog$intervalHint.hint = activity.getString(org.fossify.commons.R.string.seconds_raw).replaceFirstChar { it.uppercaseChar() }</ID>
<ID>MaxLineLength:String.kt$folderNoMediaStatuses.getOrElse("$this/$NOMEDIA") { false } || ((!isRPlus() || isExternalStorageManager()) &amp;&amp; File(this, NOMEDIA).exists())</ID>
@@ -425,8 +408,6 @@
<ID>MaxLineLength:String.kt$val noMediaExists = folderNoMediaStatuses.getOrElse(pathToCheck, { false }) || File(pathToCheck).exists()</ID>
<ID>MaxLineLength:SvgModule.kt$SvgModule$registry.register(SVG::class.java, PictureDrawable::class.java, SvgDrawableTranscoder()).append(InputStream::class.java, SVG::class.java, SvgDecoder())</ID>
<ID>MaxLineLength:SvgSoftwareLayerSetter.kt$SvgSoftwareLayerSetter$override</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$if</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$requireContext().config</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_pause_outline_vector)</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_play_outline_vector)</ID>
@@ -445,7 +426,6 @@
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomResize.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RESIZE != 0 &amp;&amp; currentMedium?.isImage() == true)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomRotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 &amp;&amp; getCurrentMedium()?.isImage() == true)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomToggleFileVisibility.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$currentMedium.isFavorite &amp;&amp; visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 &amp;&amp; !currentMedium.getIsInRecycleBin()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 &amp;&amp; visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_edit).isVisible = visibleBottomActions and BOTTOM_ACTION_EDIT == 0 &amp;&amp; !currentMedium.isSVG()</ID>
@@ -473,7 +453,6 @@
<ID>NestedBlockDepth:Context.kt$fun Context.getNoMediaFoldersSync(): ArrayList&lt;String&gt;</ID>
<ID>NestedBlockDepth:Context.kt$fun Context.parseFileChannel( path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -&gt; Unit )</ID>
<ID>NestedBlockDepth:Context.kt$fun Context.updateSubfolderCounts( children: ArrayList&lt;Directory&gt;, parentDirs: ArrayList&lt;Directory&gt; )</ID>
<ID>NestedBlockDepth:EditActivity.kt$EditActivity$private fun onCropImageComplete(bitmap: Bitmap?, error: Exception?)</ID>
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?)</ID>
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$private fun getFoldersWithMedia(path: String): HashSet&lt;String&gt;</ID>
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList&lt;Directory&gt;)</ID>
@@ -488,19 +467,8 @@
<ID>NestedBlockDepth:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet&lt;String&gt;, includedPaths: MutableSet&lt;String&gt;, showHidden: Boolean, folderNoMediaStatuses: HashMap&lt;String, Boolean&gt;, callback: (path: String, hasNoMedia: Boolean) -&gt; Unit ): Boolean</ID>
<ID>NestedBlockDepth:VideoPlayerActivity.kt$VideoPlayerActivity$private fun handleEvent(event: MotionEvent)</ID>
<ID>NestedBlockDepth:ViewPagerActivity.kt$ViewPagerActivity$private fun getPositionInList(items: MutableList&lt;Medium&gt;): Int</ID>
<ID>ReturnCount:Context.kt$@Suppress("UNCHECKED_CAST") fun Context.getSortedDirectories(source: ArrayList&lt;Directory&gt;): ArrayList&lt;Directory&gt;</ID>
<ID>ReturnCount:Context.kt$fun Context.getDirectorySortingValue( media: ArrayList&lt;Medium&gt;, path: String, name: String, size: Long, count: Int ): String</ID>
<ID>ReturnCount:ExcludeFolderDialog.kt$ExcludeFolderDialog$private fun getAlternativePathsList(): List&lt;String&gt;</ID>
<ID>ReturnCount:InstantItemSwitch.kt$InstantItemSwitch$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
<ID>ReturnCount:MediaFetcher.kt$MediaFetcher$fun groupMedia(media: ArrayList&lt;Medium&gt;, path: String): ArrayList&lt;ThumbnailItem&gt;</ID>
<ID>ReturnCount:MediaSideScroll.kt$MediaSideScroll$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
<ID>ReturnCount:PhotoFragment.kt$PhotoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
<ID>ReturnCount:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
<ID>ReturnCount:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet&lt;String&gt;, includedPaths: MutableSet&lt;String&gt;, showHidden: Boolean, folderNoMediaStatuses: HashMap&lt;String, Boolean&gt;, callback: (path: String, hasNoMedia: Boolean) -&gt; Unit ): Boolean</ID>
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun getPositionInList(items: MutableList&lt;Medium&gt;): Int</ID>
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun initViewPager(savedPath: String)</ID>
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun isShowHiddenFlagNeeded(): Boolean</ID>
<ID>ReturnCount:ViewPagerFragment.kt$ViewPagerFragment$fun getMediumExtendedDetails(medium: Medium): String</ID>
<ID>SpreadOperator:Context.kt$(*mediaToDelete.toTypedArray())</ID>
<ID>SpreadOperator:MainActivity.kt$MainActivity$(*mediaToDelete.toTypedArray())</ID>
<ID>SwallowedException:Activity.kt$e: Exception</ID>
@@ -565,7 +533,6 @@
<ID>TooManyFunctions:VideoPlayerActivity.kt$VideoPlayerActivity : SimpleActivityOnSeekBarChangeListenerSurfaceTextureListenerPlaybackSpeedListener</ID>
<ID>TooManyFunctions:ViewPagerActivity.kt$ViewPagerActivity : SimpleActivityOnPageChangeListenerFragmentListener</ID>
<ID>TooManyFunctions:WidgetConfigureActivity.kt$WidgetConfigureActivity : SimpleActivity</ID>
<ID>UnusedParameter:Activity.kt$toggleActionBarVisibility: Boolean</ID>
<ID>UnusedPrivateMember:PhotoFragment.kt$PhotoFragment$private fun checkIfPanorama()</ID>
<ID>UnusedPrivateMember:VideoFragment.kt$VideoFragment$private fun checkIfPanorama()</ID>
<ID>UnusedPrivateProperty:MyPagerAdapter.kt$MyPagerAdapter$pos</ID>
@@ -630,19 +597,12 @@
<ID>WildcardImport:Medium.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:Medium.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:MediumDao.kt$import androidx.room.*</ID>
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:PicassoRegionDecoder.kt$import android.graphics.*</ID>
<ID>WildcardImport:PicassoRoundedCornersTransformation.kt$import android.graphics.*</ID>
<ID>WildcardImport:PickDirectoryDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:PickDirectoryDialog.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:PlaybackSpeedFragment.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ResizeDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ResizeMultipleImagesDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ResizeWithPathDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SaveAsDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SearchActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SearchActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.dialogs.*</ID>

View File

File diff suppressed because it is too large Load Diff

View File

@@ -102,6 +102,9 @@ class EditActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupEdgeToEdge(
padBottomSystem = listOf(binding.bottomEditorPrimaryActions.root)
)
if (checkAppSideloading()) {
return
@@ -121,7 +124,7 @@ class EditActivity : SimpleActivity() {
super.onResume()
isEditingWithThirdParty = false
binding.bottomEditorDrawActions.bottomDrawWidth.setColors(getProperTextColor(), getProperPrimaryColor(), getProperBackgroundColor())
setupToolbar(binding.editorToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.editorAppbar, NavigationIcon.Arrow)
}
override fun onStop() {

View File

@@ -16,20 +16,22 @@ class ExcludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private val binding by viewBinding(ActivityManageFoldersBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
updateFolders()
setupOptionsMenu()
binding.manageFoldersToolbar.title = getString(org.fossify.commons.R.string.excluded_folders)
updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
setupEdgeToEdge(
padTopSystem = listOf(binding.manageFoldersAppbar),
padBottomSystem = listOf(binding.manageFoldersList)
)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersAppbar)
}
override fun onResume() {
super.onResume()
setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.manageFoldersAppbar, NavigationIcon.Arrow)
}
private fun updateFolders() {

View File

@@ -19,20 +19,22 @@ class HiddenFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private val binding by viewBinding(ActivityManageFoldersBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
updateFolders()
setupOptionsMenu()
binding.manageFoldersToolbar.title = getString(R.string.hidden_folders)
updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
setupEdgeToEdge(
padTopSystem = listOf(binding.manageFoldersAppbar),
padBottomSystem = listOf(binding.manageFoldersList)
)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersAppbar)
}
override fun onResume() {
super.onResume()
setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.manageFoldersAppbar, NavigationIcon.Arrow)
}
private fun updateFolders() {

View File

@@ -16,20 +16,22 @@ class IncludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private val binding by viewBinding(ActivityManageFoldersBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
updateFolders()
setupOptionsMenu()
binding.manageFoldersToolbar.title = getString(R.string.include_folders)
updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
setupEdgeToEdge(
padTopSystem = listOf(binding.manageFoldersAppbar),
padBottomSystem = listOf(binding.manageFoldersList)
)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersAppbar)
}
override fun onResume() {
super.onResume()
setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.manageFoldersAppbar, NavigationIcon.Arrow)
}
private fun updateFolders() {

View File

@@ -151,6 +151,8 @@ import java.io.InputStream
import java.io.OutputStream
class MainActivity : SimpleActivity(), DirectoryOperationsListener {
override var isSearchBarEnabled = true
companion object {
private const val PICK_MEDIA = 2
private const val PICK_WALLPAPER = 3
@@ -197,7 +199,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private val binding by viewBinding(ActivityMainBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID)
@@ -229,11 +230,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupOptionsMenu()
refreshMenuItems()
updateMaterialActivityViews(
mainCoordinatorLayout = binding.directoriesCoordinator,
nestedView = binding.directoriesGrid,
useTransparentNavigation = !config.scrollHorizontally,
useTopSearchMenu = true
setupEdgeToEdge(
padBottomImeAndSystem = listOf(binding.directoriesGrid)
)
binding.directoriesRefreshLayout.setOnRefreshListener { getDirectories() }
@@ -394,20 +392,23 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
override fun onBackPressed() {
if (binding.mainMenu.isSearchOpen) {
override fun onBackPressedCompat(): Boolean {
return if (binding.mainMenu.isSearchOpen) {
binding.mainMenu.closeSearch()
true
} else if (config.groupDirectSubfolders) {
if (mCurrentPathPrefix.isEmpty()) {
super.onBackPressed()
appLockManager.lock()
false
} else {
mOpenedSubfolders.removeAt(mOpenedSubfolders.lastIndex)
mCurrentPathPrefix = mOpenedSubfolders.last()
setupAdapter(mDirs)
true
}
} else {
appLockManager.lock()
super.onBackPressed()
false
}
}
@@ -448,7 +449,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun refreshMenuItems() {
if (!mIsThirdPartyIntent) {
binding.mainMenu.getToolbar().menu.apply {
binding.mainMenu.requireToolbar().menu.apply {
findItem(R.id.column_count).isVisible = config.viewTypeFolders == VIEW_TYPE_GRID
findItem(R.id.set_as_default_folder).isVisible = !config.defaultFolder.isEmpty()
findItem(R.id.open_recycle_bin).isVisible =
@@ -458,7 +459,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
binding.mainMenu.getToolbar().menu.apply {
binding.mainMenu.requireToolbar().menu.apply {
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible =
(!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
@@ -475,7 +476,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
R.menu.menu_main
}
binding.mainMenu.getToolbar().inflateMenu(menuId)
binding.mainMenu.requireToolbar().inflateMenu(menuId)
binding.mainMenu.toggleHideOnScroll(!config.scrollHorizontally)
binding.mainMenu.setupMenu()
@@ -492,7 +493,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
binding.directoriesSwitchSearching.beVisibleIf(text.isNotEmpty())
}
binding.mainMenu.getToolbar().setOnMenuItemClickListener { menuItem ->
binding.mainMenu.requireToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.sort -> showSortingDialog()
R.id.filter -> showFilterMediaDialog()
@@ -517,7 +518,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
binding.mainMenu.updateColors()
}

View File

@@ -112,6 +112,8 @@ import java.io.File
import java.io.IOException
class MediaActivity : SimpleActivity(), MediaOperationsListener {
override var isSearchBarEnabled = true
private val LAST_MEDIA_CHECK_PERIOD = 3000L
private var mPath = ""
@@ -149,7 +151,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
@@ -172,11 +173,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
setupOptionsMenu()
refreshMenuItems()
storeStateVariables()
updateMaterialActivityViews(
mainCoordinatorLayout = binding.mediaCoordinator,
nestedView = binding.mediaGrid,
useTransparentNavigation = !config.scrollHorizontally,
useTopSearchMenu = true
setupEdgeToEdge(
padTopSystem = listOf(binding.mediaMenu),
padBottomImeAndSystem = listOf(binding.mediaGrid)
)
if (mShowAll) {
@@ -304,15 +303,16 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mTempShowHiddenHandler.removeCallbacksAndMessages(null)
}
override fun onBackPressed() {
if (binding.mediaMenu.isSearchOpen) {
override fun onBackPressedCompat(): Boolean {
return if (binding.mediaMenu.isSearchOpen) {
binding.mediaMenu.closeSearch()
true
} else {
if (config.showAll) {
appLockManager.lock()
}
super.onBackPressed()
false
}
}
@@ -330,7 +330,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val isDefaultFolder = !config.defaultFolder.isEmpty()
&& File(config.defaultFolder).compareTo(File(mPath)) == 0
binding.mediaMenu.getToolbar().menu.apply {
binding.mediaMenu.requireToolbar().menu.apply {
findItem(R.id.group).isVisible = !config.scrollHorizontally
findItem(R.id.empty_recycle_bin).isVisible = mPath == RECYCLE_BIN
@@ -358,7 +358,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupOptionsMenu() {
binding.mediaMenu.getToolbar().inflateMenu(R.menu.menu_media)
binding.mediaMenu.requireToolbar().inflateMenu(R.menu.menu_media)
binding.mediaMenu.toggleHideOnScroll(!config.scrollHorizontally)
binding.mediaMenu.setupMenu()
@@ -368,7 +368,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
binding.mediaRefreshLayout.isEnabled = text.isEmpty() && config.enablePullToRefresh
}
binding.mediaMenu.getToolbar().setOnMenuItemClickListener { menuItem ->
binding.mediaMenu.requireToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.sort -> showSortingDialog()
R.id.filter -> showFilterMediaDialog()
@@ -411,7 +411,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
binding.mediaMenu.updateColors()
}
@@ -477,7 +476,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
if (!mShowAll) {
binding.mediaMenu.toggleForceArrowBackIcon(true)
binding.mediaMenu.onNavigateBackClickListener = {
onBackPressed()
performDefaultBack()
}
}

View File

@@ -3,24 +3,76 @@ package org.fossify.gallery.activities
import android.content.Intent
import android.content.res.Configuration
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.text.Html
import android.view.View
import android.widget.RelativeLayout
import androidx.core.graphics.drawable.toDrawable
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import org.fossify.commons.dialogs.PropertiesDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.*
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.checkAppSideloading
import org.fossify.commons.extensions.getColoredDrawableWithColor
import org.fossify.commons.extensions.getDoesFilePathExist
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getFilenameFromUri
import org.fossify.commons.extensions.getFinalUriFromPath
import org.fossify.commons.extensions.getParentPath
import org.fossify.commons.extensions.getRealPathFromURI
import org.fossify.commons.extensions.getUriMimeType
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.isExternalStorageManager
import org.fossify.commons.extensions.isGif
import org.fossify.commons.extensions.isGone
import org.fossify.commons.extensions.isImageFast
import org.fossify.commons.extensions.isPortrait
import org.fossify.commons.extensions.isRawFast
import org.fossify.commons.extensions.isSvg
import org.fossify.commons.extensions.isVideoFast
import org.fossify.commons.extensions.rescanPath
import org.fossify.commons.extensions.rescanPaths
import org.fossify.commons.extensions.toHex
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.IS_FROM_GALLERY
import org.fossify.commons.helpers.NOMEDIA
import org.fossify.commons.helpers.REAL_FILE_PATH
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isRPlus
import org.fossify.gallery.BuildConfig
import org.fossify.gallery.R
import org.fossify.gallery.databinding.FragmentHolderBinding
import org.fossify.gallery.extensions.*
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.hideSystemUI
import org.fossify.gallery.extensions.openEditor
import org.fossify.gallery.extensions.openPath
import org.fossify.gallery.extensions.setAs
import org.fossify.gallery.extensions.sharePath
import org.fossify.gallery.extensions.showFileOnMap
import org.fossify.gallery.extensions.showSystemUI
import org.fossify.gallery.fragments.PhotoFragment
import org.fossify.gallery.fragments.VideoFragment
import org.fossify.gallery.fragments.ViewPagerFragment
import org.fossify.gallery.helpers.*
import org.fossify.gallery.helpers.BOTTOM_ACTION_EDIT
import org.fossify.gallery.helpers.BOTTOM_ACTION_PROPERTIES
import org.fossify.gallery.helpers.BOTTOM_ACTION_SET_AS
import org.fossify.gallery.helpers.BOTTOM_ACTION_SHARE
import org.fossify.gallery.helpers.BOTTOM_ACTION_SHOW_ON_MAP
import org.fossify.gallery.helpers.IS_IN_RECYCLE_BIN
import org.fossify.gallery.helpers.IS_VIEW_INTENT
import org.fossify.gallery.helpers.MEDIUM
import org.fossify.gallery.helpers.PATH
import org.fossify.gallery.helpers.SHOW_FAVORITES
import org.fossify.gallery.helpers.SKIP_AUTHENTICATION
import org.fossify.gallery.helpers.TYPE_GIFS
import org.fossify.gallery.helpers.TYPE_IMAGES
import org.fossify.gallery.helpers.TYPE_PORTRAITS
import org.fossify.gallery.helpers.TYPE_RAWS
import org.fossify.gallery.helpers.TYPE_SVGS
import org.fossify.gallery.helpers.TYPE_VIDEOS
import org.fossify.gallery.models.Medium
import java.io.File
@@ -35,11 +87,16 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
private val binding by viewBinding(FragmentHolderBinding::inflate)
public override fun onCreate(savedInstanceState: Bundle?) {
showTransparentTop = true
override val padCutout: Boolean
get() = !config.showNotch
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupEdgeToEdge(
padTopSystem = listOf(binding.fragmentViewerAppbar),
padBottomSystem = listOf(binding.bottomActions.bottomActionsWrapper),
)
if (checkAppSideloading()) {
return
}
@@ -53,29 +110,14 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
override fun onResume() {
super.onResume()
if (config.bottomActions) {
window.navigationBarColor = Color.TRANSPARENT
} else {
setTranslucentNavigation()
}
if (config.blackBackground) {
updateStatusbarColor(Color.BLACK)
binding.fragmentHolder.background = Color.BLACK.toDrawable()
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
initBottomActionsLayout()
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
(binding.fragmentViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
binding.fragmentViewerToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
binding.fragmentViewerToolbar.setPadding(0, 0, 0, 0)
}
}
fun refreshMenuItems() {
@@ -91,7 +133,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
private fun setupOptionsMenu() {
(binding.fragmentViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
binding.fragmentViewerToolbar.apply {
setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
@@ -194,15 +235,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
}
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
binding.fragmentViewerToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
binding.fragmentViewerToolbar.setPadding(0, 0, 0, 0)
}
checkNotchSupport()
showSystemUI(true)
showSystemUI()
val bundle = Bundle()
val file = File(mUri.toString())
val intentType = intent.type ?: ""
@@ -228,7 +261,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
if (config.blackBackground) {
binding.fragmentHolder.background = ColorDrawable(Color.BLACK)
binding.fragmentHolder.background = Color.BLACK.toDrawable()
}
if (config.maxBrightness) {
@@ -237,9 +270,16 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
window.attributes = attributes
}
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
val isFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
mFragment?.fullscreenToggled(isFullscreen)
ViewCompat.setOnApplyWindowInsetsListener(binding.fragmentHolder) { _, insets ->
val systemBarsVisible = insets.isVisible(
WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars()
)
val fullscreen = !systemBarsVisible
if (mIsFullScreen != fullscreen) {
mIsFullScreen = fullscreen
mFragment?.fullscreenToggled(fullscreen)
}
insets
}
initBottomActions()
@@ -332,7 +372,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
private fun initBottomActionsLayout() {
binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight
if (config.bottomActions) {
binding.bottomActions.root.beVisible()
} else {
@@ -386,11 +425,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
override fun fragmentClicked() {
mIsFullScreen = !mIsFullScreen
if (mIsFullScreen) {
hideSystemUI(true)
} else {
showSystemUI(true)
}
if (mIsFullScreen) hideSystemUI() else showSystemUI()
mFragment?.fullscreenToggled(mIsFullScreen)
val newAlpha = if (mIsFullScreen) 0f else 1f
binding.topShadow.animate().alpha(newAlpha).start()

View File

@@ -26,6 +26,8 @@ import org.fossify.gallery.models.ThumbnailItem
import java.io.File
class SearchActivity : SimpleActivity(), MediaOperationsListener {
override var isSearchBarEnabled = true
private var mLastSearchedText = ""
private var mCurrAsyncTask: GetMediaAsynctask? = null
@@ -34,11 +36,13 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
private val binding by viewBinding(ActivitySearchBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupOptionsMenu()
updateMaterialActivityViews(binding.searchCoordinator, binding.searchGrid, useTransparentNavigation = true, useTopSearchMenu = true)
setupEdgeToEdge(
padTopSystem = listOf(binding.searchMenu),
padBottomImeAndSystem = listOf(binding.searchGrid)
)
binding.searchEmptyTextPlaceholder.setTextColor(getProperTextColor())
getAllMedia()
binding.searchFastscroller.updateColors(getProperPrimaryColor())
@@ -55,7 +59,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupOptionsMenu() {
binding.searchMenu.getToolbar().inflateMenu(R.menu.menu_search)
binding.searchMenu.requireToolbar().inflateMenu(R.menu.menu_search)
binding.searchMenu.toggleHideOnScroll(true)
binding.searchMenu.setupMenu()
binding.searchMenu.toggleForceArrowBackIcon(true)
@@ -75,7 +79,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
textChanged(text)
}
binding.searchMenu.getToolbar().setOnMenuItemClickListener { menuItem ->
binding.searchMenu.requireToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.toggle_filename -> toggleFilenameVisibility()
else -> return@setOnMenuItemClickListener false
@@ -85,7 +89,6 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
}
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
binding.searchMenu.updateColors()
}

View File

@@ -54,7 +54,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
override fun onResume() {
super.onResume()
setupToolbar(binding.setWallpaperToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.setWallpaperAppbar, NavigationIcon.Arrow)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {

View File

@@ -35,17 +35,19 @@ class SettingsActivity : SimpleActivity() {
private val binding by viewBinding(ActivitySettingsBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsToolbar)
setupEdgeToEdge(
padTopSystem = listOf(binding.settingsAppbar),
padBottomSystem = listOf(binding.settingsNestedScrollview)
)
setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsAppbar)
}
override fun onResume() {
super.onResume()
setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.settingsAppbar, NavigationIcon.Arrow)
setupSettingItems()
}
@@ -488,7 +490,7 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupShowNotch() {
binding.settingsShowNotchHolder.beVisibleIf(isPiePlus())
binding.settingsShowNotchHolder.beVisibleIf(isPiePlus() && !isVanillaIceCreamPlus())
binding.settingsShowNotch.isChecked = config.showNotch
binding.settingsShowNotchHolder.setOnClickListener {
binding.settingsShowNotch.toggle()

View File

@@ -22,7 +22,6 @@ import android.view.Surface
import android.view.TextureView
import android.view.View
import android.view.WindowManager
import android.widget.RelativeLayout
import android.widget.SeekBar
import androidx.appcompat.content.res.AppCompatResources
import androidx.media3.common.AudioAttributes
@@ -41,7 +40,6 @@ import androidx.media3.exoplayer.SeekParameters
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource
import org.fossify.commons.extensions.actionBarHeight
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
@@ -50,14 +48,9 @@ import org.fossify.commons.extensions.getColoredDrawableWithColor
import org.fossify.commons.extensions.getFilenameFromUri
import org.fossify.commons.extensions.getFormattedDuration
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.navigationBarHeight
import org.fossify.commons.extensions.navigationBarOnSide
import org.fossify.commons.extensions.navigationBarWidth
import org.fossify.commons.extensions.onGlobalLayout
import org.fossify.commons.extensions.portrait
import org.fossify.commons.extensions.setDrawablesRelativeWithIntrinsicBounds
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.statusBarHeight
import org.fossify.commons.extensions.updateTextColors
import org.fossify.commons.extensions.viewBinding
import org.fossify.gallery.R
@@ -65,7 +58,6 @@ import org.fossify.gallery.databinding.ActivityVideoPlayerBinding
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.getFormattedDuration
import org.fossify.gallery.extensions.getFriendlyMessage
import org.fossify.gallery.extensions.hasNavBar
import org.fossify.gallery.extensions.hideSystemUI
import org.fossify.gallery.extensions.mute
import org.fossify.gallery.extensions.openPath
@@ -124,19 +116,23 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
private val binding by viewBinding(ActivityVideoPlayerBinding::inflate)
override val padCutout: Boolean
get() = !config.showNotch
public override fun onCreate(savedInstanceState: Bundle?) {
showTransparentTop = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupEdgeToEdge(
padTopSystem = listOf(binding.videoAppbar),
padBottomSystem = listOf(binding.bottomVideoTimeHolder.root),
)
setupOptionsMenu()
setupOrientation()
checkNotchSupport()
initPlayer()
}
override fun onResume() {
super.onResume()
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT
if (config.blackBackground) {
@@ -150,12 +146,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
}
updateTextColors(binding.videoPlayerHolder)
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
binding.videoToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
binding.videoToolbar.setPadding(0, 0, 0, 0)
}
}
override fun onPause() {
@@ -180,8 +170,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
}
private fun setupOptionsMenu() {
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin =
statusBarHeight
binding.videoToolbar.apply {
setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(
@@ -220,15 +208,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
binding.videoSurfaceFrame.onGlobalLayout {
binding.videoSurfaceFrame.controller.resetState()
}
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin =
statusBarHeight
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
binding.videoToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
binding.videoToolbar.setPadding(0, 0, 0, 0)
}
}
private fun setupOrientation() {
@@ -246,7 +225,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
binding.videoToolbar.title = getFilenameFromUri(mUri!!)
initTimeHolder()
showSystemUI(true)
showSystemUI()
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
val isFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
fullscreenToggled(isFullscreen)
@@ -605,9 +584,9 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
private fun fullscreenToggled(isFullScreen: Boolean) {
mIsFullscreen = isFullScreen
if (isFullScreen) {
hideSystemUI(true)
hideSystemUI()
} else {
showSystemUI(true)
showSystemUI()
}
val newAlpha = if (isFullScreen) 0f else 1f
@@ -673,19 +652,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
}
private fun initTimeHolder() {
var right = 0
var bottom = 0
if (hasNavBar()) {
if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
bottom += navigationBarHeight
} else {
right += navigationBarWidth
bottom += navigationBarHeight
}
}
binding.bottomVideoTimeHolder.videoTimeHolder.setPadding(0, 0, right, bottom)
binding.bottomVideoTimeHolder.videoSeekbar.setOnSeekBarChangeListener(this)
binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration.toInt()
binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()

View File

@@ -18,16 +18,16 @@ import android.content.pm.ShortcutManager
import android.content.res.Configuration
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Icon
import android.os.Bundle
import android.os.Handler
import android.view.MenuItem
import android.view.View
import android.view.WindowManager
import android.view.animation.DecelerateInterpolator
import android.widget.RelativeLayout
import android.widget.Toast
import androidx.core.graphics.drawable.toDrawable
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.exifinterface.media.ExifInterface
import androidx.print.PrintHelper
import androidx.viewpager.widget.ViewPager
@@ -40,7 +40,6 @@ import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import org.fossify.commons.dialogs.PropertiesDialog
import org.fossify.commons.dialogs.RenameItemDialog
import org.fossify.commons.extensions.actionBarHeight
import org.fossify.commons.extensions.applyColorFilter
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beVisible
@@ -72,17 +71,12 @@ import org.fossify.commons.extensions.isPortrait
import org.fossify.commons.extensions.isRawFast
import org.fossify.commons.extensions.isSvg
import org.fossify.commons.extensions.isVideoFast
import org.fossify.commons.extensions.navigationBarHeight
import org.fossify.commons.extensions.navigationBarOnSide
import org.fossify.commons.extensions.navigationBarWidth
import org.fossify.commons.extensions.needsStupidWritePermissions
import org.fossify.commons.extensions.onGlobalLayout
import org.fossify.commons.extensions.portrait
import org.fossify.commons.extensions.recycleBinPath
import org.fossify.commons.extensions.rescanPaths
import org.fossify.commons.extensions.scanPathRecursively
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.statusBarHeight
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.tryGenericMimeType
import org.fossify.commons.extensions.viewBinding
@@ -95,7 +89,6 @@ import org.fossify.commons.helpers.REQUEST_SET_AS
import org.fossify.commons.helpers.SORT_BY_RANDOM
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isRPlus
import org.fossify.commons.helpers.isUpsideDownCakePlus
import org.fossify.commons.models.FileDirItem
import org.fossify.gallery.BuildConfig
import org.fossify.gallery.R
@@ -218,16 +211,21 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private val binding by viewBinding(ActivityMediumBinding::inflate)
override val padCutout: Boolean
get() = !config.showNotch
override fun onCreate(savedInstanceState: Bundle?) {
showTransparentTop = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupEdgeToEdge(
padTopSystem = listOf(binding.mediumViewerAppbar),
padBottomSystem = listOf(binding.bottomActions.bottomActionsWrapper),
)
setupOptionsMenu()
refreshMenuItems()
window.decorView.setBackgroundColor(getProperBackgroundColor())
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
checkNotchSupport()
(MediaActivity.mMedia.clone() as ArrayList<ThumbnailItem>).filterIsInstanceTo(mMediaFiles, Medium::class.java)
requestMediaPermissions {
@@ -246,12 +244,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return
}
if (config.bottomActions) {
window.navigationBarColor = Color.TRANSPARENT
} else {
setTranslucentNavigation()
}
initBottomActions()
if (config.maxBrightness) {
@@ -343,7 +335,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun setupOptionsMenu() {
(binding.mediumViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
binding.mediumViewerToolbar.apply {
setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
@@ -416,7 +407,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
initBottomActionsLayout()
(binding.mediumViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
}
override fun onSaveInstanceState(outState: Bundle) {
@@ -467,7 +457,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return
}
showSystemUI(true)
showSystemUI()
if (intent.getBooleanExtra(SKIP_AUTHENTICATION, false)) {
initContinue()
@@ -525,7 +515,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
binding.viewPager.offscreenPageLimit = 2
if (config.blackBackground) {
binding.viewPager.background = ColorDrawable(Color.BLACK)
binding.viewPager.background = Color.BLACK.toDrawable()
}
if (config.hideSystemUI) {
@@ -536,18 +526,16 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
}
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
mIsFullScreen = if (isUpsideDownCakePlus()) {
visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE != 0
} else if (isInMultiWindowMode) {
visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE != 0
} else if (visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE == 0) {
false
} else {
visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
ViewCompat.setOnApplyWindowInsetsListener(binding.fragmentHolder) { _, insets ->
val systemBarsVisible = insets.isVisible(
WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars()
)
val fullscreen = !systemBarsVisible
if (mIsFullScreen != fullscreen) {
mIsFullScreen = fullscreen
checkSystemUI()
}
checkSystemUI()
insets
}
if (intent.action == "com.android.camera.action.REVIEW") {
@@ -633,7 +621,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
binding.viewPager.setPageTransformer(false, FadePageTransformer())
}
hideSystemUI(true)
hideSystemUI()
if (!mIsFullScreen) {
mIsFullScreen = true
fullscreenToggled()
@@ -730,7 +718,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (mIsSlideshowActive) {
binding.viewPager.setPageTransformer(false, DefaultPageTransformer())
mIsSlideshowActive = false
showSystemUI(true)
showSystemUI()
mSlideshowHandler.removeCallbacksAndMessages(null)
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
mAreSlideShowMediaVisible = false
@@ -956,18 +944,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun initBottomActionsLayout() {
binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight
if (config.bottomActions) {
binding.bottomActions.root.beVisible()
} else {
binding.bottomActions.root.beGone()
}
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
binding.mediumViewerToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
binding.mediumViewerToolbar.setPadding(0, 0, 0, 0)
}
}
private fun initBottomActionButtons() {
@@ -1499,10 +1480,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun checkSystemUI() {
if (mIsFullScreen) {
hideSystemUI(true)
hideSystemUI()
} else {
stopSlideshow()
showSystemUI(true)
showSystemUI()
}
}

View File

@@ -37,6 +37,7 @@ class WidgetConfigureActivity : SimpleActivity() {
super.onCreate(savedInstanceState)
setResult(RESULT_CANCELED)
setContentView(binding.root)
setupEdgeToEdge(padTopSystem = listOf(binding.root), padBottomSystem = listOf(binding.root))
initVariables()
mWidgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: AppWidgetManager.INVALID_APPWIDGET_ID

View File

@@ -268,7 +268,7 @@ class DirectoryAdapter(
}
private fun moveSelectedItemsToTop() {
selectedKeys.reversed().forEach { key ->
selectedKeys.toMutableList().reversed().forEach { key ->
val position = dirs.indexOfFirst { it.path.hashCode() == key }
val tempItem = dirs[position]
dirs.removeAt(position)

View File

@@ -1,22 +1,39 @@
package org.fossify.gallery.dialogs
import android.graphics.Color
import android.view.KeyEvent.ACTION_UP
import android.view.KeyEvent.KEYCODE_BACK
import android.view.inputmethod.EditorInfo
import android.widget.Toast
import androidx.activity.addCallback
import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.RecyclerView
import org.fossify.commons.activities.BaseSimpleActivity
import org.fossify.commons.dialogs.FilePickerDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beInvisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.getAlertDialogBuilder
import org.fossify.commons.extensions.getDefaultCopyDestinationPath
import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.handleHiddenFolderPasswordProtection
import org.fossify.commons.extensions.handleLockedFolderOpening
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.isGone
import org.fossify.commons.extensions.isInDownloadDir
import org.fossify.commons.extensions.isRestrictedWithSAFSdk30
import org.fossify.commons.extensions.setupDialogStuff
import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.VIEW_TYPE_GRID
import org.fossify.commons.views.MyGridLayoutManager
import org.fossify.commons.views.MySearchMenu
import org.fossify.gallery.R
import org.fossify.gallery.adapters.DirectoryAdapter
import org.fossify.gallery.databinding.DialogDirectoryPickerBinding
import org.fossify.gallery.extensions.*
import org.fossify.gallery.extensions.addTempFolderIfNeeded
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.getCachedDirectories
import org.fossify.gallery.extensions.getDirsToShow
import org.fossify.gallery.extensions.getDistinctPath
import org.fossify.gallery.extensions.getSortedDirectories
import org.fossify.gallery.models.Directory
class PickDirectoryDialog(
@@ -39,7 +56,7 @@ class PickDirectoryDialog(
private val config = activity.config
private val searchView = binding.folderSearchView
private val searchEditText = searchView.binding.topToolbarSearch
private val searchViewAppBarLayout = searchView.binding.topAppBarLayout
private val searchBarContainer = searchView.binding.searchBarContainer
init {
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).apply {
@@ -54,14 +71,6 @@ class PickDirectoryDialog(
val builder = activity.getAlertDialogBuilder()
.setPositiveButton(org.fossify.commons.R.string.ok, null)
.setNegativeButton(org.fossify.commons.R.string.cancel, null)
.setOnKeyListener { dialogInterface, i, keyEvent ->
return@setOnKeyListener if (keyEvent.action == ACTION_UP && i == KEYCODE_BACK) {
backPressed()
true
} else {
false
}
}
if (showOtherFolderButton) {
builder.setNeutralButton(R.string.other_folder) { dialogInterface, i -> showOtherFolder() }
@@ -78,6 +87,24 @@ class PickDirectoryDialog(
fetchDirectories(true)
}
}
alertDialog.onBackPressedDispatcher.addCallback(alertDialog) {
if (searchView.isSearchOpen) {
searchView.closeSearch()
} else if (activity.config.groupDirectSubfolders) {
if (currentPathPrefix.isEmpty()) {
isEnabled = false
alertDialog.onBackPressedDispatcher.onBackPressed()
} else {
openedSubfolders.removeAt(openedSubfolders.lastIndex)
currentPathPrefix = openedSubfolders.last()
gotDirectories(allDirectories)
}
} else {
isEnabled = false
alertDialog.onBackPressedDispatcher.onBackPressed()
}
}
}
}
@@ -95,10 +122,10 @@ class PickDirectoryDialog(
}
private fun MySearchMenu.updateSearchViewUi() {
getToolbar().beInvisible()
requireToolbar().beInvisible()
updateColors()
setBackgroundColor(Color.TRANSPARENT)
searchViewAppBarLayout.setBackgroundColor(Color.TRANSPARENT)
searchBarContainer.setBackgroundColor(Color.TRANSPARENT)
}
private fun MySearchMenu.setSearchViewListeners() {
@@ -233,20 +260,4 @@ class PickDirectoryDialog(
directoriesFastscroller.setScrollVertically(!scrollHorizontally)
}
}
private fun backPressed() {
if (searchView.isSearchOpen) {
searchView.closeSearch()
} else if (activity.config.groupDirectSubfolders) {
if (currentPathPrefix.isEmpty()) {
dialog?.dismiss()
} else {
openedSubfolders.removeLast()
currentPathPrefix = openedSubfolders.last()
gotDirectories(allDirectories)
}
} else {
dialog?.dismiss()
}
}
}

View File

@@ -182,20 +182,12 @@ fun BaseSimpleActivity.launchGrantAllFilesIntent() {
}
}
fun AppCompatActivity.showSystemUI(toggleActionBarVisibility: Boolean) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
fun AppCompatActivity.showSystemUI() {
window.showBars()
}
fun AppCompatActivity.hideSystemUI(toggleActionBarVisibility: Boolean) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LOW_PROFILE or
View.SYSTEM_UI_FLAG_FULLSCREEN or
View.SYSTEM_UI_FLAG_IMMERSIVE
fun AppCompatActivity.hideSystemUI() {
window.hideBars()
}
fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {

View File

@@ -3,6 +3,7 @@ package org.fossify.gallery.extensions
import android.content.Context
import android.content.res.Resources
import android.util.TypedValue
import org.fossify.gallery.R
fun Resources.getActionBarHeight(context: Context): Int {
val tv = TypedValue()
@@ -27,3 +28,8 @@ fun Resources.getNavBarHeight(): Int {
} else
0
}
fun Resources.getBottomActionsHeight(): Int {
return getDimensionPixelSize(R.dimen.bottom_actions_height) +
getDimensionPixelSize(org.fossify.commons.R.dimen.normal_margin)
}

View File

@@ -19,8 +19,10 @@ import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.RelativeLayout
import androidx.core.graphics.drawable.toBitmapOrNull
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat.Type
import androidx.core.view.updateLayoutParams
import androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_180
import androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_270
import androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_90
@@ -52,10 +54,12 @@ import it.sephiroth.android.library.exif2.ExifInterface
import org.apache.sanselan.common.byteSources.ByteSourceInputStream
import org.apache.sanselan.formats.jpeg.JpegImageParser
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.beInvisible
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.fadeIn
import org.fossify.commons.extensions.fadeOut
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.getRealPathFromURI
@@ -63,11 +67,11 @@ import org.fossify.commons.extensions.isExternalStorageManager
import org.fossify.commons.extensions.isPathOnOTG
import org.fossify.commons.extensions.isVisible
import org.fossify.commons.extensions.isWebP
import org.fossify.commons.extensions.navigationBarHeight
import org.fossify.commons.extensions.onGlobalLayout
import org.fossify.commons.extensions.portrait
import org.fossify.commons.extensions.realScreenSize
import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.DEFAULT_ANIMATION_DURATION
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isRPlus
import org.fossify.gallery.R
@@ -77,6 +81,7 @@ import org.fossify.gallery.activities.ViewPagerActivity
import org.fossify.gallery.adapters.PortraitPhotosAdapter
import org.fossify.gallery.databinding.PagerPhotoItemBinding
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.getBottomActionsHeight
import org.fossify.gallery.extensions.sendFakeClick
import org.fossify.gallery.helpers.ColorModeHelper
import org.fossify.gallery.helpers.HIGH_TILE_DPI
@@ -203,6 +208,14 @@ class PhotoFragment : ViewPagerFragment() {
}
}
ViewCompat.setOnApplyWindowInsetsListener(binding.photoHolder) { _, insets ->
val system = insets.getInsetsIgnoringVisibility(Type.systemBars())
binding.bottomActionsDummy.updateLayoutParams<ViewGroup.LayoutParams> {
height = resources.getBottomActionsHeight() + system.bottom
}
insets
}
checkScreenDimensions()
storeStateVariables()
if (!mIsFragmentVisible && activity is PhotoActivity) {
@@ -242,7 +255,6 @@ class PhotoFragment : ViewPagerFragment() {
}
}
mIsFullscreen = requireActivity().window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
loadImage()
initExtendedDetails()
mWasInit = true
@@ -623,7 +635,6 @@ class PhotoFragment : ViewPagerFragment() {
}
binding.photoPortraitStripe.adapter = adapter
setupStripeBottomMargin()
val coverIndex = getCoverImageIndex(paths)
if (coverIndex != -1) {
@@ -658,14 +669,6 @@ class PhotoFragment : ViewPagerFragment() {
return paths
}
private fun setupStripeBottomMargin() {
var bottomMargin = requireContext().navigationBarHeight + resources.getDimension(org.fossify.commons.R.dimen.normal_margin).toInt()
if (requireContext().config.bottomActions) {
bottomMargin += resources.getDimension(R.dimen.bottom_actions_height).toInt()
}
(binding.photoPortraitStripeWrapper.layoutParams as RelativeLayout.LayoutParams).bottomMargin = bottomMargin
}
private fun getCoverImageIndex(paths: ArrayList<String>): Int {
var coverIndex = -1
paths.forEachIndexed { index, path ->
@@ -898,18 +901,9 @@ class PhotoFragment : ViewPagerFragment() {
private fun initExtendedDetails() {
if (requireContext().config.showExtendedDetails) {
binding.photoDetails.apply {
beInvisible() // make it invisible so we can measure it, but not show yet
text = getMediumExtendedDetails(mMedium)
onGlobalLayout {
if (isAdded) {
val realY = getExtendedDetailsY(height)
if (realY > 0) {
y = realY
beVisibleIf(text.isNotEmpty())
alpha = if (!requireContext().config.hideExtendedDetails || !mIsFullscreen) 1f else 0f
}
}
}
beVisibleIf(text.isNotEmpty())
alpha = if (!requireContext().config.hideExtendedDetails || !mIsFullscreen) 1f else 0f
}
} else {
binding.photoDetails.beGone()
@@ -939,14 +933,18 @@ class PhotoFragment : ViewPagerFragment() {
binding.apply {
photoDetails.apply {
if (mStoredShowExtendedDetails && isVisible() && context != null && resources != null) {
animate().y(getExtendedDetailsY(height))
if (mStoredHideExtendedDetails) {
animate().alpha(if (isFullscreen) 0f else 1f).start()
}
}
}
if (isFullscreen) {
bottomActionsDummy.fadeOut(DEFAULT_ANIMATION_DURATION)
} else {
bottomActionsDummy.beVisible()
}
if (mIsPanorama) {
panoramaOutline.animate().alpha(if (isFullscreen) 0f else 1f).start()
panoramaOutline.isClickable = !isFullscreen
@@ -958,13 +956,6 @@ class PhotoFragment : ViewPagerFragment() {
}
}
private fun getExtendedDetailsY(height: Int): Float {
val smallMargin = context?.resources?.getDimension(org.fossify.commons.R.dimen.small_margin) ?: return 0f
val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else requireContext().navigationBarHeight
val actionsHeight = if (requireContext().config.bottomActions && !mIsFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f
return requireContext().realScreenSize.y - height - actionsHeight - fullscreenOffset
}
private fun applyProperColorMode(resource: Drawable?) {
if (mIsFragmentVisible && activity != null) {
ColorModeHelper.setColorModeForImage(

View File

@@ -18,11 +18,12 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.SeekBar
import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.view.children
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat.Type
import androidx.core.view.updateLayoutParams
import androidx.media3.common.AudioAttributes
import androidx.media3.common.C
import androidx.media3.common.MediaItem
@@ -44,31 +45,29 @@ import com.bumptech.glide.Glide
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.beInvisible
import org.fossify.commons.extensions.beInvisibleIf
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.fadeIn
import org.fossify.commons.extensions.fadeOut
import org.fossify.commons.extensions.getDuration
import org.fossify.commons.extensions.getFormattedDuration
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.getVideoResolution
import org.fossify.commons.extensions.isGone
import org.fossify.commons.extensions.isVisible
import org.fossify.commons.extensions.navigationBarHeight
import org.fossify.commons.extensions.navigationBarWidth
import org.fossify.commons.extensions.onGlobalLayout
import org.fossify.commons.extensions.realScreenSize
import org.fossify.commons.extensions.setDrawablesRelativeWithIntrinsicBounds
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.updateTextColors
import org.fossify.commons.helpers.DEFAULT_ANIMATION_DURATION
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.gallery.R
import org.fossify.gallery.activities.VideoActivity
import org.fossify.gallery.databinding.PagerVideoItemBinding
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.getBottomActionsHeight
import org.fossify.gallery.extensions.getFormattedDuration
import org.fossify.gallery.extensions.getFriendlyMessage
import org.fossify.gallery.extensions.hasNavBar
import org.fossify.gallery.extensions.mute
import org.fossify.gallery.extensions.parseFileChannel
import org.fossify.gallery.extensions.unmute
@@ -220,6 +219,15 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
false
}
}
ViewCompat.setOnApplyWindowInsetsListener(binding.videoHolder) { _, insets ->
val system = insets.getInsetsIgnoringVisibility(Type.systemBars())
binding.bottomActionsDummy.updateLayoutParams<ViewGroup.LayoutParams> {
height = resources.getBottomActionsHeight() + system.bottom
}
insets
}
mView = binding.root
if (!arguments.getBoolean(SHOULD_INIT_FRAGMENT, true)) {
@@ -234,8 +242,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
mIsFragmentVisible = true
}
mIsFullscreen =
activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
initTimeHolder()
// checkIfPanorama() TODO: Implement panorama using a FOSS library
@@ -361,8 +367,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
setVideoSize()
initTimeHolder()
checkExtendedDetails()
binding.videoSurfaceFrame.onGlobalLayout {
binding.videoSurfaceFrame.controller.resetState()
}
@@ -558,18 +562,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
private fun checkExtendedDetails() {
if (mConfig.showExtendedDetails) {
binding.videoDetails.apply {
beInvisible() // make it invisible so we can measure it, but not show yet
text = getMediumExtendedDetails(mMedium)
onGlobalLayout {
if (isAdded) {
val realY = getExtendedDetailsY(height)
if (realY > 0) {
y = realY
beVisibleIf(text.isNotEmpty())
alpha = if (!mConfig.hideExtendedDetails || !mIsFullscreen) 1f else 0f
}
}
}
beVisibleIf(text.isNotEmpty())
alpha = if (!mConfig.hideExtendedDetails || !mIsFullscreen) 1f else 0f
}
} else {
binding.videoDetails.beGone()
@@ -577,21 +572,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
}
private fun initTimeHolder() {
var right = 0
var bottom = requireContext().navigationBarHeight
if (mConfig.bottomActions) {
bottom += resources.getDimension(R.dimen.bottom_actions_height).toInt()
}
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && activity?.hasNavBar() == true) {
right += requireActivity().navigationBarWidth
}
(mTimeHolder.layoutParams as RelativeLayout.LayoutParams).apply {
bottomMargin = bottom
rightMargin = right
}
mTimeHolder.beInvisibleIf(mIsFullscreen)
mTimeHolder.beGoneIf(mIsFullscreen)
mTimeHolder.alpha = if (mIsFullscreen) 0f else 1f
}
private fun checkIfPanorama() {
@@ -613,10 +595,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
override fun fullscreenToggled(isFullscreen: Boolean) {
mIsFullscreen = isFullscreen
val newAlpha = if (isFullscreen) 0f else 1f
if (!mIsFullscreen) {
mTimeHolder.beVisible()
}
mSeekBar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
arrayOf(
@@ -629,13 +607,18 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
it.isClickable = !mIsFullscreen
}
mTimeHolder.animate().alpha(newAlpha).start()
if (isFullscreen) {
mTimeHolder.fadeOut(DEFAULT_ANIMATION_DURATION)
binding.bottomActionsDummy.fadeOut(DEFAULT_ANIMATION_DURATION)
} else {
binding.bottomActionsDummy.beVisible()
mTimeHolder.fadeIn(DEFAULT_ANIMATION_DURATION)
}
binding.videoDetails.apply {
if (mStoredShowExtendedDetails && isVisible() && context != null && resources != null) {
animate().y(getExtendedDetailsY(height))
if (mStoredHideExtendedDetails) {
animate().alpha(newAlpha).start()
animate().alpha(if (isFullscreen) 0f else 1f).start()
}
}
}
@@ -670,24 +653,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
mExoPlayer?.setPlaybackSpeed(speed)
}
private fun getExtendedDetailsY(height: Int): Float {
val smallMargin =
context?.resources?.getDimension(org.fossify.commons.R.dimen.small_margin) ?: return 0f
val fullscreenOffset =
smallMargin + if (mIsFullscreen) 0 else requireContext().navigationBarHeight
var actionsHeight = 0f
if (!mIsFullscreen) {
if (binding.bottomVideoTimeHolder.root.children.any { isVisible }) {
actionsHeight += binding.bottomVideoTimeHolder.root.height
}
if (mConfig.bottomActions) {
actionsHeight += resources.getDimension(R.dimen.bottom_actions_height)
}
}
return requireContext().realScreenSize.y - height - actionsHeight - fullscreenOffset
}
private fun skip(forward: Boolean) {
if (mIsPanorama) {
return

View File

@@ -2,12 +2,14 @@ package org.fossify.gallery.helpers
import android.graphics.*
import com.squareup.picasso.Transformation
import kotlin.math.min
import androidx.core.graphics.createBitmap
// taken from https://stackoverflow.com/a/35241525/1967672
class PicassoRoundedCornersTransformation(private val radius: Float) : Transformation {
override fun transform(source: Bitmap): Bitmap {
val size = Math.min(source.width, source.height)
val size = min(source.width, source.height)
val x = (source.width - size) / 2
val y = (source.height - size) / 2
val squaredBitmap = Bitmap.createBitmap(source, x, y, size, size)
@@ -15,7 +17,7 @@ class PicassoRoundedCornersTransformation(private val radius: Float) : Transform
source.recycle()
}
val bitmap = Bitmap.createBitmap(size, size, source.config)
val bitmap = createBitmap(size, size, source.config ?: Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val paint = Paint()
val shader = BitmapShader(squaredBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)

View File

@@ -5,8 +5,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/editor_app_bar_layout"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/editor_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -19,13 +19,13 @@
app:title="@string/editor"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</com.google.android.material.appbar.AppBarLayout>
</org.fossify.commons.views.MyAppBarLayout>
<RelativeLayout
android:id="@+id/activity_edit_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize">
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<ImageView
android:id="@+id/default_image_view"

View File

@@ -5,19 +5,26 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/manage_folders_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/manage_folders_appbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:menu="@menu/menu_add_folder"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/manage_folders_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:menu="@menu/menu_add_folder"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<RelativeLayout
android:id="@+id/manage_folders_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize">
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<org.fossify.commons.views.MyRecyclerView
android:id="@+id/manage_folders_list"

View File

@@ -17,7 +17,10 @@
<ImageView
android:id="@+id/top_shadow"
android:layout_width="match_parent"
android:layout_height="@dimen/default_status_action_height"
android:layout_height="0dp"
android:minHeight="@dimen/default_status_action_height"
android:layout_alignBottom="@id/medium_viewer_appbar"
android:layout_alignParentTop="true"
android:background="@drawable/gradient_background_flipped"
android:contentDescription="@null" />

View File

@@ -5,8 +5,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/set_wallpaper_app_bar_layout"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/set_wallpaper_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -19,13 +19,13 @@
app:title="@string/wallpaper"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</com.google.android.material.appbar.AppBarLayout>
</org.fossify.commons.views.MyAppBarLayout>
<RelativeLayout
android:id="@+id/activity_set_wallpaper_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize">
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<com.canhub.cropper.CropImageView
android:id="@+id/crop_image_view"

View File

@@ -6,21 +6,28 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/settings_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/settings_appbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:title="@string/settings"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/settings_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:title="@string/settings"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/settings_nested_scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true"
android:scrollbars="none">
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:id="@+id/settings_holder"

View File

@@ -33,9 +33,12 @@
<ImageView
android:id="@+id/top_shadow"
android:layout_width="match_parent"
android:layout_height="@dimen/default_status_action_height"
android:layout_height="0dp"
android:layout_alignBottom="@id/video_appbar"
android:layout_alignParentTop="true"
android:background="@drawable/gradient_background_flipped"
android:contentDescription="@null" />
android:contentDescription="@null"
android:minHeight="@dimen/default_status_action_height" />
<TextView
android:id="@+id/video_bottom_gradient"
@@ -48,7 +51,10 @@
<include
android:id="@+id/bottom_video_time_holder"
layout="@layout/bottom_video_time_holder" />
layout="@layout/bottom_video_time_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
<include
android:id="@+id/error_message_holder"

View File

@@ -3,18 +3,20 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_actions_wrapper"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_actions_height"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient_background"
android:paddingTop="@dimen/medium_margin">
android:minHeight="@dimen/bottom_actions_height"
android:paddingTop="@dimen/normal_margin">
<ImageView
android:id="@+id/bottom_favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/toggle_favorite"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_star_outline_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_edit"
@@ -25,11 +27,12 @@
<ImageView
android:id="@+id/bottom_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/edit"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_edit_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_share"
@@ -40,11 +43,12 @@
<ImageView
android:id="@+id/bottom_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/share"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_share_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_delete"
@@ -55,11 +59,12 @@
<ImageView
android:id="@+id/bottom_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/delete"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_delete_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_rotate"
@@ -70,11 +75,12 @@
<ImageView
android:id="@+id/bottom_rotate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/rotate_right"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_rotate_right_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_properties"
@@ -85,11 +91,12 @@
<ImageView
android:id="@+id/bottom_properties"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/properties"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_info_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_change_orientation"
@@ -100,11 +107,12 @@
<ImageView
android:id="@+id/bottom_change_orientation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/change_orientation"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_orientation_auto_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_slideshow"
@@ -115,11 +123,12 @@
<ImageView
android:id="@+id/bottom_slideshow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/slideshow"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_slideshow_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_show_on_map"
@@ -130,11 +139,12 @@
<ImageView
android:id="@+id/bottom_show_on_map"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/show_on_map"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_place_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_toggle_file_visibility"
@@ -145,11 +155,12 @@
<ImageView
android:id="@+id/bottom_toggle_file_visibility"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/toggle_file_visibility"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_hide_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_rename"
@@ -160,11 +171,12 @@
<ImageView
android:id="@+id/bottom_rename"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/rename"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_rename_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_set_as"
@@ -175,11 +187,12 @@
<ImageView
android:id="@+id/bottom_set_as"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/set_as"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_set_as_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_copy"
@@ -190,11 +203,12 @@
<ImageView
android:id="@+id/bottom_copy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/copy"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_copy_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_move"
@@ -205,11 +219,12 @@
<ImageView
android:id="@+id/bottom_move"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/move"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_move_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bottom_resize"
@@ -220,11 +235,12 @@
<ImageView
android:id="@+id/bottom_resize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/list_touch_target_min"
android:layout_height="@dimen/list_touch_target_min"
android:layout_marginBottom="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/resize"
android:padding="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_minimize_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -3,8 +3,9 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_editor_primary_actions_wrapper"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_actions_height"
android:layout_alignParentBottom="true">
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:minHeight="@dimen/bottom_actions_height">
<ImageView
android:id="@+id/bottom_primary_filter"

View File

@@ -4,8 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/video_time_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
android:layout_height="wrap_content">
<TextView
android:id="@+id/video_playback_speed"

View File

@@ -13,7 +13,9 @@
<ImageView
android:id="@+id/top_shadow"
android:layout_width="match_parent"
android:layout_height="@dimen/default_status_action_height"
android:layout_height="0dp"
android:layout_alignBottom="@id/fragment_viewer_appbar"
android:layout_alignParentTop="true"
android:background="@drawable/gradient_background_flipped"
android:contentDescription="@null" />

View File

@@ -4,7 +4,8 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/photo_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:animateLayoutChanges="true">
<com.alexvasilkov.gestures.GestureImageView
android:id="@+id/gestures_view"
@@ -50,14 +51,25 @@
android:id="@+id/photo_details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignWithParentIfMissing="true"
android:layout_above="@id/bottom_actions_dummy"
android:layout_alignParentStart="true"
android:layout_marginHorizontal="@dimen/medium_margin"
android:layout_marginHorizontal="@dimen/activity_margin"
android:layout_marginVertical="@dimen/activity_margin"
android:background="@drawable/extended_details_background"
android:padding="@dimen/medium_margin"
android:textColor="@color/theme_dark_text_color"
android:textSize="@dimen/smaller_text_size"
android:visibility="gone"
tools:text="My image\nAnother line" />
tools:text="My image\nAnother line"
tools:visibility="visible" />
<Space
android:id="@+id/bottom_actions_dummy"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_actions_height"
android:layout_alignParentBottom="true"
android:paddingTop="@dimen/normal_margin" />
<org.fossify.gallery.views.MediaSideScroll
android:id="@+id/photo_brightness_controller"
@@ -86,7 +98,7 @@
android:id="@+id/photo_portrait_stripe_wrapper"
android:layout_width="match_parent"
android:layout_height="@dimen/portrait_photos_stripe_height"
android:layout_alignParentBottom="true"
android:layout_above="@id/bottom_actions_dummy"
android:visibility="invisible">
<androidx.recyclerview.widget.RecyclerView

View File

@@ -4,6 +4,7 @@
android:id="@+id/video_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:layoutDirection="ltr">
<ImageView
@@ -60,8 +61,11 @@
android:id="@+id/video_details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignWithParentIfMissing="true"
android:layout_above="@id/bottom_video_time_holder"
android:layout_alignParentStart="true"
android:layout_marginHorizontal="@dimen/medium_margin"
android:layout_marginHorizontal="@dimen/activity_margin"
android:layout_marginVertical="@dimen/activity_margin"
android:background="@drawable/extended_details_background"
android:padding="@dimen/medium_margin"
android:textColor="@color/theme_dark_text_color"
@@ -70,9 +74,20 @@
tools:text="Big buck bunny.mp4\n948.52 MB\n1920 x 1080 (2.1MP)\n10 April 2008, 08:30 AM"
tools:visibility="visible" />
<Space
android:id="@+id/bottom_actions_dummy"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_actions_height"
android:layout_alignParentBottom="true"
android:paddingTop="@dimen/normal_margin" />
<include
android:id="@+id/bottom_video_time_holder"
layout="@layout/bottom_video_time_holder" />
layout="@layout/bottom_video_time_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignWithParentIfMissing="true"
android:layout_above="@id/bottom_actions_dummy" />
<TextView
android:id="@+id/slide_info"

View File

@@ -7,14 +7,16 @@ ksp = "2.2.20-2.0.4"
detekt = "1.23.8"
detektCompose = "0.4.27"
#AndroidX
androidx-print = "1.1.0"
androidx-swiperefreshlayout = "1.1.0"
androidx-constraintlayout = "2.2.1"
androidx-documentfile = "1.1.0"
#exif
exif = "1.0.1"
#Room
room = "2.8.2"
#Fossify
commons = "5.4.0"
commons = "5.5.0"
#Gradle4
gradlePlugins-agp = "8.11.1"
#Other
@@ -34,8 +36,8 @@ okio = "3.16.2"
picasso = "2.71828"
subsamplingScaleImageView = "d705c3c4ad"
#build
app-build-compileSDKVersion = "34"
app-build-targetSDK = "34"
app-build-compileSDKVersion = "36"
app-build-targetSDK = "36"
app-build-minimumSDK = "26"
app-build-javaVersion = "VERSION_17"
app-build-kotlinJVMTarget = "17"
@@ -44,6 +46,8 @@ app-build-kotlinJVMTarget = "17"
androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3Exoplayer" }
androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "androidx-swiperefreshlayout" }
androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "androidx-constraintlayout" }
androidx-print = { module = "androidx.print:print", version.ref = "androidx-print" }
androidx-documentfile = { module = "androidx.documentfile:documentfile", version.ref = "androidx-documentfile" }
#exif
exif = { module = "it.sephiroth.android.exif:library", version.ref = "exif" }
#Room

View File

@@ -11,6 +11,7 @@ dependencyResolutionManagement {
google()
mavenCentral()
maven { setUrl("https://jitpack.io") }
mavenLocal()
}
}