mirror of
https://github.com/FossifyOrg/Gallery.git
synced 2025-12-23 23:58:28 -05:00
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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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<String>, getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long> ): ArrayList<Medium></ID>
|
||||
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaOnOTG( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList<String>, getVideoDurations: Boolean ): ArrayList<Medium></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<Directory>)</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<Directory>)</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 && intent.extras!!.get(MediaStore.EXTRA_OUTPUT) is Uri -> 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.<no name provided>$if</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity.<no name provided>$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.<no name provided>$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 && it != FAVORITES && !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 && !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<String, Any>())</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.<no name provided>$binding.gesturesView.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || allowZoomingImages == false</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.<no name provided>$override</ID>
|
||||
@@ -373,7 +361,6 @@
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.<no name provided>$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 && mMedium?.isImage() == true)</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.bottomSetAs.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0 && 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("<font color='${Color.WHITE.toHex()}'>${mMedium!!.name}</font>")</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" && visibleBottomActions and BOTTOM_ACTION_EDIT == 0</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" && 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 > 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 > 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()) && 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 && currentMedium?.isImage() == true)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomRotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && 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 && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 && !currentMedium.getIsInRecycleBin()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 && 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 && !currentMedium.isSVG()</ID>
|
||||
@@ -473,7 +453,6 @@
|
||||
<ID>NestedBlockDepth:Context.kt$fun Context.getNoMediaFoldersSync(): ArrayList<String></ID>
|
||||
<ID>NestedBlockDepth:Context.kt$fun Context.parseFileChannel( path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -> Unit )</ID>
|
||||
<ID>NestedBlockDepth:Context.kt$fun Context.updateSubfolderCounts( children: ArrayList<Directory>, parentDirs: ArrayList<Directory> )</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<String></ID>
|
||||
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList<Directory>)</ID>
|
||||
@@ -488,19 +467,8 @@
|
||||
<ID>NestedBlockDepth:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean, folderNoMediaStatuses: HashMap<String, Boolean>, callback: (path: String, hasNoMedia: Boolean) -> Unit ): Boolean</ID>
|
||||
<ID>NestedBlockDepth:VideoPlayerActivity.kt$VideoPlayerActivity$private fun handleEvent(event: MotionEvent)</ID>
|
||||
<ID>NestedBlockDepth:ViewPagerActivity.kt$ViewPagerActivity$private fun getPositionInList(items: MutableList<Medium>): Int</ID>
|
||||
<ID>ReturnCount:Context.kt$@Suppress("UNCHECKED_CAST") fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Directory></ID>
|
||||
<ID>ReturnCount:Context.kt$fun Context.getDirectorySortingValue( media: ArrayList<Medium>, path: String, name: String, size: Long, count: Int ): String</ID>
|
||||
<ID>ReturnCount:ExcludeFolderDialog.kt$ExcludeFolderDialog$private fun getAlternativePathsList(): List<String></ID>
|
||||
<ID>ReturnCount:InstantItemSwitch.kt$InstantItemSwitch$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
|
||||
<ID>ReturnCount:MediaFetcher.kt$MediaFetcher$fun groupMedia(media: ArrayList<Medium>, path: String): ArrayList<ThumbnailItem></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<String>, includedPaths: MutableSet<String>, showHidden: Boolean, folderNoMediaStatuses: HashMap<String, Boolean>, callback: (path: String, hasNoMedia: Boolean) -> Unit ): Boolean</ID>
|
||||
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun getPositionInList(items: MutableList<Medium>): 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>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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?) {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" />
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" />
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -11,6 +11,7 @@ dependencyResolutionManagement {
|
||||
google()
|
||||
mavenCentral()
|
||||
maven { setUrl("https://jitpack.io") }
|
||||
mavenLocal()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user