Migrate to viewbinding and kotlin gradle scripts

- Replaced kotlinx sythetic with viewbinding
- Updated kotlin from 1.7.10 to 1.9.0
- Updated Android Gradle Plugin to 8.1.0
This commit is contained in:
Ensar Sarajčić 2023-08-09 10:32:19 +02:00
parent 087048b134
commit 3303a6d638
71 changed files with 2476 additions and 2150 deletions

View file

@ -1,6 +1,5 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
def keystorePropertiesFile = rootProject.file("keystore.properties")
@ -10,12 +9,13 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 33
compileSdkVersion 34
namespace = "com.simplemobiletools.gallery.pro"
defaultConfig {
applicationId "com.simplemobiletools.gallery.pro"
minSdkVersion 23
targetSdkVersion 33
targetSdkVersion 34
versionCode 394
versionName "6.27.2"
setProperty("archivesBaseName", "gallery-$versionCode")
@ -68,17 +68,22 @@ android {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
packagingOptions {
exclude 'META-INF/library_release.kotlin_module'
}
buildFeatures {
buildConfig = true
viewBinding = true
}
}
dependencies {
implementation 'com.github.SimpleMobileTools:Simple-Commons:fad9b2cdb0'
implementation 'com.github.esensar:Simple-Commons:98cea1b5bb'
implementation 'com.vanniktech:android-image-cropper:4.5.0'
implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.25'

View file

@ -36,6 +36,7 @@ import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.gallery.pro.BuildConfig
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.FiltersAdapter
import com.simplemobiletools.gallery.pro.databinding.ActivityEditBinding
import com.simplemobiletools.gallery.pro.dialogs.OtherAspectRatioDialog
import com.simplemobiletools.gallery.pro.dialogs.ResizeDialog
import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog
@ -47,34 +48,30 @@ import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.FilterItem
import com.zomato.photofilters.FilterPack
import com.zomato.photofilters.imageprocessors.Filter
import kotlinx.android.synthetic.main.activity_edit.*
import kotlinx.android.synthetic.main.bottom_actions_aspect_ratio.*
import kotlinx.android.synthetic.main.bottom_editor_actions_filter.*
import kotlinx.android.synthetic.main.bottom_editor_crop_rotate_actions.*
import kotlinx.android.synthetic.main.bottom_editor_draw_actions.*
import kotlinx.android.synthetic.main.bottom_editor_primary_actions.*
import java.io.*
import kotlin.math.max
class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener {
companion object {
init {
System.loadLibrary("NativeImageProcessor")
}
private const val TEMP_FOLDER_NAME = "images"
private const val ASPECT_X = "aspectX"
private const val ASPECT_Y = "aspectY"
private const val CROP = "crop"
// constants for bottom primary action groups
private const val PRIMARY_ACTION_NONE = 0
private const val PRIMARY_ACTION_FILTER = 1
private const val PRIMARY_ACTION_CROP_ROTATE = 2
private const val PRIMARY_ACTION_DRAW = 3
private const val CROP_ROTATE_NONE = 0
private const val CROP_ROTATE_ASPECT_RATIO = 1
}
private val TEMP_FOLDER_NAME = "images"
private val ASPECT_X = "aspectX"
private val ASPECT_Y = "aspectY"
private val CROP = "crop"
// constants for bottom primary action groups
private val PRIMARY_ACTION_NONE = 0
private val PRIMARY_ACTION_FILTER = 1
private val PRIMARY_ACTION_CROP_ROTATE = 2
private val PRIMARY_ACTION_DRAW = 3
private val CROP_ROTATE_NONE = 0
private val CROP_ROTATE_ASPECT_RATIO = 1
private lateinit var saveUri: Uri
private var uri: Uri? = null
@ -92,10 +89,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private var oldExif: ExifInterface? = null
private var filterInitialBitmap: Bitmap? = null
private var originalUri: Uri? = null
private lateinit var binding: ActivityEditBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_edit)
binding = ActivityEditBinding.inflate(layoutInflater)
setContentView(binding.root)
if (checkAppSideloading()) {
return
@ -104,7 +103,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
setupOptionsMenu()
handlePermission(getPermissionToRequest()) {
if (!it) {
toast(R.string.no_storage_permissions)
toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish()
}
initEditActivity()
@ -114,8 +113,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
override fun onResume() {
super.onResume()
isEditingWithThirdParty = false
bottom_draw_width.setColors(getProperTextColor(), getProperPrimaryColor(), getProperBackgroundColor())
setupToolbar(editor_toolbar, NavigationIcon.Arrow)
binding.bottomEditorDrawActions.bottomDrawWidth.setColors(getProperTextColor(), getProperPrimaryColor(), getProperBackgroundColor())
setupToolbar(binding.editorToolbar, NavigationIcon.Arrow)
}
override fun onStop() {
@ -126,7 +125,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
private fun setupOptionsMenu() {
editor_toolbar.setOnMenuItemClickListener { menuItem ->
binding.editorToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.save_as -> saveImage()
R.id.edit -> editWith()
@ -172,8 +171,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
isCropIntent = intent.extras?.get(CROP) == "true"
if (isCropIntent) {
bottom_editor_primary_actions.beGone()
(bottom_editor_crop_rotate_actions.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1)
binding.bottomEditorPrimaryActions.root.beGone()
(binding.bottomEditorCropRotateActions.root.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1)
}
loadDefaultImageView()
@ -191,14 +190,14 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
lastOtherAspectRatio = Pair(config.lastEditorCropOtherAspectRatioX, config.lastEditorCropOtherAspectRatioY)
}
updateAspectRatio(config.lastEditorCropAspectRatio)
crop_image_view.guidelines = CropImageView.Guidelines.ON
bottom_aspect_ratios.beVisible()
binding.cropImageView.guidelines = CropImageView.Guidelines.ON
binding.bottomAspectRatios.root.beVisible()
}
private fun loadDefaultImageView() {
default_image_view.beVisible()
crop_image_view.beGone()
editor_draw_canvas.beGone()
binding.defaultImageView.beVisible()
binding.cropImageView.beGone()
binding.editorDrawCanvas.beGone()
val options = RequestOptions()
.skipMemoryCache(true)
@ -232,8 +231,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
bottomCropRotateClicked()
}
if (filterInitialBitmap != null && currentFilter != null && currentFilter.filter.name != getString(R.string.none)) {
default_image_view.onGlobalLayout {
if (filterInitialBitmap != null && currentFilter != null && currentFilter.filter.name != getString(com.simplemobiletools.commons.R.string.none)) {
binding.defaultImageView.onGlobalLayout {
applyFilter(currentFilter)
}
} else {
@ -241,19 +240,19 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
if (isCropIntent) {
bottom_primary_filter.beGone()
bottom_primary_draw.beGone()
binding.bottomEditorPrimaryActions.bottomPrimaryFilter.beGone()
binding.bottomEditorPrimaryActions.bottomPrimaryDraw.beGone()
}
return false
}
}).into(default_image_view)
}).into(binding.defaultImageView)
}
private fun loadCropImageView() {
default_image_view.beGone()
editor_draw_canvas.beGone()
crop_image_view.apply {
binding.defaultImageView.beGone()
binding.editorDrawCanvas.beGone()
binding.cropImageView.apply {
beVisible()
setOnCropImageCompleteListener(this@EditActivity)
setImageUriAsync(uri)
@ -262,19 +261,19 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
if (isCropIntent && shouldCropSquare()) {
currAspectRatio = ASPECT_RATIO_ONE_ONE
setFixedAspectRatio(true)
bottom_aspect_ratio.beGone()
binding.bottomEditorCropRotateActions.bottomAspectRatio.beGone()
}
}
}
private fun loadDrawCanvas() {
default_image_view.beGone()
crop_image_view.beGone()
editor_draw_canvas.beVisible()
binding.defaultImageView.beGone()
binding.cropImageView.beGone()
binding.editorDrawCanvas.beVisible()
if (!wasDrawCanvasPositioned) {
wasDrawCanvasPositioned = true
editor_draw_canvas.onGlobalLayout {
binding.editorDrawCanvas.onGlobalLayout {
ensureBackgroundThread {
fillCanvasBackground()
}
@ -296,11 +295,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
.asBitmap()
.load(uri)
.apply(options)
.into(editor_draw_canvas.width, editor_draw_canvas.height)
.into(binding.editorDrawCanvas.width, binding.editorDrawCanvas.height)
val bitmap = builder.get()
runOnUiThread {
editor_draw_canvas.apply {
binding.editorDrawCanvas.apply {
updateBackgroundBitmap(bitmap)
layoutParams.width = bitmap.width
layoutParams.height = bitmap.height
@ -317,10 +316,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private fun saveImage() {
setOldExif()
if (crop_image_view.isVisible()) {
crop_image_view.croppedImageAsync()
} else if (editor_draw_canvas.isVisible()) {
val bitmap = editor_draw_canvas.getBitmap()
if (binding.cropImageView.isVisible()) {
binding.cropImageView.croppedImageAsync()
} else if (binding.editorDrawCanvas.isVisible()) {
val bitmap = binding.editorDrawCanvas.getBitmap()
if (saveUri.scheme == "file") {
SaveAsDialog(this, saveUri.path!!, true) {
saveBitmapToFile(bitmap, it, true)
@ -335,13 +334,13 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
val currentFilter = getFiltersAdapter()?.getCurrentFilter() ?: return
val filePathGetter = getNewFilePath()
SaveAsDialog(this, filePathGetter.first, filePathGetter.second) {
toast(R.string.saving)
toast(com.simplemobiletools.commons.R.string.saving)
// clean up everything to free as much memory as possible
default_image_view.setImageResource(0)
crop_image_view.setImageBitmap(null)
bottom_actions_filter_list.adapter = null
bottom_actions_filter_list.beGone()
binding.defaultImageView.setImageResource(0)
binding.cropImageView.setImageBitmap(null)
binding.bottomEditorFilterActions.bottomActionsFilterList.adapter = null
binding.bottomEditorFilterActions.bottomActionsFilterList.beGone()
ensureBackgroundThread {
try {
@ -349,7 +348,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
currentFilter.filter.processFilter(originalBitmap)
saveBitmapToFile(originalBitmap, it, false)
} catch (e: OutOfMemoryError) {
toast(R.string.out_of_memory_error)
toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
}
}
}
@ -373,10 +372,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private fun shareImage() {
ensureBackgroundThread {
when {
default_image_view.isVisible() -> {
binding.defaultImageView.isVisible() -> {
val currentFilter = getFiltersAdapter()?.getCurrentFilter()
if (currentFilter == null) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return@ensureBackgroundThread
}
@ -384,13 +383,15 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
currentFilter.filter.processFilter(originalBitmap)
shareBitmap(originalBitmap)
}
crop_image_view.isVisible() -> {
binding.cropImageView.isVisible() -> {
isSharingBitmap = true
runOnUiThread {
crop_image_view.croppedImageAsync()
binding.cropImageView.croppedImageAsync()
}
}
editor_draw_canvas.isVisible() -> shareBitmap(editor_draw_canvas.getBitmap())
binding.editorDrawCanvas.isVisible() -> shareBitmap(binding.editorDrawCanvas.getBitmap())
}
}
}
@ -430,12 +431,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
if (it != null) {
sharePathIntent(it, BuildConfig.APPLICATION_ID)
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
}
}
private fun getFiltersAdapter() = bottom_actions_filter_list.adapter as? FiltersAdapter
private fun getFiltersAdapter() = binding.bottomEditorFilterActions.bottomActionsFilterList.adapter as? FiltersAdapter
private fun setupBottomActions() {
setupPrimaryActionButtons()
@ -445,18 +446,22 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
private fun setupPrimaryActionButtons() {
bottom_primary_filter.setOnClickListener {
binding.bottomEditorPrimaryActions.bottomPrimaryFilter.setOnClickListener {
bottomFilterClicked()
}
bottom_primary_crop_rotate.setOnClickListener {
binding.bottomEditorPrimaryActions.bottomPrimaryCropRotate.setOnClickListener {
bottomCropRotateClicked()
}
bottom_primary_draw.setOnClickListener {
binding.bottomEditorPrimaryActions.bottomPrimaryDraw.setOnClickListener {
bottomDrawClicked()
}
arrayOf(bottom_primary_filter, bottom_primary_crop_rotate, bottom_primary_draw).forEach {
arrayOf(
binding.bottomEditorPrimaryActions.bottomPrimaryFilter,
binding.bottomEditorPrimaryActions.bottomPrimaryCropRotate,
binding.bottomEditorPrimaryActions.bottomPrimaryDraw
).forEach {
setupLongPress(it)
}
}
@ -489,59 +494,65 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
private fun setupCropRotateActionButtons() {
bottom_rotate.setOnClickListener {
crop_image_view.rotateImage(90)
binding.bottomEditorCropRotateActions.bottomRotate.setOnClickListener {
binding.cropImageView.rotateImage(90)
}
bottom_resize.beGoneIf(isCropIntent)
bottom_resize.setOnClickListener {
binding.bottomEditorCropRotateActions.bottomResize.beGoneIf(isCropIntent)
binding.bottomEditorCropRotateActions.bottomResize.setOnClickListener {
resizeImage()
}
bottom_flip_horizontally.setOnClickListener {
crop_image_view.flipImageHorizontally()
binding.bottomEditorCropRotateActions.bottomFlipHorizontally.setOnClickListener {
binding.cropImageView.flipImageHorizontally()
}
bottom_flip_vertically.setOnClickListener {
crop_image_view.flipImageVertically()
binding.bottomEditorCropRotateActions.bottomFlipVertically.setOnClickListener {
binding.cropImageView.flipImageVertically()
}
bottom_aspect_ratio.setOnClickListener {
binding.bottomEditorCropRotateActions.bottomAspectRatio.setOnClickListener {
currCropRotateAction = if (currCropRotateAction == CROP_ROTATE_ASPECT_RATIO) {
crop_image_view.guidelines = CropImageView.Guidelines.OFF
bottom_aspect_ratios.beGone()
binding.cropImageView.guidelines = CropImageView.Guidelines.OFF
binding.bottomAspectRatios.root.beGone()
CROP_ROTATE_NONE
} else {
crop_image_view.guidelines = CropImageView.Guidelines.ON
bottom_aspect_ratios.beVisible()
binding.cropImageView.guidelines = CropImageView.Guidelines.ON
binding.bottomAspectRatios.root.beVisible()
CROP_ROTATE_ASPECT_RATIO
}
updateCropRotateActionButtons()
}
arrayOf(bottom_rotate, bottom_resize, bottom_flip_horizontally, bottom_flip_vertically, bottom_aspect_ratio).forEach {
arrayOf(
binding.bottomEditorCropRotateActions.bottomRotate,
binding.bottomEditorCropRotateActions.bottomResize,
binding.bottomEditorCropRotateActions.bottomFlipHorizontally,
binding.bottomEditorCropRotateActions.bottomFlipVertically,
binding.bottomEditorCropRotateActions.bottomAspectRatio
).forEach {
setupLongPress(it)
}
}
private fun setupAspectRatioButtons() {
bottom_aspect_ratio_free.setOnClickListener {
binding.bottomAspectRatios.bottomAspectRatioFree.setOnClickListener {
updateAspectRatio(ASPECT_RATIO_FREE)
}
bottom_aspect_ratio_one_one.setOnClickListener {
binding.bottomAspectRatios.bottomAspectRatioOneOne.setOnClickListener {
updateAspectRatio(ASPECT_RATIO_ONE_ONE)
}
bottom_aspect_ratio_four_three.setOnClickListener {
binding.bottomAspectRatios.bottomAspectRatioFourThree.setOnClickListener {
updateAspectRatio(ASPECT_RATIO_FOUR_THREE)
}
bottom_aspect_ratio_sixteen_nine.setOnClickListener {
binding.bottomAspectRatios.bottomAspectRatioSixteenNine.setOnClickListener {
updateAspectRatio(ASPECT_RATIO_SIXTEEN_NINE)
}
bottom_aspect_ratio_other.setOnClickListener {
binding.bottomAspectRatios.bottomAspectRatioOther.setOnClickListener {
OtherAspectRatioDialog(this, lastOtherAspectRatio) {
lastOtherAspectRatio = it
config.lastEditorCropOtherAspectRatioX = it.first
@ -555,10 +566,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private fun setupDrawButtons() {
updateDrawColor(config.lastEditorDrawColor)
bottom_draw_width.progress = config.lastEditorBrushSize
binding.bottomEditorDrawActions.bottomDrawWidth.progress = config.lastEditorBrushSize
updateBrushSize(config.lastEditorBrushSize)
bottom_draw_color_clickable.setOnClickListener {
binding.bottomEditorDrawActions.bottomDrawColorClickable.setOnClickListener {
ColorPickerDialog(this, drawColor) { wasPositivePressed, color ->
if (wasPositivePressed) {
updateDrawColor(color)
@ -566,49 +577,53 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
}
bottom_draw_width.onSeekBarChangeListener {
binding.bottomEditorDrawActions.bottomDrawWidth.onSeekBarChangeListener {
config.lastEditorBrushSize = it
updateBrushSize(it)
}
bottom_draw_undo.setOnClickListener {
editor_draw_canvas.undo()
binding.bottomEditorDrawActions.bottomDrawUndo.setOnClickListener {
binding.editorDrawCanvas.undo()
}
}
private fun updateBrushSize(percent: Int) {
editor_draw_canvas.updateBrushSize(percent)
val scale = Math.max(0.03f, percent / 100f)
bottom_draw_color.scaleX = scale
bottom_draw_color.scaleY = scale
binding.editorDrawCanvas.updateBrushSize(percent)
val scale = max(0.03f, percent / 100f)
binding.bottomEditorDrawActions.bottomDrawColor.scaleX = scale
binding.bottomEditorDrawActions.bottomDrawColor.scaleY = scale
}
private fun updatePrimaryActionButtons() {
if (crop_image_view.isGone() && currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) {
if (binding.cropImageView.isGone() && currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) {
loadCropImageView()
} else if (default_image_view.isGone() && currPrimaryAction == PRIMARY_ACTION_FILTER) {
} else if (binding.defaultImageView.isGone() && currPrimaryAction == PRIMARY_ACTION_FILTER) {
loadDefaultImageView()
} else if (editor_draw_canvas.isGone() && currPrimaryAction == PRIMARY_ACTION_DRAW) {
} else if (binding.editorDrawCanvas.isGone() && currPrimaryAction == PRIMARY_ACTION_DRAW) {
loadDrawCanvas()
}
arrayOf(bottom_primary_filter, bottom_primary_crop_rotate, bottom_primary_draw).forEach {
arrayOf(
binding.bottomEditorPrimaryActions.bottomPrimaryFilter,
binding.bottomEditorPrimaryActions.bottomPrimaryCropRotate,
binding.bottomEditorPrimaryActions.bottomPrimaryDraw
).forEach {
it.applyColorFilter(Color.WHITE)
}
val currentPrimaryActionButton = when (currPrimaryAction) {
PRIMARY_ACTION_FILTER -> bottom_primary_filter
PRIMARY_ACTION_CROP_ROTATE -> bottom_primary_crop_rotate
PRIMARY_ACTION_DRAW -> bottom_primary_draw
PRIMARY_ACTION_FILTER -> binding.bottomEditorPrimaryActions.bottomPrimaryFilter
PRIMARY_ACTION_CROP_ROTATE -> binding.bottomEditorPrimaryActions.bottomPrimaryCropRotate
PRIMARY_ACTION_DRAW -> binding.bottomEditorPrimaryActions.bottomPrimaryDraw
else -> null
}
currentPrimaryActionButton?.applyColorFilter(getProperPrimaryColor())
bottom_editor_filter_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_FILTER)
bottom_editor_crop_rotate_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE)
bottom_editor_draw_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_DRAW)
binding.bottomEditorFilterActions.root.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_FILTER)
binding.bottomEditorCropRotateActions.root.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE)
binding.bottomEditorDrawActions.root.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_DRAW)
if (currPrimaryAction == PRIMARY_ACTION_FILTER && bottom_actions_filter_list.adapter == null) {
if (currPrimaryAction == PRIMARY_ACTION_FILTER && binding.bottomEditorFilterActions.bottomActionsFilterList.adapter == null) {
ensureBackgroundThread {
val thumbnailSize = resources.getDimension(R.dimen.bottom_filters_thumbnail_size).toInt()
@ -641,7 +656,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
val filterThumbnailsManager = FilterThumbnailsManager()
filterThumbnailsManager.clearThumbs()
val noFilter = Filter(getString(R.string.none))
val noFilter = Filter(getString(com.simplemobiletools.commons.R.string.none))
filterThumbnailsManager.addThumb(FilterItem(bitmap, noFilter))
FilterPack.getFilterPack(this).forEach {
@ -651,24 +666,24 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
val filterItems = filterThumbnailsManager.processThumbs()
val adapter = FiltersAdapter(applicationContext, filterItems) {
val layoutManager = bottom_actions_filter_list.layoutManager as LinearLayoutManager
val layoutManager = binding.bottomEditorFilterActions.bottomActionsFilterList.layoutManager as LinearLayoutManager
applyFilter(filterItems[it])
if (it == layoutManager.findLastCompletelyVisibleItemPosition() || it == layoutManager.findLastVisibleItemPosition()) {
bottom_actions_filter_list.smoothScrollBy(thumbnailSize, 0)
binding.bottomEditorFilterActions.bottomActionsFilterList.smoothScrollBy(thumbnailSize, 0)
} else if (it == layoutManager.findFirstCompletelyVisibleItemPosition() || it == layoutManager.findFirstVisibleItemPosition()) {
bottom_actions_filter_list.smoothScrollBy(-thumbnailSize, 0)
binding.bottomEditorFilterActions.bottomActionsFilterList.smoothScrollBy(-thumbnailSize, 0)
}
}
bottom_actions_filter_list.adapter = adapter
binding.bottomEditorFilterActions.bottomActionsFilterList.adapter = adapter
adapter.notifyDataSetChanged()
}
}
}
if (currPrimaryAction != PRIMARY_ACTION_CROP_ROTATE) {
bottom_aspect_ratios.beGone()
binding.bottomAspectRatios.root.beGone()
currCropRotateAction = CROP_ROTATE_NONE
}
updateCropRotateActionButtons()
@ -676,7 +691,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private fun applyFilter(filterItem: FilterItem) {
val newBitmap = Bitmap.createBitmap(filterInitialBitmap!!)
default_image_view.setImageBitmap(filterItem.filter.processFilter(newBitmap))
binding.defaultImageView.setImageBitmap(filterItem.filter.processFilter(newBitmap))
}
private fun updateAspectRatio(aspectRatio: Int) {
@ -684,7 +699,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
config.lastEditorCropAspectRatio = aspectRatio
updateAspectRatioButtons()
crop_image_view.apply {
binding.cropImageView.apply {
if (aspectRatio == ASPECT_RATIO_FREE) {
setFixedAspectRatio(false)
} else {
@ -702,33 +717,33 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private fun updateAspectRatioButtons() {
arrayOf(
bottom_aspect_ratio_free,
bottom_aspect_ratio_one_one,
bottom_aspect_ratio_four_three,
bottom_aspect_ratio_sixteen_nine,
bottom_aspect_ratio_other
binding.bottomAspectRatios.bottomAspectRatioFree,
binding.bottomAspectRatios.bottomAspectRatioOneOne,
binding.bottomAspectRatios.bottomAspectRatioFourThree,
binding.bottomAspectRatios.bottomAspectRatioSixteenNine,
binding.bottomAspectRatios.bottomAspectRatioOther,
).forEach {
it.setTextColor(Color.WHITE)
}
val currentAspectRatioButton = when (currAspectRatio) {
ASPECT_RATIO_FREE -> bottom_aspect_ratio_free
ASPECT_RATIO_ONE_ONE -> bottom_aspect_ratio_one_one
ASPECT_RATIO_FOUR_THREE -> bottom_aspect_ratio_four_three
ASPECT_RATIO_SIXTEEN_NINE -> bottom_aspect_ratio_sixteen_nine
else -> bottom_aspect_ratio_other
ASPECT_RATIO_FREE -> binding.bottomAspectRatios.bottomAspectRatioFree
ASPECT_RATIO_ONE_ONE -> binding.bottomAspectRatios.bottomAspectRatioOneOne
ASPECT_RATIO_FOUR_THREE -> binding.bottomAspectRatios.bottomAspectRatioFourThree
ASPECT_RATIO_SIXTEEN_NINE -> binding.bottomAspectRatios.bottomAspectRatioSixteenNine
else -> binding.bottomAspectRatios.bottomAspectRatioOther
}
currentAspectRatioButton.setTextColor(getProperPrimaryColor())
}
private fun updateCropRotateActionButtons() {
arrayOf(bottom_aspect_ratio).forEach {
arrayOf(binding.bottomEditorCropRotateActions.bottomAspectRatio).forEach {
it.applyColorFilter(Color.WHITE)
}
val primaryActionView = when (currCropRotateAction) {
CROP_ROTATE_ASPECT_RATIO -> bottom_aspect_ratio
CROP_ROTATE_ASPECT_RATIO -> binding.bottomEditorCropRotateActions.bottomAspectRatio
else -> null
}
@ -737,22 +752,22 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private fun updateDrawColor(color: Int) {
drawColor = color
bottom_draw_color.applyColorFilter(color)
binding.bottomEditorDrawActions.bottomDrawColor.applyColorFilter(color)
config.lastEditorDrawColor = color
editor_draw_canvas.updateColor(color)
binding.editorDrawCanvas.updateColor(color)
}
private fun resizeImage() {
val point = getAreaSize()
if (point == null) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return
}
ResizeDialog(this, point) {
resizeWidth = it.x
resizeHeight = it.y
crop_image_view.croppedImageAsync()
binding.cropImageView.croppedImageAsync()
}
}
@ -766,8 +781,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
private fun getAreaSize(): Point? {
val rect = crop_image_view.cropRect ?: return null
val rotation = crop_image_view.rotatedDegrees
val rect = binding.cropImageView.cropRect ?: return null
val rotation = binding.cropImageView.rotatedDegrees
return if (rotation == 0 || rotation == 180) {
Point(rect.width(), rect.height())
} else {
@ -861,7 +876,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
val label =
"sknahT .moc.slootelibomelpmis.www morf eno lanigiro eht daolnwod ytefas nwo ruoy roF .ppa eht fo noisrev ekaf a gnisu era uoY".reversed()
runOnUiThread {
ConfirmationDialog(this, label, positive = R.string.ok, negative = 0) {
ConfirmationDialog(this, label, positive = com.simplemobiletools.commons.R.string.ok, negative = 0) {
launchViewIntent("6629852208836920709=di?ved/sppa/erots/moc.elgoog.yalp//:sptth".reversed())
}
}
@ -889,14 +904,14 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
} catch (e: Exception) {
showErrorToast(e)
} catch (e: OutOfMemoryError) {
toast(R.string.out_of_memory_error)
toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun saveBitmap(file: File, bitmap: Bitmap, out: OutputStream, showSavingToast: Boolean) {
if (showSavingToast) {
toast(R.string.saving)
toast(com.simplemobiletools.commons.R.string.saving)
}
if (resizeWidth > 0 && resizeHeight > 0) {
@ -929,7 +944,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
rescanPaths(paths) {
fixDateTaken(paths, false)
setResult(Activity.RESULT_OK, intent)
toast(R.string.file_saved)
toast(com.simplemobiletools.commons.R.string.file_saved)
finish()
}
}

View file

@ -11,33 +11,36 @@ import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.ManageFoldersAdapter
import com.simplemobiletools.gallery.pro.databinding.ActivityManageFoldersBinding
import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.activity_manage_folders.*
class ExcludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private lateinit var binding: ActivityManageFoldersBinding
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_folders)
binding = ActivityManageFoldersBinding.inflate(layoutInflater)
setContentView(binding.root)
updateFolders()
setupOptionsMenu()
manage_folders_toolbar.title = getString(R.string.excluded_folders)
binding.manageFoldersToolbar.title = getString(com.simplemobiletools.commons.R.string.excluded_folders)
updateMaterialActivityViews(manage_folders_coordinator, manage_folders_list, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(manage_folders_list, manage_folders_toolbar)
updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
}
override fun onResume() {
super.onResume()
setupToolbar(manage_folders_toolbar, NavigationIcon.Arrow)
setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
}
private fun updateFolders() {
val folders = ArrayList<String>()
config.excludedFolders.mapTo(folders) { it }
var placeholderText = getString(R.string.excluded_activity_placeholder)
manage_folders_placeholder.apply {
binding.manageFoldersPlaceholder.apply {
beVisibleIf(folders.isEmpty())
setTextColor(getProperTextColor())
@ -48,12 +51,12 @@ class ExcludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
text = placeholderText
}
val adapter = ManageFoldersAdapter(this, folders, true, this, manage_folders_list) {}
manage_folders_list.adapter = adapter
val adapter = ManageFoldersAdapter(this, folders, true, this, binding.manageFoldersList) {}
binding.manageFoldersList.adapter = adapter
}
private fun setupOptionsMenu() {
manage_folders_toolbar.setOnMenuItemClickListener { menuItem ->
binding.manageFoldersToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.add_folder -> addFolder()
else -> return@setOnMenuItemClickListener false

View file

@ -9,47 +9,49 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.ManageHiddenFoldersAdapter
import com.simplemobiletools.gallery.pro.databinding.ActivityManageFoldersBinding
import com.simplemobiletools.gallery.pro.extensions.addNoMedia
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.getNoMediaFolders
import kotlinx.android.synthetic.main.activity_manage_folders.*
class HiddenFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private lateinit var binding: ActivityManageFoldersBinding
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_folders)
binding = ActivityManageFoldersBinding.inflate(layoutInflater)
setContentView(binding.root)
updateFolders()
setupOptionsMenu()
manage_folders_toolbar.title = getString(R.string.hidden_folders)
binding.manageFoldersToolbar.title = getString(R.string.hidden_folders)
updateMaterialActivityViews(manage_folders_coordinator, manage_folders_list, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(manage_folders_list, manage_folders_toolbar)
updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
}
override fun onResume() {
super.onResume()
setupToolbar(manage_folders_toolbar, NavigationIcon.Arrow)
setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
}
private fun updateFolders() {
getNoMediaFolders {
runOnUiThread {
manage_folders_placeholder.apply {
binding.manageFoldersPlaceholder.apply {
text = getString(R.string.hidden_folders_placeholder)
beVisibleIf(it.isEmpty())
setTextColor(getProperTextColor())
}
val adapter = ManageHiddenFoldersAdapter(this, it, this, manage_folders_list) {}
manage_folders_list.adapter = adapter
val adapter = ManageHiddenFoldersAdapter(this, it, this, binding.manageFoldersList) {}
binding.manageFoldersList.adapter = adapter
}
}
}
private fun setupOptionsMenu() {
manage_folders_toolbar.setOnMenuItemClickListener { menuItem ->
binding.manageFoldersToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.add_folder -> addFolder()
else -> return@setOnMenuItemClickListener false

View file

@ -7,43 +7,46 @@ import com.simplemobiletools.commons.helpers.NavigationIcon
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.ManageFoldersAdapter
import com.simplemobiletools.gallery.pro.databinding.ActivityManageFoldersBinding
import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.activity_manage_folders.*
class IncludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private lateinit var binding: ActivityManageFoldersBinding
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_folders)
binding = ActivityManageFoldersBinding.inflate(layoutInflater)
setContentView(binding.root)
updateFolders()
setupOptionsMenu()
manage_folders_toolbar.title = getString(R.string.include_folders)
binding.manageFoldersToolbar.title = getString(R.string.include_folders)
updateMaterialActivityViews(manage_folders_coordinator, manage_folders_list, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(manage_folders_list, manage_folders_toolbar)
updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
}
override fun onResume() {
super.onResume()
setupToolbar(manage_folders_toolbar, NavigationIcon.Arrow)
setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
}
private fun updateFolders() {
val folders = ArrayList<String>()
config.includedFolders.mapTo(folders) { it }
manage_folders_placeholder.apply {
binding.manageFoldersPlaceholder.apply {
text = getString(R.string.included_activity_placeholder)
beVisibleIf(folders.isEmpty())
setTextColor(getProperTextColor())
}
val adapter = ManageFoldersAdapter(this, folders, false, this, manage_folders_list) {}
manage_folders_list.adapter = adapter
val adapter = ManageFoldersAdapter(this, folders, false, this, binding.manageFoldersList) {}
binding.manageFoldersList.adapter = adapter
}
private fun setupOptionsMenu() {
manage_folders_toolbar.setOnMenuItemClickListener { menuItem ->
binding.manageFoldersToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.add_folder -> addFolder()
else -> return@setOnMenuItemClickListener false

View file

@ -28,6 +28,7 @@ import com.simplemobiletools.gallery.pro.BuildConfig
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.DirectoryAdapter
import com.simplemobiletools.gallery.pro.databases.GalleryDatabase
import com.simplemobiletools.gallery.pro.databinding.ActivityMainBinding
import com.simplemobiletools.gallery.pro.dialogs.ChangeSortingDialog
import com.simplemobiletools.gallery.pro.dialogs.ChangeViewTypeDialog
import com.simplemobiletools.gallery.pro.dialogs.FilterMediaDialog
@ -38,13 +39,14 @@ import com.simplemobiletools.gallery.pro.interfaces.DirectoryOperationsListener
import com.simplemobiletools.gallery.pro.jobs.NewPhotoFetcher
import com.simplemobiletools.gallery.pro.models.Directory
import com.simplemobiletools.gallery.pro.models.Medium
import kotlinx.android.synthetic.main.activity_main.*
import java.io.*
class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private val PICK_MEDIA = 2
private val PICK_WALLPAPER = 3
private val LAST_MEDIA_CHECK_PERIOD = 3000L
companion object {
private const val PICK_MEDIA = 2
private const val PICK_WALLPAPER = 3
private const val LAST_MEDIA_CHECK_PERIOD = 3000L
}
private var mIsPickImageIntent = false
private var mIsPickVideoIntent = false
@ -81,11 +83,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private var mStoredTextColor = 0
private var mStoredPrimaryColor = 0
private var mStoredStyleString = ""
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID)
if (savedInstanceState == null) {
@ -111,9 +115,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupOptionsMenu()
refreshMenuItems()
updateMaterialActivityViews(directories_coordinator, directories_grid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true)
updateMaterialActivityViews(
binding.directoriesCoordinator,
binding.directoriesGrid,
useTransparentNavigation = !config.scrollHorizontally,
useTopSearchMenu = true
)
directories_refresh_layout.setOnRefreshListener { getDirectories() }
binding.directoriesRefreshLayout.setOnRefreshListener { getDirectories() }
storeStateVariables()
checkWhatsNewDialog()
@ -146,32 +155,25 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
updateWidgets()
registerFileUpdateListener()
directories_switch_searching.setOnClickListener {
binding.directoriesSwitchSearching.setOnClickListener {
launchSearchActivity()
}
// just request the permission, tryLoadGallery will then trigger in onResume
handleMediaPermissions { success ->
if (!success) {
toast(R.string.no_storage_permissions)
toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish()
}
}
}
private fun handleMediaPermissions(callback: (granted: Boolean) -> Unit) {
handlePermission(getPermissionToRequest()) { granted ->
callback(granted)
if (granted && isRPlus()) {
handlePermission(PERMISSION_MEDIA_LOCATION) {}
if (isTiramisuPlus()) {
handlePermission(PERMISSION_READ_MEDIA_VIDEO) {}
}
if (!mWasMediaManagementPromptShown) {
mWasMediaManagementPromptShown = true
handleMediaManagementPrompt { }
}
private fun handleMediaPermissions(force: Boolean = false, callback: (granted: Boolean) -> Unit) {
handlePartialMediaPermissions(getPermissionsToRequest(), force) {
callback(it)
if (!mWasMediaManagementPromptShown) {
mWasMediaManagementPromptShown = true
handleMediaManagementPrompt { }
}
}
}
@ -200,7 +202,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (mStoredScrollHorizontally != config.scrollHorizontally) {
mLoadedInitialPhotos = false
directories_grid.adapter = null
binding.directoriesGrid.adapter = null
getDirectories()
}
@ -218,20 +220,20 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupAdapter(mDirs, forceRecreate = true)
}
directories_fastscroller.updateColors(primaryColor)
directories_refresh_layout.isEnabled = config.enablePullToRefresh
binding.directoriesFastscroller.updateColors(primaryColor)
binding.directoriesRefreshLayout.isEnabled = config.enablePullToRefresh
getRecyclerAdapter()?.apply {
dateFormat = config.dateFormat
timeFormat = getTimeFormat()
}
directories_empty_placeholder.setTextColor(getProperTextColor())
directories_empty_placeholder_2.setTextColor(primaryColor)
directories_switch_searching.setTextColor(primaryColor)
directories_switch_searching.underlineText()
directories_empty_placeholder_2.bringToFront()
binding.directoriesEmptyPlaceholder.setTextColor(getProperTextColor())
binding.directoriesEmptyPlaceholder2.setTextColor(primaryColor)
binding.directoriesSwitchSearching.setTextColor(primaryColor)
binding.directoriesSwitchSearching.underlineText()
binding.directoriesEmptyPlaceholder2.bringToFront()
if (!main_menu.isSearchOpen) {
if (!binding.mainMenu.isSearchOpen) {
refreshMenuItems()
if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
handleAppPasswordProtection {
@ -249,15 +251,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
if (config.searchAllFilesByDefault) {
main_menu.updateHintText(getString(R.string.search_files))
binding.mainMenu.updateHintText(getString(com.simplemobiletools.commons.R.string.search_files))
} else {
main_menu.updateHintText(getString(R.string.search_folders))
binding.mainMenu.updateHintText(getString(com.simplemobiletools.commons.R.string.search_folders))
}
}
override fun onPause() {
super.onPause()
directories_refresh_layout.isRefreshing = false
binding.directoriesRefreshLayout.isRefreshing = false
mIsGettingDirs = false
storeStateVariables()
mLastMediaHandler.removeCallbacksAndMessages(null)
@ -297,8 +299,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
override fun onBackPressed() {
if (main_menu.isSearchOpen) {
main_menu.closeSearch()
if (binding.mainMenu.isSearchOpen) {
binding.mainMenu.closeSearch()
} else if (config.groupDirectSubfolders) {
if (mCurrentPathPrefix.isEmpty()) {
super.onBackPressed()
@ -345,15 +347,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun refreshMenuItems() {
if (!mIsThirdPartyIntent) {
main_menu.getToolbar().menu.apply {
binding.mainMenu.getToolbar().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 = config.useRecycleBin && !config.showRecycleBinAtFolders
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations)
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations)
}
}
main_menu.getToolbar().menu.apply {
binding.mainMenu.getToolbar().menu.apply {
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
@ -369,23 +371,23 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
R.menu.menu_main
}
main_menu.getToolbar().inflateMenu(menuId)
main_menu.toggleHideOnScroll(!config.scrollHorizontally)
main_menu.setupMenu()
binding.mainMenu.getToolbar().inflateMenu(menuId)
binding.mainMenu.toggleHideOnScroll(!config.scrollHorizontally)
binding.mainMenu.setupMenu()
main_menu.onSearchOpenListener = {
binding.mainMenu.onSearchOpenListener = {
if (config.searchAllFilesByDefault) {
launchSearchActivity()
}
}
main_menu.onSearchTextChangedListener = { text ->
binding.mainMenu.onSearchTextChangedListener = { text ->
setupAdapter(mDirsIgnoringSearch, text)
directories_refresh_layout.isEnabled = text.isEmpty() && config.enablePullToRefresh
directories_switch_searching.beVisibleIf(text.isNotEmpty())
binding.directoriesRefreshLayout.isEnabled = text.isEmpty() && config.enablePullToRefresh
binding.directoriesSwitchSearching.beVisibleIf(text.isNotEmpty())
}
main_menu.getToolbar().setOnMenuItemClickListener { menuItem ->
binding.mainMenu.getToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.sort -> showSortingDialog()
R.id.filter -> showFilterMediaDialog()
@ -396,6 +398,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden()
R.id.temporarily_show_excluded -> tryToggleTemporarilyShowExcluded()
R.id.stop_showing_excluded -> tryToggleTemporarilyShowExcluded()
R.id.access_more_media -> handleMediaPermissions(force = true) { }
R.id.create_new_folder -> createNewFolder()
R.id.open_recycle_bin -> openRecycleBin()
R.id.column_count -> changeColumnCount()
@ -421,10 +424,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
main_menu.updateColors()
binding.mainMenu.updateColors()
}
private fun getRecyclerAdapter() = directories_grid.adapter as? DirectoryAdapter
private fun getRecyclerAdapter() = binding.directoriesGrid.adapter as? DirectoryAdapter
private fun storeStateVariables() {
mStoredTextColor = getProperTextColor()
@ -451,7 +454,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val newFolder = File(config.tempFolderPath)
if (getDoesFilePathExist(newFolder.absolutePath) && newFolder.isDirectory) {
if (newFolder.getProperSize(true) == 0L && newFolder.getFileCount(true) == 0 && newFolder.list()?.isEmpty() == true) {
toast(String.format(getString(R.string.deleting_folder), config.tempFolderPath), Toast.LENGTH_LONG)
toast(String.format(getString(com.simplemobiletools.commons.R.string.deleting_folder), config.tempFolderPath), Toast.LENGTH_LONG)
tryDeleteFileDirItem(newFolder.toFileDirItem(applicationContext), true, true)
}
}
@ -503,7 +506,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
if (isPackageInstalled("com.simplemobiletools.gallery")) {
ConfirmationDialog(this, "", R.string.upgraded_from_free_gallery, R.string.ok, 0, false) {}
ConfirmationDialog(
this,
"",
com.simplemobiletools.commons.R.string.upgraded_from_free_gallery,
com.simplemobiletools.commons.R.string.ok,
0,
false
) {}
}
checkOTGPath()
@ -517,7 +527,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupLayoutManager()
} else {
toast(R.string.no_storage_permissions)
toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish()
}
}
@ -544,14 +554,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
startActivity(this)
}
main_menu.postDelayed({
main_menu.closeSearch()
binding.mainMenu.postDelayed({
binding.mainMenu.closeSearch()
}, 500)
}
private fun showSortingDialog() {
ChangeSortingDialog(this, true, false) {
directories_grid.adapter = null
binding.directoriesGrid.adapter = null
if (config.directorySorting and SORT_BY_DATE_MODIFIED != 0 || config.directorySorting and SORT_BY_DATE_TAKEN != 0) {
getDirectories()
} else {
@ -567,8 +577,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun showFilterMediaDialog() {
FilterMediaDialog(this) {
mShouldStopFetching = true
directories_refresh_layout.isRefreshing = true
directories_grid.adapter = null
binding.directoriesRefreshLayout.isRefreshing = true
binding.directoriesGrid.adapter = null
getDirectories()
}
}
@ -592,7 +602,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
ChangeViewTypeDialog(this, true) {
refreshMenuItems()
setupLayoutManager()
directories_grid.adapter = null
binding.directoriesGrid.adapter = null
setupAdapter(getRecyclerAdapter()?.dirs ?: mDirs)
}
}
@ -614,7 +624,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun toggleTemporarilyShowHidden(show: Boolean) {
mLoadedInitialPhotos = false
config.temporarilyShowHidden = show
directories_grid.adapter = null
binding.directoriesGrid.adapter = null
getDirectories()
refreshMenuItems()
}
@ -632,7 +642,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun toggleTemporarilyShowExcluded(show: Boolean) {
mLoadedInitialPhotos = false
config.temporarilyShowExcluded = show
directories_grid.adapter = null
binding.directoriesGrid.adapter = null
getDirectories()
refreshMenuItems()
}
@ -644,14 +654,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
fileDirItems.isEmpty() -> return
fileDirItems.size == 1 -> {
try {
toast(String.format(getString(R.string.deleting_folder), fileDirItems.first().name))
toast(String.format(getString(com.simplemobiletools.commons.R.string.deleting_folder), fileDirItems.first().name))
} catch (e: Exception) {
showErrorToast(e)
}
}
else -> {
val baseString = if (config.useRecycleBin && !config.tempSkipRecycleBin) R.plurals.moving_items_into_bin else R.plurals.delete_items
val baseString =
if (config.useRecycleBin && !config.tempSkipRecycleBin) com.simplemobiletools.commons.R.plurals.moving_items_into_bin else com.simplemobiletools.commons.R.plurals.delete_items
val deletingItems = resources.getQuantityString(baseString, fileDirItems.size, fileDirItems.size)
toast(deletingItems)
}
@ -680,7 +691,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (it) {
deleteFilteredFileDirItems(itemsToDelete, folders)
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
}
} else {
@ -717,33 +728,35 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupListLayoutManager()
}
(directories_refresh_layout.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.BELOW, R.id.directories_switch_searching)
(binding.directoriesRefreshLayout.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.BELOW, R.id.directories_switch_searching)
}
private fun setupGridLayoutManager() {
val layoutManager = directories_grid.layoutManager as MyGridLayoutManager
val layoutManager = binding.directoriesGrid.layoutManager as MyGridLayoutManager
if (config.scrollHorizontally) {
layoutManager.orientation = RecyclerView.HORIZONTAL
directories_refresh_layout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
binding.directoriesRefreshLayout.layoutParams =
RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
} else {
layoutManager.orientation = RecyclerView.VERTICAL
directories_refresh_layout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.directoriesRefreshLayout.layoutParams =
RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
layoutManager.spanCount = config.dirColumnCnt
}
private fun setupListLayoutManager() {
val layoutManager = directories_grid.layoutManager as MyGridLayoutManager
val layoutManager = binding.directoriesGrid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL
directories_refresh_layout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.directoriesRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
mZoomListener = null
}
private fun initZoomListener() {
if (config.viewTypeFolders == VIEW_TYPE_GRID) {
val layoutManager = directories_grid.layoutManager as MyGridLayoutManager
val layoutManager = binding.directoriesGrid.layoutManager as MyGridLayoutManager
mZoomListener = object : MyRecyclerView.MyZoomListener {
override fun zoomIn() {
if (layoutManager.spanCount > 1) {
@ -778,10 +791,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun changeColumnCount() {
val items = ArrayList<RadioItem>()
for (i in 1..MAX_COLUMN_COUNT) {
items.add(RadioItem(i, resources.getQuantityString(R.plurals.column_counts, i, i)))
items.add(RadioItem(i, resources.getQuantityString(com.simplemobiletools.commons.R.plurals.column_counts, i, i)))
}
val currentColumnCount = (directories_grid.layoutManager as MyGridLayoutManager).spanCount
val currentColumnCount = (binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount
RadioGroupDialog(this, items, currentColumnCount) {
val newColumnCount = it as Int
if (currentColumnCount != newColumnCount) {
@ -802,7 +815,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun columnCountChanged() {
(directories_grid.layoutManager as MyGridLayoutManager).spanCount = config.dirColumnCnt
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount = config.dirColumnCnt
refreshMenuItems()
getRecyclerAdapter()?.apply {
notifyItemRangeChanged(0, dirs.size)
@ -953,7 +966,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (mediaDB.getDeletedMediaCount() > 0) {
val recycleBin = Directory().apply {
path = RECYCLE_BIN
name = getString(R.string.recycle_bin)
name = getString(com.simplemobiletools.commons.R.string.recycle_bin)
location = LOCATION_INTERNAL
}
@ -967,7 +980,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (mediaDB.getFavoritesCount() > 0) {
val favorites = Directory().apply {
path = FAVORITES
name = getString(R.string.favorites)
name = getString(com.simplemobiletools.commons.R.string.favorites)
location = LOCATION_INTERNAL
}
@ -1114,9 +1127,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (isPlaceholderVisible) {
isPlaceholderVisible = false
runOnUiThread {
directories_empty_placeholder.beGone()
directories_empty_placeholder_2.beGone()
directories_fastscroller.beVisible()
binding.directoriesEmptyPlaceholder.beGone()
binding.directoriesEmptyPlaceholder2.beGone()
binding.directoriesFastscroller.beVisible()
}
}
@ -1142,7 +1155,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
runOnUiThread {
directories_refresh_layout.isRefreshing = false
binding.directoriesRefreshLayout.isRefreshing = false
checkPlaceholderVisibility(dirs)
}
@ -1201,41 +1214,41 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun checkPlaceholderVisibility(dirs: ArrayList<Directory>) {
directories_empty_placeholder.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
directories_empty_placeholder_2.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
binding.directoriesEmptyPlaceholder.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
binding.directoriesEmptyPlaceholder2.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
if (main_menu.isSearchOpen) {
directories_empty_placeholder.text = getString(R.string.no_items_found)
directories_empty_placeholder_2.beGone()
if (binding.mainMenu.isSearchOpen) {
binding.directoriesEmptyPlaceholder.text = getString(com.simplemobiletools.commons.R.string.no_items_found)
binding.directoriesEmptyPlaceholder2.beGone()
} else if (dirs.isEmpty() && config.filterMedia == getDefaultFileFilter()) {
if (isRPlus() && !isExternalStorageManager()) {
directories_empty_placeholder.text = getString(R.string.no_items_found)
directories_empty_placeholder_2.beGone()
binding.directoriesEmptyPlaceholder.text = getString(com.simplemobiletools.commons.R.string.no_items_found)
binding.directoriesEmptyPlaceholder2.beGone()
} else {
directories_empty_placeholder.text = getString(R.string.no_media_add_included)
directories_empty_placeholder_2.text = getString(R.string.add_folder)
binding.directoriesEmptyPlaceholder.text = getString(R.string.no_media_add_included)
binding.directoriesEmptyPlaceholder2.text = getString(R.string.add_folder)
}
directories_empty_placeholder_2.setOnClickListener {
binding.directoriesEmptyPlaceholder2.setOnClickListener {
showAddIncludedFolderDialog {
refreshItems()
}
}
} else {
directories_empty_placeholder.text = getString(R.string.no_media_with_filters)
directories_empty_placeholder_2.text = getString(R.string.change_filters_underlined)
binding.directoriesEmptyPlaceholder.text = getString(R.string.no_media_with_filters)
binding.directoriesEmptyPlaceholder2.text = getString(R.string.change_filters_underlined)
directories_empty_placeholder_2.setOnClickListener {
binding.directoriesEmptyPlaceholder2.setOnClickListener {
showFilterMediaDialog()
}
}
directories_empty_placeholder_2.underlineText()
directories_fastscroller.beVisibleIf(directories_empty_placeholder.isGone())
binding.directoriesEmptyPlaceholder2.underlineText()
binding.directoriesFastscroller.beVisibleIf(binding.directoriesEmptyPlaceholder.isGone())
}
private fun setupAdapter(dirs: ArrayList<Directory>, textToSearch: String = main_menu.getCurrentQuery(), forceRecreate: Boolean = false) {
val currAdapter = directories_grid.adapter
private fun setupAdapter(dirs: ArrayList<Directory>, textToSearch: String = binding.mainMenu.getCurrentQuery(), forceRecreate: Boolean = false) {
val currAdapter = binding.directoriesGrid.adapter
val distinctDirs = dirs.distinctBy { it.path.getDistinctPath() }.toMutableList() as ArrayList<Directory>
val sortedDirs = getSortedDirectories(distinctDirs)
var dirsToShow = getDirsToShow(sortedDirs, mDirs, mCurrentPathPrefix).clone() as ArrayList<Directory>
@ -1247,9 +1260,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
this,
dirsToShow,
this,
directories_grid,
binding.directoriesGrid,
isPickIntent(intent) || isGetAnyContentIntent(intent),
directories_refresh_layout
binding.directoriesRefreshLayout
) {
val clickedDir = it as Directory
val path = clickedDir.path
@ -1265,11 +1278,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}.apply {
setupZoomListener(mZoomListener)
runOnUiThread {
directories_grid.adapter = this
binding.directoriesGrid.adapter = this
setupScrollDirection()
if (config.viewTypeFolders == VIEW_TYPE_LIST && areSystemAnimationsEnabled) {
directories_grid.scheduleLayoutAnimation()
binding.directoriesGrid.scheduleLayoutAnimation()
}
}
}
@ -1281,19 +1294,19 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
checkPlaceholderVisibility(dirsToShow)
(directories_grid.adapter as? DirectoryAdapter)?.updateDirs(dirsToShow)
(binding.directoriesGrid.adapter as? DirectoryAdapter)?.updateDirs(dirsToShow)
}
}
// recyclerview sometimes becomes empty at init/update, triggering an invisible refresh like this seems to work fine
directories_grid.postDelayed({
directories_grid.scrollBy(0, 0)
binding.directoriesGrid.postDelayed({
binding.directoriesGrid.scrollBy(0, 0)
}, 500)
}
private fun setupScrollDirection() {
val scrollHorizontally = config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID
directories_fastscroller.setScrollVertically(!scrollHorizontally)
binding.directoriesFastscroller.setScrollVertically(!scrollHorizontally)
}
private fun checkInvalidDirectories(dirs: ArrayList<Directory>) {

View file

@ -28,6 +28,7 @@ import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.MediaAdapter
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.pro.databases.GalleryDatabase
import com.simplemobiletools.gallery.pro.databinding.ActivityMediaBinding
import com.simplemobiletools.gallery.pro.dialogs.*
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.*
@ -35,7 +36,6 @@ import com.simplemobiletools.gallery.pro.interfaces.MediaOperationsListener
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection
import kotlinx.android.synthetic.main.activity_media.*
import java.io.File
import java.io.IOException
@ -70,6 +70,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private var mStoredPrimaryColor = 0
private var mStoredThumbnailSpacing = 0
private lateinit var binding: ActivityMediaBinding
companion object {
var mMedia = ArrayList<ThumbnailItem>()
}
@ -77,7 +79,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_media)
binding = ActivityMediaBinding.inflate(layoutInflater)
setContentView(binding.root)
intent.apply {
mIsGetImageIntent = getBooleanExtra(GET_IMAGE_INTENT, false)
@ -86,7 +89,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mAllowPickingMultiple = getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
}
media_refresh_layout.setOnRefreshListener { getMedia() }
binding.mediaRefreshLayout.setOnRefreshListener { getMedia() }
try {
mPath = intent.getStringExtra(DIRECTORY) ?: ""
} catch (e: Exception) {
@ -98,17 +101,24 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
setupOptionsMenu()
refreshMenuItems()
storeStateVariables()
updateMaterialActivityViews(media_coordinator, media_grid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true)
updateMaterialActivityViews(binding.mediaCoordinator, binding.mediaGrid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true)
if (mShowAll) {
registerFileUpdateListener()
if (isPackageInstalled("com.simplemobiletools.gallery")) {
ConfirmationDialog(this, "", R.string.upgraded_from_free_gallery, R.string.ok, 0, false) {}
ConfirmationDialog(
this,
"",
com.simplemobiletools.commons.R.string.upgraded_from_free_gallery,
com.simplemobiletools.commons.R.string.ok,
0,
false
) {}
}
}
media_empty_text_placeholder_2.setOnClickListener {
binding.mediaEmptyTextPlaceholder2.setOnClickListener {
showFilterMediaDialog()
}
@ -133,7 +143,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
if (mStoredScrollHorizontally != config.scrollHorizontally) {
mLoadedInitialPhotos = false
media_grid.adapter = null
binding.mediaGrid.adapter = null
getMedia()
}
@ -155,22 +165,22 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|| mStoredRoundedCorners != config.fileRoundedCorners
|| mStoredMarkFavoriteItems != config.markFavoriteItems
) {
media_grid.adapter = null
binding.mediaGrid.adapter = null
setupAdapter()
}
refreshMenuItems()
media_fastscroller.updateColors(primaryColor)
media_refresh_layout.isEnabled = config.enablePullToRefresh
binding.mediaFastscroller.updateColors(primaryColor)
binding.mediaRefreshLayout.isEnabled = config.enablePullToRefresh
getMediaAdapter()?.apply {
dateFormat = config.dateFormat
timeFormat = getTimeFormat()
}
media_empty_text_placeholder.setTextColor(getProperTextColor())
media_empty_text_placeholder_2.setTextColor(getProperPrimaryColor())
media_empty_text_placeholder_2.bringToFront()
binding.mediaEmptyTextPlaceholder.setTextColor(getProperTextColor())
binding.mediaEmptyTextPlaceholder2.setTextColor(getProperPrimaryColor())
binding.mediaEmptyTextPlaceholder2.bringToFront()
// do not refresh Random sorted files after opening a fullscreen image and going Back
val isRandomSorting = config.getFolderSorting(mPath) and SORT_BY_RANDOM != 0
@ -192,7 +202,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
override fun onPause() {
super.onPause()
mIsGettingMedia = false
media_refresh_layout.isRefreshing = false
binding.mediaRefreshLayout.isRefreshing = false
storeStateVariables()
mLastMediaHandler.removeCallbacksAndMessages(null)
@ -229,8 +239,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
override fun onBackPressed() {
if (media_menu.isSearchOpen) {
media_menu.closeSearch()
if (binding.mediaMenu.isSearchOpen) {
binding.mediaMenu.closeSearch()
} else {
super.onBackPressed()
}
@ -249,7 +259,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun refreshMenuItems() {
val isDefaultFolder = !config.defaultFolder.isEmpty() && File(config.defaultFolder).compareTo(File(mPath)) == 0
media_menu.getToolbar().menu.apply {
binding.mediaMenu.getToolbar().menu.apply {
findItem(R.id.group).isVisible = !config.scrollHorizontally
findItem(R.id.empty_recycle_bin).isVisible = mPath == RECYCLE_BIN
@ -275,17 +285,17 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupOptionsMenu() {
media_menu.getToolbar().inflateMenu(R.menu.menu_media)
media_menu.toggleHideOnScroll(!config.scrollHorizontally)
media_menu.setupMenu()
binding.mediaMenu.getToolbar().inflateMenu(R.menu.menu_media)
binding.mediaMenu.toggleHideOnScroll(!config.scrollHorizontally)
binding.mediaMenu.setupMenu()
media_menu.onSearchTextChangedListener = { text ->
binding.mediaMenu.onSearchTextChangedListener = { text ->
mLastSearchedText = text
searchQueryChanged(text)
media_refresh_layout.isEnabled = text.isEmpty() && config.enablePullToRefresh
binding.mediaRefreshLayout.isEnabled = text.isEmpty() && config.enablePullToRefresh
}
media_menu.getToolbar().setOnMenuItemClickListener { menuItem ->
binding.mediaMenu.getToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.sort -> showSortingDialog()
R.id.filter -> showFilterMediaDialog()
@ -329,7 +339,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
media_menu.updateColors()
binding.mediaMenu.updateColors()
}
private fun storeStateVariables() {
@ -355,12 +365,12 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList<Medium>, mPath)
runOnUiThread {
if (grouped.isEmpty()) {
media_empty_text_placeholder.text = getString(R.string.no_items_found)
media_empty_text_placeholder.beVisible()
media_fastscroller.beGone()
binding.mediaEmptyTextPlaceholder.text = getString(com.simplemobiletools.commons.R.string.no_items_found)
binding.mediaEmptyTextPlaceholder.beVisible()
binding.mediaFastscroller.beGone()
} else {
media_empty_text_placeholder.beGone()
media_fastscroller.beVisible()
binding.mediaEmptyTextPlaceholder.beGone()
binding.mediaFastscroller.beVisible()
}
handleGridSpacing(grouped)
@ -375,22 +385,22 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
handlePermission(getPermissionToRequest()) {
if (it) {
val dirName = when {
mPath == FAVORITES -> getString(R.string.favorites)
mPath == RECYCLE_BIN -> getString(R.string.recycle_bin)
mPath == config.OTGPath -> getString(R.string.usb)
mPath == FAVORITES -> getString(com.simplemobiletools.commons.R.string.favorites)
mPath == RECYCLE_BIN -> getString(com.simplemobiletools.commons.R.string.recycle_bin)
mPath == config.OTGPath -> getString(com.simplemobiletools.commons.R.string.usb)
else -> getHumanizedFilename(mPath)
}
val searchHint = if (mShowAll) {
getString(R.string.search_files)
getString(com.simplemobiletools.commons.R.string.search_files)
} else {
getString(R.string.search_in_placeholder, dirName)
getString(com.simplemobiletools.commons.R.string.search_in_placeholder, dirName)
}
media_menu.updateHintText(searchHint)
binding.mediaMenu.updateHintText(searchHint)
if (!mShowAll) {
media_menu.toggleForceArrowBackIcon(true)
media_menu.onNavigateBackClickListener = {
binding.mediaMenu.toggleForceArrowBackIcon(true)
binding.mediaMenu.onNavigateBackClickListener = {
onBackPressed()
}
}
@ -398,37 +408,37 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
getMedia()
setupLayoutManager()
} else {
toast(R.string.no_storage_permissions)
toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish()
}
}
}
private fun getMediaAdapter() = media_grid.adapter as? MediaAdapter
private fun getMediaAdapter() = binding.mediaGrid.adapter as? MediaAdapter
private fun setupAdapter() {
if (!mShowAll && isDirEmpty()) {
return
}
val currAdapter = media_grid.adapter
val currAdapter = binding.mediaGrid.adapter
if (currAdapter == null) {
initZoomListener()
MediaAdapter(
this, mMedia.clone() as ArrayList<ThumbnailItem>, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent,
mAllowPickingMultiple, mPath, media_grid
mAllowPickingMultiple, mPath, binding.mediaGrid
) {
if (it is Medium && !isFinishing) {
itemClicked(it.path)
}
}.apply {
setupZoomListener(mZoomListener)
media_grid.adapter = this
binding.mediaGrid.adapter = this
}
val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath)
if (viewType == VIEW_TYPE_LIST && areSystemAnimationsEnabled) {
media_grid.scheduleLayoutAnimation()
binding.mediaGrid.scheduleLayoutAnimation()
}
setupLayoutManager()
@ -446,7 +456,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun setupScrollDirection() {
val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath)
val scrollHorizontally = config.scrollHorizontally && viewType == VIEW_TYPE_GRID
media_fastscroller.setScrollVertically(!scrollHorizontally)
binding.mediaFastscroller.setScrollVertically(!scrollHorizontally)
}
private fun checkLastMediaChanged() {
@ -475,7 +485,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun showSortingDialog() {
ChangeSortingDialog(this, false, true, mPath) {
mLoadedInitialPhotos = false
media_grid.adapter = null
binding.mediaGrid.adapter = null
getMedia()
}
}
@ -483,8 +493,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun showFilterMediaDialog() {
FilterMediaDialog(this) {
mLoadedInitialPhotos = false
media_refresh_layout.isRefreshing = true
media_grid.adapter = null
binding.mediaRefreshLayout.isRefreshing = true
binding.mediaGrid.adapter = null
getMedia()
}
}
@ -531,7 +541,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
ChangeViewTypeDialog(this, false, mPath) {
refreshMenuItems()
setupLayoutManager()
media_grid.adapter = null
binding.mediaGrid.adapter = null
setupAdapter()
}
}
@ -539,7 +549,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun showGroupByDialog() {
ChangeGroupingDialog(this, mPath) {
mLoadedInitialPhotos = false
media_grid.adapter = null
binding.mediaGrid.adapter = null
getMedia()
}
}
@ -569,7 +579,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
getCachedMedia(mPath, mIsGetVideoIntent, mIsGetImageIntent) {
if (it.isEmpty()) {
runOnUiThread {
media_refresh_layout.isRefreshing = true
binding.mediaRefreshLayout.isRefreshing = true
}
} else {
gotMedia(it, true)
@ -622,9 +632,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
if (mPath == RECYCLE_BIN) {
media_empty_text_placeholder.setText(R.string.no_items_found)
media_empty_text_placeholder.beVisible()
media_empty_text_placeholder_2.beGone()
binding.mediaEmptyTextPlaceholder.setText(com.simplemobiletools.commons.R.string.no_items_found)
binding.mediaEmptyTextPlaceholder.beVisible()
binding.mediaEmptyTextPlaceholder2.beGone()
} else {
finish()
}
@ -681,13 +691,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupGridLayoutManager() {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager
val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
if (config.scrollHorizontally) {
layoutManager.orientation = RecyclerView.HORIZONTAL
media_refresh_layout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
} else {
layoutManager.orientation = RecyclerView.VERTICAL
media_refresh_layout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
layoutManager.spanCount = config.mediaColumnCnt
@ -704,10 +714,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupListLayoutManager() {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager
val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL
media_refresh_layout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
mZoomListener = null
}
@ -719,17 +729,17 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val useGridPosition = media.firstOrNull() is ThumbnailSection
var currentGridDecoration: GridSpacingItemDecoration? = null
if (media_grid.itemDecorationCount > 0) {
currentGridDecoration = media_grid.getItemDecorationAt(0) as GridSpacingItemDecoration
if (binding.mediaGrid.itemDecorationCount > 0) {
currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration.items = media
}
val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)
if (currentGridDecoration.toString() != newGridDecoration.toString()) {
if (currentGridDecoration != null) {
media_grid.removeItemDecoration(currentGridDecoration)
binding.mediaGrid.removeItemDecoration(currentGridDecoration)
}
media_grid.addItemDecoration(newGridDecoration)
binding.mediaGrid.addItemDecoration(newGridDecoration)
}
}
}
@ -737,7 +747,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun initZoomListener() {
val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath)
if (viewType == VIEW_TYPE_GRID) {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager
val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
mZoomListener = object : MyRecyclerView.MyZoomListener {
override fun zoomIn() {
if (layoutManager.spanCount > 1) {
@ -761,10 +771,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun changeColumnCount() {
val items = ArrayList<RadioItem>()
for (i in 1..MAX_COLUMN_COUNT) {
items.add(RadioItem(i, resources.getQuantityString(R.plurals.column_counts, i, i)))
items.add(RadioItem(i, resources.getQuantityString(com.simplemobiletools.commons.R.plurals.column_counts, i, i)))
}
val currentColumnCount = (media_grid.layoutManager as MyGridLayoutManager).spanCount
val currentColumnCount = (binding.mediaGrid.layoutManager as MyGridLayoutManager).spanCount
RadioGroupDialog(this, items, currentColumnCount) {
val newColumnCount = it as Int
if (currentColumnCount != newColumnCount) {
@ -785,7 +795,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun columnCountChanged() {
(media_grid.layoutManager as MyGridLayoutManager).spanCount = config.mediaColumnCnt
(binding.mediaGrid.layoutManager as MyGridLayoutManager).spanCount = config.mediaColumnCnt
handleGridSpacing()
refreshMenuItems()
getMediaAdapter()?.apply {
@ -863,14 +873,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mMedia = media
runOnUiThread {
media_refresh_layout.isRefreshing = false
media_empty_text_placeholder.beVisibleIf(media.isEmpty() && !isFromCache)
media_empty_text_placeholder_2.beVisibleIf(media.isEmpty() && !isFromCache)
binding.mediaRefreshLayout.isRefreshing = false
binding.mediaEmptyTextPlaceholder.beVisibleIf(media.isEmpty() && !isFromCache)
binding.mediaEmptyTextPlaceholder2.beVisibleIf(media.isEmpty() && !isFromCache)
if (media_empty_text_placeholder.isVisible()) {
media_empty_text_placeholder.text = getString(R.string.no_media_with_filters)
if (binding.mediaEmptyTextPlaceholder.isVisible()) {
binding.mediaEmptyTextPlaceholder.text = getString(R.string.no_media_with_filters)
}
media_fastscroller.beVisibleIf(media_empty_text_placeholder.isGone())
binding.mediaFastscroller.beVisibleIf(binding.mediaEmptyTextPlaceholder.isGone())
setupAdapter()
}
@ -894,18 +904,18 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
if (config.useRecycleBin && !skipRecycleBin && !filtered.first().path.startsWith(recycleBinPath)) {
val movingItems = resources.getQuantityString(R.plurals.moving_items_into_bin, filtered.size, filtered.size)
val movingItems = resources.getQuantityString(com.simplemobiletools.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)
toast(movingItems)
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>) {
if (it) {
deleteFilteredFiles(filtered)
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
}
} else {
val deletingItems = resources.getQuantityString(R.plurals.deleting_items, filtered.size, filtered.size)
val deletingItems = resources.getQuantityString(com.simplemobiletools.commons.R.plurals.deleting_items, filtered.size, filtered.size)
toast(deletingItems)
deleteFilteredFiles(filtered)
}
@ -916,7 +926,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun deleteFilteredFiles(filtered: ArrayList<FileDirItem>) {
deleteFiles(filtered) {
if (!it) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return@deleteFiles
}
@ -961,8 +971,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
}
if (media_grid.itemDecorationCount > 0) {
val currentGridDecoration = media_grid.getItemDecorationAt(0) as GridSpacingItemDecoration
if (binding.mediaGrid.itemDecorationCount > 0) {
val currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration.items = media
}
}

View file

@ -16,11 +16,11 @@ import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.ActivityPanoramaPhotoBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.hideSystemUI
import com.simplemobiletools.gallery.pro.extensions.showSystemUI
import com.simplemobiletools.gallery.pro.helpers.PATH
import kotlinx.android.synthetic.main.activity_panorama_photo.*
open class PanoramaPhotoActivity : SimpleActivity() {
private val CARDBOARD_DISPLAY_MODE = 3
@ -29,23 +29,26 @@ open class PanoramaPhotoActivity : SimpleActivity() {
private var isExploreEnabled = true
private var isRendering = false
private lateinit var binding: ActivityPanoramaPhotoBinding
public override fun onCreate(savedInstanceState: Bundle?) {
useDynamicTheme = false
requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_panorama_photo)
binding = ActivityPanoramaPhotoBinding.inflate(layoutInflater)
setContentView(binding.root)
checkNotchSupport()
setupButtonMargins()
cardboard.setOnClickListener {
panorama_view.displayMode = CARDBOARD_DISPLAY_MODE
binding.cardboard.setOnClickListener {
binding.panoramaView.displayMode = CARDBOARD_DISPLAY_MODE
}
explore.setOnClickListener {
binding.explore.setOnClickListener {
isExploreEnabled = !isExploreEnabled
panorama_view.setPureTouchTracking(isExploreEnabled)
explore.setImageResource(if (isExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
binding.panoramaView.setPureTouchTracking(isExploreEnabled)
binding.explore.setImageResource(if (isExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
}
checkIntent()
@ -57,7 +60,7 @@ open class PanoramaPhotoActivity : SimpleActivity() {
override fun onResume() {
super.onResume()
panorama_view.resumeRendering()
binding.panoramaView.resumeRendering()
isRendering = true
if (config.blackBackground) {
updateStatusbarColor(Color.BLACK)
@ -74,14 +77,14 @@ open class PanoramaPhotoActivity : SimpleActivity() {
override fun onPause() {
super.onPause()
panorama_view.pauseRendering()
binding.panoramaView.pauseRendering()
isRendering = false
}
override fun onDestroy() {
super.onDestroy()
if (isRendering) {
panorama_view.shutdown()
binding.panoramaView.shutdown()
}
}
@ -106,7 +109,7 @@ open class PanoramaPhotoActivity : SimpleActivity() {
ensureBackgroundThread {
val bitmap = getBitmapToLoad(path)
runOnUiThread {
panorama_view.apply {
binding.panoramaView.apply {
beVisible()
loadImageFromBitmap(bitmap, options)
setFlingingEnabled(true)
@ -164,20 +167,20 @@ open class PanoramaPhotoActivity : SimpleActivity() {
private fun setupButtonMargins() {
val navBarHeight = navigationBarHeight
(cardboard.layoutParams as RelativeLayout.LayoutParams).apply {
(binding.cardboard.layoutParams as RelativeLayout.LayoutParams).apply {
bottomMargin = navBarHeight
rightMargin = navigationBarWidth
}
(explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = navigationBarHeight
(binding.explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = navigationBarHeight
cardboard.onGlobalLayout {
panorama_gradient_background.layoutParams.height = navBarHeight + cardboard.height
binding.cardboard.onGlobalLayout {
binding.panoramaGradientBackground.layoutParams.height = navBarHeight + binding.cardboard.height
}
}
private fun toggleButtonVisibility() {
arrayOf(cardboard, explore, panorama_gradient_background).forEach {
arrayOf(binding.cardboard, binding.explore, binding.panoramaGradientBackground).forEach {
it.animate().alpha(if (isFullscreen) 0f else 1f)
it.isClickable = !isFullscreen
}

View file

@ -16,14 +16,13 @@ import com.google.vr.sdk.widgets.video.VrVideoView
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.ActivityPanoramaVideoBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.hasNavBar
import com.simplemobiletools.gallery.pro.extensions.hideSystemUI
import com.simplemobiletools.gallery.pro.extensions.showSystemUI
import com.simplemobiletools.gallery.pro.helpers.MIN_SKIP_LENGTH
import com.simplemobiletools.gallery.pro.helpers.PATH
import kotlinx.android.synthetic.main.activity_panorama_video.*
import kotlinx.android.synthetic.main.bottom_video_time_holder.*
import java.io.File
open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener {
@ -39,12 +38,14 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
private var mCurrTime = 0
private var mTimerHandler = Handler()
private lateinit var binding: ActivityPanoramaVideoBinding
public override fun onCreate(savedInstanceState: Bundle?) {
useDynamicTheme = false
requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_panorama_video)
binding = ActivityPanoramaVideoBinding.inflate(layoutInflater)
setContentView(binding.root)
checkNotchSupport()
checkIntent()
@ -56,7 +57,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
override fun onResume() {
super.onResume()
vr_video_view.resumeRendering()
binding.vrVideoView.resumeRendering()
mIsRendering = true
if (config.blackBackground) {
updateStatusbarColor(Color.BLACK)
@ -73,14 +74,14 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
override fun onPause() {
super.onPause()
vr_video_view.pauseRendering()
binding.vrVideoView.pauseRendering()
mIsRendering = false
}
override fun onDestroy() {
super.onDestroy()
if (mIsRendering) {
vr_video_view.shutdown()
binding.vrVideoView.shutdown()
}
if (!isChangingConfigurations) {
@ -104,8 +105,8 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
setupButtons()
intent.removeExtra(PATH)
video_curr_time.setOnClickListener { skip(false) }
video_duration.setOnClickListener { skip(true) }
binding.bottomVideoTimeHolder.videoCurrTime.setOnClickListener { skip(false) }
binding.bottomVideoTimeHolder.videoDuration.setOnClickListener { skip(true) }
try {
val options = VrVideoView.Options()
@ -116,7 +117,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
Uri.fromFile(File(path))
}
vr_video_view.apply {
binding.vrVideoView.apply {
loadVideo(uri, options)
pauseVideo()
@ -149,9 +150,9 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
mIsPlaying = true
resumeVideo()
} else {
video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector)
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(com.simplemobiletools.commons.R.drawable.ic_play_outline_vector)
}
video_toggle_play_pause.beVisible()
binding.bottomVideoTimeHolder.videoTogglePlayPause.beVisible()
}
override fun onCompletion() {
@ -160,7 +161,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
})
}
video_toggle_play_pause.setOnClickListener {
binding.bottomVideoTimeHolder.videoTogglePlayPause.setOnClickListener {
togglePlayPause()
}
} catch (e: Exception) {
@ -175,8 +176,8 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
private fun setupDuration(duration: Long) {
mDuration = (duration / 1000).toInt()
video_seekbar.max = mDuration
video_duration.text = mDuration.getFormattedDuration()
binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
setVideoProgress(0)
}
@ -184,9 +185,9 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
runOnUiThread(object : Runnable {
override fun run() {
if (mIsPlaying && !mIsDragged) {
mCurrTime = (vr_video_view!!.currentPosition / 1000).toInt()
video_seekbar.progress = mCurrTime
video_curr_time.text = mCurrTime.getFormattedDuration()
mCurrTime = (binding.vrVideoView.currentPosition / 1000).toInt()
binding.bottomVideoTimeHolder.videoSeekbar.progress = mCurrTime
binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
}
mTimerHandler.postDelayed(this, 1000)
@ -204,35 +205,35 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
}
private fun resumeVideo() {
video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline_vector)
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(com.simplemobiletools.commons.R.drawable.ic_pause_outline_vector)
if (mCurrTime == mDuration) {
setVideoProgress(0)
mPlayOnReady = true
return
}
vr_video_view.playVideo()
binding.vrVideoView.playVideo()
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private fun pauseVideo() {
vr_video_view.pauseVideo()
video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector)
binding.vrVideoView.pauseVideo()
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(com.simplemobiletools.commons.R.drawable.ic_play_outline_vector)
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private fun setVideoProgress(seconds: Int) {
vr_video_view.seekTo(seconds * 1000L)
video_seekbar.progress = seconds
binding.vrVideoView.seekTo(seconds * 1000L)
binding.bottomVideoTimeHolder.videoSeekbar.progress = seconds
mCurrTime = seconds
video_curr_time.text = seconds.getFormattedDuration()
binding.bottomVideoTimeHolder.videoCurrTime.text = seconds.getFormattedDuration()
}
private fun videoCompleted() {
mIsPlaying = false
mCurrTime = (vr_video_view.duration / 1000).toInt()
video_seekbar.progress = video_seekbar.max
video_curr_time.text = mDuration.getFormattedDuration()
mCurrTime = (binding.vrVideoView.duration / 1000).toInt()
binding.bottomVideoTimeHolder.videoSeekbar.progress = binding.bottomVideoTimeHolder.videoSeekbar.max
binding.bottomVideoTimeHolder.videoCurrTime.text = mDuration.getFormattedDuration()
pauseVideo()
}
@ -249,44 +250,50 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
}
}
video_time_holder.setPadding(0, 0, right, bottom)
video_time_holder.background = resources.getDrawable(R.drawable.gradient_background)
video_time_holder.onGlobalLayout {
val newBottomMargin = video_time_holder.height - resources.getDimension(R.dimen.video_player_play_pause_size)
.toInt() - resources.getDimension(R.dimen.activity_margin).toInt()
(explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = newBottomMargin
binding.bottomVideoTimeHolder.root.setPadding(0, 0, right, bottom)
binding.bottomVideoTimeHolder.root.background = resources.getDrawable(R.drawable.gradient_background)
binding.bottomVideoTimeHolder.root.onGlobalLayout {
val newBottomMargin = binding.bottomVideoTimeHolder.root.height - resources.getDimension(R.dimen.video_player_play_pause_size)
.toInt() - resources.getDimension(com.simplemobiletools.commons.R.dimen.activity_margin).toInt()
(binding.explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = newBottomMargin
(cardboard.layoutParams as RelativeLayout.LayoutParams).apply {
(binding.cardboard.layoutParams as RelativeLayout.LayoutParams).apply {
bottomMargin = newBottomMargin
rightMargin = navigationBarWidth
}
explore.requestLayout()
binding.explore.requestLayout()
}
video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector)
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(com.simplemobiletools.commons.R.drawable.ic_play_outline_vector)
cardboard.setOnClickListener {
vr_video_view.displayMode = CARDBOARD_DISPLAY_MODE
binding.cardboard.setOnClickListener {
binding.vrVideoView.displayMode = CARDBOARD_DISPLAY_MODE
}
explore.setOnClickListener {
binding.explore.setOnClickListener {
mIsExploreEnabled = !mIsExploreEnabled
vr_video_view.setPureTouchTracking(mIsExploreEnabled)
explore.setImageResource(if (mIsExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
binding.vrVideoView.setPureTouchTracking(mIsExploreEnabled)
binding.explore.setImageResource(if (mIsExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
}
}
private fun toggleButtonVisibility() {
val newAlpha = if (mIsFullscreen) 0f else 1f
arrayOf(cardboard, explore).forEach {
arrayOf(binding.cardboard, binding.explore).forEach {
it.animate().alpha(newAlpha)
}
arrayOf(cardboard, explore, video_toggle_play_pause, video_curr_time, video_duration).forEach {
arrayOf(
binding.cardboard,
binding.explore,
binding.bottomVideoTimeHolder.videoTogglePlayPause,
binding.bottomVideoTimeHolder.videoCurrTime,
binding.bottomVideoTimeHolder.videoDuration
).forEach {
it.isClickable = !mIsFullscreen
}
video_seekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
video_time_holder.animate().alpha(newAlpha).start()
binding.bottomVideoTimeHolder.videoSeekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
binding.bottomVideoTimeHolder.videoTimeHolder.animate().alpha(newAlpha).start()
}
private fun handleClick() {
@ -304,11 +311,11 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
return
}
val curr = vr_video_view.currentPosition
val twoPercents = Math.max((vr_video_view.duration / 50).toInt(), MIN_SKIP_LENGTH)
val curr = binding.vrVideoView.currentPosition
val twoPercents = Math.max((binding.vrVideoView.duration / 50).toInt(), MIN_SKIP_LENGTH)
val newProgress = if (forward) curr + twoPercents else curr - twoPercents
val roundProgress = Math.round(newProgress / 1000f)
val limitedProgress = Math.max(Math.min(vr_video_view.duration.toInt(), roundProgress), 0)
val limitedProgress = Math.max(Math.min(binding.vrVideoView.duration.toInt(), roundProgress), 0)
setVideoProgress(limitedProgress)
if (!mIsPlaying) {
togglePlayPause()
@ -322,7 +329,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
vr_video_view.pauseVideo()
binding.vrVideoView.pauseVideo()
mIsDragged = true
}

View file

@ -15,14 +15,13 @@ import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.pro.BuildConfig
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.FragmentHolderBinding
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.fragments.PhotoFragment
import com.simplemobiletools.gallery.pro.fragments.VideoFragment
import com.simplemobiletools.gallery.pro.fragments.ViewPagerFragment
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
import kotlinx.android.synthetic.main.bottom_actions.*
import kotlinx.android.synthetic.main.fragment_holder.*
import java.io.File
import java.io.FileInputStream
@ -35,11 +34,14 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
var mIsVideo = false
private lateinit var binding: FragmentHolderBinding
public override fun onCreate(savedInstanceState: Bundle?) {
showTransparentTop = true
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_holder)
binding = FragmentHolderBinding.inflate(layoutInflater)
setContentView(binding.root)
if (checkAppSideloading()) {
return
}
@ -50,7 +52,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
if (it) {
checkIntent(savedInstanceState)
} else {
toast(R.string.no_storage_permissions)
toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish()
}
}
@ -74,19 +76,19 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
super.onConfigurationChanged(newConfig)
initBottomActionsLayout()
top_shadow.layoutParams.height = statusBarHeight + actionBarHeight
(fragment_viewer_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
(binding.fragmentViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
fragment_viewer_toolbar.setPadding(0, 0, navigationBarWidth, 0)
binding.fragmentViewerToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
fragment_viewer_toolbar.setPadding(0, 0, 0, 0)
binding.fragmentViewerToolbar.setPadding(0, 0, 0, 0)
}
}
fun refreshMenuItems() {
val visibleBottomActions = if (config.bottomActions) config.visibleBottomActions else 0
fragment_viewer_toolbar.menu.apply {
binding.fragmentViewerToolbar.menu.apply {
findItem(R.id.menu_set_as).isVisible = mMedium?.isImage() == true && visibleBottomActions and BOTTOM_ACTION_SET_AS == 0
findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" && visibleBottomActions and BOTTOM_ACTION_EDIT == 0
findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" && visibleBottomActions and BOTTOM_ACTION_PROPERTIES == 0
@ -96,15 +98,15 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
private fun setupOptionsMenu() {
(fragment_viewer_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
fragment_viewer_toolbar.apply {
(binding.fragmentViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
binding.fragmentViewerToolbar.apply {
setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(R.drawable.ic_arrow_left_vector, Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)
}
updateMenuItemColors(fragment_viewer_toolbar.menu, forceWhiteIcons = true)
fragment_viewer_toolbar.setOnMenuItemClickListener { menuItem ->
updateMenuItemColors(binding.fragmentViewerToolbar.menu, forceWhiteIcons = true)
binding.fragmentViewerToolbar.setOnMenuItemClickListener { menuItem ->
if (mMedium == null || mUri == null) {
return@setOnMenuItemClickListener true
}
@ -121,7 +123,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
return@setOnMenuItemClickListener true
}
fragment_viewer_toolbar.setNavigationOnClickListener {
binding.fragmentViewerToolbar.setNavigationOnClickListener {
finish()
}
}
@ -162,7 +164,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
if (!preventShowingHiddenFile) {
if (realPath.getFilenameFromPath().contains('.') || filename.contains('.')) {
if (isFileTypeVisible(realPath)) {
bottom_actions.beGone()
binding.bottomActions.root.beGone()
sendViewPagerIntent(realPath)
finish()
return
@ -176,7 +178,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
if (mUri!!.scheme == "file") {
if (filename.contains('.')) {
bottom_actions.beGone()
binding.bottomActions.root.beGone()
rescanPaths(arrayListOf(mUri!!.path!!))
sendViewPagerIntent(mUri!!.path!!)
finish()
@ -189,7 +191,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
if (!preventShowingHiddenFile) {
if (realPath != mUri.toString() && realPath.isNotEmpty() && mUri!!.authority != "mms" && filename.contains('.') && getDoesFilePathExist(realPath)) {
if (isFileTypeVisible(realPath)) {
bottom_actions.beGone()
binding.bottomActions.root.beGone()
rescanPaths(arrayListOf(mUri!!.path!!))
sendViewPagerIntent(realPath)
finish()
@ -199,11 +201,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
}
top_shadow.layoutParams.height = statusBarHeight + actionBarHeight
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
fragment_viewer_toolbar.setPadding(0, 0, navigationBarWidth, 0)
binding.fragmentViewerToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
fragment_viewer_toolbar.setPadding(0, 0, 0, 0)
binding.fragmentViewerToolbar.setPadding(0, 0, 0, 0)
}
checkNotchSupport()
@ -222,7 +224,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
mIsVideo = type == TYPE_VIDEOS
mMedium = Medium(null, filename, mUri.toString(), mUri!!.path!!.getParentPath(), 0, 0, file.length(), type, 0, false, 0L, 0)
fragment_viewer_toolbar.title = Html.fromHtml("<font color='${Color.WHITE.toHex()}'>${mMedium!!.name}</font>")
binding.fragmentViewerToolbar.title = Html.fromHtml("<font color='${Color.WHITE.toHex()}'>${mMedium!!.name}</font>")
bundle.putSerializable(MEDIUM, mMedium)
if (savedInstanceState == null) {
@ -233,7 +235,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
if (config.blackBackground) {
fragment_holder.background = ColorDrawable(Color.BLACK)
binding.fragmentHolder.background = ColorDrawable(Color.BLACK)
}
if (config.maxBrightness) {
@ -253,7 +255,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
private fun launchVideoPlayer() {
val newUri = getFinalUriFromPath(mUri.toString(), BuildConfig.APPLICATION_ID)
if (newUri == null) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return
}
@ -356,44 +358,54 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
private fun initBottomActionsLayout() {
bottom_actions.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight
binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight
if (config.bottomActions) {
bottom_actions.beVisible()
binding.bottomActions.root.beVisible()
} else {
bottom_actions.beGone()
binding.bottomActions.root.beGone()
}
}
private fun initBottomActionButtons() {
arrayListOf(
bottom_favorite, bottom_delete, bottom_rotate, bottom_properties, bottom_change_orientation, bottom_slideshow, bottom_show_on_map,
bottom_toggle_file_visibility, bottom_rename, bottom_copy, bottom_move, bottom_resize
binding.bottomActions.bottomFavorite,
binding.bottomActions.bottomDelete,
binding.bottomActions.bottomRotate,
binding.bottomActions.bottomProperties,
binding.bottomActions.bottomChangeOrientation,
binding.bottomActions.bottomSlideshow,
binding.bottomActions.bottomShowOnMap,
binding.bottomActions.bottomToggleFileVisibility,
binding.bottomActions.bottomRename,
binding.bottomActions.bottomCopy,
binding.bottomActions.bottomMove,
binding.bottomActions.bottomResize,
).forEach {
it.beGone()
}
val visibleBottomActions = if (config.bottomActions) config.visibleBottomActions else 0
bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && mMedium?.isImage() == true)
bottom_edit.setOnClickListener {
if (mUri != null && bottom_actions.alpha == 1f) {
binding.bottomActions.bottomEdit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && mMedium?.isImage() == true)
binding.bottomActions.bottomEdit.setOnClickListener {
if (mUri != null && binding.bottomActions.root.alpha == 1f) {
openEditor(mUri!!.toString())
}
}
bottom_share.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHARE != 0)
bottom_share.setOnClickListener {
if (mUri != null && bottom_actions.alpha == 1f) {
binding.bottomActions.bottomShare.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHARE != 0)
binding.bottomActions.bottomShare.setOnClickListener {
if (mUri != null && binding.bottomActions.root.alpha == 1f) {
sharePath(mUri!!.toString())
}
}
bottom_set_as.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0 && mMedium?.isImage() == true)
bottom_set_as.setOnClickListener {
binding.bottomActions.bottomSetAs.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0 && mMedium?.isImage() == true)
binding.bottomActions.bottomSetAs.setOnClickListener {
setAs(mUri!!.toString())
}
bottom_show_on_map.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHOW_ON_MAP != 0)
bottom_show_on_map.setOnClickListener {
binding.bottomActions.bottomShowOnMap.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHOW_ON_MAP != 0)
binding.bottomActions.bottomShowOnMap.setOnClickListener {
showFileOnMap(mUri!!.toString())
}
}
@ -407,15 +419,15 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
val newAlpha = if (mIsFullScreen) 0f else 1f
top_shadow.animate().alpha(newAlpha).start()
if (!bottom_actions.isGone()) {
bottom_actions.animate().alpha(newAlpha).start()
binding.topShadow.animate().alpha(newAlpha).start()
if (!binding.bottomActions.root.isGone()) {
binding.bottomActions.root.animate().alpha(newAlpha).start()
}
fragment_viewer_toolbar.animate().alpha(newAlpha).withStartAction {
fragment_viewer_toolbar.beVisible()
binding.fragmentViewerToolbar.animate().alpha(newAlpha).withStartAction {
binding.fragmentViewerToolbar.beVisible()
}.withEndAction {
fragment_viewer_toolbar.beVisibleIf(newAlpha == 1f)
binding.fragmentViewerToolbar.beVisibleIf(newAlpha == 1f)
}.start()
}

View file

@ -14,6 +14,7 @@ import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.MediaAdapter
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.pro.databinding.ActivitySearchBinding
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.GridSpacingItemDecoration
import com.simplemobiletools.gallery.pro.helpers.MediaFetcher
@ -22,7 +23,6 @@ import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
import com.simplemobiletools.gallery.pro.interfaces.MediaOperationsListener
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import kotlinx.android.synthetic.main.activity_search.*
import java.io.File
class SearchActivity : SimpleActivity(), MediaOperationsListener {
@ -31,15 +31,18 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
private var mCurrAsyncTask: GetMediaAsynctask? = null
private var mAllMedia = ArrayList<ThumbnailItem>()
private lateinit var binding: ActivitySearchBinding
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_search)
binding = ActivitySearchBinding.inflate(layoutInflater)
setContentView(binding.root)
setupOptionsMenu()
updateMaterialActivityViews(search_coordinator, search_grid, useTransparentNavigation = true, useTopSearchMenu = true)
search_empty_text_placeholder.setTextColor(getProperTextColor())
updateMaterialActivityViews(binding.searchCoordinator, binding.searchGrid, useTransparentNavigation = true, useTopSearchMenu = true)
binding.searchEmptyTextPlaceholder.setTextColor(getProperTextColor())
getAllMedia()
search_fastscroller.updateColors(getProperPrimaryColor())
binding.searchFastscroller.updateColors(getProperPrimaryColor())
}
override fun onResume() {
@ -53,27 +56,27 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupOptionsMenu() {
search_menu.getToolbar().inflateMenu(R.menu.menu_search)
search_menu.toggleHideOnScroll(true)
search_menu.setupMenu()
search_menu.toggleForceArrowBackIcon(true)
search_menu.focusView()
search_menu.updateHintText(getString(R.string.search_files))
binding.searchMenu.getToolbar().inflateMenu(R.menu.menu_search)
binding.searchMenu.toggleHideOnScroll(true)
binding.searchMenu.setupMenu()
binding.searchMenu.toggleForceArrowBackIcon(true)
binding.searchMenu.focusView()
binding.searchMenu.updateHintText(getString(com.simplemobiletools.commons.R.string.search_files))
search_menu.onNavigateBackClickListener = {
if (search_menu.getCurrentQuery().isEmpty()) {
binding.searchMenu.onNavigateBackClickListener = {
if (binding.searchMenu.getCurrentQuery().isEmpty()) {
finish()
} else {
search_menu.closeSearch()
binding.searchMenu.closeSearch()
}
}
search_menu.onSearchTextChangedListener = { text ->
binding.searchMenu.onSearchTextChangedListener = { text ->
mLastSearchedText = text
textChanged(text)
}
search_menu.getToolbar().setOnMenuItemClickListener { menuItem ->
binding.searchMenu.getToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.toggle_filename -> toggleFilenameVisibility()
else -> return@setOnMenuItemClickListener false
@ -84,7 +87,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
search_menu.updateColors()
binding.searchMenu.updateColors()
}
private fun textChanged(text: String) {
@ -95,10 +98,10 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList<Medium>, "")
runOnUiThread {
if (grouped.isEmpty()) {
search_empty_text_placeholder.text = getString(R.string.no_items_found)
search_empty_text_placeholder.beVisible()
binding.searchEmptyTextPlaceholder.text = getString(com.simplemobiletools.commons.R.string.no_items_found)
binding.searchEmptyTextPlaceholder.beVisible()
} else {
search_empty_text_placeholder.beGone()
binding.searchEmptyTextPlaceholder.beGone()
}
handleGridSpacing(grouped)
@ -110,14 +113,14 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupAdapter() {
val currAdapter = search_grid.adapter
val currAdapter = binding.searchGrid.adapter
if (currAdapter == null) {
MediaAdapter(this, mAllMedia, this, false, false, "", search_grid) {
MediaAdapter(this, mAllMedia, this, false, false, "", binding.searchGrid) {
if (it is Medium) {
itemClicked(it.path)
}
}.apply {
search_grid.adapter = this
binding.searchGrid.adapter = this
}
setupLayoutManager()
handleGridSpacing(mAllMedia)
@ -134,18 +137,18 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
private fun handleGridSpacing(media: ArrayList<ThumbnailItem>) {
val viewType = config.getFolderViewType(SHOW_ALL)
if (viewType == VIEW_TYPE_GRID) {
if (search_grid.itemDecorationCount > 0) {
search_grid.removeItemDecorationAt(0)
if (binding.searchGrid.itemDecorationCount > 0) {
binding.searchGrid.removeItemDecorationAt(0)
}
val spanCount = config.mediaColumnCnt
val spacing = config.thumbnailSpacing
val decoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, true)
search_grid.addItemDecoration(decoration)
binding.searchGrid.addItemDecoration(decoration)
}
}
private fun getMediaAdapter() = search_grid.adapter as? MediaAdapter
private fun getMediaAdapter() = binding.searchGrid.adapter as? MediaAdapter
private fun toggleFilenameVisibility() {
config.displayFileNames = !config.displayFileNames
@ -175,13 +178,13 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupGridLayoutManager() {
val layoutManager = search_grid.layoutManager as MyGridLayoutManager
val layoutManager = binding.searchGrid.layoutManager as MyGridLayoutManager
if (config.scrollHorizontally) {
layoutManager.orientation = RecyclerView.HORIZONTAL
search_grid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
binding.searchGrid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
} else {
layoutManager.orientation = RecyclerView.VERTICAL
search_grid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.searchGrid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
layoutManager.spanCount = config.mediaColumnCnt
@ -198,7 +201,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
}
private fun setupListLayoutManager() {
val layoutManager = search_grid.layoutManager as MyGridLayoutManager
val layoutManager = binding.searchGrid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL
}
@ -206,7 +209,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
private fun setupScrollDirection() {
val viewType = config.getFolderViewType(SHOW_ALL)
val scrollHorizontally = config.scrollHorizontally && viewType == VIEW_TYPE_GRID
search_fastscroller.setScrollVertically(!scrollHorizontally)
binding.searchFastscroller.setScrollVertically(!scrollHorizontally)
}
private fun getAllMedia() {
@ -244,18 +247,18 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
}
if (config.useRecycleBin && !skipRecycleBin && !filtered.first().path.startsWith(recycleBinPath)) {
val movingItems = resources.getQuantityString(R.plurals.moving_items_into_bin, filtered.size, filtered.size)
val movingItems = resources.getQuantityString(com.simplemobiletools.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)
toast(movingItems)
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>) {
if (it) {
deleteFilteredFiles(filtered)
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
}
} else {
val deletingItems = resources.getQuantityString(R.plurals.deleting_items, filtered.size, filtered.size)
val deletingItems = resources.getQuantityString(com.simplemobiletools.commons.R.plurals.deleting_items, filtered.size, filtered.size)
toast(deletingItems)
deleteFilteredFiles(filtered)
}
@ -264,7 +267,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
private fun deleteFilteredFiles(filtered: ArrayList<FileDirItem>) {
deleteFiles(filtered) {
if (!it) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return@deleteFiles
}

View file

@ -15,10 +15,7 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.activity_set_wallpaper.crop_image_view
import kotlinx.android.synthetic.main.activity_set_wallpaper.set_wallpaper_toolbar
import kotlinx.android.synthetic.main.bottom_set_wallpaper_actions.bottom_set_wallpaper_aspect_ratio
import kotlinx.android.synthetic.main.bottom_set_wallpaper_actions.bottom_set_wallpaper_rotate
import com.simplemobiletools.gallery.pro.databinding.ActivitySetWallpaperBinding
class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener {
private val RATIO_PORTRAIT = 0
@ -32,9 +29,12 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
lateinit var uri: Uri
lateinit var wallpaperManager: WallpaperManager
private lateinit var binding: ActivitySetWallpaperBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_set_wallpaper)
binding = ActivitySetWallpaperBinding.inflate(layoutInflater)
setContentView(binding.root)
setupBottomActions()
if (checkAppSideloading()) {
@ -55,7 +55,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
override fun onResume() {
super.onResume()
setupToolbar(set_wallpaper_toolbar, NavigationIcon.Arrow)
setupToolbar(binding.setWallpaperToolbar, NavigationIcon.Arrow)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
@ -70,10 +70,10 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
}
private fun setupOptionsMenu() {
set_wallpaper_toolbar.setOnMenuItemClickListener { menuItem ->
binding.setWallpaperToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.save -> confirmWallpaper()
R.id.allow_changing_aspect_ratio -> crop_image_view.clearAspectRatio()
R.id.allow_changing_aspect_ratio -> binding.cropImageView.clearAspectRatio()
else -> return@setOnMenuItemClickListener false
}
return@setOnMenuItemClickListener true
@ -89,7 +89,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
}
wallpaperManager = WallpaperManager.getInstance(applicationContext)
crop_image_view.apply {
binding.cropImageView.apply {
setOnCropImageCompleteListener(this@SetWallpaperActivity)
setImageUriAsync(uri)
}
@ -98,12 +98,12 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
}
private fun setupBottomActions() {
bottom_set_wallpaper_aspect_ratio.setOnClickListener {
binding.bottomSetWallpaperActions.bottomSetWallpaperAspectRatio.setOnClickListener {
changeAspectRatio()
}
bottom_set_wallpaper_rotate.setOnClickListener {
crop_image_view.rotateImage(90)
binding.bottomSetWallpaperActions.bottomSetWallpaperRotate.setOnClickListener {
binding.cropImageView.rotateImage(90)
}
}
@ -115,9 +115,9 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
}
when (aspectRatio) {
RATIO_PORTRAIT -> crop_image_view.setAspectRatio(heightToUse, widthToUse)
RATIO_LANDSCAPE -> crop_image_view.setAspectRatio(widthToUse, heightToUse)
else -> crop_image_view.setAspectRatio(widthToUse, widthToUse)
RATIO_PORTRAIT -> binding.cropImageView.setAspectRatio(heightToUse, widthToUse)
RATIO_LANDSCAPE -> binding.cropImageView.setAspectRatio(widthToUse, heightToUse)
else -> binding.cropImageView.setAspectRatio(widthToUse, widthToUse)
}
}
@ -136,10 +136,10 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
RadioGroupDialog(this, items) {
wallpaperFlag = it as Int
crop_image_view.croppedImageAsync()
binding.cropImageView.croppedImageAsync()
}
} else {
crop_image_view.croppedImageAsync()
binding.cropImageView.croppedImageAsync()
}
}
@ -163,7 +163,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
}
setResult(Activity.RESULT_OK)
} catch (e: OutOfMemoryError) {
toast(R.string.out_of_memory_error)
toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
setResult(Activity.RESULT_CANCELED)
}
finish()

View file

@ -13,35 +13,40 @@ import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.ActivitySettingsBinding
import com.simplemobiletools.gallery.pro.dialogs.*
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.AlbumCover
import kotlinx.android.synthetic.main.activity_settings.*
import java.io.File
import java.io.InputStream
import java.io.OutputStream
import java.util.*
import java.util.Locale
import kotlin.system.exitProcess
class SettingsActivity : SimpleActivity() {
private val PICK_IMPORT_SOURCE_INTENT = 1
private val SELECT_EXPORT_FAVORITES_FILE_INTENT = 2
private val SELECT_IMPORT_FAVORITES_FILE_INTENT = 3
companion object {
private const val PICK_IMPORT_SOURCE_INTENT = 1
private const val SELECT_EXPORT_FAVORITES_FILE_INTENT = 2
private const val SELECT_IMPORT_FAVORITES_FILE_INTENT = 3
}
private var mRecycleBinContentSize = 0L
private lateinit var binding: ActivitySettingsBinding
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
binding = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(binding.root)
updateMaterialActivityViews(settings_coordinator, settings_holder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(settings_nested_scrollview, settings_toolbar)
updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsToolbar)
}
override fun onResume() {
super.onResume()
setupToolbar(settings_toolbar, NavigationIcon.Arrow)
setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow)
setupSettingItems()
}
@ -94,7 +99,7 @@ class SettingsActivity : SimpleActivity() {
setupShowRecycleBin()
setupShowRecycleBinLast()
setupEmptyRecycleBin()
updateTextColors(settings_holder)
updateTextColors(binding.settingsHolder)
setupClearCache()
setupExportFavorites()
setupImportFavorites()
@ -102,19 +107,19 @@ class SettingsActivity : SimpleActivity() {
setupImportSettings()
arrayOf(
settings_color_customization_section_label,
settings_general_settings_label,
settings_videos_label,
settings_thumbnails_label,
settings_scrolling_label,
settings_fullscreen_media_label,
settings_deep_zoomable_images_label,
settings_extended_details_label,
settings_security_label,
settings_file_operations_label,
settings_bottom_actions_label,
settings_recycle_bin_label,
settings_migrating_label
binding.settingsColorCustomizationSectionLabel,
binding.settingsGeneralSettingsLabel,
binding.settingsVideosLabel,
binding.settingsThumbnailsLabel,
binding.settingsScrollingLabel,
binding.settingsFullscreenMediaLabel,
binding.settingsDeepZoomableImagesLabel,
binding.settingsExtendedDetailsLabel,
binding.settingsSecurityLabel,
binding.settingsFileOperationsLabel,
binding.settingsBottomActionsLabel,
binding.settingsRecycleBinLabel,
binding.settingsMigratingLabel
).forEach {
it.setTextColor(getProperPrimaryColor())
}
@ -135,39 +140,39 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupCustomizeColors() {
settings_color_customization_holder.setOnClickListener {
binding.settingsColorCustomizationHolder.setOnClickListener {
startCustomizationActivity()
}
}
private fun setupUseEnglish() {
settings_use_english_holder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
settings_use_english.isChecked = config.useEnglish
settings_use_english_holder.setOnClickListener {
settings_use_english.toggle()
config.useEnglish = settings_use_english.isChecked
binding.settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
binding.settingsUseEnglish.isChecked = config.useEnglish
binding.settingsUseEnglishHolder.setOnClickListener {
binding.settingsUseEnglish.toggle()
config.useEnglish = binding.settingsUseEnglish.isChecked
exitProcess(0)
}
}
private fun setupLanguage() {
settings_language.text = Locale.getDefault().displayLanguage
settings_language_holder.beVisibleIf(isTiramisuPlus())
settings_language_holder.setOnClickListener {
binding.settingsLanguage.text = Locale.getDefault().displayLanguage
binding.settingsLanguageHolder.beVisibleIf(isTiramisuPlus())
binding.settingsLanguageHolder.setOnClickListener {
launchChangeAppLanguageIntent()
}
}
private fun setupChangeDateTimeFormat() {
settings_change_date_time_format_holder.setOnClickListener {
binding.settingsChangeDateTimeFormatHolder.setOnClickListener {
ChangeDateTimeFormatDialog(this) {}
}
}
private fun setupFileLoadingPriority() {
settings_file_loading_priority_holder.beGoneIf(isRPlus() && !isExternalStorageManager())
settings_file_loading_priority.text = getFileLoadingPriorityText()
settings_file_loading_priority_holder.setOnClickListener {
binding.settingsFileLoadingPriorityHolder.beGoneIf(isRPlus() && !isExternalStorageManager())
binding.settingsFileLoadingPriority.text = getFileLoadingPriorityText()
binding.settingsFileLoadingPriorityHolder.setOnClickListener {
val items = arrayListOf(
RadioItem(PRIORITY_SPEED, getString(R.string.speed)),
RadioItem(PRIORITY_COMPROMISE, getString(R.string.compromise)),
@ -176,7 +181,7 @@ class SettingsActivity : SimpleActivity() {
RadioGroupDialog(this@SettingsActivity, items, config.fileLoadingPriority) {
config.fileLoadingPriority = it as Int
settings_file_loading_priority.text = getFileLoadingPriorityText()
binding.settingsFileLoadingPriority.text = getFileLoadingPriorityText()
}
}
}
@ -191,12 +196,13 @@ class SettingsActivity : SimpleActivity() {
private fun setupManageIncludedFolders() {
if (isRPlus() && !isExternalStorageManager()) {
settings_manage_included_folders.text = "${getString(R.string.manage_included_folders)} (${getString(R.string.no_permission)})"
binding.settingsManageIncludedFolders.text =
"${getString(R.string.manage_included_folders)} (${getString(com.simplemobiletools.commons.R.string.no_permission)})"
} else {
settings_manage_included_folders.setText(R.string.manage_included_folders)
binding.settingsManageIncludedFolders.setText(R.string.manage_included_folders)
}
settings_manage_included_folders_holder.setOnClickListener {
binding.settingsManageIncludedFoldersHolder.setOnClickListener {
if (isRPlus() && !isExternalStorageManager()) {
GrantAllFilesDialog(this)
} else {
@ -206,7 +212,7 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupManageExcludedFolders() {
settings_manage_excluded_folders_holder.setOnClickListener {
binding.settingsManageExcludedFoldersHolder.setOnClickListener {
handleExcludedFolderPasswordProtection {
startActivity(Intent(this, ExcludedFoldersActivity::class.java))
}
@ -214,8 +220,8 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupManageHiddenFolders() {
settings_manage_hidden_folders_holder.beGoneIf(isQPlus())
settings_manage_hidden_folders_holder.setOnClickListener {
binding.settingsManageHiddenFoldersHolder.beGoneIf(isQPlus())
binding.settingsManageHiddenFoldersHolder.setOnClickListener {
handleHiddenFolderPasswordProtection {
startActivity(Intent(this, HiddenFoldersActivity::class.java))
}
@ -224,13 +230,14 @@ class SettingsActivity : SimpleActivity() {
private fun setupShowHiddenItems() {
if (isRPlus() && !isExternalStorageManager()) {
settings_show_hidden_items.text = "${getString(R.string.show_hidden_items)} (${getString(R.string.no_permission)})"
binding.settingsShowHiddenItems.text =
"${getString(com.simplemobiletools.commons.R.string.show_hidden_items)} (${getString(com.simplemobiletools.commons.R.string.no_permission)})"
} else {
settings_show_hidden_items.setText(R.string.show_hidden_items)
binding.settingsShowHiddenItems.setText(com.simplemobiletools.commons.R.string.show_hidden_items)
}
settings_show_hidden_items.isChecked = config.showHiddenMedia
settings_show_hidden_items_holder.setOnClickListener {
binding.settingsShowHiddenItems.isChecked = config.showHiddenMedia
binding.settingsShowHiddenItemsHolder.setOnClickListener {
if (isRPlus() && !isExternalStorageManager()) {
GrantAllFilesDialog(this)
} else if (config.showHiddenMedia) {
@ -244,112 +251,112 @@ class SettingsActivity : SimpleActivity() {
}
private fun toggleHiddenItems() {
settings_show_hidden_items.toggle()
config.showHiddenMedia = settings_show_hidden_items.isChecked
binding.settingsShowHiddenItems.toggle()
config.showHiddenMedia = binding.settingsShowHiddenItems.isChecked
}
private fun setupSearchAllFiles() {
settings_search_all_files.isChecked = config.searchAllFilesByDefault
settings_search_all_files_holder.setOnClickListener {
settings_search_all_files.toggle()
config.searchAllFilesByDefault = settings_search_all_files.isChecked
binding.settingsSearchAllFiles.isChecked = config.searchAllFilesByDefault
binding.settingsSearchAllFilesHolder.setOnClickListener {
binding.settingsSearchAllFiles.toggle()
config.searchAllFilesByDefault = binding.settingsSearchAllFiles.isChecked
}
}
private fun setupAutoplayVideos() {
settings_autoplay_videos.isChecked = config.autoplayVideos
settings_autoplay_videos_holder.setOnClickListener {
settings_autoplay_videos.toggle()
config.autoplayVideos = settings_autoplay_videos.isChecked
binding.settingsAutoplayVideos.isChecked = config.autoplayVideos
binding.settingsAutoplayVideosHolder.setOnClickListener {
binding.settingsAutoplayVideos.toggle()
config.autoplayVideos = binding.settingsAutoplayVideos.isChecked
}
}
private fun setupRememberLastVideo() {
settings_remember_last_video_position.isChecked = config.rememberLastVideoPosition
settings_remember_last_video_position_holder.setOnClickListener {
settings_remember_last_video_position.toggle()
config.rememberLastVideoPosition = settings_remember_last_video_position.isChecked
binding.settingsRememberLastVideoPosition.isChecked = config.rememberLastVideoPosition
binding.settingsRememberLastVideoPositionHolder.setOnClickListener {
binding.settingsRememberLastVideoPosition.toggle()
config.rememberLastVideoPosition = binding.settingsRememberLastVideoPosition.isChecked
}
}
private fun setupLoopVideos() {
settings_loop_videos.isChecked = config.loopVideos
settings_loop_videos_holder.setOnClickListener {
settings_loop_videos.toggle()
config.loopVideos = settings_loop_videos.isChecked
binding.settingsLoopVideos.isChecked = config.loopVideos
binding.settingsLoopVideosHolder.setOnClickListener {
binding.settingsLoopVideos.toggle()
config.loopVideos = binding.settingsLoopVideos.isChecked
}
}
private fun setupOpenVideosOnSeparateScreen() {
settings_open_videos_on_separate_screen.isChecked = config.openVideosOnSeparateScreen
settings_open_videos_on_separate_screen_holder.setOnClickListener {
settings_open_videos_on_separate_screen.toggle()
config.openVideosOnSeparateScreen = settings_open_videos_on_separate_screen.isChecked
binding.settingsOpenVideosOnSeparateScreen.isChecked = config.openVideosOnSeparateScreen
binding.settingsOpenVideosOnSeparateScreenHolder.setOnClickListener {
binding.settingsOpenVideosOnSeparateScreen.toggle()
config.openVideosOnSeparateScreen = binding.settingsOpenVideosOnSeparateScreen.isChecked
}
}
private fun setupMaxBrightness() {
settings_max_brightness.isChecked = config.maxBrightness
settings_max_brightness_holder.setOnClickListener {
settings_max_brightness.toggle()
config.maxBrightness = settings_max_brightness.isChecked
binding.settingsMaxBrightness.isChecked = config.maxBrightness
binding.settingsMaxBrightnessHolder.setOnClickListener {
binding.settingsMaxBrightness.toggle()
config.maxBrightness = binding.settingsMaxBrightness.isChecked
}
}
private fun setupCropThumbnails() {
settings_crop_thumbnails.isChecked = config.cropThumbnails
settings_crop_thumbnails_holder.setOnClickListener {
settings_crop_thumbnails.toggle()
config.cropThumbnails = settings_crop_thumbnails.isChecked
binding.settingsCropThumbnails.isChecked = config.cropThumbnails
binding.settingsCropThumbnailsHolder.setOnClickListener {
binding.settingsCropThumbnails.toggle()
config.cropThumbnails = binding.settingsCropThumbnails.isChecked
}
}
private fun setupDarkBackground() {
settings_black_background.isChecked = config.blackBackground
settings_black_background_holder.setOnClickListener {
settings_black_background.toggle()
config.blackBackground = settings_black_background.isChecked
binding.settingsBlackBackground.isChecked = config.blackBackground
binding.settingsBlackBackgroundHolder.setOnClickListener {
binding.settingsBlackBackground.toggle()
config.blackBackground = binding.settingsBlackBackground.isChecked
}
}
private fun setupScrollHorizontally() {
settings_scroll_horizontally.isChecked = config.scrollHorizontally
settings_scroll_horizontally_holder.setOnClickListener {
settings_scroll_horizontally.toggle()
config.scrollHorizontally = settings_scroll_horizontally.isChecked
binding.settingsScrollHorizontally.isChecked = config.scrollHorizontally
binding.settingsScrollHorizontallyHolder.setOnClickListener {
binding.settingsScrollHorizontally.toggle()
config.scrollHorizontally = binding.settingsScrollHorizontally.isChecked
if (config.scrollHorizontally) {
config.enablePullToRefresh = false
settings_enable_pull_to_refresh.isChecked = false
binding.settingsEnablePullToRefresh.isChecked = false
}
}
}
private fun setupHideSystemUI() {
settings_hide_system_ui.isChecked = config.hideSystemUI
settings_hide_system_ui_holder.setOnClickListener {
settings_hide_system_ui.toggle()
config.hideSystemUI = settings_hide_system_ui.isChecked
binding.settingsHideSystemUi.isChecked = config.hideSystemUI
binding.settingsHideSystemUiHolder.setOnClickListener {
binding.settingsHideSystemUi.toggle()
config.hideSystemUI = binding.settingsHideSystemUi.isChecked
}
}
private fun setupHiddenItemPasswordProtection() {
settings_hidden_item_password_protection_holder.beGoneIf(isRPlus() && !isExternalStorageManager())
settings_hidden_item_password_protection.isChecked = config.isHiddenPasswordProtectionOn
settings_hidden_item_password_protection_holder.setOnClickListener {
binding.settingsHiddenItemPasswordProtectionHolder.beGoneIf(isRPlus() && !isExternalStorageManager())
binding.settingsHiddenItemPasswordProtection.isChecked = config.isHiddenPasswordProtectionOn
binding.settingsHiddenItemPasswordProtectionHolder.setOnClickListener {
val tabToShow = if (config.isHiddenPasswordProtectionOn) config.hiddenProtectionType else SHOW_ALL_TABS
SecurityDialog(this, config.hiddenPasswordHash, tabToShow) { hash, type, success ->
if (success) {
val hasPasswordProtection = config.isHiddenPasswordProtectionOn
settings_hidden_item_password_protection.isChecked = !hasPasswordProtection
binding.settingsHiddenItemPasswordProtection.isChecked = !hasPasswordProtection
config.isHiddenPasswordProtectionOn = !hasPasswordProtection
config.hiddenPasswordHash = if (hasPasswordProtection) "" else hash
config.hiddenProtectionType = type
if (config.isHiddenPasswordProtectionOn) {
val confirmationTextId = if (config.hiddenProtectionType == PROTECTION_FINGERPRINT)
R.string.fingerprint_setup_successfully else R.string.protection_setup_successfully
ConfirmationDialog(this, "", confirmationTextId, R.string.ok, 0) { }
com.simplemobiletools.commons.R.string.fingerprint_setup_successfully else com.simplemobiletools.commons.R.string.protection_setup_successfully
ConfirmationDialog(this, "", confirmationTextId, com.simplemobiletools.commons.R.string.ok, 0) { }
}
}
}
@ -357,22 +364,22 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupExcludedItemPasswordProtection() {
settings_excluded_item_password_protection_holder.beGoneIf(settings_hidden_item_password_protection_holder.isVisible())
settings_excluded_item_password_protection.isChecked = config.isExcludedPasswordProtectionOn
settings_excluded_item_password_protection_holder.setOnClickListener {
binding.settingsExcludedItemPasswordProtectionHolder.beGoneIf(binding.settingsHiddenItemPasswordProtectionHolder.isVisible())
binding.settingsExcludedItemPasswordProtection.isChecked = config.isExcludedPasswordProtectionOn
binding.settingsExcludedItemPasswordProtectionHolder.setOnClickListener {
val tabToShow = if (config.isExcludedPasswordProtectionOn) config.excludedProtectionType else SHOW_ALL_TABS
SecurityDialog(this, config.excludedPasswordHash, tabToShow) { hash, type, success ->
if (success) {
val hasPasswordProtection = config.isExcludedPasswordProtectionOn
settings_excluded_item_password_protection.isChecked = !hasPasswordProtection
binding.settingsExcludedItemPasswordProtection.isChecked = !hasPasswordProtection
config.isExcludedPasswordProtectionOn = !hasPasswordProtection
config.excludedPasswordHash = if (hasPasswordProtection) "" else hash
config.excludedProtectionType = type
if (config.isExcludedPasswordProtectionOn) {
val confirmationTextId = if (config.excludedProtectionType == PROTECTION_FINGERPRINT)
R.string.fingerprint_setup_successfully else R.string.protection_setup_successfully
ConfirmationDialog(this, "", confirmationTextId, R.string.ok, 0) { }
com.simplemobiletools.commons.R.string.fingerprint_setup_successfully else com.simplemobiletools.commons.R.string.protection_setup_successfully
ConfirmationDialog(this, "", confirmationTextId, com.simplemobiletools.commons.R.string.ok, 0) { }
}
}
}
@ -380,21 +387,21 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupAppPasswordProtection() {
settings_app_password_protection.isChecked = config.isAppPasswordProtectionOn
settings_app_password_protection_holder.setOnClickListener {
binding.settingsAppPasswordProtection.isChecked = config.isAppPasswordProtectionOn
binding.settingsAppPasswordProtectionHolder.setOnClickListener {
val tabToShow = if (config.isAppPasswordProtectionOn) config.appProtectionType else SHOW_ALL_TABS
SecurityDialog(this, config.appPasswordHash, tabToShow) { hash, type, success ->
if (success) {
val hasPasswordProtection = config.isAppPasswordProtectionOn
settings_app_password_protection.isChecked = !hasPasswordProtection
binding.settingsAppPasswordProtection.isChecked = !hasPasswordProtection
config.isAppPasswordProtectionOn = !hasPasswordProtection
config.appPasswordHash = if (hasPasswordProtection) "" else hash
config.appProtectionType = type
if (config.isAppPasswordProtectionOn) {
val confirmationTextId = if (config.appProtectionType == PROTECTION_FINGERPRINT)
R.string.fingerprint_setup_successfully else R.string.protection_setup_successfully
ConfirmationDialog(this, "", confirmationTextId, R.string.ok, 0) { }
com.simplemobiletools.commons.R.string.fingerprint_setup_successfully else com.simplemobiletools.commons.R.string.protection_setup_successfully
ConfirmationDialog(this, "", confirmationTextId, com.simplemobiletools.commons.R.string.ok, 0) { }
}
}
}
@ -402,21 +409,21 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupFileDeletionPasswordProtection() {
settings_file_deletion_password_protection.isChecked = config.isDeletePasswordProtectionOn
settings_file_deletion_password_protection_holder.setOnClickListener {
binding.settingsFileDeletionPasswordProtection.isChecked = config.isDeletePasswordProtectionOn
binding.settingsFileDeletionPasswordProtectionHolder.setOnClickListener {
val tabToShow = if (config.isDeletePasswordProtectionOn) config.deleteProtectionType else SHOW_ALL_TABS
SecurityDialog(this, config.deletePasswordHash, tabToShow) { hash, type, success ->
if (success) {
val hasPasswordProtection = config.isDeletePasswordProtectionOn
settings_file_deletion_password_protection.isChecked = !hasPasswordProtection
binding.settingsFileDeletionPasswordProtection.isChecked = !hasPasswordProtection
config.isDeletePasswordProtectionOn = !hasPasswordProtection
config.deletePasswordHash = if (hasPasswordProtection) "" else hash
config.deleteProtectionType = type
if (config.isDeletePasswordProtectionOn) {
val confirmationTextId = if (config.deleteProtectionType == PROTECTION_FINGERPRINT)
R.string.fingerprint_setup_successfully else R.string.protection_setup_successfully
ConfirmationDialog(this, "", confirmationTextId, R.string.ok, 0) { }
com.simplemobiletools.commons.R.string.fingerprint_setup_successfully else com.simplemobiletools.commons.R.string.protection_setup_successfully
ConfirmationDialog(this, "", confirmationTextId, com.simplemobiletools.commons.R.string.ok, 0) { }
}
}
}
@ -424,65 +431,65 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupDeleteEmptyFolders() {
settings_delete_empty_folders.isChecked = config.deleteEmptyFolders
settings_delete_empty_folders_holder.setOnClickListener {
settings_delete_empty_folders.toggle()
config.deleteEmptyFolders = settings_delete_empty_folders.isChecked
binding.settingsDeleteEmptyFolders.isChecked = config.deleteEmptyFolders
binding.settingsDeleteEmptyFoldersHolder.setOnClickListener {
binding.settingsDeleteEmptyFolders.toggle()
config.deleteEmptyFolders = binding.settingsDeleteEmptyFolders.isChecked
}
}
private fun setupAllowPhotoGestures() {
settings_allow_photo_gestures.isChecked = config.allowPhotoGestures
settings_allow_photo_gestures_holder.setOnClickListener {
settings_allow_photo_gestures.toggle()
config.allowPhotoGestures = settings_allow_photo_gestures.isChecked
binding.settingsAllowPhotoGestures.isChecked = config.allowPhotoGestures
binding.settingsAllowPhotoGesturesHolder.setOnClickListener {
binding.settingsAllowPhotoGestures.toggle()
config.allowPhotoGestures = binding.settingsAllowPhotoGestures.isChecked
}
}
private fun setupAllowVideoGestures() {
settings_allow_video_gestures.isChecked = config.allowVideoGestures
settings_allow_video_gestures_holder.setOnClickListener {
settings_allow_video_gestures.toggle()
config.allowVideoGestures = settings_allow_video_gestures.isChecked
binding.settingsAllowVideoGestures.isChecked = config.allowVideoGestures
binding.settingsAllowVideoGesturesHolder.setOnClickListener {
binding.settingsAllowVideoGestures.toggle()
config.allowVideoGestures = binding.settingsAllowVideoGestures.isChecked
}
}
private fun setupAllowDownGesture() {
settings_allow_down_gesture.isChecked = config.allowDownGesture
settings_allow_down_gesture_holder.setOnClickListener {
settings_allow_down_gesture.toggle()
config.allowDownGesture = settings_allow_down_gesture.isChecked
binding.settingsAllowDownGesture.isChecked = config.allowDownGesture
binding.settingsAllowDownGestureHolder.setOnClickListener {
binding.settingsAllowDownGesture.toggle()
config.allowDownGesture = binding.settingsAllowDownGesture.isChecked
}
}
private fun setupAllowRotatingWithGestures() {
settings_allow_rotating_with_gestures.isChecked = config.allowRotatingWithGestures
settings_allow_rotating_with_gestures_holder.setOnClickListener {
settings_allow_rotating_with_gestures.toggle()
config.allowRotatingWithGestures = settings_allow_rotating_with_gestures.isChecked
binding.settingsAllowRotatingWithGestures.isChecked = config.allowRotatingWithGestures
binding.settingsAllowRotatingWithGesturesHolder.setOnClickListener {
binding.settingsAllowRotatingWithGestures.toggle()
config.allowRotatingWithGestures = binding.settingsAllowRotatingWithGestures.isChecked
}
}
private fun setupShowNotch() {
settings_show_notch_holder.beVisibleIf(isPiePlus())
settings_show_notch.isChecked = config.showNotch
settings_show_notch_holder.setOnClickListener {
settings_show_notch.toggle()
config.showNotch = settings_show_notch.isChecked
binding.settingsShowNotchHolder.beVisibleIf(isPiePlus())
binding.settingsShowNotch.isChecked = config.showNotch
binding.settingsShowNotchHolder.setOnClickListener {
binding.settingsShowNotch.toggle()
config.showNotch = binding.settingsShowNotch.isChecked
}
}
private fun setupFileThumbnailStyle() {
settings_file_thumbnail_style_holder.setOnClickListener {
binding.settingsFileThumbnailStyleHolder.setOnClickListener {
ChangeFileThumbnailStyleDialog(this)
}
}
private fun setupFolderThumbnailStyle() {
settings_folder_thumbnail_style.text = getFolderStyleText()
settings_folder_thumbnail_style_holder.setOnClickListener {
binding.settingsFolderThumbnailStyle.text = getFolderStyleText()
binding.settingsFolderThumbnailStyleHolder.setOnClickListener {
ChangeFolderThumbnailStyleDialog(this) {
settings_folder_thumbnail_style.text = getFolderStyleText()
binding.settingsFolderThumbnailStyle.text = getFolderStyleText()
}
}
}
@ -495,107 +502,107 @@ class SettingsActivity : SimpleActivity() {
)
private fun setupKeepLastModified() {
settings_keep_last_modified.isChecked = config.keepLastModified
settings_keep_last_modified_holder.setOnClickListener {
binding.settingsKeepLastModified.isChecked = config.keepLastModified
binding.settingsKeepLastModifiedHolder.setOnClickListener {
handleMediaManagementPrompt {
settings_keep_last_modified.toggle()
config.keepLastModified = settings_keep_last_modified.isChecked
binding.settingsKeepLastModified.toggle()
config.keepLastModified = binding.settingsKeepLastModified.isChecked
}
}
}
private fun setupEnablePullToRefresh() {
settings_enable_pull_to_refresh.isChecked = config.enablePullToRefresh
settings_enable_pull_to_refresh_holder.setOnClickListener {
settings_enable_pull_to_refresh.toggle()
config.enablePullToRefresh = settings_enable_pull_to_refresh.isChecked
binding.settingsEnablePullToRefresh.isChecked = config.enablePullToRefresh
binding.settingsEnablePullToRefreshHolder.setOnClickListener {
binding.settingsEnablePullToRefresh.toggle()
config.enablePullToRefresh = binding.settingsEnablePullToRefresh.isChecked
}
}
private fun setupAllowZoomingImages() {
settings_allow_zooming_images.isChecked = config.allowZoomingImages
binding.settingsAllowZoomingImages.isChecked = config.allowZoomingImages
updateDeepZoomToggleButtons()
settings_allow_zooming_images_holder.setOnClickListener {
settings_allow_zooming_images.toggle()
config.allowZoomingImages = settings_allow_zooming_images.isChecked
binding.settingsAllowZoomingImagesHolder.setOnClickListener {
binding.settingsAllowZoomingImages.toggle()
config.allowZoomingImages = binding.settingsAllowZoomingImages.isChecked
updateDeepZoomToggleButtons()
}
}
private fun updateDeepZoomToggleButtons() {
settings_allow_rotating_with_gestures_holder.beVisibleIf(config.allowZoomingImages)
settings_show_highest_quality_holder.beVisibleIf(config.allowZoomingImages)
settings_allow_one_to_one_zoom_holder.beVisibleIf(config.allowZoomingImages)
binding.settingsAllowRotatingWithGesturesHolder.beVisibleIf(config.allowZoomingImages)
binding.settingsShowHighestQualityHolder.beVisibleIf(config.allowZoomingImages)
binding.settingsAllowOneToOneZoomHolder.beVisibleIf(config.allowZoomingImages)
}
private fun setupShowHighestQuality() {
settings_show_highest_quality.isChecked = config.showHighestQuality
settings_show_highest_quality_holder.setOnClickListener {
settings_show_highest_quality.toggle()
config.showHighestQuality = settings_show_highest_quality.isChecked
binding.settingsShowHighestQuality.isChecked = config.showHighestQuality
binding.settingsShowHighestQualityHolder.setOnClickListener {
binding.settingsShowHighestQuality.toggle()
config.showHighestQuality = binding.settingsShowHighestQuality.isChecked
}
}
private fun setupAllowOneToOneZoom() {
settings_allow_one_to_one_zoom.isChecked = config.allowOneToOneZoom
settings_allow_one_to_one_zoom_holder.setOnClickListener {
settings_allow_one_to_one_zoom.toggle()
config.allowOneToOneZoom = settings_allow_one_to_one_zoom.isChecked
binding.settingsAllowOneToOneZoom.isChecked = config.allowOneToOneZoom
binding.settingsAllowOneToOneZoomHolder.setOnClickListener {
binding.settingsAllowOneToOneZoom.toggle()
config.allowOneToOneZoom = binding.settingsAllowOneToOneZoom.isChecked
}
}
private fun setupAllowInstantChange() {
settings_allow_instant_change.isChecked = config.allowInstantChange
settings_allow_instant_change_holder.setOnClickListener {
settings_allow_instant_change.toggle()
config.allowInstantChange = settings_allow_instant_change.isChecked
binding.settingsAllowInstantChange.isChecked = config.allowInstantChange
binding.settingsAllowInstantChangeHolder.setOnClickListener {
binding.settingsAllowInstantChange.toggle()
config.allowInstantChange = binding.settingsAllowInstantChange.isChecked
}
}
private fun setupShowExtendedDetails() {
settings_show_extended_details.isChecked = config.showExtendedDetails
binding.settingsShowExtendedDetails.isChecked = config.showExtendedDetails
updateExtendedDetailsButtons()
settings_show_extended_details_holder.setOnClickListener {
settings_show_extended_details.toggle()
config.showExtendedDetails = settings_show_extended_details.isChecked
binding.settingsShowExtendedDetailsHolder.setOnClickListener {
binding.settingsShowExtendedDetails.toggle()
config.showExtendedDetails = binding.settingsShowExtendedDetails.isChecked
updateExtendedDetailsButtons()
}
}
private fun setupHideExtendedDetails() {
settings_hide_extended_details.isChecked = config.hideExtendedDetails
settings_hide_extended_details_holder.setOnClickListener {
settings_hide_extended_details.toggle()
config.hideExtendedDetails = settings_hide_extended_details.isChecked
binding.settingsHideExtendedDetails.isChecked = config.hideExtendedDetails
binding.settingsHideExtendedDetailsHolder.setOnClickListener {
binding.settingsHideExtendedDetails.toggle()
config.hideExtendedDetails = binding.settingsHideExtendedDetails.isChecked
}
}
private fun setupManageExtendedDetails() {
settings_manage_extended_details_holder.setOnClickListener {
binding.settingsManageExtendedDetailsHolder.setOnClickListener {
ManageExtendedDetailsDialog(this) {
if (config.extendedDetails == 0) {
settings_show_extended_details_holder.callOnClick()
binding.settingsShowExtendedDetailsHolder.callOnClick()
}
}
}
}
private fun updateExtendedDetailsButtons() {
settings_manage_extended_details_holder.beVisibleIf(config.showExtendedDetails)
settings_hide_extended_details_holder.beVisibleIf(config.showExtendedDetails)
binding.settingsManageExtendedDetailsHolder.beVisibleIf(config.showExtendedDetails)
binding.settingsHideExtendedDetailsHolder.beVisibleIf(config.showExtendedDetails)
}
private fun setupSkipDeleteConfirmation() {
settings_skip_delete_confirmation.isChecked = config.skipDeleteConfirmation
settings_skip_delete_confirmation_holder.setOnClickListener {
settings_skip_delete_confirmation.toggle()
config.skipDeleteConfirmation = settings_skip_delete_confirmation.isChecked
binding.settingsSkipDeleteConfirmation.isChecked = config.skipDeleteConfirmation
binding.settingsSkipDeleteConfirmationHolder.setOnClickListener {
binding.settingsSkipDeleteConfirmation.toggle()
config.skipDeleteConfirmation = binding.settingsSkipDeleteConfirmation.isChecked
}
}
private fun setupScreenRotation() {
settings_screen_rotation.text = getScreenRotationText()
settings_screen_rotation_holder.setOnClickListener {
binding.settingsScreenRotation.text = getScreenRotationText()
binding.settingsScreenRotationHolder.setOnClickListener {
val items = arrayListOf(
RadioItem(ROTATE_BY_SYSTEM_SETTING, getString(R.string.screen_rotation_system_setting)),
RadioItem(ROTATE_BY_DEVICE_ROTATION, getString(R.string.screen_rotation_device_rotation)),
@ -604,7 +611,7 @@ class SettingsActivity : SimpleActivity() {
RadioGroupDialog(this@SettingsActivity, items, config.screenRotation) {
config.screenRotation = it as Int
settings_screen_rotation.text = getScreenRotationText()
binding.settingsScreenRotation.text = getScreenRotationText()
}
}
}
@ -618,20 +625,20 @@ class SettingsActivity : SimpleActivity() {
)
private fun setupBottomActions() {
settings_bottom_actions_checkbox.isChecked = config.bottomActions
settings_manage_bottom_actions_holder.beVisibleIf(config.bottomActions)
settings_bottom_actions_checkbox_holder.setOnClickListener {
settings_bottom_actions_checkbox.toggle()
config.bottomActions = settings_bottom_actions_checkbox.isChecked
settings_manage_bottom_actions_holder.beVisibleIf(config.bottomActions)
binding.settingsBottomActionsCheckbox.isChecked = config.bottomActions
binding.settingsManageBottomActionsHolder.beVisibleIf(config.bottomActions)
binding.settingsBottomActionsCheckboxHolder.setOnClickListener {
binding.settingsBottomActionsCheckbox.toggle()
config.bottomActions = binding.settingsBottomActionsCheckbox.isChecked
binding.settingsManageBottomActionsHolder.beVisibleIf(config.bottomActions)
}
}
private fun setupManageBottomActions() {
settings_manage_bottom_actions_holder.setOnClickListener {
binding.settingsManageBottomActionsHolder.setOnClickListener {
ManageBottomActionsDialog(this) {
if (config.visibleBottomActions == 0) {
settings_bottom_actions_checkbox_holder.callOnClick()
binding.settingsBottomActionsCheckboxHolder.callOnClick()
config.bottomActions = false
config.visibleBottomActions = DEFAULT_BOTTOM_ACTIONS
}
@ -641,28 +648,28 @@ class SettingsActivity : SimpleActivity() {
private fun setupUseRecycleBin() {
updateRecycleBinButtons()
settings_use_recycle_bin.isChecked = config.useRecycleBin
settings_use_recycle_bin_holder.setOnClickListener {
settings_use_recycle_bin.toggle()
config.useRecycleBin = settings_use_recycle_bin.isChecked
binding.settingsUseRecycleBin.isChecked = config.useRecycleBin
binding.settingsUseRecycleBinHolder.setOnClickListener {
binding.settingsUseRecycleBin.toggle()
config.useRecycleBin = binding.settingsUseRecycleBin.isChecked
updateRecycleBinButtons()
}
}
private fun setupShowRecycleBin() {
settings_show_recycle_bin.isChecked = config.showRecycleBinAtFolders
settings_show_recycle_bin_holder.setOnClickListener {
settings_show_recycle_bin.toggle()
config.showRecycleBinAtFolders = settings_show_recycle_bin.isChecked
binding.settingsShowRecycleBin.isChecked = config.showRecycleBinAtFolders
binding.settingsShowRecycleBinHolder.setOnClickListener {
binding.settingsShowRecycleBin.toggle()
config.showRecycleBinAtFolders = binding.settingsShowRecycleBin.isChecked
updateRecycleBinButtons()
}
}
private fun setupShowRecycleBinLast() {
settings_show_recycle_bin_last.isChecked = config.showRecycleBinLast
settings_show_recycle_bin_last_holder.setOnClickListener {
settings_show_recycle_bin_last.toggle()
config.showRecycleBinLast = settings_show_recycle_bin_last.isChecked
binding.settingsShowRecycleBinLast.isChecked = config.showRecycleBinLast
binding.settingsShowRecycleBinLastHolder.setOnClickListener {
binding.settingsShowRecycleBinLast.toggle()
config.showRecycleBinLast = binding.settingsShowRecycleBinLast.isChecked
if (config.showRecycleBinLast) {
config.removePinnedFolders(setOf(RECYCLE_BIN))
}
@ -670,9 +677,9 @@ class SettingsActivity : SimpleActivity() {
}
private fun updateRecycleBinButtons() {
settings_show_recycle_bin_last_holder.beVisibleIf(config.useRecycleBin && config.showRecycleBinAtFolders)
settings_empty_recycle_bin_holder.beVisibleIf(config.useRecycleBin)
settings_show_recycle_bin_holder.beVisibleIf(config.useRecycleBin)
binding.settingsShowRecycleBinLastHolder.beVisibleIf(config.useRecycleBin && config.showRecycleBinAtFolders)
binding.settingsEmptyRecycleBinHolder.beVisibleIf(config.useRecycleBin)
binding.settingsShowRecycleBinHolder.beVisibleIf(config.useRecycleBin)
}
private fun setupEmptyRecycleBin() {
@ -691,18 +698,18 @@ class SettingsActivity : SimpleActivity() {
}
runOnUiThread {
settings_empty_recycle_bin_size.text = mRecycleBinContentSize.formatSize()
binding.settingsEmptyRecycleBinSize.text = mRecycleBinContentSize.formatSize()
}
}
settings_empty_recycle_bin_holder.setOnClickListener {
binding.settingsEmptyRecycleBinHolder.setOnClickListener {
if (mRecycleBinContentSize == 0L) {
toast(R.string.recycle_bin_empty)
toast(com.simplemobiletools.commons.R.string.recycle_bin_empty)
} else {
showRecycleBinEmptyingDialog {
emptyTheRecycleBin()
mRecycleBinContentSize = 0L
settings_empty_recycle_bin_size.text = 0L.formatSize()
binding.settingsEmptyRecycleBinSize.text = 0L.formatSize()
}
}
}
@ -712,22 +719,22 @@ class SettingsActivity : SimpleActivity() {
ensureBackgroundThread {
val size = cacheDir.getProperSize(true).formatSize()
runOnUiThread {
settings_clear_cache_size.text = size
binding.settingsClearCacheSize.text = size
}
}
settings_clear_cache_holder.setOnClickListener {
binding.settingsClearCacheHolder.setOnClickListener {
ensureBackgroundThread {
cacheDir.deleteRecursively()
runOnUiThread {
settings_clear_cache_size.text = cacheDir.getProperSize(true).formatSize()
binding.settingsClearCacheSize.text = cacheDir.getProperSize(true).formatSize()
}
}
}
}
private fun setupExportFavorites() {
settings_export_favorites_holder.setOnClickListener {
binding.settingsExportFavoritesHolder.setOnClickListener {
if (isQPlus()) {
ExportFavoritesDialog(this, getExportFavoritesFilename(), true) { path, filename ->
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
@ -738,7 +745,7 @@ class SettingsActivity : SimpleActivity() {
try {
startActivityForResult(this, SELECT_EXPORT_FAVORITES_FILE_INTENT)
} catch (e: ActivityNotFoundException) {
toast(R.string.system_service_disabled, Toast.LENGTH_LONG)
toast(com.simplemobiletools.commons.R.string.system_service_disabled, Toast.LENGTH_LONG)
} catch (e: Exception) {
showErrorToast(e)
}
@ -761,7 +768,7 @@ class SettingsActivity : SimpleActivity() {
private fun exportFavoritesTo(outputStream: OutputStream?) {
if (outputStream == null) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return
}
@ -774,9 +781,9 @@ class SettingsActivity : SimpleActivity() {
}
}
toast(R.string.exporting_successful)
toast(com.simplemobiletools.commons.R.string.exporting_successful)
} else {
toast(R.string.no_items_found)
toast(com.simplemobiletools.commons.R.string.no_items_found)
}
}
}
@ -787,7 +794,7 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupImportFavorites() {
settings_import_favorites_holder.setOnClickListener {
binding.settingsImportFavoritesHolder.setOnClickListener {
if (isQPlus()) {
Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
@ -810,7 +817,7 @@ class SettingsActivity : SimpleActivity() {
private fun importFavorites(inputStream: InputStream?) {
if (inputStream == null) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return
}
@ -831,12 +838,12 @@ class SettingsActivity : SimpleActivity() {
}
}
toast(if (importedItems > 0) R.string.importing_successful else R.string.no_entries_for_importing)
toast(if (importedItems > 0) com.simplemobiletools.commons.R.string.importing_successful else com.simplemobiletools.commons.R.string.no_entries_for_importing)
}
}
private fun setupExportSettings() {
settings_export_holder.setOnClickListener {
binding.settingsExportHolder.setOnClickListener {
val configItems = LinkedHashMap<String, Any>().apply {
put(IS_USING_SHARED_THEME, config.isUsingSharedTheme)
put(TEXT_COLOR, config.textColor)
@ -930,7 +937,7 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupImportSettings() {
settings_import_holder.setOnClickListener {
binding.settingsImportHolder.setOnClickListener {
if (isQPlus()) {
Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
@ -953,7 +960,7 @@ class SettingsActivity : SimpleActivity() {
private fun parseFile(inputStream: InputStream?) {
if (inputStream == null) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return
}
@ -987,6 +994,7 @@ class SettingsActivity : SimpleActivity() {
checkAppIconColor()
}
}
USE_ENGLISH -> config.useEnglish = value.toBoolean()
WAS_USE_ENGLISH_TOGGLED -> config.wasUseEnglishToggled = value.toBoolean()
WIDGET_BG_COLOR -> config.widgetBgColor = value.toInt()
@ -1080,7 +1088,7 @@ class SettingsActivity : SimpleActivity() {
}
}
toast(if (configValues.size > 0) R.string.settings_imported_successfully else R.string.no_entries_for_importing)
toast(if (configValues.size > 0) com.simplemobiletools.commons.R.string.settings_imported_successfully else com.simplemobiletools.commons.R.string.no_entries_for_importing)
runOnUiThread {
setupSettingItems()
}

View file

@ -27,12 +27,12 @@ import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.ActivityVideoPlayerBinding
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.*
import kotlinx.android.synthetic.main.activity_video_player.*
import kotlinx.android.synthetic.main.bottom_video_time_holder.*
@UnstableApi open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener, TextureView.SurfaceTextureListener {
@UnstableApi
open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener, TextureView.SurfaceTextureListener {
private val PLAY_WHEN_READY_DRAG_DELAY = 100L
private var mIsFullscreen = false
@ -58,10 +58,13 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
private var mIgnoreCloseDown = false
private lateinit var binding: ActivityVideoPlayerBinding
public override fun onCreate(savedInstanceState: Bundle?) {
showTransparentTop = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video_player)
binding = ActivityVideoPlayerBinding.inflate(layoutInflater)
setContentView(binding.root)
setupOptionsMenu()
setupOrientation()
checkNotchSupport()
@ -70,11 +73,11 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
override fun onResume() {
super.onResume()
top_shadow.layoutParams.height = statusBarHeight + actionBarHeight
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT
if (config.blackBackground) {
video_player_holder.background = ColorDrawable(Color.BLACK)
binding.videoPlayerHolder.background = ColorDrawable(Color.BLACK)
}
if (config.maxBrightness) {
@ -83,12 +86,12 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
window.attributes = attributes
}
updateTextColors(video_player_holder)
updateTextColors(binding.videoPlayerHolder)
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
video_toolbar.setPadding(0, 0, navigationBarWidth, 0)
binding.videoToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
video_toolbar.setPadding(0, 0, 0, 0)
binding.videoToolbar.setPadding(0, 0, 0, 0)
}
}
@ -105,24 +108,24 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
super.onDestroy()
if (!isChangingConfigurations) {
pauseVideo()
video_curr_time.text = 0.getFormattedDuration()
binding.bottomVideoTimeHolder.videoCurrTime.text = 0.getFormattedDuration()
releaseExoPlayer()
video_seekbar.progress = 0
binding.bottomVideoTimeHolder.videoSeekbar.progress = 0
mTimerHandler.removeCallbacksAndMessages(null)
mPlayWhenReadyHandler.removeCallbacksAndMessages(null)
}
}
private fun setupOptionsMenu() {
(video_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
video_toolbar.apply {
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
binding.videoToolbar.apply {
setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(R.drawable.ic_arrow_left_vector, Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)
}
updateMenuItemColors(video_toolbar.menu, forceWhiteIcons = true)
video_toolbar.setOnMenuItemClickListener { menuItem ->
updateMenuItemColors(binding.videoToolbar.menu, forceWhiteIcons = true)
binding.videoToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_change_orientation -> changeOrientation()
R.id.menu_open_with -> openPath(mUri!!.toString(), true)
@ -132,7 +135,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
return@setOnMenuItemClickListener true
}
video_toolbar.setNavigationOnClickListener {
binding.videoToolbar.setNavigationOnClickListener {
finish()
}
}
@ -141,16 +144,16 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
super.onConfigurationChanged(newConfig)
setVideoSize()
initTimeHolder()
video_surface_frame.onGlobalLayout {
video_surface_frame.controller.resetState()
binding.videoSurfaceFrame.onGlobalLayout {
binding.videoSurfaceFrame.controller.resetState()
}
top_shadow.layoutParams.height = statusBarHeight + actionBarHeight
(video_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
video_toolbar.setPadding(0, 0, navigationBarWidth, 0)
binding.videoToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
video_toolbar.setPadding(0, 0, 0, 0)
binding.videoToolbar.setPadding(0, 0, 0, 0)
}
}
@ -166,7 +169,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
private fun initPlayer() {
mUri = intent.data ?: return
video_toolbar.title = getFilenameFromUri(mUri!!)
binding.videoToolbar.title = getFilenameFromUri(mUri!!)
initTimeHolder()
showSystemUI(true)
@ -175,17 +178,17 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
fullscreenToggled(isFullscreen)
}
video_curr_time.setOnClickListener { doSkip(false) }
video_duration.setOnClickListener { doSkip(true) }
video_toggle_play_pause.setOnClickListener { togglePlayPause() }
video_surface_frame.setOnClickListener { toggleFullscreen() }
video_surface_frame.controller.settings.swallowDoubleTaps = true
binding.bottomVideoTimeHolder.videoCurrTime.setOnClickListener { doSkip(false) }
binding.bottomVideoTimeHolder.videoDuration.setOnClickListener { doSkip(true) }
binding.bottomVideoTimeHolder.videoTogglePlayPause.setOnClickListener { togglePlayPause() }
binding.videoSurfaceFrame.setOnClickListener { toggleFullscreen() }
binding.videoSurfaceFrame.controller.settings.swallowDoubleTaps = true
video_next_file.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false))
video_next_file.setOnClickListener { handleNextFile() }
binding.bottomVideoTimeHolder.videoNextFile.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false))
binding.bottomVideoTimeHolder.videoNextFile.setOnClickListener { handleNextFile() }
video_prev_file.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false))
video_prev_file.setOnClickListener { handlePrevFile() }
binding.bottomVideoTimeHolder.videoPrevFile.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false))
binding.bottomVideoTimeHolder.videoPrevFile.setOnClickListener { handlePrevFile() }
val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent): Boolean {
@ -194,30 +197,30 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
}
})
video_surface_frame.setOnTouchListener { view, event ->
binding.videoSurfaceFrame.setOnTouchListener { view, event ->
handleEvent(event)
gestureDetector.onTouchEvent(event)
false
}
initExoPlayer()
video_surface.surfaceTextureListener = this
binding.videoSurface.surfaceTextureListener = this
if (config.allowVideoGestures) {
video_brightness_controller.initialize(this, slide_info, true, video_player_holder, singleTap = { x, y ->
binding.videoBrightnessController.initialize(this, binding.slideInfo, true, binding.videoPlayerHolder, singleTap = { x, y ->
toggleFullscreen()
}, doubleTap = { x, y ->
doSkip(false)
})
video_volume_controller.initialize(this, slide_info, false, video_player_holder, singleTap = { x, y ->
binding.videoVolumeController.initialize(this, binding.slideInfo, false, binding.videoPlayerHolder, singleTap = { x, y ->
toggleFullscreen()
}, doubleTap = { x, y ->
doSkip(true)
})
} else {
video_brightness_controller.beGone()
video_volume_controller.beGone()
binding.videoBrightnessController.beGone()
binding.videoVolumeController.beGone()
}
if (config.hideSystemUI) {
@ -267,8 +270,8 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
override fun onPositionDiscontinuity(oldPosition: Player.PositionInfo, newPosition: Player.PositionInfo, @Player.DiscontinuityReason reason: Int) {
// Reset progress views when video loops.
if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
video_seekbar.progress = 0
video_curr_time.text = 0.getFormattedDuration()
binding.bottomVideoTimeHolder.videoSeekbar.progress = 0
binding.bottomVideoTimeHolder.videoCurrTime.text = 0.getFormattedDuration()
}
}
@ -289,10 +292,10 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
private fun videoPrepared() {
if (!mWasVideoStarted) {
video_toggle_play_pause.beVisible()
binding.bottomVideoTimeHolder.videoTogglePlayPause.beVisible()
mDuration = (mExoPlayer!!.duration / 1000).toInt()
video_seekbar.max = mDuration
video_duration.text = mDuration.getFormattedDuration()
binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
setPosition(mCurrTime)
if (config.rememberLastVideoPosition) {
@ -302,7 +305,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
if (config.autoplayVideos) {
resumeVideo()
} else {
video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector)
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(com.simplemobiletools.commons.R.drawable.ic_play_outline_vector)
}
}
}
@ -317,7 +320,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
}
private fun resumeVideo() {
video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline_vector)
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(com.simplemobiletools.commons.R.drawable.ic_pause_outline_vector)
if (mExoPlayer == null) {
return
}
@ -334,7 +337,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
}
private fun pauseVideo() {
video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector)
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(com.simplemobiletools.commons.R.drawable.ic_play_outline_vector)
if (mExoPlayer == null) {
return
}
@ -358,8 +361,8 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
private fun setPosition(seconds: Int) {
mExoPlayer?.seekTo(seconds * 1000L)
video_seekbar.progress = seconds
video_curr_time.text = seconds.getFormattedDuration()
binding.bottomVideoTimeHolder.videoSeekbar.progress = seconds
binding.bottomVideoTimeHolder.videoCurrTime.text = seconds.getFormattedDuration()
}
private fun setLastVideoSavedPosition() {
@ -376,8 +379,8 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
clearLastVideoSavedProgress()
mCurrTime = (mExoPlayer!!.duration / 1000).toInt()
video_seekbar.progress = video_seekbar.max
video_curr_time.text = mDuration.getFormattedDuration()
binding.bottomVideoTimeHolder.videoSeekbar.progress = binding.bottomVideoTimeHolder.videoSeekbar.max
binding.bottomVideoTimeHolder.videoCurrTime.text = mDuration.getFormattedDuration()
pauseVideo()
}
@ -410,7 +413,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
val screenProportion = screenWidth.toFloat() / screenHeight.toFloat()
video_surface.layoutParams.apply {
binding.videoSurface.layoutParams.apply {
if (videoProportion > screenProportion) {
width = screenWidth
height = (screenWidth.toFloat() / videoProportion).toInt()
@ -418,7 +421,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
width = (videoProportion * screenHeight.toFloat()).toInt()
height = screenHeight
}
video_surface.layoutParams = this
binding.videoSurface.layoutParams = this
}
val multiplier = if (screenWidth > screenHeight) 0.5 else 0.8
@ -456,26 +459,31 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
val newAlpha = if (isFullScreen) 0f else 1f
arrayOf(
video_prev_file,
video_toggle_play_pause,
video_next_file,
video_curr_time,
video_seekbar,
video_duration,
top_shadow,
video_bottom_gradient
binding.bottomVideoTimeHolder.videoPrevFile,
binding.bottomVideoTimeHolder.videoTogglePlayPause,
binding.bottomVideoTimeHolder.videoNextFile,
binding.bottomVideoTimeHolder.videoCurrTime,
binding.bottomVideoTimeHolder.videoSeekbar,
binding.bottomVideoTimeHolder.videoDuration,
binding.topShadow,
binding.videoBottomGradient
).forEach {
it.animate().alpha(newAlpha).start()
}
video_seekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
arrayOf(video_prev_file, video_next_file, video_curr_time, video_duration).forEach {
binding.bottomVideoTimeHolder.videoSeekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
arrayOf(
binding.bottomVideoTimeHolder.videoPrevFile,
binding.bottomVideoTimeHolder.videoNextFile,
binding.bottomVideoTimeHolder.videoCurrTime,
binding.bottomVideoTimeHolder.videoDuration,
).forEach {
it.isClickable = !mIsFullscreen
}
video_appbar.animate().alpha(newAlpha).withStartAction {
video_appbar.beVisible()
binding.videoAppbar.animate().alpha(newAlpha).withStartAction {
binding.videoAppbar.beVisible()
}.withEndAction {
video_appbar.beVisibleIf(newAlpha == 1f)
binding.videoAppbar.beVisibleIf(newAlpha == 1f)
}.start()
}
@ -492,11 +500,11 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
}
}
video_time_holder.setPadding(0, 0, right, bottom)
video_seekbar.setOnSeekBarChangeListener(this)
video_seekbar.max = mDuration
video_duration.text = mDuration.getFormattedDuration()
video_curr_time.text = mCurrTime.getFormattedDuration()
binding.bottomVideoTimeHolder.videoTimeHolder.setPadding(0, 0, right, bottom)
binding.bottomVideoTimeHolder.videoSeekbar.setOnSeekBarChangeListener(this)
binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
setupTimer()
}
@ -505,8 +513,8 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
override fun run() {
if (mExoPlayer != null && !mIsDragged && mIsPlaying) {
mCurrTime = (mExoPlayer!!.currentPosition / 1000).toInt()
video_seekbar.progress = mCurrTime
video_curr_time.text = mCurrTime.getFormattedDuration()
binding.bottomVideoTimeHolder.videoSeekbar.progress = mCurrTime
binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
}
mTimerHandler.postDelayed(this, 1000)
@ -543,9 +551,13 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
val diffX = event.rawX - mTouchDownX
val diffY = event.rawY - mTouchDownY
if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY)) && video_surface_frame.controller.state.zoom == 1f) {
if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY)) && binding.videoSurfaceFrame.controller.state.zoom == 1f) {
if (!mIsDragged) {
arrayOf(video_curr_time, video_seekbar, video_duration).forEach {
arrayOf(
binding.bottomVideoTimeHolder.videoCurrTime,
binding.bottomVideoTimeHolder.videoSeekbar,
binding.bottomVideoTimeHolder.videoDuration,
).forEach {
it.animate().alpha(1f).start()
}
}
@ -570,7 +582,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
val downGestureDuration = System.currentTimeMillis() - mTouchDownTime
if (config.allowDownGesture && !mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold &&
downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION &&
video_surface_frame.controller.state.zoom == 1f
binding.videoSurfaceFrame.controller.state.zoom == 1f
) {
supportFinishAfterTransition()
}
@ -578,7 +590,11 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
mIgnoreCloseDown = false
if (mIsDragged) {
if (mIsFullscreen) {
arrayOf(video_curr_time, video_seekbar, video_duration).forEach {
arrayOf(
binding.bottomVideoTimeHolder.videoCurrTime,
binding.bottomVideoTimeHolder.videoSeekbar,
binding.bottomVideoTimeHolder.videoDuration,
).forEach {
it.animate().alpha(0f).start()
}
}
@ -653,7 +669,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
override fun onSurfaceTextureDestroyed(surface: SurfaceTexture) = false
override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
mExoPlayer?.setVideoSurface(Surface(video_surface!!.surfaceTexture))
mExoPlayer?.setVideoSurface(Surface(binding.videoSurface.surfaceTexture))
}
override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {}

View file

@ -43,6 +43,7 @@ import com.simplemobiletools.gallery.pro.BuildConfig
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.MyPagerAdapter
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.pro.databinding.ActivityMediumBinding
import com.simplemobiletools.gallery.pro.dialogs.DeleteWithRememberDialog
import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog
import com.simplemobiletools.gallery.pro.dialogs.SlideshowDialog
@ -53,8 +54,6 @@ import com.simplemobiletools.gallery.pro.fragments.ViewPagerFragment
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import kotlinx.android.synthetic.main.activity_medium.*
import kotlinx.android.synthetic.main.bottom_actions.*
import java.io.File
import kotlin.math.min
@ -83,15 +82,18 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mFavoritePaths = ArrayList<String>()
private var mIgnoredPaths = ArrayList<String>()
private lateinit var binding: ActivityMediumBinding
override fun onCreate(savedInstanceState: Bundle?) {
showTransparentTop = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_medium)
binding = ActivityMediumBinding.inflate(layoutInflater)
setContentView(binding.root)
setupOptionsMenu()
refreshMenuItems()
window.decorView.setBackgroundColor(getProperBackgroundColor())
top_shadow.layoutParams.height = statusBarHeight + actionBarHeight
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
checkNotchSupport()
(MediaActivity.mMedia.clone() as ArrayList<ThumbnailItem>).filterIsInstanceTo(mMediaFiles, Medium::class.java)
@ -99,7 +101,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (it) {
initViewPager()
} else {
toast(R.string.no_storage_permissions)
toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish()
}
}
@ -132,7 +134,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
refreshMenuItems()
val filename = getCurrentMedium()?.name ?: mPath.getFilenameFromPath()
medium_viewer_toolbar.title = filename
binding.mediumViewerToolbar.title = filename
}
override fun onPause() {
@ -162,7 +164,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
runOnUiThread {
val rotationDegrees = getCurrentPhotoFragment()?.mCurrentRotationDegrees ?: 0
medium_viewer_toolbar.menu.apply {
binding.mediumViewerToolbar.menu.apply {
findItem(R.id.menu_show_on_map).isVisible = visibleBottomActions and BOTTOM_ACTION_SHOW_ON_MAP == 0
findItem(R.id.menu_slideshow).isVisible = visibleBottomActions and BOTTOM_ACTION_SLIDESHOW == 0
findItem(R.id.menu_properties).isVisible = visibleBottomActions and BOTTOM_ACTION_PROPERTIES == 0
@ -209,15 +211,15 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun setupOptionsMenu() {
(medium_viewer_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
medium_viewer_toolbar.apply {
(binding.mediumViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
binding.mediumViewerToolbar.apply {
setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(R.drawable.ic_arrow_left_vector, Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)
}
updateMenuItemColors(medium_viewer_toolbar.menu, forceWhiteIcons = true)
medium_viewer_toolbar.setOnMenuItemClickListener { menuItem ->
updateMenuItemColors(binding.mediumViewerToolbar.menu, forceWhiteIcons = true)
binding.mediumViewerToolbar.setOnMenuItemClickListener { menuItem ->
if (getCurrentMedium() == null) {
return@setOnMenuItemClickListener true
}
@ -255,7 +257,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return@setOnMenuItemClickListener true
}
medium_viewer_toolbar.setNavigationOnClickListener {
binding.mediumViewerToolbar.setNavigationOnClickListener {
finish()
}
}
@ -280,7 +282,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
initBottomActionsLayout()
(medium_viewer_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
(binding.mediumViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
}
private fun initViewPager() {
@ -314,7 +316,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
if (mPath.isEmpty()) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
finish()
return
}
@ -368,9 +370,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
isShowingRecycleBin -> RECYCLE_BIN
else -> mPath.getParentPath()
}
medium_viewer_toolbar.title = mPath.getFilenameFromPath()
binding.mediumViewerToolbar.title = mPath.getFilenameFromPath()
view_pager.onGlobalLayout {
binding.viewPager.onGlobalLayout {
if (!isDestroyed) {
if (mMediaFiles.isNotEmpty()) {
gotMedia(mMediaFiles as ArrayList<ThumbnailItem>, refetchViewPagerPosition = true)
@ -390,14 +392,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
refreshViewPager(true)
view_pager.offscreenPageLimit = 2
binding.viewPager.offscreenPageLimit = 2
if (config.blackBackground) {
view_pager.background = ColorDrawable(Color.BLACK)
binding.viewPager.background = ColorDrawable(Color.BLACK)
}
if (config.hideSystemUI) {
view_pager.onGlobalLayout {
binding.viewPager.onGlobalLayout {
Handler().postDelayed({
fragmentClicked()
}, HIDE_SYSTEM_UI_DELAY)
@ -469,7 +471,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, media)
if (!isDestroyed) {
pagerAdapter.shouldInitFragment = mPos < 5
view_pager.apply {
binding.viewPager.apply {
// must remove the listener before changing adapter, otherwise it might cause `mPos` to be set to 0
removeOnPageChangeListener(this@ViewPagerActivity)
adapter = pagerAdapter
@ -494,10 +496,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun startSlideshow() {
if (getMediaForSlideshow()) {
view_pager.onGlobalLayout {
binding.viewPager.onGlobalLayout {
if (!isDestroyed) {
if (config.slideshowAnimation == SLIDESHOW_ANIMATION_FADE) {
view_pager.setPageTransformer(false, FadePageTransformer())
binding.viewPager.setPageTransformer(false, FadePageTransformer())
}
hideSystemUI(true)
@ -513,35 +515,35 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun goToNextMedium(forward: Boolean) {
val oldPosition = view_pager.currentItem
val oldPosition = binding.viewPager.currentItem
val newPosition = if (forward) oldPosition + 1 else oldPosition - 1
if (newPosition == -1 || newPosition > view_pager.adapter!!.count - 1) {
if (newPosition == -1 || newPosition > binding.viewPager.adapter!!.count - 1) {
slideshowEnded(forward)
} else {
view_pager.setCurrentItem(newPosition, false)
binding.viewPager.setCurrentItem(newPosition, false)
}
}
private fun animatePagerTransition(forward: Boolean) {
val oldPosition = view_pager.currentItem
val animator = ValueAnimator.ofInt(0, view_pager.width)
val oldPosition = binding.viewPager.currentItem
val animator = ValueAnimator.ofInt(0, binding.viewPager.width)
animator.addListener(object : Animator.AnimatorListener {
override fun onAnimationEnd(animation: Animator) {
if (view_pager.isFakeDragging) {
if (binding.viewPager.isFakeDragging) {
try {
view_pager.endFakeDrag()
binding.viewPager.endFakeDrag()
} catch (ignored: Exception) {
stopSlideshow()
}
if (view_pager.currentItem == oldPosition) {
if (binding.viewPager.currentItem == oldPosition) {
slideshowEnded(forward)
}
}
}
override fun onAnimationCancel(animation: Animator) {
view_pager.endFakeDrag()
binding.viewPager.endFakeDrag()
}
override fun onAnimationStart(animation: Animator) {}
@ -559,12 +561,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener {
var oldDragPosition = 0
override fun onAnimationUpdate(animation: ValueAnimator) {
if (view_pager?.isFakeDragging == true) {
if (binding.viewPager?.isFakeDragging == true) {
val dragPosition = animation.animatedValue as Int
val dragOffset = dragPosition - oldDragPosition
oldDragPosition = dragPosition
try {
view_pager.fakeDragBy(dragOffset * (if (forward) -1f else 1f))
binding.viewPager.fakeDragBy(dragOffset * (if (forward) -1f else 1f))
} catch (e: Exception) {
stopSlideshow()
}
@ -572,16 +574,16 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
})
view_pager.beginFakeDrag()
binding.viewPager.beginFakeDrag()
animator.start()
}
private fun slideshowEnded(forward: Boolean) {
if (config.loopSlideshow) {
if (forward) {
view_pager.setCurrentItem(0, false)
binding.viewPager.setCurrentItem(0, false)
} else {
view_pager.setCurrentItem(view_pager.adapter!!.count - 1, false)
binding.viewPager.setCurrentItem(binding.viewPager.adapter!!.count - 1, false)
}
} else {
stopSlideshow()
@ -591,7 +593,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun stopSlideshow() {
if (mIsSlideshowActive) {
view_pager.setPageTransformer(false, DefaultPageTransformer())
binding.viewPager.setPageTransformer(false, DefaultPageTransformer())
mIsSlideshowActive = false
showSystemUI(true)
mSlideshowHandler.removeCallbacksAndMessages(null)
@ -665,7 +667,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun copyMoveTo(isCopyOperation: Boolean) {
val currPath = getCurrentPath()
if (!isCopyOperation && currPath.startsWith(recycleBinPath)) {
toast(R.string.moving_recycle_bin_items_disabled, Toast.LENGTH_LONG)
toast(com.simplemobiletools.commons.R.string.moving_recycle_bin_items_disabled, Toast.LENGTH_LONG)
return
}
@ -687,7 +689,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun toggleFileVisibility(hide: Boolean, callback: (() -> Unit)? = null) {
toggleFileVisibility(getCurrentPath(), hide) {
val newFileName = it.getFilenameFromPath()
medium_viewer_toolbar.title = newFileName
binding.mediumViewerToolbar.title = newFileName
getCurrentMedium()!!.apply {
name = newFileName
@ -727,12 +729,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun getChangeOrientationIcon(): Int {
return if (mIsOrientationLocked) {
if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
R.drawable.ic_orientation_portrait_vector
com.simplemobiletools.commons.R.drawable.ic_orientation_portrait_vector
} else {
R.drawable.ic_orientation_landscape_vector
com.simplemobiletools.commons.R.drawable.ic_orientation_landscape_vector
}
} else {
R.drawable.ic_orientation_auto_vector
com.simplemobiletools.commons.R.drawable.ic_orientation_auto_vector
}
}
@ -745,11 +747,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return@handleSAFDialog
}
toast(R.string.saving)
toast(com.simplemobiletools.commons.R.string.saving)
ensureBackgroundThread {
val photoFragment = getCurrentPhotoFragment() ?: return@ensureBackgroundThread
saveRotatedImageToFile(currPath, newPath, photoFragment.mCurrentRotationDegrees, true) {
toast(R.string.file_saved)
toast(com.simplemobiletools.commons.R.string.file_saved)
getCurrentPhotoFragment()?.mCurrentRotationDegrees = 0
refreshMenuItems()
}
@ -814,7 +816,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return false
}
private fun getCurrentFragment() = (view_pager.adapter as? MyPagerAdapter)?.getCurrentFragment(view_pager.currentItem)
private fun getCurrentFragment() = (binding.viewPager.adapter as? MyPagerAdapter)?.getCurrentFragment(binding.viewPager.currentItem)
private fun showProperties() {
if (getCurrentMedium() != null) {
@ -823,63 +825,63 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun initBottomActionsLayout() {
bottom_actions.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight
binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight
if (config.bottomActions) {
bottom_actions.beVisible()
binding.bottomActions.root.beVisible()
} else {
bottom_actions.beGone()
binding.bottomActions.root.beGone()
}
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
medium_viewer_toolbar.setPadding(0, 0, navigationBarWidth, 0)
binding.mediumViewerToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
medium_viewer_toolbar.setPadding(0, 0, 0, 0)
binding.mediumViewerToolbar.setPadding(0, 0, 0, 0)
}
}
private fun initBottomActionButtons() {
val currentMedium = getCurrentMedium()
val visibleBottomActions = if (config.bottomActions) config.visibleBottomActions else 0
bottom_favorite.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0 && currentMedium?.getIsInRecycleBin() == false)
bottom_favorite.setOnLongClickListener { toast(R.string.toggle_favorite); true }
bottom_favorite.setOnClickListener {
binding.bottomActions.bottomFavorite.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0 && currentMedium?.getIsInRecycleBin() == false)
binding.bottomActions.bottomFavorite.setOnLongClickListener { toast(R.string.toggle_favorite); true }
binding.bottomActions.bottomFavorite.setOnClickListener {
toggleFavorite()
}
bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && currentMedium?.isSVG() == false)
bottom_edit.setOnLongClickListener { toast(R.string.edit); true }
bottom_edit.setOnClickListener {
binding.bottomActions.bottomEdit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && currentMedium?.isSVG() == false)
binding.bottomActions.bottomEdit.setOnLongClickListener { toast(R.string.edit); true }
binding.bottomActions.bottomEdit.setOnClickListener {
openEditor(getCurrentPath())
}
bottom_share.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHARE != 0)
bottom_share.setOnLongClickListener { toast(R.string.share); true }
bottom_share.setOnClickListener {
binding.bottomActions.bottomShare.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHARE != 0)
binding.bottomActions.bottomShare.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.share); true }
binding.bottomActions.bottomShare.setOnClickListener {
shareMediumPath(getCurrentPath())
}
bottom_delete.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_DELETE != 0)
bottom_delete.setOnLongClickListener { toast(R.string.delete); true }
bottom_delete.setOnClickListener {
binding.bottomActions.bottomDelete.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_DELETE != 0)
binding.bottomActions.bottomDelete.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.delete); true }
binding.bottomActions.bottomDelete.setOnClickListener {
checkDeleteConfirmation()
}
bottom_rotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && getCurrentMedium()?.isImage() == true)
bottom_rotate.setOnLongClickListener { toast(R.string.rotate); true }
bottom_rotate.setOnClickListener {
binding.bottomActions.bottomRotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && getCurrentMedium()?.isImage() == true)
binding.bottomActions.bottomRotate.setOnLongClickListener { toast(R.string.rotate); true }
binding.bottomActions.bottomRotate.setOnClickListener {
rotateImage(90)
}
bottom_properties.applyColorFilter(Color.WHITE)
bottom_properties.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_PROPERTIES != 0)
bottom_properties.setOnLongClickListener { toast(R.string.properties); true }
bottom_properties.setOnClickListener {
binding.bottomActions.bottomProperties.applyColorFilter(Color.WHITE)
binding.bottomActions.bottomProperties.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_PROPERTIES != 0)
binding.bottomActions.bottomProperties.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.properties); true }
binding.bottomActions.bottomProperties.setOnClickListener {
showProperties()
}
bottom_change_orientation.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0)
bottom_change_orientation.setOnLongClickListener { toast(R.string.change_orientation); true }
bottom_change_orientation.setOnClickListener {
binding.bottomActions.bottomChangeOrientation.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0)
binding.bottomActions.bottomChangeOrientation.setOnLongClickListener { toast(R.string.change_orientation); true }
binding.bottomActions.bottomChangeOrientation.setOnClickListener {
requestedOrientation = when (requestedOrientation) {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT -> ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
@ -889,24 +891,24 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
updateBottomActionIcons(currentMedium)
}
bottom_slideshow.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SLIDESHOW != 0)
bottom_slideshow.setOnLongClickListener { toast(R.string.slideshow); true }
bottom_slideshow.setOnClickListener {
binding.bottomActions.bottomSlideshow.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SLIDESHOW != 0)
binding.bottomActions.bottomSlideshow.setOnLongClickListener { toast(R.string.slideshow); true }
binding.bottomActions.bottomSlideshow.setOnClickListener {
initSlideshow()
}
bottom_show_on_map.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHOW_ON_MAP != 0)
bottom_show_on_map.setOnLongClickListener { toast(R.string.show_on_map); true }
bottom_show_on_map.setOnClickListener {
binding.bottomActions.bottomShowOnMap.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHOW_ON_MAP != 0)
binding.bottomActions.bottomShowOnMap.setOnLongClickListener { toast(R.string.show_on_map); true }
binding.bottomActions.bottomShowOnMap.setOnClickListener {
showFileOnMap(getCurrentPath())
}
bottom_toggle_file_visibility.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0)
bottom_toggle_file_visibility.setOnLongClickListener {
toast(if (currentMedium?.isHidden() == true) R.string.unhide else R.string.hide); true
binding.bottomActions.bottomToggleFileVisibility.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0)
binding.bottomActions.bottomToggleFileVisibility.setOnLongClickListener {
toast(if (currentMedium?.isHidden() == true) com.simplemobiletools.commons.R.string.unhide else com.simplemobiletools.commons.R.string.hide); true
}
bottom_toggle_file_visibility.setOnClickListener {
binding.bottomActions.bottomToggleFileVisibility.setOnClickListener {
currentMedium?.apply {
toggleFileVisibility(!isHidden()) {
updateBottomActionIcons(currentMedium)
@ -914,33 +916,33 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
}
bottom_rename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 && currentMedium?.getIsInRecycleBin() == false)
bottom_rename.setOnLongClickListener { toast(R.string.rename); true }
bottom_rename.setOnClickListener {
binding.bottomActions.bottomRename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 && currentMedium?.getIsInRecycleBin() == false)
binding.bottomActions.bottomRename.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.rename); true }
binding.bottomActions.bottomRename.setOnClickListener {
checkMediaManagementAndRename()
}
bottom_set_as.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0)
bottom_set_as.setOnLongClickListener { toast(R.string.set_as); true }
bottom_set_as.setOnClickListener {
binding.bottomActions.bottomSetAs.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0)
binding.bottomActions.bottomSetAs.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.set_as); true }
binding.bottomActions.bottomSetAs.setOnClickListener {
setAs(getCurrentPath())
}
bottom_copy.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_COPY != 0)
bottom_copy.setOnLongClickListener { toast(R.string.copy); true }
bottom_copy.setOnClickListener {
binding.bottomActions.bottomCopy.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_COPY != 0)
binding.bottomActions.bottomCopy.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.copy); true }
binding.bottomActions.bottomCopy.setOnClickListener {
checkMediaManagementAndCopy(true)
}
bottom_move.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_MOVE != 0)
bottom_move.setOnLongClickListener { toast(R.string.move); true }
bottom_move.setOnClickListener {
binding.bottomActions.bottomMove.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_MOVE != 0)
binding.bottomActions.bottomMove.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.move); true }
binding.bottomActions.bottomMove.setOnClickListener {
moveFileTo()
}
bottom_resize.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RESIZE != 0 && currentMedium?.isImage() == true)
bottom_resize.setOnLongClickListener { toast(R.string.resize); true }
bottom_resize.setOnClickListener {
binding.bottomActions.bottomResize.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RESIZE != 0 && currentMedium?.isImage() == true)
binding.bottomActions.bottomResize.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.resize); true }
binding.bottomActions.bottomResize.setOnClickListener {
resizeImage()
}
}
@ -950,14 +952,16 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return
}
val favoriteIcon = if (medium.isFavorite) R.drawable.ic_star_vector else R.drawable.ic_star_outline_vector
bottom_favorite.setImageResource(favoriteIcon)
val favoriteIcon =
if (medium.isFavorite) com.simplemobiletools.commons.R.drawable.ic_star_vector else com.simplemobiletools.commons.R.drawable.ic_star_outline_vector
binding.bottomActions.bottomFavorite.setImageResource(favoriteIcon)
val hideIcon = if (medium.isHidden()) R.drawable.ic_unhide_vector else R.drawable.ic_hide_vector
bottom_toggle_file_visibility.setImageResource(hideIcon)
val hideIcon =
if (medium.isHidden()) com.simplemobiletools.commons.R.drawable.ic_unhide_vector else com.simplemobiletools.commons.R.drawable.ic_hide_vector
binding.bottomActions.bottomToggleFileVisibility.setImageResource(hideIcon)
bottom_rotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && getCurrentMedium()?.isImage() == true)
bottom_change_orientation.setImageResource(getChangeOrientationIcon())
binding.bottomActions.bottomRotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && getCurrentMedium()?.isImage() == true)
binding.bottomActions.bottomChangeOrientation.setImageResource(getChangeOrientationIcon())
}
private fun toggleFavorite() {
@ -989,7 +993,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
try {
val resolution = path.getImageResolution(this)
if (resolution == null) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return
}
@ -1073,9 +1077,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val isInRecycleBin = getCurrentMedium()!!.getIsInRecycleBin()
val baseString = if (config.useRecycleBin && !config.tempSkipRecycleBin && !isInRecycleBin) {
R.string.move_to_recycle_bin_confirmation
com.simplemobiletools.commons.R.string.move_to_recycle_bin_confirmation
} else {
R.string.deletion_confirmation
com.simplemobiletools.commons.R.string.deletion_confirmation
}
val message = String.format(resources.getString(baseString), filenameAndSize)
@ -1128,7 +1132,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
}
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
}
}
@ -1186,7 +1190,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val isSDOrOtgRootFolder = isAStorageRootFolder(oldPath.getParentPath()) && !oldPath.startsWith(internalStoragePath)
if (isRPlus() && isSDOrOtgRootFolder && !isExternalStorageManager()) {
toast(R.string.rename_in_sd_card_system_restriction, Toast.LENGTH_LONG)
toast(com.simplemobiletools.commons.R.string.rename_in_sd_card_system_restriction, Toast.LENGTH_LONG)
return
}
@ -1320,12 +1324,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun isSlideShowActive() = mIsSlideshowActive
override fun goToPrevItem() {
view_pager.setCurrentItem(view_pager.currentItem - 1, false)
binding.viewPager.setCurrentItem(binding.viewPager.currentItem - 1, false)
checkOrientation()
}
override fun goToNextItem() {
view_pager.setCurrentItem(view_pager.currentItem + 1, false)
binding.viewPager.setCurrentItem(binding.viewPager.currentItem + 1, false)
checkOrientation()
}
@ -1340,14 +1344,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
putExtra(IS_FROM_GALLERY, true)
putExtra(REAL_FILE_PATH, path)
putExtra(SHOW_PREV_ITEM, view_pager.currentItem != 0)
putExtra(SHOW_NEXT_ITEM, view_pager.currentItem != mMediaFiles.lastIndex)
putExtra(SHOW_PREV_ITEM, binding.viewPager.currentItem != 0)
putExtra(SHOW_NEXT_ITEM, binding.viewPager.currentItem != mMediaFiles.lastIndex)
try {
startActivityForResult(this, REQUEST_VIEW_VIDEO)
} catch (e: ActivityNotFoundException) {
if (!tryGenericMimeType(this, mimeType, newUri)) {
toast(R.string.no_app_found)
toast(com.simplemobiletools.commons.R.string.no_app_found)
}
} catch (e: Exception) {
showErrorToast(e)
@ -1366,20 +1370,20 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun fullscreenToggled() {
view_pager.adapter?.let {
binding.viewPager.adapter?.let {
(it as MyPagerAdapter).toggleFullscreen(mIsFullScreen)
val newAlpha = if (mIsFullScreen) 0f else 1f
top_shadow.animate().alpha(newAlpha).start()
bottom_actions.animate().alpha(newAlpha).withStartAction {
bottom_actions.beVisible()
binding.topShadow.animate().alpha(newAlpha).start()
binding.bottomActions.root.animate().alpha(newAlpha).withStartAction {
binding.bottomActions.root.beVisible()
}.withEndAction {
bottom_actions.beVisibleIf(newAlpha == 1f)
binding.bottomActions.root.beVisibleIf(newAlpha == 1f)
}.start()
medium_viewer_appbar.animate().alpha(newAlpha).withStartAction {
medium_viewer_appbar.beVisible()
binding.mediumViewerAppbar.animate().alpha(newAlpha).withStartAction {
binding.mediumViewerAppbar.beVisible()
}.withEndAction {
medium_viewer_appbar.beVisibleIf(newAlpha == 1f)
binding.mediumViewerAppbar.beVisibleIf(newAlpha == 1f)
}.start()
}
}
@ -1388,7 +1392,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
runOnUiThread {
val medium = getCurrentMedium()
if (medium != null) {
medium_viewer_toolbar.title = medium.path.getFilenameFromPath()
binding.mediumViewerToolbar.title = medium.path.getFilenameFromPath()
}
}
}

View file

@ -13,13 +13,13 @@ import com.simplemobiletools.commons.dialogs.ColorPickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.ActivityWidgetConfigBinding
import com.simplemobiletools.gallery.pro.dialogs.PickDirectoryDialog
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.MyWidgetProvider
import com.simplemobiletools.gallery.pro.helpers.ROUNDED_CORNERS_NONE
import com.simplemobiletools.gallery.pro.models.Directory
import com.simplemobiletools.gallery.pro.models.Widget
import kotlinx.android.synthetic.main.activity_widget_config.*
class WidgetConfigureActivity : SimpleActivity() {
private var mBgAlpha = 0f
@ -30,11 +30,14 @@ class WidgetConfigureActivity : SimpleActivity() {
private var mFolderPath = ""
private var mDirectories = ArrayList<Directory>()
private lateinit var binding: ActivityWidgetConfigBinding
public override fun onCreate(savedInstanceState: Bundle?) {
useDynamicTheme = false
super.onCreate(savedInstanceState)
setResult(RESULT_CANCELED)
setContentView(R.layout.activity_widget_config)
binding = ActivityWidgetConfigBinding.inflate(layoutInflater)
setContentView(binding.root)
initVariables()
mWidgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: AppWidgetManager.INVALID_APPWIDGET_ID
@ -43,21 +46,21 @@ class WidgetConfigureActivity : SimpleActivity() {
finish()
}
config_save.setOnClickListener { saveConfig() }
config_bg_color.setOnClickListener { pickBackgroundColor() }
config_text_color.setOnClickListener { pickTextColor() }
folder_picker_value.setOnClickListener { changeSelectedFolder() }
config_image_holder.setOnClickListener { changeSelectedFolder() }
binding.configSave.setOnClickListener { saveConfig() }
binding.configBgColor.setOnClickListener { pickBackgroundColor() }
binding.configTextColor.setOnClickListener { pickTextColor() }
binding.folderPickerValue.setOnClickListener { changeSelectedFolder() }
binding.configImageHolder.setOnClickListener { changeSelectedFolder() }
updateTextColors(folder_picker_holder)
updateTextColors(binding.folderPickerHolder)
val primaryColor = getProperPrimaryColor()
config_bg_seekbar.setColors(mTextColor, primaryColor, primaryColor)
folder_picker_holder.background = ColorDrawable(getProperBackgroundColor())
binding.configBgSeekbar.setColors(mTextColor, primaryColor, primaryColor)
binding.folderPickerHolder.background = ColorDrawable(getProperBackgroundColor())
folder_picker_show_folder_name.isChecked = config.showWidgetFolderName
binding.folderPickerShowFolderName.isChecked = config.showWidgetFolderName
handleFolderNameDisplay()
folder_picker_show_folder_name_holder.setOnClickListener {
folder_picker_show_folder_name.toggle()
binding.folderPickerShowFolderNameHolder.setOnClickListener {
binding.folderPickerShowFolderName.toggle()
handleFolderNameDisplay()
}
@ -75,7 +78,7 @@ class WidgetConfigureActivity : SimpleActivity() {
mBgAlpha = Color.alpha(mBgColor) / 255f
mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor))
config_bg_seekbar.apply {
binding.configBgSeekbar.apply {
progress = (mBgAlpha * 100).toInt()
onSeekBarChangeListener { progress ->
@ -86,8 +89,8 @@ class WidgetConfigureActivity : SimpleActivity() {
updateBackgroundColor()
mTextColor = config.widgetTextColor
if (mTextColor == resources.getColor(R.color.default_widget_text_color) && config.isUsingSystemTheme) {
mTextColor = resources.getColor(R.color.you_primary_color, theme)
if (mTextColor == resources.getColor(com.simplemobiletools.commons.R.color.default_widget_text_color) && config.isUsingSystemTheme) {
mTextColor = resources.getColor(com.simplemobiletools.commons.R.color.you_primary_color, theme)
}
updateTextColor()
@ -97,7 +100,7 @@ class WidgetConfigureActivity : SimpleActivity() {
val views = RemoteViews(packageName, R.layout.widget)
views.setBackgroundColor(R.id.widget_holder, mBgColor)
AppWidgetManager.getInstance(this)?.updateAppWidget(mWidgetId, views) ?: return
config.showWidgetFolderName = folder_picker_show_folder_name.isChecked
config.showWidgetFolderName = binding.folderPickerShowFolderName.isChecked
val widget = Widget(null, mWidgetId, mFolderPath)
ensureBackgroundThread {
widgetsDB.insertOrUpdate(widget)
@ -128,16 +131,16 @@ class WidgetConfigureActivity : SimpleActivity() {
}
private fun updateTextColor() {
config_folder_name.setTextColor(mTextColor)
config_text_color.setFillWithStroke(mTextColor, mTextColor)
config_save.setTextColor(getProperPrimaryColor().getContrastColor())
binding.configFolderName.setTextColor(mTextColor)
binding.configTextColor.setFillWithStroke(mTextColor, mTextColor)
binding.configSave.setTextColor(getProperPrimaryColor().getContrastColor())
}
private fun updateBackgroundColor() {
mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha)
config_image_holder.background.applyColorFilter(mBgColor)
config_bg_color.setFillWithStroke(mBgColor, mBgColor)
config_save.backgroundTintList = ColorStateList.valueOf(getProperPrimaryColor())
binding.configImageHolder.background.applyColorFilter(mBgColor)
binding.configBgColor.setFillWithStroke(mBgColor, mBgColor)
binding.configSave.backgroundTintList = ColorStateList.valueOf(getProperPrimaryColor())
}
private fun pickBackgroundColor() {
@ -167,8 +170,8 @@ class WidgetConfigureActivity : SimpleActivity() {
private fun updateFolderImage(folderPath: String) {
mFolderPath = folderPath
runOnUiThread {
folder_picker_value.text = getFolderNameFromPath(folderPath)
config_folder_name.text = getFolderNameFromPath(folderPath)
binding.folderPickerValue.text = getFolderNameFromPath(folderPath)
binding.configFolderName.text = getFolderNameFromPath(folderPath)
}
ensureBackgroundThread {
@ -176,14 +179,14 @@ class WidgetConfigureActivity : SimpleActivity() {
if (path != null) {
runOnUiThread {
val signature = ObjectKey(System.currentTimeMillis().toString())
loadJpg(path, config_image, config.cropThumbnails, ROUNDED_CORNERS_NONE, signature)
loadJpg(path, binding.configImage, config.cropThumbnails, ROUNDED_CORNERS_NONE, signature)
}
}
}
}
private fun handleFolderNameDisplay() {
val showFolderName = folder_picker_show_folder_name.isChecked
config_folder_name.beVisibleIf(showFolderName)
val showFolderName = binding.folderPickerShowFolderName.isChecked
binding.configFolderName.beVisibleIf(showFolderName)
}
}

View file

@ -31,6 +31,9 @@ import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.MediaActivity
import com.simplemobiletools.gallery.pro.databinding.DirectoryItemGridRoundedCornersBinding
import com.simplemobiletools.gallery.pro.databinding.DirectoryItemGridSquareBinding
import com.simplemobiletools.gallery.pro.databinding.DirectoryItemListBinding
import com.simplemobiletools.gallery.pro.dialogs.ConfirmDeleteFolderDialog
import com.simplemobiletools.gallery.pro.dialogs.ExcludeFolderDialog
import com.simplemobiletools.gallery.pro.dialogs.PickMediumDialog
@ -39,20 +42,8 @@ import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.interfaces.DirectoryOperationsListener
import com.simplemobiletools.gallery.pro.models.AlbumCover
import com.simplemobiletools.gallery.pro.models.Directory
import kotlinx.android.synthetic.main.directory_item_grid_square.view.*
import kotlinx.android.synthetic.main.directory_item_grid_square.view.dir_check
import kotlinx.android.synthetic.main.directory_item_grid_square.view.dir_location
import kotlinx.android.synthetic.main.directory_item_grid_square.view.dir_lock
import kotlinx.android.synthetic.main.directory_item_grid_square.view.dir_name
import kotlinx.android.synthetic.main.directory_item_grid_square.view.dir_pin
import kotlinx.android.synthetic.main.directory_item_grid_square.view.dir_thumbnail
import kotlinx.android.synthetic.main.directory_item_list.view.*
import kotlinx.android.synthetic.main.directory_item_list.view.dir_drag_handle
import kotlinx.android.synthetic.main.directory_item_list.view.dir_holder
import kotlinx.android.synthetic.main.directory_item_list.view.photo_cnt
import java.io.File
import java.util.*
import kotlin.collections.ArrayList
class DirectoryAdapter(
activity: BaseSimpleActivity, var dirs: ArrayList<Directory>, val listener: DirectoryOperationsListener?, recyclerView: MyRecyclerView,
@ -87,13 +78,13 @@ class DirectoryAdapter(
override fun getActionMenuId() = R.menu.cab_directories
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layoutType = when {
isListViewType -> R.layout.directory_item_list
folderStyle == FOLDER_STYLE_SQUARE -> R.layout.directory_item_grid_square
else -> R.layout.directory_item_grid_rounded_corners
val binding = when {
isListViewType -> DirectoryItemListBinding.inflate(layoutInflater, parent, false)
folderStyle == FOLDER_STYLE_SQUARE -> DirectoryItemGridSquareBinding.inflate(layoutInflater, parent, false)
else -> DirectoryItemGridRoundedCornersBinding.inflate(layoutInflater, parent, false)
}
return createViewHolder(layoutType, parent)
return createViewHolder(binding.root)
}
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
@ -188,7 +179,7 @@ class DirectoryAdapter(
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
if (!activity.isDestroyed) {
Glide.with(activity).clear(holder.itemView.dir_thumbnail!!)
Glide.with(activity).clear(bindItem(holder.itemView).dirThumbnail)
}
}
@ -251,7 +242,7 @@ class DirectoryAdapter(
val sourcePath = firstDir.path
val dir = File(sourcePath)
if (activity.isAStorageRootFolder(dir.absolutePath)) {
activity.toast(R.string.rename_folder_root)
activity.toast(com.simplemobiletools.commons.R.string.rename_folder_root)
return
}
@ -306,7 +297,7 @@ class DirectoryAdapter(
}
} else {
if (selectedPaths.any { it.isThisOrParentFolderHidden() }) {
ConfirmationDialog(activity, "", R.string.cant_unhide_folder, R.string.ok, 0) {}
ConfirmationDialog(activity, "", R.string.cant_unhide_folder, com.simplemobiletools.commons.R.string.ok, 0) {}
return
}
@ -602,7 +593,13 @@ class DirectoryAdapter(
else -> {
val itemsCnt = selectedKeys.size
if (itemsCnt == 1 && getSelectedItems().first().isRecycleBin()) {
ConfirmationDialog(activity, "", R.string.empty_recycle_bin_confirmation, R.string.yes, R.string.no) {
ConfirmationDialog(
activity,
"",
com.simplemobiletools.commons.R.string.empty_recycle_bin_confirmation,
com.simplemobiletools.commons.R.string.yes,
com.simplemobiletools.commons.R.string.no
) {
deleteFolders()
}
return
@ -612,18 +609,18 @@ class DirectoryAdapter(
val folder = getSelectedPaths().first().getFilenameFromPath()
"\"$folder\""
} else {
resources.getQuantityString(R.plurals.delete_items, itemsCnt, itemsCnt)
resources.getQuantityString(com.simplemobiletools.commons.R.plurals.delete_items, itemsCnt, itemsCnt)
}
val fileDirItem = getFirstSelectedItem() ?: return
val baseString = if (!config.useRecycleBin || config.tempSkipRecycleBin || (isOneItemSelected() && fileDirItem.areFavorites())) {
R.string.deletion_confirmation
com.simplemobiletools.commons.R.string.deletion_confirmation
} else {
R.string.move_to_recycle_bin_confirmation
com.simplemobiletools.commons.R.string.move_to_recycle_bin_confirmation
}
val question = String.format(resources.getString(baseString), items)
val warning = resources.getQuantityString(R.plurals.delete_warning, itemsCnt, itemsCnt)
val warning = resources.getQuantityString(com.simplemobiletools.commons.R.plurals.delete_warning, itemsCnt, itemsCnt)
ConfirmDeleteFolderDialog(activity, question, warning) {
deleteFolders()
}
@ -772,8 +769,8 @@ class DirectoryAdapter(
private fun setupView(view: View, directory: Directory, holder: ViewHolder) {
val isSelected = selectedKeys.contains(directory.path.hashCode())
view.apply {
dir_path?.text = "${directory.path.substringBeforeLast("/")}/"
bindItem(view).apply {
dirPath?.text = "${directory.path.substringBeforeLast("/")}/"
val thumbnailType = when {
directory.tmb.isVideoFast() -> TYPE_VIDEOS
directory.tmb.isGif() -> TYPE_GIFS
@ -782,25 +779,25 @@ class DirectoryAdapter(
else -> TYPE_IMAGES
}
dir_check?.beVisibleIf(isSelected)
dirCheck.beVisibleIf(isSelected)
if (isSelected) {
dir_check.background?.applyColorFilter(properPrimaryColor)
dir_check.applyColorFilter(contrastColor)
dirCheck.background?.applyColorFilter(properPrimaryColor)
dirCheck.applyColorFilter(contrastColor)
}
if (isListViewType) {
dir_holder.isSelected = isSelected
dirHolder.isSelected = isSelected
}
if (scrollHorizontally && !isListViewType && folderStyle == FOLDER_STYLE_ROUNDED_CORNERS) {
(dir_thumbnail.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ABOVE, dir_name.id)
(dirThumbnail.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ABOVE, dirName.id)
val photoCntParams = (photo_cnt.layoutParams as RelativeLayout.LayoutParams)
val nameParams = (dir_name.layoutParams as RelativeLayout.LayoutParams)
val photoCntParams = (photoCnt.layoutParams as RelativeLayout.LayoutParams)
val nameParams = (dirName.layoutParams as RelativeLayout.LayoutParams)
nameParams.removeRule(RelativeLayout.BELOW)
if (config.showFolderMediaCount == FOLDER_MEDIA_CNT_LINE) {
nameParams.addRule(RelativeLayout.ABOVE, photo_cnt.id)
nameParams.addRule(RelativeLayout.ABOVE, photoCnt.id)
nameParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM)
photoCntParams.removeRule(RelativeLayout.BELOW)
@ -811,11 +808,11 @@ class DirectoryAdapter(
}
if (lockedFolderPaths.contains(directory.path)) {
dir_lock.beVisible()
dir_lock.background = ColorDrawable(context.getProperBackgroundColor())
dir_lock.applyColorFilter(context.getProperBackgroundColor().getContrastColor())
dirLock.beVisible()
dirLock.background = ColorDrawable(root.context.getProperBackgroundColor())
dirLock.applyColorFilter(root.context.getProperBackgroundColor().getContrastColor())
} else {
dir_lock.beGone()
dirLock.beGone()
val roundedCorners = when {
isListViewType -> ROUNDED_CORNERS_SMALL
folderStyle == FOLDER_STYLE_SQUARE -> ROUNDED_CORNERS_NONE
@ -825,7 +822,7 @@ class DirectoryAdapter(
activity.loadImage(
thumbnailType,
directory.tmb,
dir_thumbnail,
dirThumbnail,
scrollHorizontally,
animateGifs,
cropThumbnails,
@ -834,18 +831,18 @@ class DirectoryAdapter(
)
}
dir_pin.beVisibleIf(pinnedFolders.contains(directory.path))
dir_location.beVisibleIf(directory.location != LOCATION_INTERNAL)
if (dir_location.isVisible()) {
dir_location.setImageResource(if (directory.location == LOCATION_SD) R.drawable.ic_sd_card_vector else R.drawable.ic_usb_vector)
dirPin.beVisibleIf(pinnedFolders.contains(directory.path))
dirLocation.beVisibleIf(directory.location != LOCATION_INTERNAL)
if (dirLocation.isVisible()) {
dirLocation.setImageResource(if (directory.location == LOCATION_SD) com.simplemobiletools.commons.R.drawable.ic_sd_card_vector else com.simplemobiletools.commons.R.drawable.ic_usb_vector)
}
photo_cnt.text = directory.subfoldersMediaCount.toString()
photo_cnt.beVisibleIf(showMediaCount == FOLDER_MEDIA_CNT_LINE)
photoCnt.text = directory.subfoldersMediaCount.toString()
photoCnt.beVisibleIf(showMediaCount == FOLDER_MEDIA_CNT_LINE)
if (limitFolderTitle) {
dir_name.setSingleLine()
dir_name.ellipsize = TextUtils.TruncateAt.MIDDLE
dirName.setSingleLine()
dirName.ellipsize = TextUtils.TruncateAt.MIDDLE
}
var nameCount = directory.name
@ -859,26 +856,26 @@ class DirectoryAdapter(
}
}
dir_name.text = nameCount
dirName.text = nameCount
if (isListViewType || folderStyle == FOLDER_STYLE_ROUNDED_CORNERS) {
photo_cnt.setTextColor(textColor)
dir_name.setTextColor(textColor)
dir_location.applyColorFilter(textColor)
photoCnt.setTextColor(textColor)
dirName.setTextColor(textColor)
dirLocation.applyColorFilter(textColor)
}
if (isListViewType) {
dir_path.setTextColor(textColor)
dir_pin.applyColorFilter(textColor)
dir_location.applyColorFilter(textColor)
dir_drag_handle.beVisibleIf(isDragAndDropping)
dirPath?.setTextColor(textColor)
dirPin.applyColorFilter(textColor)
dirLocation.applyColorFilter(textColor)
dirDragHandle.beVisibleIf(isDragAndDropping)
} else {
dir_drag_handle_wrapper.beVisibleIf(isDragAndDropping)
dirDragHandleWrapper?.beVisibleIf(isDragAndDropping)
}
if (isDragAndDropping) {
dir_drag_handle.applyColorFilter(textColor)
dir_drag_handle.setOnTouchListener { v, event ->
dirDragHandle.applyColorFilter(textColor)
dirDragHandle.setOnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
startReorderDragListener?.requestDrag(holder)
}
@ -911,4 +908,12 @@ class DirectoryAdapter(
}
override fun onChange(position: Int) = dirs.getOrNull(position)?.getBubbleText(directorySorting, activity, dateFormat, timeFormat) ?: ""
private fun bindItem(view: View): DirectoryItemBinding {
return when {
isListViewType -> DirectoryItemListBinding.bind(view).toItemBinding()
folderStyle == FOLDER_STYLE_SQUARE -> DirectoryItemGridSquareBinding.bind(view).toItemBinding()
else -> DirectoryItemGridRoundedCornersBinding.bind(view).toItemBinding()
}
}
}

View file

@ -0,0 +1,75 @@
package com.simplemobiletools.gallery.pro.adapters
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import com.simplemobiletools.commons.views.MySquareImageView
import com.simplemobiletools.gallery.pro.databinding.DirectoryItemGridRoundedCornersBinding
import com.simplemobiletools.gallery.pro.databinding.DirectoryItemGridSquareBinding
import com.simplemobiletools.gallery.pro.databinding.DirectoryItemListBinding
interface DirectoryItemBinding {
val root: ViewGroup
val dirThumbnail: MySquareImageView
val dirPath: TextView?
val dirCheck: ImageView
val dirHolder: ViewGroup
val photoCnt: TextView
val dirName: TextView
val dirLock: ImageView
val dirPin: ImageView
val dirLocation: ImageView
val dirDragHandle: ImageView
val dirDragHandleWrapper: ViewGroup?
}
class ListDirectoryItemBinding(val binding: DirectoryItemListBinding) : DirectoryItemBinding {
override val root: ViewGroup = binding.root
override val dirThumbnail: MySquareImageView = binding.dirThumbnail
override val dirPath: TextView = binding.dirPath
override val dirCheck: ImageView = binding.dirCheck
override val dirHolder: ViewGroup = binding.dirHolder
override val photoCnt: TextView = binding.photoCnt
override val dirName: TextView = binding.dirName
override val dirLock: ImageView = binding.dirLock
override val dirPin: ImageView = binding.dirPin
override val dirLocation: ImageView = binding.dirLocation
override val dirDragHandle: ImageView = binding.dirDragHandle
override val dirDragHandleWrapper: ViewGroup? = null
}
fun DirectoryItemListBinding.toItemBinding() = ListDirectoryItemBinding(this)
class GridDirectoryItemSquareBinding(val binding: DirectoryItemGridSquareBinding) : DirectoryItemBinding {
override val root: ViewGroup = binding.root
override val dirThumbnail: MySquareImageView = binding.dirThumbnail
override val dirPath: TextView? = null
override val dirCheck: ImageView = binding.dirCheck
override val dirHolder: ViewGroup = binding.dirHolder
override val photoCnt: TextView = binding.photoCnt
override val dirName: TextView = binding.dirName
override val dirLock: ImageView = binding.dirLock
override val dirPin: ImageView = binding.dirPin
override val dirLocation: ImageView = binding.dirLocation
override val dirDragHandle: ImageView = binding.dirDragHandle
override val dirDragHandleWrapper: ViewGroup = binding.dirDragHandleWrapper
}
fun DirectoryItemGridSquareBinding.toItemBinding() = GridDirectoryItemSquareBinding(this)
class GridDirectoryItemRoundedCornersBinding(val binding: DirectoryItemGridRoundedCornersBinding) : DirectoryItemBinding {
override val root: ViewGroup = binding.root
override val dirThumbnail: MySquareImageView = binding.dirThumbnail
override val dirPath: TextView? = null
override val dirCheck: ImageView = binding.dirCheck
override val dirHolder: ViewGroup = binding.dirHolder
override val photoCnt: TextView = binding.photoCnt
override val dirName: TextView = binding.dirName
override val dirLock: ImageView = binding.dirLock
override val dirPin: ImageView = binding.dirPin
override val dirLocation: ImageView = binding.dirLocation
override val dirDragHandle: ImageView = binding.dirDragHandle
override val dirDragHandleWrapper: ViewGroup = binding.dirDragHandleWrapper
}
fun DirectoryItemGridRoundedCornersBinding.toItemBinding() = GridDirectoryItemRoundedCornersBinding(this)

View file

@ -6,8 +6,8 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.EditorFilterItemBinding
import com.simplemobiletools.gallery.pro.models.FilterItem
import kotlinx.android.synthetic.main.editor_filter_item.view.*
class FiltersAdapter(val context: Context, val filterItems: ArrayList<FilterItem>, val itemClick: (Int) -> Unit) :
RecyclerView.Adapter<FiltersAdapter.ViewHolder>() {
@ -20,8 +20,8 @@ class FiltersAdapter(val context: Context, val filterItems: ArrayList<FilterItem
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.editor_filter_item, parent, false)
return ViewHolder(view)
val binding = EditorFilterItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun getItemCount() = filterItems.size
@ -37,18 +37,18 @@ class FiltersAdapter(val context: Context, val filterItems: ArrayList<FilterItem
}
}
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
inner class ViewHolder(private val binding: EditorFilterItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun bindView(filterItem: FilterItem): View {
itemView.apply {
editor_filter_item_label.text = filterItem.filter.name
editor_filter_item_thumbnail.setImageBitmap(filterItem.bitmap)
editor_filter_item_thumbnail.background = if (getCurrentFilter() == filterItem) {
binding.apply {
editorFilterItemLabel.text = filterItem.filter.name
editorFilterItemThumbnail.setImageBitmap(filterItem.bitmap)
editorFilterItemThumbnail.background = if (getCurrentFilter() == filterItem) {
strokeBackground
} else {
null
}
setOnClickListener {
root.setOnClickListener {
setCurrentFilter(adapterPosition)
}
}

View file

@ -9,9 +9,8 @@ import com.simplemobiletools.commons.extensions.getProperTextColor
import com.simplemobiletools.commons.extensions.setupViewBackground
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.ItemManageFolderBinding
import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.item_manage_folder.view.*
class ManageFoldersAdapter(
activity: BaseSimpleActivity, var folders: ArrayList<String>, val isShowingExcludedFolders: Boolean, val listener: RefreshRecyclerViewListener?,
@ -24,13 +23,13 @@ class ManageFoldersAdapter(
setupDragListener(true)
}
override fun getActionMenuId() = R.menu.cab_remove_only
override fun getActionMenuId() = com.simplemobiletools.commons.R.menu.cab_remove_only
override fun prepareActionMode(menu: Menu) {}
override fun actionItemPressed(id: Int) {
when (id) {
R.id.cab_remove -> removeSelection()
com.simplemobiletools.commons.R.id.cab_remove -> removeSelection()
}
}
@ -46,7 +45,9 @@ class ManageFoldersAdapter(
override fun onActionModeDestroyed() {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_folder, parent)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return createViewHolder(ItemManageFolderBinding.inflate(layoutInflater, parent, false).root)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val folder = folders[position]
@ -61,21 +62,21 @@ class ManageFoldersAdapter(
private fun getSelectedItems() = folders.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<String>
private fun setupView(view: View, folder: String) {
view.apply {
setupViewBackground(activity)
manage_folder_holder?.isSelected = selectedKeys.contains(folder.hashCode())
manage_folder_title.apply {
ItemManageFolderBinding.bind(view).apply {
root.setupViewBackground(activity)
manageFolderHolder.isSelected = selectedKeys.contains(folder.hashCode())
manageFolderTitle.apply {
text = folder
setTextColor(context.getProperTextColor())
}
overflow_menu_icon.drawable.apply {
overflowMenuIcon.drawable.apply {
mutate()
setTint(activity.getProperTextColor())
}
overflow_menu_icon.setOnClickListener {
showPopupMenu(overflow_menu_anchor, folder)
overflowMenuIcon.setOnClickListener {
showPopupMenu(overflowMenuAnchor, folder)
}
}
}
@ -90,7 +91,7 @@ class ManageFoldersAdapter(
setOnMenuItemClickListener { item ->
val eventTypeId = folder.hashCode()
when (item.itemId) {
R.id.cab_remove -> {
com.simplemobiletools.commons.R.id.cab_remove -> {
executeItemMenuOperation(eventTypeId) {
removeSelection()
}

View file

@ -11,8 +11,8 @@ import com.simplemobiletools.commons.extensions.setupViewBackground
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.ItemManageFolderBinding
import com.simplemobiletools.gallery.pro.extensions.removeNoMedia
import kotlinx.android.synthetic.main.item_manage_folder.view.*
class ManageHiddenFoldersAdapter(
activity: BaseSimpleActivity, var folders: ArrayList<String>, val listener: RefreshRecyclerViewListener?,
@ -45,7 +45,9 @@ class ManageHiddenFoldersAdapter(
override fun onActionModeDestroyed() {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_folder, parent)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return createViewHolder(ItemManageFolderBinding.inflate(layoutInflater, parent, false).root)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val folder = folders[position]
@ -60,10 +62,10 @@ class ManageHiddenFoldersAdapter(
private fun getSelectedItems() = folders.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<String>
private fun setupView(view: View, folder: String) {
view.apply {
setupViewBackground(activity)
manage_folder_holder?.isSelected = selectedKeys.contains(folder.hashCode())
manage_folder_title.apply {
ItemManageFolderBinding.bind(view).apply {
root.setupViewBackground(activity)
manageFolderHolder.isSelected = selectedKeys.contains(folder.hashCode())
manageFolderTitle.apply {
text = folder
setTextColor(context.getProperTextColor())
}

View file

@ -10,6 +10,7 @@ import android.view.Menu
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.view.allViews
import com.bumptech.glide.Glide
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import com.simplemobiletools.commons.activities.BaseSimpleActivity
@ -23,6 +24,7 @@ import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.ViewPagerActivity
import com.simplemobiletools.gallery.pro.databinding.*
import com.simplemobiletools.gallery.pro.dialogs.DeleteWithRememberDialog
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.*
@ -30,9 +32,6 @@ import com.simplemobiletools.gallery.pro.interfaces.MediaOperationsListener
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection
import kotlinx.android.synthetic.main.photo_item_grid.view.file_type
import kotlinx.android.synthetic.main.thumbnail_section.view.thumbnail_section
import kotlinx.android.synthetic.main.video_item_grid.view.*
class MediaAdapter(
activity: BaseSimpleActivity, var media: ArrayList<ThumbnailItem>, val listener: MediaOperationsListener?, val isAGetIntent: Boolean,
@ -74,24 +73,24 @@ class MediaAdapter(
override fun getActionMenuId() = R.menu.cab_media
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layoutType = if (viewType == ITEM_SECTION) {
R.layout.thumbnail_section
val binding = if (viewType == ITEM_SECTION) {
ThumbnailSectionBinding.inflate(layoutInflater, parent, false)
} else {
if (isListViewType) {
if (viewType == ITEM_MEDIUM_PHOTO) {
R.layout.photo_item_list
PhotoItemListBinding.inflate(layoutInflater, parent, false)
} else {
R.layout.video_item_list
VideoItemListBinding.inflate(layoutInflater, parent, false)
}
} else {
if (viewType == ITEM_MEDIUM_PHOTO) {
R.layout.photo_item_grid
PhotoItemGridBinding.inflate(layoutInflater, parent, false)
} else {
R.layout.video_item_grid
VideoItemGridBinding.inflate(layoutInflater, parent, false)
}
}
}
return createViewHolder(layoutType, parent)
return createViewHolder(binding.root)
}
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
@ -196,8 +195,8 @@ class MediaAdapter(
super.onViewRecycled(holder)
if (!activity.isDestroyed) {
val itemView = holder.itemView
visibleItemPaths.remove(itemView.medium_name?.tag)
val tmb = itemView.medium_thumbnail
visibleItemPaths.remove(itemView.allViews.firstOrNull { it.id == R.id.medium_name }?.tag)
val tmb = itemView.allViews.firstOrNull { it.id == R.id.medium_thumbnail }
if (tmb != null) {
Glide.with(activity).clear(tmb)
}
@ -242,7 +241,7 @@ class MediaAdapter(
val isSDOrOtgRootFolder = activity.isAStorageRootFolder(firstPath.getParentPath()) && !firstPath.startsWith(activity.internalStoragePath)
if (isRPlus() && isSDOrOtgRootFolder && !isExternalStorageManager()) {
activity.toast(R.string.rename_in_sd_card_system_restriction, Toast.LENGTH_LONG)
activity.toast(com.simplemobiletools.commons.R.string.rename_in_sd_card_system_restriction, Toast.LENGTH_LONG)
finishActMode()
return
}
@ -354,7 +353,7 @@ class MediaAdapter(
private fun handleRotate(paths: List<String>, degrees: Int) {
var fileCnt = paths.size
rotatedImagePaths.clear()
activity.toast(R.string.saving)
activity.toast(com.simplemobiletools.commons.R.string.saving)
ensureBackgroundThread {
paths.forEach {
rotatedImagePaths.add(it)
@ -406,7 +405,7 @@ class MediaAdapter(
}.toMutableList() as ArrayList
if (!isCopyOperation && paths.any { it.startsWith(recycleBinPath) }) {
activity.toast(R.string.moving_recycle_bin_items_disabled, Toast.LENGTH_LONG)
activity.toast(com.simplemobiletools.commons.R.string.moving_recycle_bin_items_disabled, Toast.LENGTH_LONG)
}
if (fileDirItems.isEmpty()) {
@ -500,13 +499,13 @@ class MediaAdapter(
fileDirItems.add(curFileDirItem)
}
val fileSize = fileDirItems.sumByLong { it.getProperSize(activity, countHidden = true) }.formatSize()
val deleteItemsString = resources.getQuantityString(R.plurals.delete_items, itemsCnt, itemsCnt)
val deleteItemsString = resources.getQuantityString(com.simplemobiletools.commons.R.plurals.delete_items, itemsCnt, itemsCnt)
"$deleteItemsString ($fileSize)"
}
val isRecycleBin = firstPath.startsWith(activity.recycleBinPath)
val baseString =
if (config.useRecycleBin && !config.tempSkipRecycleBin && !isRecycleBin) R.string.move_to_recycle_bin_confirmation else R.string.deletion_confirmation
if (config.useRecycleBin && !config.tempSkipRecycleBin && !isRecycleBin) com.simplemobiletools.commons.R.string.move_to_recycle_bin_confirmation else com.simplemobiletools.commons.R.string.deletion_confirmation
val question = String.format(resources.getString(baseString), itemsAndSize)
val showSkipRecycleBinOption = config.useRecycleBin && !isRecycleBin
@ -607,62 +606,62 @@ class MediaAdapter(
private fun setupThumbnail(view: View, medium: Medium) {
val isSelected = selectedKeys.contains(medium.path.hashCode())
view.apply {
bindItem(view, medium).apply {
val padding = if (config.thumbnailSpacing <= 1) {
config.thumbnailSpacing
} else {
0
}
media_item_holder.setPadding(padding, padding, padding, padding)
mediaItemHolder.setPadding(padding, padding, padding, padding)
favorite.beVisibleIf(medium.isFavorite && config.markFavoriteItems)
play_portrait_outline?.beVisibleIf(medium.isVideo() || medium.isPortrait())
playPortraitOutline?.beVisibleIf(medium.isVideo() || medium.isPortrait())
if (medium.isVideo()) {
play_portrait_outline?.setImageResource(R.drawable.ic_play_outline_vector)
play_portrait_outline?.beVisible()
playPortraitOutline?.setImageResource(com.simplemobiletools.commons.R.drawable.ic_play_outline_vector)
playPortraitOutline?.beVisible()
} else if (medium.isPortrait()) {
play_portrait_outline?.setImageResource(R.drawable.ic_portrait_photo_vector)
play_portrait_outline?.beVisibleIf(showFileTypes)
playPortraitOutline?.setImageResource(R.drawable.ic_portrait_photo_vector)
playPortraitOutline?.beVisibleIf(showFileTypes)
}
if (showFileTypes && (medium.isGIF() || medium.isRaw() || medium.isSVG())) {
file_type.setText(
fileType?.setText(
when (medium.type) {
TYPE_GIFS -> R.string.gif
TYPE_RAWS -> R.string.raw
else -> R.string.svg
}
)
file_type.beVisible()
fileType?.beVisible()
} else {
file_type?.beGone()
fileType?.beGone()
}
medium_name.beVisibleIf(displayFilenames || isListViewType)
medium_name.text = medium.name
medium_name.tag = medium.path
mediumName.beVisibleIf(displayFilenames || isListViewType)
mediumName.text = medium.name
mediumName.tag = medium.path
val showVideoDuration = medium.isVideo() && config.showThumbnailVideoDuration
if (showVideoDuration) {
video_duration?.text = medium.videoDuration.getFormattedDuration()
videoDuration?.text = medium.videoDuration.getFormattedDuration()
}
video_duration?.beVisibleIf(showVideoDuration)
videoDuration?.beVisibleIf(showVideoDuration)
medium_check?.beVisibleIf(isSelected)
mediumCheck.beVisibleIf(isSelected)
if (isSelected) {
medium_check?.background?.applyColorFilter(properPrimaryColor)
medium_check.applyColorFilter(contrastColor)
mediumCheck.background?.applyColorFilter(properPrimaryColor)
mediumCheck.applyColorFilter(contrastColor)
}
if (isListViewType) {
media_item_holder.isSelected = isSelected
mediaItemHolder.isSelected = isSelected
}
var path = medium.path
if (hasOTGConnected && context.isPathOnOTG(path)) {
path = path.getOTGPublicPath(context)
if (hasOTGConnected && root.context.isPathOnOTG(path)) {
path = path.getOTGPublicPath(root.context)
}
val roundedCorners = when {
@ -673,16 +672,16 @@ class MediaAdapter(
if (loadImageInstantly) {
activity.loadImage(
medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, medium.getKey(), rotatedImagePaths
medium.type, path, mediumThumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, medium.getKey(), rotatedImagePaths
)
} else {
medium_thumbnail.setImageDrawable(null)
medium_thumbnail.isHorizontalScrolling = scrollHorizontally
mediumThumbnail.setImageDrawable(null)
mediumThumbnail.isHorizontalScrolling = scrollHorizontally
delayHandler.postDelayed({
val isVisible = visibleItemPaths.contains(medium.path)
if (isVisible) {
activity.loadImage(
medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners,
medium.type, path, mediumThumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners,
medium.getKey(), rotatedImagePaths
)
}
@ -690,16 +689,16 @@ class MediaAdapter(
}
if (isListViewType) {
medium_name.setTextColor(textColor)
play_portrait_outline?.applyColorFilter(textColor)
mediumName.setTextColor(textColor)
playPortraitOutline?.applyColorFilter(textColor)
}
}
}
private fun setupSection(view: View, section: ThumbnailSection) {
view.apply {
thumbnail_section.text = section.title
thumbnail_section.setTextColor(textColor)
ThumbnailSectionBinding.bind(view).apply {
thumbnailSection.text = section.title
thumbnailSection.setTextColor(textColor)
}
}
@ -711,4 +710,20 @@ class MediaAdapter(
return (media[realIndex] as? Medium)?.getBubbleText(sorting, activity, dateFormat, timeFormat) ?: ""
}
private fun bindItem(view: View, medium: Medium): MediaItemBinding {
return if (isListViewType) {
if (!medium.isVideo() && !medium.isPortrait()) {
PhotoItemListBinding.bind(view).toMediaItemBinding()
} else {
VideoItemListBinding.bind(view).toMediaItemBinding()
}
} else {
if (!medium.isVideo() && !medium.isPortrait()) {
PhotoItemGridBinding.bind(view).toMediaItemBinding()
} else {
VideoItemGridBinding.bind(view).toMediaItemBinding()
}
}
}
}

View file

@ -0,0 +1,78 @@
package com.simplemobiletools.gallery.pro.adapters
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import com.simplemobiletools.commons.views.MySquareImageView
import com.simplemobiletools.gallery.pro.databinding.PhotoItemGridBinding
import com.simplemobiletools.gallery.pro.databinding.PhotoItemListBinding
import com.simplemobiletools.gallery.pro.databinding.VideoItemGridBinding
import com.simplemobiletools.gallery.pro.databinding.VideoItemListBinding
interface MediaItemBinding {
val root: ViewGroup
val mediaItemHolder: ViewGroup
val favorite: ImageView
val playPortraitOutline: ImageView?
val fileType: TextView?
val mediumName: TextView
val videoDuration: TextView?
val mediumCheck: ImageView
val mediumThumbnail: MySquareImageView
}
class PhotoListMediaItemBinding(val binding: PhotoItemListBinding) : MediaItemBinding {
override val root: ViewGroup = binding.root
override val mediaItemHolder: ViewGroup = binding.mediaItemHolder
override val favorite: ImageView = binding.favorite
override val playPortraitOutline: ImageView? = null
override val fileType: TextView = binding.fileType
override val mediumName: TextView = binding.mediumName
override val videoDuration: TextView? = null
override val mediumCheck: ImageView = binding.mediumCheck
override val mediumThumbnail: MySquareImageView = binding.mediumThumbnail
}
fun PhotoItemListBinding.toMediaItemBinding() = PhotoListMediaItemBinding(this)
class PhotoGridMediaItemBinding(val binding: PhotoItemGridBinding) : MediaItemBinding {
override val root: ViewGroup = binding.root
override val mediaItemHolder: ViewGroup = binding.mediaItemHolder
override val favorite: ImageView = binding.favorite
override val playPortraitOutline: ImageView? = null
override val fileType: TextView = binding.fileType
override val mediumName: TextView = binding.mediumName
override val videoDuration: TextView? = null
override val mediumCheck: ImageView = binding.mediumCheck
override val mediumThumbnail: MySquareImageView = binding.mediumThumbnail
}
fun PhotoItemGridBinding.toMediaItemBinding() = PhotoGridMediaItemBinding(this)
class VideoListMediaItemBinding(val binding: VideoItemListBinding) : MediaItemBinding {
override val root: ViewGroup = binding.root
override val mediaItemHolder: ViewGroup = binding.mediaItemHolder
override val favorite: ImageView = binding.favorite
override val playPortraitOutline: ImageView? = binding.playPortraitOutline
override val fileType: TextView? = null
override val mediumName: TextView = binding.mediumName
override val videoDuration: TextView = binding.videoDuration
override val mediumCheck: ImageView = binding.mediumCheck
override val mediumThumbnail: MySquareImageView = binding.mediumThumbnail
}
fun VideoItemListBinding.toMediaItemBinding() = VideoListMediaItemBinding(this)
class VideoGridMediaItemBinding(val binding: VideoItemGridBinding) : MediaItemBinding {
override val root: ViewGroup = binding.root
override val mediaItemHolder: ViewGroup = binding.mediaItemHolder
override val favorite: ImageView = binding.favorite
override val playPortraitOutline: ImageView = binding.playPortraitOutline
override val fileType: TextView? = null
override val mediumName: TextView = binding.mediumName
override val videoDuration: TextView = binding.videoDuration
override val mediumCheck: ImageView = binding.mediumCheck
override val mediumThumbnail: MySquareImageView = binding.mediumThumbnail
}
fun VideoItemGridBinding.toMediaItemBinding() = VideoGridMediaItemBinding(this)

View file

@ -12,7 +12,7 @@ import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.extensions.getFileKey
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.portrait_photo_item.view.*
import com.simplemobiletools.gallery.pro.databinding.PortraitPhotoItemBinding
class PortraitPhotosAdapter(val context: Context, val photos: ArrayList<String>, val sideElementWidth: Int, val itemClick: (Int, Int) -> Unit) :
RecyclerView.Adapter<PortraitPhotosAdapter.ViewHolder>() {
@ -27,8 +27,8 @@ class PortraitPhotosAdapter(val context: Context, val photos: ArrayList<String>,
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.portrait_photo_item, parent, false)
return ViewHolder(view)
val binding = PortraitPhotoItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding.root)
}
override fun getItemCount() = photos.size
@ -46,14 +46,14 @@ class PortraitPhotosAdapter(val context: Context, val photos: ArrayList<String>,
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bindView(photo: String, position: Int): View {
itemView.apply {
portrait_photo_item_thumbnail.layoutParams.width = if (position == 0 || position == photos.lastIndex) {
PortraitPhotoItemBinding.bind(itemView).apply {
portraitPhotoItemThumbnail.layoutParams.width = if (position == 0 || position == photos.lastIndex) {
sideElementWidth
} else {
itemWidth
}
portrait_photo_item_thumbnail.background = if (photo.isEmpty() || position != currentSelectionIndex) {
portraitPhotoItemThumbnail.background = if (photo.isEmpty() || position != currentSelectionIndex) {
null
} else {
strokeBackground
@ -68,17 +68,17 @@ class PortraitPhotosAdapter(val context: Context, val photos: ArrayList<String>,
.load(photo)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
.into(portrait_photo_item_thumbnail)
.into(portraitPhotoItemThumbnail)
if (photo.isNotEmpty()) {
isClickable = true
views[position] = this
setOnClickListener {
itemClick(position, x.toInt())
root.isClickable = true
views[position] = root
root.setOnClickListener {
itemClick(position, root.x.toInt())
setCurrentPhoto(position)
}
} else {
isClickable = false
root.isClickable = false
}
}
return itemView

View file

@ -13,7 +13,7 @@ class AllFilesPermissionDialog(
private var dialog: AlertDialog? = null
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_message, null)
val view = activity.layoutInflater.inflate(com.simplemobiletools.commons.R.layout.dialog_message, null)
view.findViewById<TextView>(R.id.message).text = message
activity.getAlertDialogBuilder().setPositiveButton(R.string.all_files) { dialog, which -> positivePressed() }

View file

@ -1,36 +1,34 @@
package com.simplemobiletools.gallery.pro.dialogs
import android.content.DialogInterface
import android.view.View
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogChangeFileThumbnailStyleBinding
import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.dialog_change_file_thumbnail_style.view.*
class ChangeFileThumbnailStyleDialog(val activity: BaseSimpleActivity) : DialogInterface.OnClickListener {
private var config = activity.config
private var view: View
private val binding: DialogChangeFileThumbnailStyleBinding
private var thumbnailSpacing = config.thumbnailSpacing
init {
view = activity.layoutInflater.inflate(R.layout.dialog_change_file_thumbnail_style, null).apply {
dialog_file_style_rounded_corners.isChecked = config.fileRoundedCorners
dialog_file_style_animate_gifs.isChecked = config.animateGifs
dialog_file_style_show_thumbnail_video_duration.isChecked = config.showThumbnailVideoDuration
dialog_file_style_show_thumbnail_file_types.isChecked = config.showThumbnailFileTypes
dialog_file_style_mark_favorite_items.isChecked = config.markFavoriteItems
binding = DialogChangeFileThumbnailStyleBinding.inflate(activity.layoutInflater).apply {
dialogFileStyleRoundedCorners.isChecked = config.fileRoundedCorners
dialogFileStyleAnimateGifs.isChecked = config.animateGifs
dialogFileStyleShowThumbnailVideoDuration.isChecked = config.showThumbnailVideoDuration
dialogFileStyleShowThumbnailFileTypes.isChecked = config.showThumbnailFileTypes
dialogFileStyleMarkFavoriteItems.isChecked = config.markFavoriteItems
dialog_file_style_rounded_corners_holder.setOnClickListener { dialog_file_style_rounded_corners.toggle() }
dialog_file_style_animate_gifs_holder.setOnClickListener { dialog_file_style_animate_gifs.toggle() }
dialog_file_style_show_thumbnail_video_duration_holder.setOnClickListener { dialog_file_style_show_thumbnail_video_duration.toggle() }
dialog_file_style_show_thumbnail_file_types_holder.setOnClickListener { dialog_file_style_show_thumbnail_file_types.toggle() }
dialog_file_style_mark_favorite_items_holder.setOnClickListener { dialog_file_style_mark_favorite_items.toggle() }
dialogFileStyleRoundedCornersHolder.setOnClickListener { dialogFileStyleRoundedCorners.toggle() }
dialogFileStyleAnimateGifsHolder.setOnClickListener { dialogFileStyleAnimateGifs.toggle() }
dialogFileStyleShowThumbnailVideoDurationHolder.setOnClickListener { dialogFileStyleShowThumbnailVideoDuration.toggle() }
dialogFileStyleShowThumbnailFileTypesHolder.setOnClickListener { dialogFileStyleShowThumbnailFileTypes.toggle() }
dialogFileStyleMarkFavoriteItemsHolder.setOnClickListener { dialogFileStyleMarkFavoriteItems.toggle() }
dialog_file_style_spacing_holder.setOnClickListener {
dialogFileStyleSpacingHolder.setOnClickListener {
val items = arrayListOf(
RadioItem(0, "0x"),
RadioItem(1, "1x"),
@ -52,23 +50,23 @@ class ChangeFileThumbnailStyleDialog(val activity: BaseSimpleActivity) : DialogI
updateThumbnailSpacingText()
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, this)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, this)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this)
activity.setupDialogStuff(binding.root, this)
}
}
override fun onClick(dialog: DialogInterface, which: Int) {
config.fileRoundedCorners = view.dialog_file_style_rounded_corners.isChecked
config.animateGifs = view.dialog_file_style_animate_gifs.isChecked
config.showThumbnailVideoDuration = view.dialog_file_style_show_thumbnail_video_duration.isChecked
config.showThumbnailFileTypes = view.dialog_file_style_show_thumbnail_file_types.isChecked
config.markFavoriteItems = view.dialog_file_style_mark_favorite_items.isChecked
config.fileRoundedCorners = binding.dialogFileStyleRoundedCorners.isChecked
config.animateGifs = binding.dialogFileStyleAnimateGifs.isChecked
config.showThumbnailVideoDuration = binding.dialogFileStyleShowThumbnailVideoDuration.isChecked
config.showThumbnailFileTypes = binding.dialogFileStyleShowThumbnailFileTypes.isChecked
config.markFavoriteItems = binding.dialogFileStyleMarkFavoriteItems.isChecked
config.thumbnailSpacing = thumbnailSpacing
}
private fun updateThumbnailSpacingText() {
view.dialog_file_style_spacing.text = "${thumbnailSpacing}x"
binding.dialogFileStyleSpacing.text = "${thumbnailSpacing}x"
}
}

View file

@ -9,23 +9,25 @@ import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.toItemBinding
import com.simplemobiletools.gallery.pro.databinding.DialogChangeFolderThumbnailStyleBinding
import com.simplemobiletools.gallery.pro.databinding.DirectoryItemGridRoundedCornersBinding
import com.simplemobiletools.gallery.pro.databinding.DirectoryItemGridSquareBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.*
import kotlinx.android.synthetic.main.dialog_change_folder_thumbnail_style.view.*
import kotlinx.android.synthetic.main.directory_item_grid_square.view.*
class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) : DialogInterface.OnClickListener {
private var config = activity.config
private var view = activity.layoutInflater.inflate(R.layout.dialog_change_folder_thumbnail_style, null).apply {
dialog_folder_limit_title.isChecked = config.limitFolderTitle
private val binding = DialogChangeFolderThumbnailStyleBinding.inflate(activity.layoutInflater).apply {
dialogFolderLimitTitle.isChecked = config.limitFolderTitle
}
init {
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, this)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, this)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this) {
activity.setupDialogStuff(binding.root, this) {
setupStyle()
setupMediaCount()
updateSample()
@ -34,29 +36,29 @@ class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val cal
}
private fun setupStyle() {
val styleRadio = view.dialog_radio_folder_style
val styleRadio = binding.dialogRadioFolderStyle
styleRadio.setOnCheckedChangeListener { group, checkedId ->
updateSample()
}
val styleBtn = when (config.folderStyle) {
FOLDER_STYLE_SQUARE -> styleRadio.dialog_radio_folder_square
else -> styleRadio.dialog_radio_folder_rounded_corners
FOLDER_STYLE_SQUARE -> binding.dialogRadioFolderSquare
else -> binding.dialogRadioFolderRoundedCorners
}
styleBtn.isChecked = true
}
private fun setupMediaCount() {
val countRadio = view.dialog_radio_folder_count_holder
val countRadio = binding.dialogRadioFolderCountHolder
countRadio.setOnCheckedChangeListener { group, checkedId ->
updateSample()
}
val countBtn = when (config.showFolderMediaCount) {
FOLDER_MEDIA_CNT_LINE -> countRadio.dialog_radio_folder_count_line
FOLDER_MEDIA_CNT_BRACKETS -> countRadio.dialog_radio_folder_count_brackets
else -> countRadio.dialog_radio_folder_count_none
FOLDER_MEDIA_CNT_LINE -> binding.dialogRadioFolderCountLine
FOLDER_MEDIA_CNT_BRACKETS -> binding.dialogRadioFolderCountBrackets
else -> binding.dialogRadioFolderCountNone
}
countBtn.isChecked = true
@ -65,30 +67,36 @@ class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val cal
private fun updateSample() {
val photoCount = 36
val folderName = "Camera"
view.apply {
val useRoundedCornersLayout = dialog_radio_folder_style.checkedRadioButtonId == R.id.dialog_radio_folder_rounded_corners
dialog_folder_sample_holder.removeAllViews()
binding.apply {
val useRoundedCornersLayout = binding.dialogRadioFolderStyle.checkedRadioButtonId == R.id.dialog_radio_folder_rounded_corners
binding.dialogFolderSampleHolder.removeAllViews()
val layout = if (useRoundedCornersLayout) R.layout.directory_item_grid_rounded_corners else R.layout.directory_item_grid_square
val sampleView = activity.layoutInflater.inflate(layout, null)
dialog_folder_sample_holder.addView(sampleView)
val sampleBinding = if (useRoundedCornersLayout) {
DirectoryItemGridRoundedCornersBinding.inflate(activity.layoutInflater).toItemBinding()
} else {
DirectoryItemGridSquareBinding.inflate(activity.layoutInflater).toItemBinding()
}
val sampleView = sampleBinding.root
binding.dialogFolderSampleHolder.addView(sampleView)
sampleView.layoutParams.width = activity.resources.getDimension(R.dimen.sample_thumbnail_size).toInt()
(sampleView.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.CENTER_HORIZONTAL)
when (dialog_radio_folder_count_holder.checkedRadioButtonId) {
when (binding.dialogRadioFolderCountHolder.checkedRadioButtonId) {
R.id.dialog_radio_folder_count_line -> {
dir_name.text = folderName
photo_cnt.text = photoCount.toString()
photo_cnt.beVisible()
sampleBinding.dirName.text = folderName
sampleBinding.photoCnt.text = photoCount.toString()
sampleBinding.photoCnt.beVisible()
}
R.id.dialog_radio_folder_count_brackets -> {
photo_cnt.beGone()
dir_name.text = "$folderName ($photoCount)"
sampleBinding.photoCnt.beGone()
sampleBinding.dirName.text = "$folderName ($photoCount)"
}
else -> {
dir_name.text = folderName
photo_cnt?.beGone()
sampleBinding.dirName.text = folderName
sampleBinding.photoCnt.beGone()
}
}
@ -98,23 +106,23 @@ class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val cal
.apply(options)
if (useRoundedCornersLayout) {
val cornerRadius = resources.getDimension(R.dimen.rounded_corner_radius_big).toInt()
val cornerRadius = root.resources.getDimension(com.simplemobiletools.commons.R.dimen.rounded_corner_radius_big).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
dir_name.setTextColor(activity.getProperTextColor())
photo_cnt.setTextColor(activity.getProperTextColor())
sampleBinding.dirName.setTextColor(activity.getProperTextColor())
sampleBinding.photoCnt.setTextColor(activity.getProperTextColor())
}
builder.into(dir_thumbnail)
builder.into(sampleBinding.dirThumbnail)
}
}
override fun onClick(dialog: DialogInterface, which: Int) {
val style = when (view.dialog_radio_folder_style.checkedRadioButtonId) {
val style = when (binding.dialogRadioFolderStyle.checkedRadioButtonId) {
R.id.dialog_radio_folder_square -> FOLDER_STYLE_SQUARE
else -> FOLDER_STYLE_ROUNDED_CORNERS
}
val count = when (view.dialog_radio_folder_count_holder.checkedRadioButtonId) {
val count = when (binding.dialogRadioFolderCountHolder.checkedRadioButtonId) {
R.id.dialog_radio_folder_count_line -> FOLDER_MEDIA_CNT_LINE
R.id.dialog_radio_folder_count_brackets -> FOLDER_MEDIA_CNT_BRACKETS
else -> FOLDER_MEDIA_CNT_NONE
@ -122,7 +130,7 @@ class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val cal
config.folderStyle = style
config.showFolderMediaCount = count
config.limitFolderTitle = view.dialog_folder_limit_title.isChecked
config.limitFolderTitle = binding.dialogFolderLimitTitle.isChecked
callback()
}
}

View file

@ -1,70 +1,66 @@
package com.simplemobiletools.gallery.pro.dialogs
import android.content.DialogInterface
import android.view.View
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogChangeGroupingBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.*
import kotlinx.android.synthetic.main.dialog_change_grouping.view.*
class ChangeGroupingDialog(val activity: BaseSimpleActivity, val path: String = "", val callback: () -> Unit) :
DialogInterface.OnClickListener {
private var currGrouping = 0
private var config = activity.config
private val pathToUse = if (path.isEmpty()) SHOW_ALL else path
private var view: View
private val binding: DialogChangeGroupingBinding
init {
currGrouping = config.getFolderGrouping(pathToUse)
view = activity.layoutInflater.inflate(R.layout.dialog_change_grouping, null).apply {
grouping_dialog_use_for_this_folder.isChecked = config.hasCustomGrouping(pathToUse)
grouping_dialog_radio_folder.beVisibleIf(path.isEmpty())
binding = DialogChangeGroupingBinding.inflate(activity.layoutInflater).apply {
groupingDialogUseForThisFolder.isChecked = config.hasCustomGrouping(pathToUse)
groupingDialogRadioFolder.beVisibleIf(path.isEmpty())
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, this)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, this)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this, R.string.group_by)
activity.setupDialogStuff(binding.root, this, R.string.group_by)
}
setupGroupRadio()
setupOrderRadio()
view.grouping_dialog_show_file_count.isChecked = currGrouping and GROUP_SHOW_FILE_COUNT != 0
binding.groupingDialogShowFileCount.isChecked = currGrouping and GROUP_SHOW_FILE_COUNT != 0
}
private fun setupGroupRadio() {
val groupingRadio = view.grouping_dialog_radio_grouping
val groupBtn = when {
currGrouping and GROUP_BY_NONE != 0 -> groupingRadio.grouping_dialog_radio_none
currGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 -> groupingRadio.grouping_dialog_radio_last_modified_daily
currGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 -> groupingRadio.grouping_dialog_radio_last_modified_monthly
currGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 -> groupingRadio.grouping_dialog_radio_date_taken_daily
currGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -> groupingRadio.grouping_dialog_radio_date_taken_monthly
currGrouping and GROUP_BY_FILE_TYPE != 0 -> groupingRadio.grouping_dialog_radio_file_type
currGrouping and GROUP_BY_EXTENSION != 0 -> groupingRadio.grouping_dialog_radio_extension
else -> groupingRadio.grouping_dialog_radio_folder
currGrouping and GROUP_BY_NONE != 0 -> binding.groupingDialogRadioNone
currGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 -> binding.groupingDialogRadioLastModifiedDaily
currGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 -> binding.groupingDialogRadioLastModifiedMonthly
currGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 -> binding.groupingDialogRadioDateTakenDaily
currGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -> binding.groupingDialogRadioDateTakenMonthly
currGrouping and GROUP_BY_FILE_TYPE != 0 -> binding.groupingDialogRadioFileType
currGrouping and GROUP_BY_EXTENSION != 0 -> binding.groupingDialogRadioExtension
else -> binding.groupingDialogRadioFolder
}
groupBtn.isChecked = true
}
private fun setupOrderRadio() {
val orderRadio = view.grouping_dialog_radio_order
var orderBtn = orderRadio.grouping_dialog_radio_ascending
var orderBtn = binding.groupingDialogRadioAscending
if (currGrouping and GROUP_DESCENDING != 0) {
orderBtn = orderRadio.grouping_dialog_radio_descending
orderBtn = binding.groupingDialogRadioDescending
}
orderBtn.isChecked = true
}
override fun onClick(dialog: DialogInterface, which: Int) {
val groupingRadio = view.grouping_dialog_radio_grouping
val groupingRadio = binding.groupingDialogRadioGrouping
var grouping = when (groupingRadio.checkedRadioButtonId) {
R.id.grouping_dialog_radio_none -> GROUP_BY_NONE
R.id.grouping_dialog_radio_last_modified_daily -> GROUP_BY_LAST_MODIFIED_DAILY
@ -76,15 +72,15 @@ class ChangeGroupingDialog(val activity: BaseSimpleActivity, val path: String =
else -> GROUP_BY_FOLDER
}
if (view.grouping_dialog_radio_order.checkedRadioButtonId == R.id.grouping_dialog_radio_descending) {
if (binding.groupingDialogRadioGrouping.checkedRadioButtonId == R.id.grouping_dialog_radio_descending) {
grouping = grouping or GROUP_DESCENDING
}
if (view.grouping_dialog_show_file_count.isChecked) {
if (binding.groupingDialogShowFileCount.isChecked) {
grouping = grouping or GROUP_SHOW_FILE_COUNT
}
if (view.grouping_dialog_use_for_this_folder.isChecked) {
if (binding.groupingDialogUseForThisFolder.isChecked) {
config.saveFolderGrouping(pathToUse, grouping)
} else {
config.removeFolderGrouping(pathToUse)

View file

@ -1,14 +1,13 @@
package com.simplemobiletools.gallery.pro.dialogs
import android.content.DialogInterface
import android.view.View
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogChangeSortingBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
class ChangeSortingDialog(
val activity: BaseSimpleActivity, val isDirectorySorting: Boolean, val showFolderCheckbox: Boolean,
@ -18,27 +17,27 @@ class ChangeSortingDialog(
private var currSorting = 0
private var config = activity.config
private var pathToUse = if (!isDirectorySorting && path.isEmpty()) SHOW_ALL else path
private var view: View
private val binding: DialogChangeSortingBinding
init {
currSorting = if (isDirectorySorting) config.directorySorting else config.getFolderSorting(pathToUse)
view = activity.layoutInflater.inflate(R.layout.dialog_change_sorting, null).apply {
use_for_this_folder_divider.beVisibleIf(showFolderCheckbox || (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
binding = DialogChangeSortingBinding.inflate(activity.layoutInflater).apply {
useForThisFolderDivider.beVisibleIf(showFolderCheckbox || (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
sorting_dialog_numeric_sorting.beVisibleIf(showFolderCheckbox && (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
sorting_dialog_numeric_sorting.isChecked = currSorting and SORT_USE_NUMERIC_VALUE != 0
sortingDialogNumericSorting.beVisibleIf(showFolderCheckbox && (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
sortingDialogNumericSorting.isChecked = currSorting and SORT_USE_NUMERIC_VALUE != 0
sorting_dialog_use_for_this_folder.beVisibleIf(showFolderCheckbox)
sorting_dialog_use_for_this_folder.isChecked = config.hasCustomSorting(pathToUse)
sorting_dialog_bottom_note.beVisibleIf(!isDirectorySorting)
sorting_dialog_radio_custom.beVisibleIf(isDirectorySorting)
sortingDialogUseForThisFolder.beVisibleIf(showFolderCheckbox)
sortingDialogUseForThisFolder.isChecked = config.hasCustomSorting(pathToUse)
sortingDialogBottomNote.beVisibleIf(!isDirectorySorting)
sortingDialogRadioCustom.beVisibleIf(isDirectorySorting)
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, this)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, this)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this, R.string.sort_by)
activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.sort_by)
}
setupSortRadio()
@ -46,41 +45,40 @@ class ChangeSortingDialog(
}
private fun setupSortRadio() {
val sortingRadio = view.sorting_dialog_radio_sorting
val sortingRadio = binding.sortingDialogRadioSorting
sortingRadio.setOnCheckedChangeListener { group, checkedId ->
val isSortingByNameOrPath = checkedId == sortingRadio.sorting_dialog_radio_name.id || checkedId == sortingRadio.sorting_dialog_radio_path.id
view.sorting_dialog_numeric_sorting.beVisibleIf(isSortingByNameOrPath)
view.use_for_this_folder_divider.beVisibleIf(view.sorting_dialog_numeric_sorting.isVisible() || view.sorting_dialog_use_for_this_folder.isVisible())
val isSortingByNameOrPath = checkedId == binding.sortingDialogRadioName.id || checkedId == binding.sortingDialogRadioPath.id
binding.sortingDialogNumericSorting.beVisibleIf(isSortingByNameOrPath)
binding.useForThisFolderDivider.beVisibleIf(binding.sortingDialogNumericSorting.isVisible() || binding.sortingDialogUseForThisFolder.isVisible())
val hideSortOrder = checkedId == sortingRadio.sorting_dialog_radio_custom.id || checkedId == sortingRadio.sorting_dialog_radio_random.id
view.sorting_dialog_radio_order.beGoneIf(hideSortOrder)
view.sorting_dialog_order_divider.beGoneIf(hideSortOrder)
val hideSortOrder = checkedId == binding.sortingDialogRadioCustom.id || checkedId == binding.sortingDialogRadioRandom.id
binding.sortingDialogRadioOrder.beGoneIf(hideSortOrder)
binding.sortingDialogOrderDivider.beGoneIf(hideSortOrder)
}
val sortBtn = when {
currSorting and SORT_BY_PATH != 0 -> sortingRadio.sorting_dialog_radio_path
currSorting and SORT_BY_SIZE != 0 -> sortingRadio.sorting_dialog_radio_size
currSorting and SORT_BY_DATE_MODIFIED != 0 -> sortingRadio.sorting_dialog_radio_last_modified
currSorting and SORT_BY_DATE_TAKEN != 0 -> sortingRadio.sorting_dialog_radio_date_taken
currSorting and SORT_BY_RANDOM != 0 -> sortingRadio.sorting_dialog_radio_random
currSorting and SORT_BY_CUSTOM != 0 -> sortingRadio.sorting_dialog_radio_custom
else -> sortingRadio.sorting_dialog_radio_name
currSorting and SORT_BY_PATH != 0 -> binding.sortingDialogRadioPath
currSorting and SORT_BY_SIZE != 0 -> binding.sortingDialogRadioSize
currSorting and SORT_BY_DATE_MODIFIED != 0 -> binding.sortingDialogRadioLastModified
currSorting and SORT_BY_DATE_TAKEN != 0 -> binding.sortingDialogRadioDateTaken
currSorting and SORT_BY_RANDOM != 0 -> binding.sortingDialogRadioRandom
currSorting and SORT_BY_CUSTOM != 0 -> binding.sortingDialogRadioCustom
else -> binding.sortingDialogRadioName
}
sortBtn.isChecked = true
}
private fun setupOrderRadio() {
val orderRadio = view.sorting_dialog_radio_order
var orderBtn = orderRadio.sorting_dialog_radio_ascending
var orderBtn = binding.sortingDialogRadioAscending
if (currSorting and SORT_DESCENDING != 0) {
orderBtn = orderRadio.sorting_dialog_radio_descending
orderBtn = binding.sortingDialogRadioDescending
}
orderBtn.isChecked = true
}
override fun onClick(dialog: DialogInterface, which: Int) {
val sortingRadio = view.sorting_dialog_radio_sorting
val sortingRadio = binding.sortingDialogRadioSorting
var sorting = when (sortingRadio.checkedRadioButtonId) {
R.id.sorting_dialog_radio_name -> SORT_BY_NAME
R.id.sorting_dialog_radio_path -> SORT_BY_PATH
@ -91,18 +89,18 @@ class ChangeSortingDialog(
else -> SORT_BY_DATE_TAKEN
}
if (view.sorting_dialog_radio_order.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) {
if (binding.sortingDialogRadioOrder.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) {
sorting = sorting or SORT_DESCENDING
}
if (view.sorting_dialog_numeric_sorting.isChecked) {
if (binding.sortingDialogNumericSorting.isChecked) {
sorting = sorting or SORT_USE_NUMERIC_VALUE
}
if (isDirectorySorting) {
config.directorySorting = sorting
} else {
if (view.sorting_dialog_use_for_this_folder.isChecked) {
if (binding.sortingDialogUseForThisFolder.isChecked) {
config.saveCustomSorting(pathToUse, sorting)
} else {
config.removeCustomSorting(pathToUse)

View file

@ -1,61 +1,59 @@
package com.simplemobiletools.gallery.pro.dialogs
import android.view.View
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogChangeViewTypeBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
import kotlinx.android.synthetic.main.dialog_change_view_type.view.*
class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView: Boolean, val path: String = "", val callback: () -> Unit) {
private var view: View
private val binding = DialogChangeViewTypeBinding.inflate(activity.layoutInflater)
private var config = activity.config
private var pathToUse = if (path.isEmpty()) SHOW_ALL else path
init {
view = activity.layoutInflater.inflate(R.layout.dialog_change_view_type, null).apply {
binding.apply {
val viewToCheck = if (fromFoldersView) {
if (config.viewTypeFolders == VIEW_TYPE_GRID) {
change_view_type_dialog_radio_grid.id
changeViewTypeDialogRadioGrid.id
} else {
change_view_type_dialog_radio_list.id
changeViewTypeDialogRadioList.id
}
} else {
val currViewType = config.getFolderViewType(pathToUse)
if (currViewType == VIEW_TYPE_GRID) {
change_view_type_dialog_radio_grid.id
changeViewTypeDialogRadioGrid.id
} else {
change_view_type_dialog_radio_list.id
changeViewTypeDialogRadioList.id
}
}
change_view_type_dialog_radio.check(viewToCheck)
change_view_type_dialog_group_direct_subfolders.apply {
changeViewTypeDialogRadio.check(viewToCheck)
changeViewTypeDialogGroupDirectSubfolders.apply {
beVisibleIf(fromFoldersView)
isChecked = config.groupDirectSubfolders
}
change_view_type_dialog_use_for_this_folder.apply {
changeViewTypeDialogUseForThisFolder.apply {
beVisibleIf(!fromFoldersView)
isChecked = config.hasCustomViewType(pathToUse)
}
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this)
activity.setupDialogStuff(binding.root, this)
}
}
private fun dialogConfirmed() {
val viewType = if (view.change_view_type_dialog_radio.checkedRadioButtonId == view.change_view_type_dialog_radio_grid.id) {
val viewType = if (binding.changeViewTypeDialogRadio.checkedRadioButtonId == binding.changeViewTypeDialogRadioGrid.id) {
VIEW_TYPE_GRID
} else {
VIEW_TYPE_LIST
@ -63,9 +61,9 @@ class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView
if (fromFoldersView) {
config.viewTypeFolders = viewType
config.groupDirectSubfolders = view.change_view_type_dialog_group_direct_subfolders.isChecked
config.groupDirectSubfolders = binding.changeViewTypeDialogGroupDirectSubfolders.isChecked
} else {
if (view.change_view_type_dialog_use_for_this_folder.isChecked) {
if (binding.changeViewTypeDialogUseForThisFolder.isChecked) {
config.saveFolderViewType(pathToUse, viewType)
} else {
config.removeFolderViewType(pathToUse)

View file

@ -4,22 +4,21 @@ import android.app.Activity
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.dialog_confirm_delete_folder.view.*
import com.simplemobiletools.gallery.pro.databinding.DialogConfirmDeleteFolderBinding
class ConfirmDeleteFolderDialog(activity: Activity, message: String, warningMessage: String, val callback: () -> Unit) {
private var dialog: AlertDialog? = null
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_confirm_delete_folder, null)
view.message.text = message
view.message_warning.text = warningMessage
val binding = DialogConfirmDeleteFolderBinding.inflate(activity.layoutInflater)
binding.message.text = message
binding.messageWarning.text = warningMessage
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.yes) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.no, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.yes) { dialog, which -> dialogConfirmed() }
.setNegativeButton(com.simplemobiletools.commons.R.string.no, null)
.apply {
activity.setupDialogStuff(view, this) { alertDialog ->
activity.setupDialogStuff(binding.root, this) { alertDialog ->
dialog = alertDialog
}
}

View file

@ -7,27 +7,26 @@ import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.showKeyboard
import com.simplemobiletools.commons.extensions.value
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.dialog_custom_aspect_ratio.view.*
import com.simplemobiletools.gallery.pro.databinding.DialogCustomAspectRatioBinding
class CustomAspectRatioDialog(
val activity: BaseSimpleActivity, val defaultCustomAspectRatio: Pair<Float, Float>?, val callback: (aspectRatio: Pair<Float, Float>) -> Unit
) {
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_custom_aspect_ratio, null).apply {
aspect_ratio_width.setText(defaultCustomAspectRatio?.first?.toInt()?.toString() ?: "")
aspect_ratio_height.setText(defaultCustomAspectRatio?.second?.toInt()?.toString() ?: "")
val binding = DialogCustomAspectRatioBinding.inflate(activity.layoutInflater).apply {
aspectRatioWidth.setText(defaultCustomAspectRatio?.first?.toInt()?.toString() ?: "")
aspectRatioHeight.setText(defaultCustomAspectRatio?.second?.toInt()?.toString() ?: "")
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this) { alertDialog ->
alertDialog.showKeyboard(view.aspect_ratio_width)
activity.setupDialogStuff(binding.root, this) { alertDialog ->
alertDialog.showKeyboard(binding.aspectRatioWidth)
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val width = getViewValue(view.aspect_ratio_width)
val height = getViewValue(view.aspect_ratio_height)
val width = getViewValue(binding.aspectRatioWidth)
val height = getViewValue(binding.aspectRatioHeight)
callback(Pair(width, height))
alertDialog.dismiss()
}

View file

@ -5,8 +5,7 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.dialog_delete_with_remember.view.*
import com.simplemobiletools.gallery.pro.databinding.DialogDeleteWithRememberBinding
class DeleteWithRememberDialog(
private val activity: Activity,
@ -16,16 +15,16 @@ class DeleteWithRememberDialog(
) {
private var dialog: AlertDialog? = null
val view = activity.layoutInflater.inflate(R.layout.dialog_delete_with_remember, null)!!
private val binding = DialogDeleteWithRememberBinding.inflate(activity.layoutInflater)
init {
view.delete_remember_title.text = message
view.skip_the_recycle_bin_checkbox.beGoneIf(!showSkipRecycleBinOption)
binding.deleteRememberTitle.text = message
binding.skipTheRecycleBinCheckbox.beGoneIf(!showSkipRecycleBinOption)
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.yes) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.no, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.yes) { dialog, which -> dialogConfirmed() }
.setNegativeButton(com.simplemobiletools.commons.R.string.no, null)
.apply {
activity.setupDialogStuff(view, this) { alertDialog ->
activity.setupDialogStuff(binding.root, this) { alertDialog ->
dialog = alertDialog
}
}
@ -33,6 +32,6 @@ class DeleteWithRememberDialog(
private fun dialogConfirmed() {
dialog?.dismiss()
callback(view.delete_remember_checkbox.isChecked, view.skip_the_recycle_bin_checkbox.isChecked)
callback(binding.deleteRememberCheckbox.isChecked, binding.skipTheRecycleBinCheckbox.isChecked)
}
}

View file

@ -1,31 +1,30 @@
package com.simplemobiletools.gallery.pro.dialogs
import android.view.ViewGroup
import android.widget.RadioButton
import android.widget.RadioGroup
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.databinding.RadioButtonBinding
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.getBasePath
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogExcludeFolderBinding
import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.dialog_exclude_folder.view.*
class ExcludeFolderDialog(val activity: BaseSimpleActivity, val selectedPaths: List<String>, val callback: () -> Unit) {
private val alternativePaths = getAlternativePathsList()
private var radioGroup: RadioGroup? = null
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_exclude_folder, null).apply {
exclude_folder_parent.beVisibleIf(alternativePaths.size > 1)
val binding = DialogExcludeFolderBinding.inflate(activity.layoutInflater).apply {
excludeFolderParent.beVisibleIf(alternativePaths.size > 1)
radioGroup = exclude_folder_radio_group
exclude_folder_radio_group.beVisibleIf(alternativePaths.size > 1)
radioGroup = excludeFolderRadioGroup
excludeFolderRadioGroup.beVisibleIf(alternativePaths.size > 1)
}
alternativePaths.forEachIndexed { index, value ->
val radioButton = (activity.layoutInflater.inflate(R.layout.radio_button, null) as RadioButton).apply {
val radioButton = RadioButtonBinding.inflate(activity.layoutInflater).root.apply {
text = alternativePaths[index]
isChecked = index == 0
id = index
@ -34,10 +33,10 @@ class ExcludeFolderDialog(val activity: BaseSimpleActivity, val selectedPaths: L
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this)
activity.setupDialogStuff(binding.root, this)
}
}

View file

@ -6,8 +6,8 @@ import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogExportFavoritesBinding
import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.dialog_export_favorites.view.*
class ExportFavoritesDialog(
val activity: BaseSimpleActivity, val defaultFilename: String, val hidePath: Boolean,
@ -21,17 +21,17 @@ class ExportFavoritesDialog(
activity.internalStoragePath
}
val view = activity.layoutInflater.inflate(R.layout.dialog_export_favorites, null).apply {
export_favorites_filename.setText(defaultFilename.removeSuffix(".txt"))
val binding = DialogExportFavoritesBinding.inflate(activity.layoutInflater).apply {
exportFavoritesFilename.setText(defaultFilename.removeSuffix(".txt"))
if (hidePath) {
export_favorites_path_label.beGone()
export_favorites_path.beGone()
exportFavoritesPathLabel.beGone()
exportFavoritesPath.beGone()
} else {
export_favorites_path.text = activity.humanizePath(folder)
export_favorites_path.setOnClickListener {
exportFavoritesPath.text = activity.humanizePath(folder)
exportFavoritesPath.setOnClickListener {
FilePickerDialog(activity, folder, false, showFAB = true) {
export_favorites_path.text = activity.humanizePath(it)
exportFavoritesPath.text = activity.humanizePath(it)
folder = it
}
}
@ -39,27 +39,30 @@ class ExportFavoritesDialog(
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this, R.string.export_favorite_paths) { alertDialog ->
activity.setupDialogStuff(binding.root, this, R.string.export_favorite_paths) { alertDialog ->
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
var filename = view.export_favorites_filename.value
var filename = binding.exportFavoritesFilename.value
if (filename.isEmpty()) {
activity.toast(R.string.filename_cannot_be_empty)
activity.toast(com.simplemobiletools.commons.R.string.filename_cannot_be_empty)
return@setOnClickListener
}
filename += ".txt"
val newPath = "${folder.trimEnd('/')}/$filename"
if (!newPath.getFilenameFromPath().isAValidFilename()) {
activity.toast(R.string.filename_invalid_characters)
activity.toast(com.simplemobiletools.commons.R.string.filename_invalid_characters)
return@setOnClickListener
}
activity.config.lastExportedFavoritesFolder = folder
if (!hidePath && activity.getDoesFilePathExist(newPath)) {
val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newPath.getFilenameFromPath())
val title = String.format(
activity.getString(com.simplemobiletools.commons.R.string.file_already_exists_overwrite),
newPath.getFilenameFromPath()
)
ConfirmationDialog(activity, title) {
callback(newPath, filename)
alertDialog.dismiss()

View file

@ -4,45 +4,45 @@ import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogFilterMediaBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.*
import kotlinx.android.synthetic.main.dialog_filter_media.view.*
class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result: Int) -> Unit) {
private var view = activity.layoutInflater.inflate(R.layout.dialog_filter_media, null)
private val binding = DialogFilterMediaBinding.inflate(activity.layoutInflater)
init {
val filterMedia = activity.config.filterMedia
view.apply {
filter_media_images.isChecked = filterMedia and TYPE_IMAGES != 0
filter_media_videos.isChecked = filterMedia and TYPE_VIDEOS != 0
filter_media_gifs.isChecked = filterMedia and TYPE_GIFS != 0
filter_media_raws.isChecked = filterMedia and TYPE_RAWS != 0
filter_media_svgs.isChecked = filterMedia and TYPE_SVGS != 0
filter_media_portraits.isChecked = filterMedia and TYPE_PORTRAITS != 0
binding.apply {
filterMediaImages.isChecked = filterMedia and TYPE_IMAGES != 0
filterMediaVideos.isChecked = filterMedia and TYPE_VIDEOS != 0
filterMediaGifs.isChecked = filterMedia and TYPE_GIFS != 0
filterMediaRaws.isChecked = filterMedia and TYPE_RAWS != 0
filterMediaSvgs.isChecked = filterMedia and TYPE_SVGS != 0
filterMediaPortraits.isChecked = filterMedia and TYPE_PORTRAITS != 0
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this, R.string.filter_media)
activity.setupDialogStuff(binding.root, this, R.string.filter_media)
}
}
private fun dialogConfirmed() {
var result = 0
if (view.filter_media_images.isChecked)
if (binding.filterMediaImages.isChecked)
result += TYPE_IMAGES
if (view.filter_media_videos.isChecked)
if (binding.filterMediaVideos.isChecked)
result += TYPE_VIDEOS
if (view.filter_media_gifs.isChecked)
if (binding.filterMediaGifs.isChecked)
result += TYPE_GIFS
if (view.filter_media_raws.isChecked)
if (binding.filterMediaRaws.isChecked)
result += TYPE_RAWS
if (view.filter_media_svgs.isChecked)
if (binding.filterMediaSvgs.isChecked)
result += TYPE_SVGS
if (view.filter_media_portraits.isChecked)
if (binding.filterMediaPortraits.isChecked)
result += TYPE_PORTRAITS
if (result == 0) {

View file

@ -1,25 +1,23 @@
package com.simplemobiletools.gallery.pro.dialogs
import android.view.View
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.applyColorFilter
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.getProperTextColor
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogGrantAllFilesBinding
import com.simplemobiletools.gallery.pro.extensions.launchGrantAllFilesIntent
import kotlinx.android.synthetic.main.dialog_grant_all_files.view.*
class GrantAllFilesDialog(val activity: BaseSimpleActivity) {
init {
val view: View = activity.layoutInflater.inflate(R.layout.dialog_grant_all_files, null)
view.grant_all_files_image.applyColorFilter(activity.getProperTextColor())
val binding = DialogGrantAllFilesBinding.inflate(activity.layoutInflater)
binding.grantAllFilesImage.applyColorFilter(activity.getProperTextColor())
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> activity.launchGrantAllFilesIntent() }
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> activity.launchGrantAllFilesIntent() }
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this) { alertDialog -> }
activity.setupDialogStuff(binding.root, this) { alertDialog -> }
}
}
}

View file

@ -3,74 +3,73 @@ package com.simplemobiletools.gallery.pro.dialogs
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogManageBottomActionsBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.*
import kotlinx.android.synthetic.main.dialog_manage_bottom_actions.view.*
class ManageBottomActionsDialog(val activity: BaseSimpleActivity, val callback: (result: Int) -> Unit) {
private var view = activity.layoutInflater.inflate(R.layout.dialog_manage_bottom_actions, null)
private val binding = DialogManageBottomActionsBinding.inflate(activity.layoutInflater)
init {
val actions = activity.config.visibleBottomActions
view.apply {
manage_bottom_actions_toggle_favorite.isChecked = actions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0
manage_bottom_actions_edit.isChecked = actions and BOTTOM_ACTION_EDIT != 0
manage_bottom_actions_share.isChecked = actions and BOTTOM_ACTION_SHARE != 0
manage_bottom_actions_delete.isChecked = actions and BOTTOM_ACTION_DELETE != 0
manage_bottom_actions_rotate.isChecked = actions and BOTTOM_ACTION_ROTATE != 0
manage_bottom_actions_properties.isChecked = actions and BOTTOM_ACTION_PROPERTIES != 0
manage_bottom_actions_change_orientation.isChecked = actions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0
manage_bottom_actions_slideshow.isChecked = actions and BOTTOM_ACTION_SLIDESHOW != 0
manage_bottom_actions_show_on_map.isChecked = actions and BOTTOM_ACTION_SHOW_ON_MAP != 0
manage_bottom_actions_toggle_visibility.isChecked = actions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0
manage_bottom_actions_rename.isChecked = actions and BOTTOM_ACTION_RENAME != 0
manage_bottom_actions_set_as.isChecked = actions and BOTTOM_ACTION_SET_AS != 0
manage_bottom_actions_copy.isChecked = actions and BOTTOM_ACTION_COPY != 0
manage_bottom_actions_move.isChecked = actions and BOTTOM_ACTION_MOVE != 0
manage_bottom_actions_resize.isChecked = actions and BOTTOM_ACTION_RESIZE != 0
binding.apply {
manageBottomActionsToggleFavorite.isChecked = actions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0
manageBottomActionsEdit.isChecked = actions and BOTTOM_ACTION_EDIT != 0
manageBottomActionsShare.isChecked = actions and BOTTOM_ACTION_SHARE != 0
manageBottomActionsDelete.isChecked = actions and BOTTOM_ACTION_DELETE != 0
manageBottomActionsRotate.isChecked = actions and BOTTOM_ACTION_ROTATE != 0
manageBottomActionsProperties.isChecked = actions and BOTTOM_ACTION_PROPERTIES != 0
manageBottomActionsChangeOrientation.isChecked = actions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0
manageBottomActionsSlideshow.isChecked = actions and BOTTOM_ACTION_SLIDESHOW != 0
manageBottomActionsShowOnMap.isChecked = actions and BOTTOM_ACTION_SHOW_ON_MAP != 0
manageBottomActionsToggleVisibility.isChecked = actions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0
manageBottomActionsRename.isChecked = actions and BOTTOM_ACTION_RENAME != 0
manageBottomActionsSetAs.isChecked = actions and BOTTOM_ACTION_SET_AS != 0
manageBottomActionsCopy.isChecked = actions and BOTTOM_ACTION_COPY != 0
manageBottomActionsMove.isChecked = actions and BOTTOM_ACTION_MOVE != 0
manageBottomActionsResize.isChecked = actions and BOTTOM_ACTION_RESIZE != 0
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this)
activity.setupDialogStuff(binding.root, this)
}
}
private fun dialogConfirmed() {
var result = 0
view.apply {
if (manage_bottom_actions_toggle_favorite.isChecked)
binding.apply {
if (manageBottomActionsToggleFavorite.isChecked)
result += BOTTOM_ACTION_TOGGLE_FAVORITE
if (manage_bottom_actions_edit.isChecked)
if (manageBottomActionsEdit.isChecked)
result += BOTTOM_ACTION_EDIT
if (manage_bottom_actions_share.isChecked)
if (manageBottomActionsShare.isChecked)
result += BOTTOM_ACTION_SHARE
if (manage_bottom_actions_delete.isChecked)
if (manageBottomActionsDelete.isChecked)
result += BOTTOM_ACTION_DELETE
if (manage_bottom_actions_rotate.isChecked)
if (manageBottomActionsRotate.isChecked)
result += BOTTOM_ACTION_ROTATE
if (manage_bottom_actions_properties.isChecked)
if (manageBottomActionsProperties.isChecked)
result += BOTTOM_ACTION_PROPERTIES
if (manage_bottom_actions_change_orientation.isChecked)
if (manageBottomActionsChangeOrientation.isChecked)
result += BOTTOM_ACTION_CHANGE_ORIENTATION
if (manage_bottom_actions_slideshow.isChecked)
if (manageBottomActionsSlideshow.isChecked)
result += BOTTOM_ACTION_SLIDESHOW
if (manage_bottom_actions_show_on_map.isChecked)
if (manageBottomActionsShowOnMap.isChecked)
result += BOTTOM_ACTION_SHOW_ON_MAP
if (manage_bottom_actions_toggle_visibility.isChecked)
if (manageBottomActionsToggleVisibility.isChecked)
result += BOTTOM_ACTION_TOGGLE_VISIBILITY
if (manage_bottom_actions_rename.isChecked)
if (manageBottomActionsRename.isChecked)
result += BOTTOM_ACTION_RENAME
if (manage_bottom_actions_set_as.isChecked)
if (manageBottomActionsSetAs.isChecked)
result += BOTTOM_ACTION_SET_AS
if (manage_bottom_actions_copy.isChecked)
if (manageBottomActionsCopy.isChecked)
result += BOTTOM_ACTION_COPY
if (manage_bottom_actions_move.isChecked)
if (manageBottomActionsMove.isChecked)
result += BOTTOM_ACTION_MOVE
if (manage_bottom_actions_resize.isChecked)
if (manageBottomActionsResize.isChecked)
result += BOTTOM_ACTION_RESIZE
}

View file

@ -3,56 +3,55 @@ package com.simplemobiletools.gallery.pro.dialogs
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogManageExtendedDetailsBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.*
import kotlinx.android.synthetic.main.dialog_manage_extended_details.view.*
class ManageExtendedDetailsDialog(val activity: BaseSimpleActivity, val callback: (result: Int) -> Unit) {
private var view = activity.layoutInflater.inflate(R.layout.dialog_manage_extended_details, null)
private val binding = DialogManageExtendedDetailsBinding.inflate(activity.layoutInflater)
init {
val details = activity.config.extendedDetails
view.apply {
manage_extended_details_name.isChecked = details and EXT_NAME != 0
manage_extended_details_path.isChecked = details and EXT_PATH != 0
manage_extended_details_size.isChecked = details and EXT_SIZE != 0
manage_extended_details_resolution.isChecked = details and EXT_RESOLUTION != 0
manage_extended_details_last_modified.isChecked = details and EXT_LAST_MODIFIED != 0
manage_extended_details_date_taken.isChecked = details and EXT_DATE_TAKEN != 0
manage_extended_details_camera.isChecked = details and EXT_CAMERA_MODEL != 0
manage_extended_details_exif.isChecked = details and EXT_EXIF_PROPERTIES != 0
manage_extended_details_gps_coordinates.isChecked = details and EXT_GPS != 0
binding.apply {
manageExtendedDetailsName.isChecked = details and EXT_NAME != 0
manageExtendedDetailsPath.isChecked = details and EXT_PATH != 0
manageExtendedDetailsSize.isChecked = details and EXT_SIZE != 0
manageExtendedDetailsResolution.isChecked = details and EXT_RESOLUTION != 0
manageExtendedDetailsLastModified.isChecked = details and EXT_LAST_MODIFIED != 0
manageExtendedDetailsDateTaken.isChecked = details and EXT_DATE_TAKEN != 0
manageExtendedDetailsCamera.isChecked = details and EXT_CAMERA_MODEL != 0
manageExtendedDetailsExif.isChecked = details and EXT_EXIF_PROPERTIES != 0
manageExtendedDetailsGpsCoordinates.isChecked = details and EXT_GPS != 0
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this)
activity.setupDialogStuff(binding.root, this)
}
}
private fun dialogConfirmed() {
var result = 0
view.apply {
if (manage_extended_details_name.isChecked)
binding.apply {
if (manageExtendedDetailsName.isChecked)
result += EXT_NAME
if (manage_extended_details_path.isChecked)
if (manageExtendedDetailsPath.isChecked)
result += EXT_PATH
if (manage_extended_details_size.isChecked)
if (manageExtendedDetailsSize.isChecked)
result += EXT_SIZE
if (manage_extended_details_resolution.isChecked)
if (manageExtendedDetailsResolution.isChecked)
result += EXT_RESOLUTION
if (manage_extended_details_last_modified.isChecked)
if (manageExtendedDetailsLastModified.isChecked)
result += EXT_LAST_MODIFIED
if (manage_extended_details_date_taken.isChecked)
if (manageExtendedDetailsDateTaken.isChecked)
result += EXT_DATE_TAKEN
if (manage_extended_details_camera.isChecked)
if (manageExtendedDetailsCamera.isChecked)
result += EXT_CAMERA_MODEL
if (manage_extended_details_exif.isChecked)
if (manageExtendedDetailsExif.isChecked)
result += EXT_EXIF_PROPERTIES
if (manage_extended_details_gps_coordinates.isChecked)
if (manageExtendedDetailsGpsCoordinates.isChecked)
result += EXT_GPS
}

View file

@ -4,8 +4,7 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.dialog_other_aspect_ratio.view.*
import com.simplemobiletools.gallery.pro.databinding.DialogOtherAspectRatioBinding
class OtherAspectRatioDialog(
val activity: BaseSimpleActivity,
@ -15,53 +14,53 @@ class OtherAspectRatioDialog(
private var dialog: AlertDialog? = null
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_other_aspect_ratio, null).apply {
other_aspect_ratio_2_1.setOnClickListener { ratioPicked(Pair(2f, 1f)) }
other_aspect_ratio_3_2.setOnClickListener { ratioPicked(Pair(3f, 2f)) }
other_aspect_ratio_4_3.setOnClickListener { ratioPicked(Pair(4f, 3f)) }
other_aspect_ratio_5_3.setOnClickListener { ratioPicked(Pair(5f, 3f)) }
other_aspect_ratio_16_9.setOnClickListener { ratioPicked(Pair(16f, 9f)) }
other_aspect_ratio_19_9.setOnClickListener { ratioPicked(Pair(19f, 9f)) }
other_aspect_ratio_custom.setOnClickListener { customRatioPicked() }
val binding = DialogOtherAspectRatioBinding.inflate(activity.layoutInflater).apply {
otherAspectRatio21.setOnClickListener { ratioPicked(Pair(2f, 1f)) }
otherAspectRatio32.setOnClickListener { ratioPicked(Pair(3f, 2f)) }
otherAspectRatio43.setOnClickListener { ratioPicked(Pair(4f, 3f)) }
otherAspectRatio53.setOnClickListener { ratioPicked(Pair(5f, 3f)) }
otherAspectRatio169.setOnClickListener { ratioPicked(Pair(16f, 9f)) }
otherAspectRatio199.setOnClickListener { ratioPicked(Pair(19f, 9f)) }
otherAspectRatioCustom.setOnClickListener { customRatioPicked() }
other_aspect_ratio_1_2.setOnClickListener { ratioPicked(Pair(1f, 2f)) }
other_aspect_ratio_2_3.setOnClickListener { ratioPicked(Pair(2f, 3f)) }
other_aspect_ratio_3_4.setOnClickListener { ratioPicked(Pair(3f, 4f)) }
other_aspect_ratio_3_5.setOnClickListener { ratioPicked(Pair(3f, 5f)) }
other_aspect_ratio_9_16.setOnClickListener { ratioPicked(Pair(9f, 16f)) }
other_aspect_ratio_9_19.setOnClickListener { ratioPicked(Pair(9f, 19f)) }
otherAspectRatio12.setOnClickListener { ratioPicked(Pair(1f, 2f)) }
otherAspectRatio23.setOnClickListener { ratioPicked(Pair(2f, 3f)) }
otherAspectRatio34.setOnClickListener { ratioPicked(Pair(3f, 4f)) }
otherAspectRatio35.setOnClickListener { ratioPicked(Pair(3f, 5f)) }
otherAspectRatio916.setOnClickListener { ratioPicked(Pair(9f, 16f)) }
otherAspectRatio919.setOnClickListener { ratioPicked(Pair(9f, 19f)) }
val radio1SelectedItemId = when (lastOtherAspectRatio) {
Pair(2f, 1f) -> other_aspect_ratio_2_1.id
Pair(3f, 2f) -> other_aspect_ratio_3_2.id
Pair(4f, 3f) -> other_aspect_ratio_4_3.id
Pair(5f, 3f) -> other_aspect_ratio_5_3.id
Pair(16f, 9f) -> other_aspect_ratio_16_9.id
Pair(19f, 9f) -> other_aspect_ratio_19_9.id
Pair(2f, 1f) -> otherAspectRatio21.id
Pair(3f, 2f) -> otherAspectRatio32.id
Pair(4f, 3f) -> otherAspectRatio43.id
Pair(5f, 3f) -> otherAspectRatio53.id
Pair(16f, 9f) -> otherAspectRatio169.id
Pair(19f, 9f) -> otherAspectRatio199.id
else -> 0
}
other_aspect_ratio_dialog_radio_1.check(radio1SelectedItemId)
otherAspectRatioDialogRadio1.check(radio1SelectedItemId)
val radio2SelectedItemId = when (lastOtherAspectRatio) {
Pair(1f, 2f) -> other_aspect_ratio_1_2.id
Pair(2f, 3f) -> other_aspect_ratio_2_3.id
Pair(3f, 4f) -> other_aspect_ratio_3_4.id
Pair(3f, 5f) -> other_aspect_ratio_3_5.id
Pair(9f, 16f) -> other_aspect_ratio_9_16.id
Pair(9f, 19f) -> other_aspect_ratio_9_19.id
Pair(1f, 2f) -> otherAspectRatio12.id
Pair(2f, 3f) -> otherAspectRatio23.id
Pair(3f, 4f) -> otherAspectRatio34.id
Pair(3f, 5f) -> otherAspectRatio35.id
Pair(9f, 16f) -> otherAspectRatio916.id
Pair(9f, 19f) -> otherAspectRatio919.id
else -> 0
}
other_aspect_ratio_dialog_radio_2.check(radio2SelectedItemId)
otherAspectRatioDialogRadio2.check(radio2SelectedItemId)
if (radio1SelectedItemId == 0 && radio2SelectedItemId == 0) {
other_aspect_ratio_dialog_radio_1.check(other_aspect_ratio_custom.id)
otherAspectRatioDialogRadio1.check(otherAspectRatioCustom.id)
}
}
activity.getAlertDialogBuilder()
.setNegativeButton(R.string.cancel, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this) { alertDialog ->
activity.setupDialogStuff(binding.root, this) { alertDialog ->
dialog = alertDialog
}
}

View file

@ -2,10 +2,7 @@ package com.simplemobiletools.gallery.pro.dialogs
import android.graphics.Color
import android.view.KeyEvent
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.RecyclerView
@ -17,9 +14,9 @@ import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.commons.views.MySearchMenu
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.DirectoryAdapter
import com.simplemobiletools.gallery.pro.databinding.DialogDirectoryPickerBinding
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.models.Directory
import kotlinx.android.synthetic.main.dialog_directory_picker.view.*
class PickDirectoryDialog(
val activity: BaseSimpleActivity,
@ -34,28 +31,28 @@ class PickDirectoryDialog(
private var shownDirectories = ArrayList<Directory>()
private var allDirectories = ArrayList<Directory>()
private var openedSubfolders = arrayListOf("")
private var view = activity.layoutInflater.inflate(R.layout.dialog_directory_picker, null)
private var binding = DialogDirectoryPickerBinding.inflate(activity.layoutInflater)
private var isGridViewType = activity.config.viewTypeFolders == VIEW_TYPE_GRID
private var showHidden = activity.config.shouldShowHidden
private var currentPathPrefix = ""
private val config = activity.config
private val searchView = view.folder_search_view
private val searchEditText = view.findViewById<EditText>(R.id.top_toolbar_search)
private val searchViewAppBarLayout = view.findViewById<View>(R.id.top_app_bar_layout)
private val searchView = binding.folderSearchView
private val searchEditText = searchView.binding.topToolbarSearch
private val searchViewAppBarLayout = searchView.binding.topAppBarLayout
init {
(view.directories_grid.layoutManager as MyGridLayoutManager).apply {
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).apply {
orientation = if (activity.config.scrollHorizontally && isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL
spanCount = if (isGridViewType) activity.config.dirColumnCnt else 1
}
view.directories_fastscroller.updateColors(activity.getProperPrimaryColor())
binding.directoriesFastscroller.updateColors(activity.getProperPrimaryColor())
configureSearchView()
val builder = activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.setOnKeyListener { dialogInterface, i, keyEvent ->
if (keyEvent.action == KeyEvent.ACTION_UP && i == KeyEvent.KEYCODE_BACK) {
backPressed()
@ -68,12 +65,12 @@ class PickDirectoryDialog(
}
builder.apply {
activity.setupDialogStuff(view, this, R.string.select_destination) { alertDialog ->
activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.select_destination) { alertDialog ->
dialog = alertDialog
view.directories_show_hidden.beVisibleIf(!context.config.shouldShowHidden)
view.directories_show_hidden.setOnClickListener {
binding.directoriesShowHidden.beVisibleIf(!context.config.shouldShowHidden)
binding.directoriesShowHidden.setOnClickListener {
activity.handleHiddenFolderPasswordProtection {
view.directories_show_hidden.beGone()
binding.directoriesShowHidden.beGone()
showHidden = true
fetchDirectories(true)
}
@ -85,7 +82,7 @@ class PickDirectoryDialog(
}
private fun configureSearchView() = with(searchView) {
updateHintText(context.getString(R.string.search_folders))
updateHintText(context.getString(com.simplemobiletools.commons.R.string.search_folders))
searchEditText.imeOptions = EditorInfo.IME_ACTION_DONE
toggleHideOnScroll(!config.scrollHorizontally)
@ -103,13 +100,13 @@ class PickDirectoryDialog(
private fun MySearchMenu.setSearchViewListeners() {
onSearchOpenListener = {
updateSearchViewLeftIcon(R.drawable.ic_cross_vector)
updateSearchViewLeftIcon(com.simplemobiletools.commons.R.drawable.ic_cross_vector)
}
onSearchClosedListener = {
searchEditText.clearFocus()
activity.hideKeyboard(searchEditText)
updateSearchViewLeftIcon(R.drawable.ic_search_vector)
updateSearchViewLeftIcon(com.simplemobiletools.commons.R.drawable.ic_search_vector)
}
onSearchTextChangedListener = { text ->
@ -117,14 +114,14 @@ class PickDirectoryDialog(
}
}
private fun updateSearchViewLeftIcon(iconResId: Int) = with(view.findViewById<ImageView>(R.id.top_toolbar_search_icon)) {
private fun updateSearchViewLeftIcon(iconResId: Int) = with(searchView.binding.topToolbarSearchIcon) {
post {
setImageResource(iconResId)
}
}
private fun filterFolderListBySearchQuery(query: String) {
val adapter = view.directories_grid.adapter as? DirectoryAdapter
val adapter = binding.directoriesGrid.adapter as? DirectoryAdapter
var dirsToShow = allDirectories
if (query.isNotEmpty()) {
dirsToShow = dirsToShow.filter { it.name.contains(query, true) }.toMutableList() as ArrayList
@ -136,7 +133,7 @@ class PickDirectoryDialog(
if (filteredFolderListUpdated) {
adapter?.updateDirs(dirsToShow)
view.directories_grid.apply {
binding.directoriesGrid.apply {
post {
scrollToPosition(0)
}
@ -144,14 +141,14 @@ class PickDirectoryDialog(
}
}
private fun checkPlaceholderVisibility(dirs: ArrayList<Directory>) = with(view) {
directories_empty_placeholder.beVisibleIf(dirs.isEmpty())
private fun checkPlaceholderVisibility(dirs: ArrayList<Directory>) = with(binding) {
directoriesEmptyPlaceholder.beVisibleIf(dirs.isEmpty())
if (folder_search_view.isSearchOpen) {
directories_empty_placeholder.text = context.getString(R.string.no_items_found)
if (folderSearchView.isSearchOpen) {
directoriesEmptyPlaceholder.text = root.context.getString(com.simplemobiletools.commons.R.string.no_items_found)
}
directories_fastscroller.beVisibleIf(directories_empty_placeholder.isGone())
directoriesFastscroller.beVisibleIf(directoriesEmptyPlaceholder.isGone())
}
private fun fetchDirectories(forceShowHiddenAndExcluded: Boolean) {
@ -201,15 +198,15 @@ class PickDirectoryDialog(
}
shownDirectories = dirs
val adapter = DirectoryAdapter(activity, dirs.clone() as ArrayList<Directory>, null, view.directories_grid, true) {
val adapter = DirectoryAdapter(activity, dirs.clone() as ArrayList<Directory>, null, binding.directoriesGrid, true) {
val clickedDir = it as Directory
val path = clickedDir.path
if (clickedDir.subfoldersCount == 1 || !activity.config.groupDirectSubfolders) {
if (isPickingCopyMoveDestination && path.trimEnd('/') == sourcePath) {
activity.toast(R.string.source_and_destination_same)
activity.toast(com.simplemobiletools.commons.R.string.source_and_destination_same)
return@DirectoryAdapter
} else if (isPickingCopyMoveDestination && activity.isRestrictedWithSAFSdk30(path) && !activity.isInDownloadDir(path)) {
activity.toast(R.string.system_folder_copy_restriction, Toast.LENGTH_LONG)
activity.toast(com.simplemobiletools.commons.R.string.system_folder_copy_restriction, Toast.LENGTH_LONG)
return@DirectoryAdapter
} else {
activity.handleLockedFolderOpening(path) { success ->
@ -227,9 +224,9 @@ class PickDirectoryDialog(
}
val scrollHorizontally = activity.config.scrollHorizontally && isGridViewType
view.apply {
directories_grid.adapter = adapter
directories_fastscroller.setScrollVertically(!scrollHorizontally)
binding.apply {
directoriesGrid.adapter = adapter
directoriesFastscroller.setScrollVertically(!scrollHorizontally)
}
}

View file

@ -11,6 +11,7 @@ import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.MediaAdapter
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.pro.databinding.DialogMediumPickerBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.getCachedMedia
import com.simplemobiletools.gallery.pro.helpers.GridSpacingItemDecoration
@ -18,30 +19,29 @@ import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection
import kotlinx.android.synthetic.main.dialog_medium_picker.view.*
class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val callback: (path: String) -> Unit) {
private var dialog: AlertDialog? = null
private var shownMedia = ArrayList<ThumbnailItem>()
private val view = activity.layoutInflater.inflate(R.layout.dialog_medium_picker, null)
private val binding = DialogMediumPickerBinding.inflate(activity.layoutInflater)
private val config = activity.config
private val viewType = config.getFolderViewType(if (config.showAll) SHOW_ALL else path)
private var isGridViewType = viewType == VIEW_TYPE_GRID
init {
(view.media_grid.layoutManager as MyGridLayoutManager).apply {
(binding.mediaGrid.layoutManager as MyGridLayoutManager).apply {
orientation = if (config.scrollHorizontally && isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL
spanCount = if (isGridViewType) config.mediaColumnCnt else 1
}
view.media_fastscroller.updateColors(activity.getProperPrimaryColor())
binding.mediaFastscroller.updateColors(activity.getProperPrimaryColor())
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.setNeutralButton(R.string.other_folder) { dialogInterface, i -> showOtherFolder() }
.apply {
activity.setupDialogStuff(view, this, R.string.select_photo) { alertDialog ->
activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.select_photo) { alertDialog ->
dialog = alertDialog
}
}
@ -72,7 +72,7 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
return
shownMedia = media
val adapter = MediaAdapter(activity, shownMedia.clone() as ArrayList<ThumbnailItem>, null, true, false, path, view.media_grid) {
val adapter = MediaAdapter(activity, shownMedia.clone() as ArrayList<ThumbnailItem>, null, true, false, path, binding.mediaGrid) {
if (it is Medium) {
callback(it.path)
dialog?.dismiss()
@ -80,9 +80,9 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
}
val scrollHorizontally = config.scrollHorizontally && isGridViewType
view.apply {
media_grid.adapter = adapter
media_fastscroller.setScrollVertically(!scrollHorizontally)
binding.apply {
mediaGrid.adapter = adapter
mediaFastscroller.setScrollVertically(!scrollHorizontally)
}
handleGridSpacing(media)
}
@ -94,17 +94,17 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
val useGridPosition = media.firstOrNull() is ThumbnailSection
var currentGridDecoration: GridSpacingItemDecoration? = null
if (view.media_grid.itemDecorationCount > 0) {
currentGridDecoration = view.media_grid.getItemDecorationAt(0) as GridSpacingItemDecoration
if (binding.mediaGrid.itemDecorationCount > 0) {
currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration.items = media
}
val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)
if (currentGridDecoration.toString() != newGridDecoration.toString()) {
if (currentGridDecoration != null) {
view.media_grid.removeItemDecoration(currentGridDecoration)
binding.mediaGrid.removeItemDecoration(currentGridDecoration)
}
view.media_grid.addItemDecoration(newGridDecoration)
binding.mediaGrid.addItemDecoration(newGridDecoration)
}
}
}

View file

@ -6,13 +6,13 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.dialog_resize_image.view.*
import com.simplemobiletools.gallery.pro.databinding.DialogResizeImageBinding
class ResizeDialog(val activity: BaseSimpleActivity, val size: Point, val callback: (newSize: Point) -> Unit) {
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_resize_image, null)
val widthView = view.resize_image_width
val heightView = view.resize_image_height
val binding = DialogResizeImageBinding.inflate(activity.layoutInflater)
val widthView = binding.resizeImageWidth
val heightView = binding.resizeImageHeight
widthView.setText(size.x.toString())
heightView.setText(size.y.toString())
@ -27,7 +27,7 @@ class ResizeDialog(val activity: BaseSimpleActivity, val size: Point, val callba
width = size.x
}
if (view.keep_aspect_ratio.isChecked) {
if (binding.keepAspectRatio.isChecked) {
heightView.setText((width / ratio).toInt().toString())
}
}
@ -41,18 +41,18 @@ class ResizeDialog(val activity: BaseSimpleActivity, val size: Point, val callba
height = size.y
}
if (view.keep_aspect_ratio.isChecked) {
if (binding.keepAspectRatio.isChecked) {
widthView.setText((height * ratio).toInt().toString())
}
}
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this, R.string.resize_and_save) { alertDialog ->
alertDialog.showKeyboard(view.resize_image_width)
activity.setupDialogStuff(binding.root, this, R.string.resize_and_save) { alertDialog ->
alertDialog.showKeyboard(binding.resizeImageWidth)
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val width = getViewValue(widthView)
val height = getViewValue(heightView)

View file

@ -6,12 +6,10 @@ import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogResizeMultipleImagesBinding
import com.simplemobiletools.gallery.pro.extensions.ensureWriteAccess
import com.simplemobiletools.gallery.pro.extensions.rescanPathsAndUpdateLastModified
import com.simplemobiletools.gallery.pro.extensions.resizeImage
import kotlinx.android.synthetic.main.dialog_resize_multiple_images.view.resize_factor_edit_text
import kotlinx.android.synthetic.main.dialog_resize_multiple_images.view.resize_factor_input_layout
import kotlinx.android.synthetic.main.dialog_resize_multiple_images.view.resize_progress
import java.io.File
import kotlin.math.roundToInt
@ -25,9 +23,9 @@ class ResizeMultipleImagesDialog(
) {
private var dialog: AlertDialog? = null
private val view = activity.layoutInflater.inflate(R.layout.dialog_resize_multiple_images, null)
private val progressView = view.resize_progress
private val resizeFactorEditText = view.resize_factor_edit_text
private val binding = DialogResizeMultipleImagesBinding.inflate(activity.layoutInflater)
private val progressView = binding.resizeProgress
private val resizeFactorEditText = binding.resizeFactorEditText
init {
resizeFactorEditText.setText(DEFAULT_RESIZE_FACTOR)
@ -37,10 +35,10 @@ class ResizeMultipleImagesDialog(
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this, R.string.resize_multiple_images) { alertDialog ->
activity.setupDialogStuff(binding.root, this, R.string.resize_multiple_images) { alertDialog ->
dialog = alertDialog
alertDialog.showKeyboard(resizeFactorEditText)
@ -56,7 +54,7 @@ class ResizeMultipleImagesDialog(
val resizeFactor = resizeFactorText.toFloat().div(100)
alertDialog.setCanceledOnTouchOutside(false)
arrayOf(view.resize_factor_input_layout, positiveButton, negativeButton).forEach {
arrayOf(binding.resizeFactorInputLayout, positiveButton, negativeButton).forEach {
it.isEnabled = false
it.alpha = 0.6f
}
@ -97,7 +95,7 @@ class ResizeMultipleImagesDialog(
}
}
} catch (e: OutOfMemoryError) {
toast(R.string.out_of_memory_error)
toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
} catch (e: Exception) {
showErrorToast(e)
}

View file

@ -8,13 +8,13 @@ import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogResizeImageWithPathBinding
import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.dialog_resize_image_with_path.view.*
class ResizeWithPathDialog(val activity: BaseSimpleActivity, val size: Point, val path: String, val callback: (newSize: Point, newPath: String) -> Unit) {
init {
var realPath = path.getParentPath()
val view = activity.layoutInflater.inflate(R.layout.dialog_resize_image_with_path, null).apply {
val binding = DialogResizeImageWithPathBinding.inflate(activity.layoutInflater).apply {
folder.setText("${activity.humanizePath(realPath).trimEnd('/')}/")
val fullName = path.getFilenameFromPath()
@ -24,10 +24,10 @@ class ResizeWithPathDialog(val activity: BaseSimpleActivity, val size: Point, va
if (dotAt > 0) {
name = fullName.substring(0, dotAt)
val extension = fullName.substring(dotAt + 1)
extension_value.setText(extension)
extensionValue.setText(extension)
}
filename_value.setText(name)
filenameValue.setText(name)
folder.setOnClickListener {
FilePickerDialog(activity, realPath, false, activity.config.shouldShowHidden, true, true) {
folder.setText(activity.humanizePath(it))
@ -36,8 +36,8 @@ class ResizeWithPathDialog(val activity: BaseSimpleActivity, val size: Point, va
}
}
val widthView = view.resize_image_width
val heightView = view.resize_image_height
val widthView = binding.resizeImageWidth
val heightView = binding.resizeImageHeight
widthView.setText(size.x.toString())
heightView.setText(size.y.toString())
@ -69,11 +69,11 @@ class ResizeWithPathDialog(val activity: BaseSimpleActivity, val size: Point, va
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this) { alertDialog ->
alertDialog.showKeyboard(view.resize_image_width)
activity.setupDialogStuff(binding.root, this) { alertDialog ->
alertDialog.showKeyboard(binding.resizeImageWidth)
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val width = getViewValue(widthView)
val height = getViewValue(heightView)
@ -84,27 +84,27 @@ class ResizeWithPathDialog(val activity: BaseSimpleActivity, val size: Point, va
val newSize = Point(getViewValue(widthView), getViewValue(heightView))
val filename = view.filename_value.value
val extension = view.extension_value.value
val filename = binding.filenameValue.value
val extension = binding.extensionValue.value
if (filename.isEmpty()) {
activity.toast(R.string.filename_cannot_be_empty)
activity.toast(com.simplemobiletools.commons.R.string.filename_cannot_be_empty)
return@setOnClickListener
}
if (extension.isEmpty()) {
activity.toast(R.string.extension_cannot_be_empty)
activity.toast(com.simplemobiletools.commons.R.string.extension_cannot_be_empty)
return@setOnClickListener
}
val newFilename = "$filename.$extension"
val newPath = "${realPath.trimEnd('/')}/$newFilename"
if (!newFilename.isAValidFilename()) {
activity.toast(R.string.filename_invalid_characters)
activity.toast(com.simplemobiletools.commons.R.string.filename_invalid_characters)
return@setOnClickListener
}
if (activity.getDoesFilePathExist(newPath)) {
val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFilename)
val title = String.format(activity.getString(com.simplemobiletools.commons.R.string.file_already_exists_overwrite), newFilename)
ConfirmationDialog(activity, title) {
callback(newSize, newPath)
alertDialog.dismiss()

View file

@ -6,8 +6,7 @@ import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.gallery.pro.R
import kotlinx.android.synthetic.main.dialog_save_as.view.*
import com.simplemobiletools.gallery.pro.databinding.DialogSaveAsBinding
import java.io.File
class SaveAsDialog(
@ -20,8 +19,8 @@ class SaveAsDialog(
realPath = activity.getPicturesDirectoryPath(realPath)
}
val view = activity.layoutInflater.inflate(R.layout.dialog_save_as, null).apply {
folder_value.setText("${activity.humanizePath(realPath).trimEnd('/')}/")
val binding = DialogSaveAsBinding.inflate(activity.layoutInflater).apply {
folderValue.setText("${activity.humanizePath(realPath).trimEnd('/')}/")
val fullName = path.getFilenameFromPath()
val dotAt = fullName.lastIndexOf(".")
@ -30,53 +29,53 @@ class SaveAsDialog(
if (dotAt > 0) {
name = fullName.substring(0, dotAt)
val extension = fullName.substring(dotAt + 1)
extension_value.setText(extension)
extensionValue.setText(extension)
}
if (appendFilename) {
name += "_1"
}
filename_value.setText(name)
folder_value.setOnClickListener {
activity.hideKeyboard(folder_value)
filenameValue.setText(name)
folderValue.setOnClickListener {
activity.hideKeyboard(folderValue)
FilePickerDialog(activity, realPath, false, false, true, true) {
folder_value.setText(activity.humanizePath(it))
folderValue.setText(activity.humanizePath(it))
realPath = it
}
}
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel) { dialog, which -> cancelCallback?.invoke() }
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel) { dialog, which -> cancelCallback?.invoke() }
.setOnCancelListener { cancelCallback?.invoke() }
.apply {
activity.setupDialogStuff(view, this, R.string.save_as) { alertDialog ->
alertDialog.showKeyboard(view.filename_value)
activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.save_as) { alertDialog ->
alertDialog.showKeyboard(binding.filenameValue)
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val filename = view.filename_value.value
val extension = view.extension_value.value
val filename = binding.filenameValue.value
val extension = binding.extensionValue.value
if (filename.isEmpty()) {
activity.toast(R.string.filename_cannot_be_empty)
activity.toast(com.simplemobiletools.commons.R.string.filename_cannot_be_empty)
return@setOnClickListener
}
if (extension.isEmpty()) {
activity.toast(R.string.extension_cannot_be_empty)
activity.toast(com.simplemobiletools.commons.R.string.extension_cannot_be_empty)
return@setOnClickListener
}
val newFilename = "$filename.$extension"
val newPath = "${realPath.trimEnd('/')}/$newFilename"
if (!newFilename.isAValidFilename()) {
activity.toast(R.string.filename_invalid_characters)
activity.toast(com.simplemobiletools.commons.R.string.filename_invalid_characters)
return@setOnClickListener
}
if (activity.getDoesFilePathExist(newPath)) {
val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFilename)
val title = String.format(activity.getString(com.simplemobiletools.commons.R.string.file_already_exists_overwrite), newFilename)
ConfirmationDialog(activity, title) {
if ((isRPlus() && !isExternalStorageManager())) {
val fileDirItem = arrayListOf(File(newPath).toFileDirItem(activity))

View file

@ -1,6 +1,5 @@
package com.simplemobiletools.gallery.pro.dialogs
import android.view.View
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
@ -10,29 +9,29 @@ import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.value
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogSlideshowBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_FADE
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_NONE
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_SLIDE
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_DEFAULT_INTERVAL
import kotlinx.android.synthetic.main.dialog_slideshow.view.*
class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) {
private val view: View
private val binding: DialogSlideshowBinding
init {
view = activity.layoutInflater.inflate(R.layout.dialog_slideshow, null).apply {
interval_hint.hint = activity.getString(R.string.seconds_raw).replaceFirstChar { it.uppercaseChar() }
interval_value.setOnClickListener {
interval_value.selectAll()
binding = DialogSlideshowBinding.inflate(activity.layoutInflater).apply {
intervalHint.hint = activity.getString(com.simplemobiletools.commons.R.string.seconds_raw).replaceFirstChar { it.uppercaseChar() }
intervalValue.setOnClickListener {
intervalValue.selectAll()
}
interval_value.setOnFocusChangeListener { v, hasFocus ->
intervalValue.setOnFocusChangeListener { v, hasFocus ->
if (!hasFocus)
activity.hideKeyboard(v)
}
animation_holder.setOnClickListener {
animationHolder.setOnClickListener {
val items = arrayListOf(
RadioItem(SLIDESHOW_ANIMATION_NONE, activity.getString(R.string.no_animation)),
RadioItem(SLIDESHOW_ANIMATION_SLIDE, activity.getString(R.string.slide)),
@ -41,42 +40,42 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit
RadioGroupDialog(activity, items, activity.config.slideshowAnimation) {
activity.config.slideshowAnimation = it as Int
animation_value.text = getAnimationText()
animationValue.text = getAnimationText()
}
}
include_videos_holder.setOnClickListener {
interval_value.clearFocus()
include_videos.toggle()
includeVideosHolder.setOnClickListener {
intervalValue.clearFocus()
includeVideos.toggle()
}
include_gifs_holder.setOnClickListener {
interval_value.clearFocus()
include_gifs.toggle()
includeGifsHolder.setOnClickListener {
intervalValue.clearFocus()
includeGifs.toggle()
}
random_order_holder.setOnClickListener {
interval_value.clearFocus()
random_order.toggle()
randomOrderHolder.setOnClickListener {
intervalValue.clearFocus()
randomOrder.toggle()
}
move_backwards_holder.setOnClickListener {
interval_value.clearFocus()
move_backwards.toggle()
moveBackwardsHolder.setOnClickListener {
intervalValue.clearFocus()
moveBackwards.toggle()
}
loop_slideshow_holder.setOnClickListener {
interval_value.clearFocus()
loop_slideshow.toggle()
loopSlideshowHolder.setOnClickListener {
intervalValue.clearFocus()
loopSlideshow.toggle()
}
}
setupValues()
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this) { alertDialog ->
activity.setupDialogStuff(binding.root, this) { alertDialog ->
alertDialog.hideKeyboard()
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
storeValues()
@ -89,30 +88,30 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit
private fun setupValues() {
val config = activity.config
view.apply {
interval_value.setText(config.slideshowInterval.toString())
animation_value.text = getAnimationText()
include_videos.isChecked = config.slideshowIncludeVideos
include_gifs.isChecked = config.slideshowIncludeGIFs
random_order.isChecked = config.slideshowRandomOrder
move_backwards.isChecked = config.slideshowMoveBackwards
loop_slideshow.isChecked = config.loopSlideshow
binding.apply {
intervalValue.setText(config.slideshowInterval.toString())
animationValue.text = getAnimationText()
includeVideos.isChecked = config.slideshowIncludeVideos
includeGifs.isChecked = config.slideshowIncludeGIFs
randomOrder.isChecked = config.slideshowRandomOrder
moveBackwards.isChecked = config.slideshowMoveBackwards
loopSlideshow.isChecked = config.loopSlideshow
}
}
private fun storeValues() {
var interval = view.interval_value.text.toString()
var interval = binding.intervalValue.text.toString()
if (interval.trim('0').isEmpty())
interval = SLIDESHOW_DEFAULT_INTERVAL.toString()
activity.config.apply {
slideshowAnimation = getAnimationValue(view.animation_value.value)
slideshowAnimation = getAnimationValue(binding.animationValue.value)
slideshowInterval = interval.toInt()
slideshowIncludeVideos = view.include_videos.isChecked
slideshowIncludeGIFs = view.include_gifs.isChecked
slideshowRandomOrder = view.random_order.isChecked
slideshowMoveBackwards = view.move_backwards.isChecked
loopSlideshow = view.loop_slideshow.isChecked
slideshowIncludeVideos = binding.includeVideos.isChecked
slideshowIncludeGIFs = binding.includeGifs.isChecked
slideshowRandomOrder = binding.randomOrder.isChecked
slideshowMoveBackwards = binding.moveBackwards.isChecked
loopSlideshow = binding.loopSlideshow.isChecked
}
}

View file

@ -99,7 +99,7 @@ fun SimpleActivity.launchAbout() {
FAQItem(R.string.faq_7_title, R.string.faq_7_text),
FAQItem(R.string.faq_14_title, R.string.faq_14_text),
FAQItem(R.string.faq_1_title, R.string.faq_1_text),
FAQItem(R.string.faq_5_title_commons, R.string.faq_5_text_commons),
FAQItem(com.simplemobiletools.commons.R.string.faq_5_title_commons, com.simplemobiletools.commons.R.string.faq_5_text_commons),
FAQItem(R.string.faq_5_title, R.string.faq_5_text),
FAQItem(R.string.faq_4_title, R.string.faq_4_text),
FAQItem(R.string.faq_6_title, R.string.faq_6_text),
@ -110,14 +110,14 @@ fun SimpleActivity.launchAbout() {
FAQItem(R.string.faq_15_title, R.string.faq_15_text),
FAQItem(R.string.faq_2_title, R.string.faq_2_text),
FAQItem(R.string.faq_18_title, R.string.faq_18_text),
FAQItem(R.string.faq_9_title_commons, R.string.faq_9_text_commons),
FAQItem(com.simplemobiletools.commons.R.string.faq_9_title_commons, com.simplemobiletools.commons.R.string.faq_9_text_commons),
)
if (!resources.getBoolean(R.bool.hide_google_relations)) {
faqItems.add(FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons))
faqItems.add(FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons))
faqItems.add(FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons))
faqItems.add(FAQItem(R.string.faq_10_title_commons, R.string.faq_10_text_commons))
if (!resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations)) {
faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_2_title_commons, com.simplemobiletools.commons.R.string.faq_2_text_commons))
faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_6_title_commons, com.simplemobiletools.commons.R.string.faq_6_text_commons))
faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_7_title_commons, com.simplemobiletools.commons.R.string.faq_7_text_commons))
faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_10_title_commons, com.simplemobiletools.commons.R.string.faq_10_text_commons))
}
if (isRPlus() && !isExternalStorageManager()) {
@ -138,7 +138,7 @@ fun BaseSimpleActivity.handleMediaManagementPrompt(callback: () -> Unit) {
if (Environment.isExternalStorageManager()) {
callback()
} else {
var messagePrompt = getString(R.string.access_storage_prompt)
var messagePrompt = getString(com.simplemobiletools.commons.R.string.access_storage_prompt)
messagePrompt += if (isSPlus()) {
"\n\n${getString(R.string.media_management_alternative)}"
} else {
@ -214,7 +214,7 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
addNoMediaIntoMediaStore(file.absolutePath)
callback()
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
callback()
}
}
@ -225,7 +225,7 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
addNoMediaIntoMediaStore(file.absolutePath)
}
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
} catch (e: Exception) {
showErrorToast(e)
@ -296,7 +296,7 @@ fun BaseSimpleActivity.toggleFileVisibility(oldPath: String, hide: Boolean, call
fun BaseSimpleActivity.tryCopyMoveFilesTo(fileDirItems: ArrayList<FileDirItem>, isCopyOperation: Boolean, callback: (destinationPath: String) -> Unit) {
if (fileDirItems.isEmpty()) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return
}
@ -477,10 +477,10 @@ fun BaseSimpleActivity.emptyTheRecycleBin(callback: (() -> Unit)? = null) {
recycleBin.deleteRecursively()
mediaDB.clearRecycleBin()
directoryDB.deleteRecycleBin()
toast(R.string.recycle_bin_emptied)
toast(com.simplemobiletools.commons.R.string.recycle_bin_emptied)
callback?.invoke()
} catch (e: Exception) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
}
}
@ -495,7 +495,13 @@ fun BaseSimpleActivity.emptyAndDisableTheRecycleBin(callback: () -> Unit) {
}
fun BaseSimpleActivity.showRecycleBinEmptyingDialog(callback: () -> Unit) {
ConfirmationDialog(this, "", R.string.empty_recycle_bin_confirmation, R.string.yes, R.string.no) {
ConfirmationDialog(
this,
"",
com.simplemobiletools.commons.R.string.empty_recycle_bin_confirmation,
com.simplemobiletools.commons.R.string.yes,
com.simplemobiletools.commons.R.string.no
) {
callback()
}
}
@ -611,7 +617,7 @@ fun AppCompatActivity.fixDateTaken(
runOnUiThread {
if (showToasts) {
toast(if (didUpdateFile) R.string.dates_fixed_successfully else R.string.unknown_error_occurred)
toast(if (didUpdateFile) R.string.dates_fixed_successfully else com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
callback?.invoke()
@ -647,7 +653,7 @@ fun BaseSimpleActivity.saveRotatedImageToFile(oldPath: String, newPath: String,
getFileOutputStream(tmpFileDirItem) {
if (it == null) {
if (showToasts) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
return@getFileOutputStream
}
@ -672,7 +678,7 @@ fun BaseSimpleActivity.saveRotatedImageToFile(oldPath: String, newPath: String,
}
} catch (e: OutOfMemoryError) {
if (showToasts) {
toast(R.string.out_of_memory_error)
toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
}
} catch (e: Exception) {
if (showToasts) {
@ -692,7 +698,7 @@ fun Activity.tryRotateByExif(path: String, degrees: Int, showToasts: Boolean, ca
fileRotatedSuccessfully(path, oldLastModified)
callback.invoke()
if (showToasts) {
toast(R.string.file_saved)
toast(com.simplemobiletools.commons.R.string.file_saved)
}
true
} else {
@ -801,7 +807,7 @@ fun BaseSimpleActivity.launchResizeImageDialog(path: String, callback: (() -> Un
try {
resizeImage(path, newPath, newSize) { success ->
if (success) {
toast(R.string.file_saved)
toast(com.simplemobiletools.commons.R.string.file_saved)
val paths = arrayListOf(file.absolutePath)
rescanPathsAndUpdateLastModified(paths, pathLastModifiedMap) {
@ -814,7 +820,7 @@ fun BaseSimpleActivity.launchResizeImageDialog(path: String, callback: (() -> Un
}
}
} catch (e: OutOfMemoryError) {
toast(R.string.out_of_memory_error)
toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
} catch (e: Exception) {
showErrorToast(e)
}
@ -882,7 +888,7 @@ fun Activity.getShortcutImage(tmb: String, drawable: Drawable, callback: () -> U
.diskCacheStrategy(DiskCacheStrategy.NONE)
.fitCenter()
val size = resources.getDimension(R.dimen.shortcut_size).toInt()
val size = resources.getDimension(com.simplemobiletools.commons.R.dimen.shortcut_size).toInt()
val builder = Glide.with(this)
.asDrawable()
.load(tmb)

View file

@ -449,11 +449,11 @@ fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders:
fun Context.getFolderNameFromPath(path: String): String {
return when (path) {
internalStoragePath -> getString(R.string.internal)
sdCardPath -> getString(R.string.sd_card)
otgPath -> getString(R.string.usb)
FAVORITES -> getString(R.string.favorites)
RECYCLE_BIN -> getString(R.string.recycle_bin)
internalStoragePath -> getString(com.simplemobiletools.commons.R.string.internal)
sdCardPath -> getString(com.simplemobiletools.commons.R.string.sd_card)
otgPath -> getString(com.simplemobiletools.commons.R.string.usb)
FAVORITES -> getString(com.simplemobiletools.commons.R.string.favorites)
RECYCLE_BIN -> getString(com.simplemobiletools.commons.R.string.recycle_bin)
else -> path.getFilenameFromPath()
}
}
@ -550,7 +550,8 @@ fun Context.loadPng(
})
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerSize =
if (roundCorners == ROUNDED_CORNERS_SMALL) com.simplemobiletools.commons.R.dimen.rounded_corner_radius_small else com.simplemobiletools.commons.R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
@ -580,7 +581,8 @@ fun Context.loadJpg(
.transition(BitmapTransitionOptions.withCrossFade())
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerSize =
if (roundCorners == ROUNDED_CORNERS_SMALL) com.simplemobiletools.commons.R.dimen.rounded_corner_radius_small else com.simplemobiletools.commons.R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
@ -609,7 +611,8 @@ fun Context.loadStaticGIF(
.apply(options)
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerSize =
if (roundCorners == ROUNDED_CORNERS_SMALL) com.simplemobiletools.commons.R.dimen.rounded_corner_radius_small else com.simplemobiletools.commons.R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
@ -629,7 +632,8 @@ fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boo
.transition(DrawableTransitionOptions.withCrossFade())
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerSize =
if (roundCorners == ROUNDED_CORNERS_SMALL) com.simplemobiletools.commons.R.dimen.rounded_corner_radius_small else com.simplemobiletools.commons.R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
@ -654,7 +658,8 @@ fun Context.tryLoadingWithPicasso(path: String, view: MySquareImageView, cropThu
}
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
val cornerSize =
if (roundCorners == ROUNDED_CORNERS_SMALL) com.simplemobiletools.commons.R.dimen.rounded_corner_radius_small else com.simplemobiletools.commons.R.dimen.rounded_corner_radius_big
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(PicassoRoundedCornersTransformation(cornerRadius.toFloat()))
}
@ -893,7 +898,7 @@ fun Context.updateFavorite(path: String, isFavorite: Boolean) {
favoritesDB.deleteFavoritePath(path)
}
} catch (e: Exception) {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
}

View file

@ -48,6 +48,7 @@ import com.simplemobiletools.gallery.pro.activities.PhotoActivity
import com.simplemobiletools.gallery.pro.activities.PhotoVideoActivity
import com.simplemobiletools.gallery.pro.activities.ViewPagerActivity
import com.simplemobiletools.gallery.pro.adapters.PortraitPhotosAdapter
import com.simplemobiletools.gallery.pro.databinding.PagerPhotoItemBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.saveRotatedImageToFile
import com.simplemobiletools.gallery.pro.extensions.sendFakeClick
@ -57,7 +58,6 @@ import com.simplemobiletools.gallery.pro.svg.SvgSoftwareLayerSetter
import com.squareup.picasso.Callback
import com.squareup.picasso.Picasso
import it.sephiroth.android.library.exif2.ExifInterface
import kotlinx.android.synthetic.main.pager_photo_item.view.*
import org.apache.sanselan.common.byteSources.ByteSourceInputStream
import org.apache.sanselan.formats.jpeg.JpegImageParser
import pl.droidsonroids.gif.InputSource
@ -98,6 +98,7 @@ class PhotoFragment : ViewPagerFragment() {
private var mStoredExtendedDetails = 0
private lateinit var mView: ViewGroup
private lateinit var binding: PagerPhotoItemBinding
private lateinit var mMedium: Medium
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
@ -105,7 +106,8 @@ class PhotoFragment : ViewPagerFragment() {
val activity = requireActivity()
val arguments = requireArguments()
mView = (inflater.inflate(R.layout.pager_photo_item, container, false) as ViewGroup)
binding = PagerPhotoItemBinding.inflate(inflater, container, false)
mView = binding.root
if (!arguments.getBoolean(SHOULD_INIT_FRAGMENT, true)) {
return mView
}
@ -113,50 +115,50 @@ class PhotoFragment : ViewPagerFragment() {
mMedium = arguments.getSerializable(MEDIUM) as Medium
mOriginalPath = mMedium.path
mView.apply {
subsampling_view.setOnClickListener { photoClicked() }
gestures_view.setOnClickListener { photoClicked() }
gif_view.setOnClickListener { photoClicked() }
instant_prev_item.setOnClickListener { listener?.goToPrevItem() }
instant_next_item.setOnClickListener { listener?.goToNextItem() }
panorama_outline.setOnClickListener { openPanorama() }
binding.apply {
subsamplingView.setOnClickListener { photoClicked() }
gesturesView.setOnClickListener { photoClicked() }
gifView.setOnClickListener { photoClicked() }
instantPrevItem.setOnClickListener { listener?.goToPrevItem() }
instantNextItem.setOnClickListener { listener?.goToNextItem() }
panoramaOutline.setOnClickListener { openPanorama() }
instant_prev_item.parentView = container
instant_next_item.parentView = container
instantPrevItem.parentView = container
instantNextItem.parentView = container
photo_brightness_controller.initialize(activity, slide_info, true, container, singleTap = { x, y ->
photoBrightnessController.initialize(activity, slideInfo, true, container, singleTap = { x, y ->
mView.apply {
if (subsampling_view.isVisible()) {
subsampling_view.sendFakeClick(x, y)
if (subsamplingView.isVisible()) {
subsamplingView.sendFakeClick(x, y)
} else {
gestures_view.sendFakeClick(x, y)
gesturesView.sendFakeClick(x, y)
}
}
})
if (context.config.allowDownGesture) {
gif_view.setOnTouchListener { v, event ->
if (gif_view_frame.controller.state.zoom == 1f) {
gifView.setOnTouchListener { v, event ->
if (gifViewFrame.controller.state.zoom == 1f) {
handleEvent(event)
}
false
}
gestures_view.controller.addOnStateChangeListener(object : GestureController.OnStateChangeListener {
gesturesView.controller.addOnStateChangeListener(object : GestureController.OnStateChangeListener {
override fun onStateChanged(state: State) {
mCurrentGestureViewZoom = state.zoom
}
})
gestures_view.setOnTouchListener { v, event ->
gesturesView.setOnTouchListener { v, event ->
if (mCurrentGestureViewZoom == 1f) {
handleEvent(event)
}
false
}
subsampling_view.setOnTouchListener { v, event ->
if (subsampling_view.isZoomedOut()) {
subsamplingView.setOnTouchListener { v, event ->
if (subsamplingView.isZoomedOut()) {
handleEvent(event)
}
false
@ -195,7 +197,7 @@ class PhotoFragment : ViewPagerFragment() {
rotated.compress(Bitmap.CompressFormat.JPEG, 100, out)
mMedium.path = file.absolutePath
} catch (e: Exception) {
requireActivity().toast(R.string.unknown_error_occurred)
requireActivity().toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return mView
} finally {
out?.close()
@ -231,13 +233,13 @@ class PhotoFragment : ViewPagerFragment() {
if (mWasInit) {
if (config.allowZoomingImages != mStoredAllowDeepZoomableImages || config.showHighestQuality != mStoredShowHighestQuality) {
mIsSubsamplingVisible = false
mView.subsampling_view.beGone()
binding.subsamplingView.beGone()
loadImage()
} else if (mMedium.isGIF()) {
loadGif()
} else if (mIsSubsamplingVisible && mShouldResetImage) {
mView.subsampling_view.onGlobalLayout {
mView.subsampling_view.resetView()
binding.subsamplingView.onGlobalLayout {
binding.subsamplingView.resetView()
}
}
mShouldResetImage = false
@ -246,10 +248,10 @@ class PhotoFragment : ViewPagerFragment() {
val allowPhotoGestures = config.allowPhotoGestures
val allowInstantChange = config.allowInstantChange
mView.apply {
photo_brightness_controller.beVisibleIf(allowPhotoGestures)
instant_prev_item.beVisibleIf(allowInstantChange)
instant_next_item.beVisibleIf(allowInstantChange)
binding.apply {
photoBrightnessController.beVisibleIf(allowPhotoGestures)
instantPrevItem.beVisibleIf(allowInstantChange)
instantNextItem.beVisibleIf(allowInstantChange)
}
storeStateVariables()
@ -258,11 +260,11 @@ class PhotoFragment : ViewPagerFragment() {
override fun onDestroyView() {
super.onDestroyView()
if (activity?.isDestroyed == false) {
mView.subsampling_view.recycle()
binding.subsamplingView.recycle()
try {
if (context != null) {
Glide.with(requireContext()).clear(mView.gestures_view)
Glide.with(requireContext()).clear(binding.gesturesView)
}
} catch (ignored: Exception) {
}
@ -289,7 +291,7 @@ class PhotoFragment : ViewPagerFragment() {
if (activity != null) {
measureScreen()
Handler().postDelayed({
mView.gif_view_frame.controller.resetState()
binding.gifViewFrame.controller.resetState()
loadGif()
}, 50)
}
@ -393,11 +395,11 @@ class PhotoFragment : ViewPagerFragment() {
InputSource.FileSource(pathToLoad)
}
mView.apply {
gestures_view.beGone()
gif_view_frame.beVisible()
binding.apply {
gesturesView.beGone()
gifViewFrame.beVisible()
ensureBackgroundThread {
gif_view.setInputSource(source)
gifView.setInputSource(source)
}
}
} catch (e: Exception) {
@ -413,14 +415,14 @@ class PhotoFragment : ViewPagerFragment() {
.`as`(PictureDrawable::class.java)
.listener(SvgSoftwareLayerSetter())
.load(mMedium.path)
.into(mView.gestures_view)
.into(binding.gesturesView)
}
}
private fun loadAPNG() {
if (context != null) {
val drawable = APNGDrawable.fromFile(mMedium.path)
mView.gestures_view.setImageDrawable(drawable)
binding.gesturesView.setImageDrawable(drawable)
}
}
@ -436,7 +438,7 @@ class PhotoFragment : ViewPagerFragment() {
loadWithGlide(path, addZoomableView)
} else {
drawable.setLoopLimit(0)
mView.gestures_view.setImageDrawable(drawable)
binding.gesturesView.setImageDrawable(drawable)
}
} else {
loadWithGlide(path, addZoomableView)
@ -476,13 +478,13 @@ class PhotoFragment : ViewPagerFragment() {
isFirstResource: Boolean
): Boolean {
val allowZoomingImages = context?.config?.allowZoomingImages ?: true
mView.gestures_view.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || allowZoomingImages == false
binding.gesturesView.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || allowZoomingImages == false
if (mIsFragmentVisible && addZoomableView) {
scheduleZoomableView()
}
return false
}
}).into(mView.gestures_view)
}).into(binding.gesturesView)
}
private fun tryLoadingWithPicasso(addZoomableView: Boolean) {
@ -502,9 +504,9 @@ class PhotoFragment : ViewPagerFragment() {
degreesForRotation(mImageOrientation).toFloat()
}
picasso.into(mView.gestures_view, object : Callback {
picasso.into(binding.gesturesView, object : Callback {
override fun onSuccess() {
mView.gestures_view.controller.settings.isZoomEnabled =
binding.gesturesView.controller.settings.isZoomEnabled =
mMedium.isRaw() || mCurrentRotationDegrees != 0 || context?.config?.allowZoomingImages == false
if (mIsFragmentVisible && addZoomableView) {
scheduleZoomableView()
@ -527,7 +529,9 @@ class PhotoFragment : ViewPagerFragment() {
val files = File(mMedium.parentPath).listFiles()?.toMutableList() as? ArrayList<File>
if (files != null) {
val screenWidth = requireContext().realScreenSize.x
val itemWidth = resources.getDimension(R.dimen.portrait_photos_stripe_height).toInt() + resources.getDimension(R.dimen.one_dp).toInt()
val itemWidth =
resources.getDimension(R.dimen.portrait_photos_stripe_height).toInt() + resources.getDimension(com.simplemobiletools.commons.R.dimen.one_dp)
.toInt()
val sideWidth = screenWidth / 2 - itemWidth / 2
val fakeItemsCnt = ceil(sideWidth / itemWidth.toDouble()).toInt()
@ -543,7 +547,7 @@ class PhotoFragment : ViewPagerFragment() {
return@PortraitPhotosAdapter
}
mView.photo_portrait_stripe.smoothScrollBy((x + itemWidth / 2) - screenWidth / 2, 0)
binding.photoPortraitStripe.smoothScrollBy((x + itemWidth / 2) - screenWidth / 2, 0)
if (paths[position] != mCurrentPortraitPhotoPath) {
mCurrentPortraitPhotoPath = paths[position]
hideZoomableView()
@ -551,7 +555,7 @@ class PhotoFragment : ViewPagerFragment() {
}
}
mView.photo_portrait_stripe.adapter = adapter
binding.photoPortraitStripe.adapter = adapter
setupStripeBottomMargin()
val coverIndex = getCoverImageIndex(paths)
@ -559,12 +563,12 @@ class PhotoFragment : ViewPagerFragment() {
mCurrentPortraitPhotoPath = paths[coverIndex]
setupStripeUpListener(adapter, screenWidth, itemWidth)
mView.photo_portrait_stripe.onGlobalLayout {
mView.photo_portrait_stripe.scrollBy((coverIndex - fakeItemsCnt) * itemWidth, 0)
binding.photoPortraitStripe.onGlobalLayout {
binding.photoPortraitStripe.scrollBy((coverIndex - fakeItemsCnt) * itemWidth, 0)
adapter.setCurrentPhoto(coverIndex)
mView.photo_portrait_stripe_wrapper.beVisible()
binding.photoPortraitStripeWrapper.beVisible()
if (mIsFullscreen) {
mView.photo_portrait_stripe_wrapper.alpha = 0f
binding.photoPortraitStripeWrapper.alpha = 0f
}
}
}
@ -588,11 +592,11 @@ class PhotoFragment : ViewPagerFragment() {
}
private fun setupStripeBottomMargin() {
var bottomMargin = requireContext().navigationBarHeight + resources.getDimension(R.dimen.normal_margin).toInt()
var bottomMargin = requireContext().navigationBarHeight + resources.getDimension(com.simplemobiletools.commons.R.dimen.normal_margin).toInt()
if (requireContext().config.bottomActions) {
bottomMargin += resources.getDimension(R.dimen.bottom_actions_height).toInt()
}
(mView.photo_portrait_stripe_wrapper.layoutParams as RelativeLayout.LayoutParams).bottomMargin = bottomMargin
(binding.photoPortraitStripeWrapper.layoutParams as RelativeLayout.LayoutParams).bottomMargin = bottomMargin
}
private fun getCoverImageIndex(paths: ArrayList<String>): Int {
@ -614,7 +618,7 @@ class PhotoFragment : ViewPagerFragment() {
}
private fun setupStripeUpListener(adapter: PortraitPhotosAdapter, screenWidth: Int, itemWidth: Int) {
mView.photo_portrait_stripe.setOnTouchListener { v, event ->
binding.photoPortraitStripe.setOnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL) {
var closestIndex = -1
var closestDistance = Integer.MAX_VALUE
@ -673,7 +677,7 @@ class PhotoFragment : ViewPagerFragment() {
newOrientation += 360
}
mView.subsampling_view.apply {
binding.subsamplingView.apply {
setMaxTileSize(if (showHighestQuality) Integer.MAX_VALUE else 4096)
setMinimumTileDpi(minTileDpi)
background = ColorDrawable(Color.TRANSPARENT)
@ -702,7 +706,7 @@ class PhotoFragment : ViewPagerFragment() {
}
override fun onImageLoadError(e: Exception) {
mView.gestures_view.controller.settings.isZoomEnabled = true
binding.gesturesView.controller.settings.isZoomEnabled = true
background = ColorDrawable(Color.TRANSPARENT)
mIsSubsamplingVisible = false
beGone()
@ -760,9 +764,9 @@ class PhotoFragment : ViewPagerFragment() {
}
activity?.runOnUiThread {
mView.panorama_outline?.beVisibleIf(mIsPanorama)
binding.panoramaOutline.beVisibleIf(mIsPanorama)
if (mIsFullscreen) {
mView.panorama_outline?.alpha = 0f
binding.panoramaOutline.alpha = 0f
}
}
}
@ -818,7 +822,7 @@ class PhotoFragment : ViewPagerFragment() {
fun rotateImageViewBy(degrees: Int) {
if (mIsSubsamplingVisible) {
mView.subsampling_view.rotateBy(degrees)
binding.subsamplingView.rotateBy(degrees)
} else {
mCurrentRotationDegrees = (mCurrentRotationDegrees + degrees) % 360
mLoadZoomableViewHandler.removeCallbacksAndMessages(null)
@ -829,7 +833,7 @@ class PhotoFragment : ViewPagerFragment() {
private fun initExtendedDetails() {
if (requireContext().config.showExtendedDetails) {
mView.photo_details.apply {
binding.photoDetails.apply {
beInvisible() // make it invisible so we can measure it, but not show yet
text = getMediumExtendedDetails(mMedium)
onGlobalLayout {
@ -844,15 +848,15 @@ class PhotoFragment : ViewPagerFragment() {
}
}
} else {
mView.photo_details.beGone()
binding.photoDetails.beGone()
}
}
private fun hideZoomableView() {
if (context?.config?.allowZoomingImages == true) {
mIsSubsamplingVisible = false
mView.subsampling_view.recycle()
mView.subsampling_view.beGone()
binding.subsamplingView.recycle()
binding.subsamplingView.beGone()
mLoadZoomableViewHandler.removeCallbacksAndMessages(null)
}
}
@ -862,14 +866,14 @@ class PhotoFragment : ViewPagerFragment() {
}
private fun updateInstantSwitchWidths() {
mView.instant_prev_item.layoutParams.width = mScreenWidth / 7
mView.instant_next_item.layoutParams.width = mScreenWidth / 7
binding.instantPrevItem.layoutParams.width = mScreenWidth / 7
binding.instantNextItem.layoutParams.width = mScreenWidth / 7
}
override fun fullscreenToggled(isFullscreen: Boolean) {
this.mIsFullscreen = isFullscreen
mView.apply {
photo_details.apply {
binding.apply {
photoDetails.apply {
if (mStoredShowExtendedDetails && isVisible() && context != null && resources != null) {
animate().y(getExtendedDetailsY(height))
@ -880,18 +884,18 @@ class PhotoFragment : ViewPagerFragment() {
}
if (mIsPanorama) {
panorama_outline.animate().alpha(if (isFullscreen) 0f else 1f).start()
panorama_outline.isClickable = !isFullscreen
panoramaOutline.animate().alpha(if (isFullscreen) 0f else 1f).start()
panoramaOutline.isClickable = !isFullscreen
}
if (mWasInit && mMedium.isPortrait()) {
photo_portrait_stripe_wrapper.animate().alpha(if (isFullscreen) 0f else 1f).start()
photoPortraitStripeWrapper.animate().alpha(if (isFullscreen) 0f else 1f).start()
}
}
}
private fun getExtendedDetailsY(height: Int): Float {
val smallMargin = context?.resources?.getDimension(R.dimen.small_margin) ?: return 0f
val smallMargin = context?.resources?.getDimension(com.simplemobiletools.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

View file

@ -15,7 +15,6 @@ import android.widget.SeekBar
import android.widget.TextView
import androidx.media3.common.*
import androidx.media3.common.util.UnstableApi
import com.bumptech.glide.Glide
import androidx.media3.datasource.ContentDataSource
import androidx.media3.datasource.DataSource
import androidx.media3.datasource.DataSpec
@ -25,23 +24,24 @@ import androidx.media3.exoplayer.SeekParameters
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource
import com.bumptech.glide.Glide
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.PanoramaVideoActivity
import com.simplemobiletools.gallery.pro.activities.VideoActivity
import com.simplemobiletools.gallery.pro.databinding.PagerVideoItemBinding
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.hasNavBar
import com.simplemobiletools.gallery.pro.extensions.parseFileChannel
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.views.MediaSideScroll
import kotlinx.android.synthetic.main.bottom_video_time_holder.view.*
import kotlinx.android.synthetic.main.pager_video_item.view.*
import java.io.File
import java.io.FileInputStream
@UnstableApi class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, SeekBar.OnSeekBarChangeListener {
@UnstableApi
class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, SeekBar.OnSeekBarChangeListener {
private val PROGRESS = "progress"
private var mIsFullscreen = false
@ -73,6 +73,7 @@ import java.io.FileInputStream
private lateinit var mTimeHolder: View
private lateinit var mBrightnessSideScroll: MediaSideScroll
private lateinit var mVolumeSideScroll: MediaSideScroll
private lateinit var binding: PagerVideoItemBinding
private lateinit var mView: View
private lateinit var mMedium: Medium
private lateinit var mConfig: Config
@ -88,15 +89,15 @@ import java.io.FileInputStream
mMedium = arguments.getSerializable(MEDIUM) as Medium
mConfig = context.config
mView = inflater.inflate(R.layout.pager_video_item, container, false).apply {
panorama_outline.setOnClickListener { openPanorama() }
video_curr_time.setOnClickListener { skip(false) }
video_duration.setOnClickListener { skip(true) }
video_holder.setOnClickListener { toggleFullscreen() }
video_preview.setOnClickListener { toggleFullscreen() }
video_surface_frame.controller.settings.swallowDoubleTaps = true
binding = PagerVideoItemBinding.inflate(inflater, container, false).apply {
panoramaOutline.setOnClickListener { openPanorama() }
bottomVideoTimeHolder.videoCurrTime.setOnClickListener { skip(false) }
bottomVideoTimeHolder.videoDuration.setOnClickListener { skip(true) }
videoHolder.setOnClickListener { toggleFullscreen() }
videoPreview.setOnClickListener { toggleFullscreen() }
videoSurfaceFrame.controller.settings.swallowDoubleTaps = true
video_play_outline.setOnClickListener {
videoPlayOutline.setOnClickListener {
if (mConfig.openVideosOnSeparateScreen) {
launchVideoPlayer()
} else {
@ -104,21 +105,21 @@ import java.io.FileInputStream
}
}
mPlayPauseButton = video_toggle_play_pause
mPlayPauseButton = bottomVideoTimeHolder.videoTogglePlayPause
mPlayPauseButton.setOnClickListener {
togglePlayPause()
}
mSeekBar = video_seekbar
mSeekBar = bottomVideoTimeHolder.videoSeekbar
mSeekBar.setOnSeekBarChangeListener(this@VideoFragment)
// adding an empty click listener just to avoid ripple animation at toggling fullscreen
mSeekBar.setOnClickListener { }
mTimeHolder = video_time_holder
mCurrTimeView = video_curr_time
mBrightnessSideScroll = video_brightness_controller
mVolumeSideScroll = video_volume_controller
mTextureView = video_surface
mTimeHolder = bottomVideoTimeHolder.videoTimeHolder
mCurrTimeView = bottomVideoTimeHolder.videoCurrTime
mBrightnessSideScroll = videoBrightnessController
mVolumeSideScroll = videoVolumeController
mTextureView = videoSurface
mTextureView.surfaceTextureListener = this@VideoFragment
val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
@ -128,7 +129,7 @@ import java.io.FileInputStream
return true
}
val viewWidth = width
val viewWidth = root.width
val instantWidth = viewWidth / 7
val clickedX = e.rawX
when {
@ -145,13 +146,13 @@ import java.io.FileInputStream
}
})
video_preview.setOnTouchListener { view, event ->
videoPreview.setOnTouchListener { view, event ->
handleEvent(event)
false
}
video_surface_frame.setOnTouchListener { view, event ->
if (video_surface_frame.controller.state.zoom == 1f) {
videoSurfaceFrame.setOnTouchListener { view, event ->
if (videoSurfaceFrame.controller.state.zoom == 1f) {
handleEvent(event)
}
@ -159,13 +160,14 @@ import java.io.FileInputStream
false
}
}
mView = binding.root
if (!arguments.getBoolean(SHOULD_INIT_FRAGMENT, true)) {
return mView
}
storeStateVariables()
Glide.with(context).load(mMedium.path).into(mView.video_preview)
Glide.with(context).load(mMedium.path).into(binding.videoPreview)
// setMenuVisibility is not called at VideoActivity (third party intent)
if (!mIsFragmentVisible && activity is VideoActivity) {
@ -184,12 +186,12 @@ import java.io.FileInputStream
}
if (mIsPanorama) {
mView.apply {
panorama_outline.beVisible()
video_play_outline.beGone()
binding.apply {
panoramaOutline.beVisible()
videoPlayOutline.beGone()
mVolumeSideScroll.beGone()
mBrightnessSideScroll.beGone()
Glide.with(context).load(mMedium.path).into(video_preview)
Glide.with(context).load(mMedium.path).into(videoPreview)
}
}
@ -201,8 +203,8 @@ import java.io.FileInputStream
mWasFragmentInit = true
setVideoSize()
mView.apply {
mBrightnessSideScroll.initialize(activity, slide_info, true, container, singleTap = { x, y ->
binding.apply {
mBrightnessSideScroll.initialize(activity, slideInfo, true, container, singleTap = { x, y ->
if (mConfig.allowInstantChange) {
listener?.goToPrevItem()
} else {
@ -212,7 +214,7 @@ import java.io.FileInputStream
doSkip(false)
})
mVolumeSideScroll.initialize(activity, slide_info, false, container, singleTap = { x, y ->
mVolumeSideScroll.initialize(activity, slideInfo, false, container, singleTap = { x, y ->
if (mConfig.allowInstantChange) {
listener?.goToNextItem()
} else {
@ -222,7 +224,7 @@ import java.io.FileInputStream
doSkip(true)
})
video_surface.onGlobalLayout {
videoSurface.onGlobalLayout {
if (mIsFragmentVisible && mConfig.autoplayVideos && !mConfig.openVideosOnSeparateScreen) {
playVideo()
}
@ -241,10 +243,10 @@ import java.io.FileInputStream
override fun onResume() {
super.onResume()
mConfig = requireContext().config // make sure we get a new config, in case the user changed something in the app settings
requireActivity().updateTextColors(mView.video_holder)
requireActivity().updateTextColors(binding.videoHolder)
val allowVideoGestures = mConfig.allowVideoGestures
mTextureView.beGoneIf(mConfig.openVideosOnSeparateScreen || mIsPanorama)
mView.video_surface_frame.beGoneIf(mTextureView.isGone())
binding.videoSurfaceFrame.beGoneIf(mTextureView.isGone())
mVolumeSideScroll.beVisibleIf(allowVideoGestures && !mIsPanorama)
mBrightnessSideScroll.beVisibleIf(allowVideoGestures && !mIsPanorama)
@ -287,8 +289,8 @@ import java.io.FileInputStream
setVideoSize()
initTimeHolder()
checkExtendedDetails()
mView.video_surface_frame.onGlobalLayout {
mView.video_surface_frame.controller.resetState()
binding.videoSurfaceFrame.onGlobalLayout {
binding.videoSurfaceFrame.controller.resetState()
}
}
@ -327,7 +329,7 @@ import java.io.FileInputStream
private fun setupTimeHolder() {
mSeekBar.max = mDuration
mView.video_duration.text = mDuration.getFormattedDuration()
binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
setupTimer()
}
@ -446,7 +448,7 @@ import java.io.FileInputStream
private fun checkExtendedDetails() {
if (mConfig.showExtendedDetails) {
mView.video_details.apply {
binding.videoDetails.apply {
beInvisible() // make it invisible so we can measure it, but not show yet
text = getMediumExtendedDetails(mMedium)
onGlobalLayout {
@ -461,7 +463,7 @@ import java.io.FileInputStream
}
}
} else {
mView.video_details.beGone()
binding.videoDetails.beGone()
}
}
@ -511,12 +513,16 @@ import java.io.FileInputStream
}
mSeekBar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
arrayOf(mView.video_curr_time, mView.video_duration, mView.video_toggle_play_pause).forEach {
arrayOf(
binding.bottomVideoTimeHolder.videoCurrTime,
binding.bottomVideoTimeHolder.videoDuration,
binding.bottomVideoTimeHolder.videoTogglePlayPause
).forEach {
it.isClickable = !mIsFullscreen
}
mTimeHolder.animate().alpha(newAlpha).start()
mView.video_details.apply {
binding.videoDetails.apply {
if (mStoredShowExtendedDetails && isVisible() && context != null && resources != null) {
animate().y(getExtendedDetailsY(height))
@ -528,7 +534,7 @@ import java.io.FileInputStream
}
private fun getExtendedDetailsY(height: Int): Float {
val smallMargin = context?.resources?.getDimension(R.dimen.small_margin) ?: return 0f
val smallMargin = context?.resources?.getDimension(com.simplemobiletools.commons.R.dimen.small_margin) ?: return 0f
val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else requireContext().navigationBarHeight
var actionsHeight = 0f
if (!mIsFullscreen) {
@ -629,8 +635,8 @@ import java.io.FileInputStream
return
}
if (mView.video_preview.isVisible()) {
mView.video_preview.beGone()
if (binding.videoPreview.isVisible()) {
binding.videoPreview.beGone()
initExoPlayer()
}
@ -645,11 +651,11 @@ import java.io.FileInputStream
}
if (!wasEnded || !mConfig.loopVideos) {
mPlayPauseButton.setImageResource(R.drawable.ic_pause_outline_vector)
mPlayPauseButton.setImageResource(com.simplemobiletools.commons.R.drawable.ic_pause_outline_vector)
}
if (!mWasVideoStarted) {
mView.video_play_outline.beGone()
binding.videoPlayOutline.beGone()
mPlayPauseButton.beVisible()
}
@ -671,7 +677,7 @@ import java.io.FileInputStream
mExoPlayer?.playWhenReady = false
}
mPlayPauseButton.setImageResource(R.drawable.ic_play_outline_vector)
mPlayPauseButton.setImageResource(com.simplemobiletools.commons.R.drawable.ic_play_outline_vector)
activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
mPositionAtPause = mExoPlayer?.currentPosition ?: 0L
}

View file

@ -7,7 +7,6 @@ import android.view.MotionEvent
import androidx.exifinterface.media.ExifInterface
import androidx.fragment.app.Fragment
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
@ -139,6 +138,7 @@ abstract class ViewPagerFragment : Fragment() {
mTouchDownX = event.rawX
mTouchDownY = event.rawY
}
MotionEvent.ACTION_POINTER_DOWN -> mIgnoreCloseDown = true
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
val diffX = mTouchDownX - event.rawX
@ -147,7 +147,7 @@ abstract class ViewPagerFragment : Fragment() {
val downGestureDuration = System.currentTimeMillis() - mTouchDownTime
if (!mIgnoreCloseDown && (Math.abs(diffY) > Math.abs(diffX)) && (diffY < -mCloseDownThreshold) && downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION && context?.config?.allowDownGesture == true) {
activity?.finish()
activity?.overridePendingTransition(0, R.anim.slide_down)
activity?.overridePendingTransition(0, com.simplemobiletools.commons.R.anim.slide_down)
}
mIgnoreCloseDown = false
}

View file

@ -1,9 +1,6 @@
package com.simplemobiletools.gallery.pro.helpers
import com.simplemobiletools.commons.helpers.MONTH_SECONDS
import com.simplemobiletools.commons.helpers.PERMISSION_READ_MEDIA_IMAGES
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.isTiramisuPlus
import com.simplemobiletools.commons.helpers.*
// shared preferences
const val DIRECTORY_SORT_ORDER = "directory_sort_order"
@ -246,3 +243,14 @@ const val FOLDER_STYLE_SQUARE = 1
const val FOLDER_STYLE_ROUNDED_CORNERS = 2
fun getPermissionToRequest() = if (isTiramisuPlus()) PERMISSION_READ_MEDIA_IMAGES else PERMISSION_WRITE_STORAGE
fun getPermissionsToRequest(): Collection<Int> {
val permissions = mutableListOf(getPermissionToRequest())
if (isRPlus()) {
permissions.add(PERMISSION_MEDIA_LOCATION)
}
if (isTiramisuPlus()) {
permissions.add(PERMISSION_READ_MEDIA_VIDEO)
}
return permissions
}

View file

@ -2,7 +2,6 @@ package com.simplemobiletools.gallery.pro.helpers
import android.graphics.Bitmap
import com.simplemobiletools.gallery.pro.models.FilterItem
import java.util.*
class FilterThumbnailsManager {
private var filterThumbnails = ArrayList<FilterItem>(10)

View file

@ -19,7 +19,8 @@ import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection
import java.io.File
import java.util.*
import java.util.Calendar
import java.util.Locale
class MediaFetcher(val context: Context) {
var shouldStop = false
@ -777,6 +778,7 @@ class MediaFetcher(val context: Context) {
o1.name.normalizeString().toLowerCase().compareTo(o2.name.normalizeString().toLowerCase())
}
}
sorting and SORT_BY_PATH != 0 -> {
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
@ -784,6 +786,7 @@ class MediaFetcher(val context: Context) {
o1.path.toLowerCase().compareTo(o2.path.toLowerCase())
}
}
sorting and SORT_BY_SIZE != 0 -> o1.size.compareTo(o2.size)
sorting and SORT_BY_DATE_MODIFIED != 0 -> o1.modified.compareTo(o2.modified)
else -> o1.taken.compareTo(o2.taken)
@ -860,6 +863,7 @@ class MediaFetcher(val context: Context) {
today,
yesterday
)
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 || grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -> formatDate(key, false)
grouping and GROUP_BY_FILE_TYPE != 0 -> getFileTypeString(key)
grouping and GROUP_BY_EXTENSION != 0 -> key.toUpperCase()
@ -868,7 +872,7 @@ class MediaFetcher(val context: Context) {
}
if (result.isEmpty()) {
result = context.getString(R.string.unknown)
result = context.getString(com.simplemobiletools.commons.R.string.unknown)
}
return if (grouping and GROUP_SHOW_FILE_COUNT != 0) {
@ -880,8 +884,8 @@ class MediaFetcher(val context: Context) {
private fun getFinalDate(date: String, today: String, yesterday: String): String {
return when (date) {
today -> context.getString(R.string.today)
yesterday -> context.getString(R.string.yesterday)
today -> context.getString(com.simplemobiletools.commons.R.string.today)
yesterday -> context.getString(com.simplemobiletools.commons.R.string.yesterday)
else -> date
}
}

View file

@ -15,4 +15,5 @@ data class DateTaken(
@ColumnInfo(name = "parent_path") var parentPath: String,
@ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "last_fixed") var lastFixed: Int,
@ColumnInfo(name = "last_modified") var lastModified: Long)
@ColumnInfo(name = "last_modified") var lastModified: Long
)

View file

@ -9,7 +9,8 @@ import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.gallery.pro.helpers.*
import java.io.File
import java.io.Serializable
import java.util.*
import java.util.Calendar
import java.util.Locale
@Entity(tableName = "media", indices = [(Index(value = ["full_path"], unique = true))])
data class Medium(

View file

@ -17,7 +17,13 @@ class SvgSoftwareLayerSetter : RequestListener<PictureDrawable> {
return false
}
override fun onResourceReady(resource: PictureDrawable, model: Any, target: Target<PictureDrawable>, dataSource: DataSource, isFirstResource: Boolean): Boolean {
override fun onResourceReady(
resource: PictureDrawable,
model: Any,
target: Target<PictureDrawable>,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
val view = (target as ImageViewTarget<*>).view
view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null)
return false

View file

@ -65,11 +65,13 @@ class EditorDrawCanvas(context: Context, attrs: AttributeSet) : View(context, at
mStartY = y
actionDown(x, y)
}
MotionEvent.ACTION_MOVE -> {
if (event.pointerCount == 1 && !mWasMultitouch) {
actionMove(x, y)
}
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> actionUp()
MotionEvent.ACTION_POINTER_DOWN -> mWasMultitouch = true
}

View file

@ -40,6 +40,7 @@ class InstantItemSwitch(context: Context, attrs: AttributeSet) : RelativeLayout(
mTouchDownY = event.rawY
mTouchDownTime = System.currentTimeMillis()
}
MotionEvent.ACTION_UP -> {
val diffX = mTouchDownX - event.rawX
val diffY = mTouchDownY - event.rawY
@ -47,6 +48,7 @@ class InstantItemSwitch(context: Context, attrs: AttributeSet) : RelativeLayout(
performClick()
}
}
MotionEvent.ACTION_MOVE -> {
if (passTouches) {
return false

View file

@ -99,6 +99,7 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
mTouchDownValue = getCurrentVolume()
}
}
MotionEvent.ACTION_MOVE -> {
val diffX = mTouchDownX - event.rawX
val diffY = mTouchDownY - event.rawY
@ -125,6 +126,7 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
}
mLastTouchY = event.rawY
}
MotionEvent.ACTION_UP -> {
if (mIsBrightnessScroll) {
mTouchDownValue = mTempBrightness

View file

@ -11,7 +11,9 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<include layout="@layout/bottom_video_time_holder"/>
<include
android:id="@+id/bottom_video_time_holder"
layout="@layout/bottom_video_time_holder"/>
<ImageView
android:id="@+id/explore"

View file

@ -46,7 +46,9 @@
android:background="@drawable/gradient_background"
tools:ignore="UnknownIdInLayout" />
<include layout="@layout/bottom_video_time_holder" />
<include
android:id="@+id/bottom_video_time_holder"
layout="@layout/bottom_video_time_holder" />
<TextView
android:id="@+id/slide_info"

View file

@ -66,7 +66,9 @@
android:visibility="gone"
tools:text="My video\nAnother line" />
<include layout="@layout/bottom_video_time_holder" />
<include
android:id="@+id/bottom_video_time_holder"
layout="@layout/bottom_video_time_holder" />
<TextView
android:id="@+id/slide_info"

View file

@ -58,6 +58,11 @@
android:showAsAction="never"
android:title="@string/create_new_folder"
app:showAsAction="never" />
<item
android:id="@+id/access_more_media"
android:showAsAction="never"
android:title="Allow access to more media"
app:showAsAction="never" />
<item
android:id="@+id/open_recycle_bin"
android:showAsAction="never"

View file

@ -1,389 +1,389 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Galerie</string>
<string name="app_launcher_name">Galerie</string>
<string name="edit">Modifier</string>
<string name="open_camera">Ouvrir l\'appareil photo</string>
<string name="hidden">(caché)</string>
<string name="excluded">(exclu)</string>
<string name="pin_folder">Épingler le dossier</string>
<string name="unpin_folder">Libérer le dossier</string>
<string name="pin_to_the_top">Épingler le dossier</string>
<string name="show_all">Affichage Dossiers</string>
<string name="all_folders">Dossiers</string>
<string name="folder_view">Affichage Galerie</string>
<string name="other_folder">Autre dossier</string>
<string name="show_on_map">Afficher sur la carte</string>
<string name="unknown_location">Position inconnue</string>
<string name="volume">Volume</string>
<string name="brightness">Luminosité</string>
<string name="lock_orientation">Verrouiller la rotation</string>
<string name="unlock_orientation">Déverrouiller la rotation</string>
<string name="change_orientation">Orientation</string>
<string name="force_portrait">Forcer la vue portrait</string>
<string name="force_landscape">Forcer la vue paysage</string>
<string name="use_default_orientation">Utiliser l\'orientation par défaut</string>
<string name="fix_date_taken">Corriger les dates de prise de vue</string>
<string name="fixing">Correction en cours…</string>
<string name="dates_fixed_successfully">Dates corrigées</string>
<string name="no_date_takens_found">Aucune date de prise de vue trouvée</string>
<string name="share_resized">Partager une version redimensionnée</string>
<string name="switch_to_file_search">Basculer vers la recherche de fichiers</string>
<string name="set_as_default_folder">Dossier par défaut</string>
<string name="unset_as_default_folder">Oublier le dossier</string>
<string name="reorder_by_dragging">Réordonner par glisser</string>
<string name="reorder_by_dragging_pro">Réordonner par glisser (Pro)</string>
<string name="restore_to_path">Restauration vers « %s »</string>
<!-- Filter -->
<string name="filter_media">Filtrer les médias</string>
<string name="images">Images</string>
<string name="videos">Vidéos</string>
<string name="gifs">GIF</string>
<string name="raw_images">Images RAW</string>
<string name="svgs">SVG</string>
<string name="portraits">Portraits</string>
<string name="no_media_with_filters">Aucun fichier média trouvé avec les filtres sélectionnés.</string>
<string name="change_filters_underlined"><u>Modifier les filtres</u></string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Cette option cache le dossier en y ajoutant un fichier .nomedia, elle cachera aussi tous les sous-dossiers. Vous pouvez afficher ces dossiers avec l\'option « Afficher les fichiers cachés » dans les paramètres. Continuer \?</string>
<string name="exclude_folder_description">La sélection sera exclue ainsi que ses sous-dossiers dans Simple Galerie uniquement. Vous pouvez gérer les dossiers exclus depuis les paramètres.</string>
<string name="exclude_folder_parent">Exclure un dossier parent \?</string>
<string name="excluded_activity_placeholder">Exclure des dossiers les cachera ainsi que leurs sous-dossiers uniquement dans Simple Galerie, ils seront toujours visibles depuis d\'autres applications.
\n
\nSi vous voulez aussi les cacher ailleurs, utilisez la fonction Cacher.</string>
<string name="hidden_folders">Dossiers cachés</string>
<string name="manage_hidden_folders">Gérer les dossiers cachés</string>
<string name="hidden_folders_placeholder">Il semblerait que vous n\'ayez pas de dossier caché par un fichier .nomedia.</string>
<string name="hidden_all_files">Vous devez accorder à l\'application l\'accès à tous les fichiers pour voir les fichiers cachés, sinon elle ne peut pas fonctionner.</string>
<string name="cant_unhide_folder">Si un dossier ou l'un de ses dossiers parents a un point avant son nom, il est caché et ne peut pas être affiché comme ceci. Vous devez supprimer le point en le renommant.</string>
<!-- Include folders -->
<string name="include_folders">Dossiers ajoutés</string>
<string name="manage_included_folders">Gérer les dossiers ajoutés</string>
<string name="add_folder">Ajouter un dossier</string>
<string name="included_activity_placeholder">Si vous avez des dossiers contenant des médias qui ne sont pas affichés dans l\'application, vous pouvez les ajouter manuellement ici.
\n
\nCet ajout n\'exclura aucun autre dossier.</string>
<string name="no_media_add_included">Aucun fichier multimédia n\'a été trouvé. Vous pouvez ajouter manuellement des dossiers contenant des fichiers multimédia.</string>
<!-- Resizing -->
<string name="resize_and_save">Redimensionner la sélection et enregistrer</string>
<string name="width">Largeur</string>
<string name="height">Hauteur</string>
<string name="keep_aspect_ratio">Conserver le rapport d\'affichage</string>
<string name="invalid_values">Veuillez entrer une résolution valide</string>
<string name="resize_multiple_images">Redimensionner plusieurs images</string>
<string name="resize_factor">Facteur de redimensionnement</string>
<string name="resize_factor_info">Redimensionner les images au pourcentage donné, la valeur doit être comprise entre 10 et 90.</string>
<string name="resize_factor_error">Entrer un nombre entre 10 et 90</string>
<plurals name="failed_to_resize_images">
<item quantity="one">Échec de redimensionnement de %d image</item>
<item quantity="many">Échec de redimensionnement de %d images</item>
<item quantity="other">Échec de redimensionnement de %d images</item>
</plurals>
<string name="images_resized_successfully">Les images ont été redimensionnées avec succès</string>
<!-- Editor -->
<string name="editor">Éditeur</string>
<string name="basic_editor">Éditeur simple</string>
<string name="advanced_editor">Éditeur avancé</string>
<string name="rotate">Pivoter</string>
<string name="invalid_image_path">Emplacement d\'image invalide</string>
<string name="invalid_video_path">Emplacement de vidéo invalide</string>
<string name="image_editing_failed">L\'édition de l\'image a échoué</string>
<string name="video_editing_failed">L\'édition de la vidéo a échoué</string>
<string name="image_editing_cancelled">L\'édition de l\'image a été annulée</string>
<string name="video_editing_cancelled">L\'édition de la vidéo a été annulée</string>
<string name="file_edited_successfully">Le fichier a été édité avec succès</string>
<string name="image_edited_successfully">L\'image a été éditée avec succès</string>
<string name="video_edited_successfully">La vidéo a été éditée avec succès</string>
<string name="edit_image_with">Modifier l\'image avec :</string>
<string name="edit_video_with">Modifier la vidéo avec :</string>
<string name="no_image_editor_found">Aucun éditeur d\'image trouvé</string>
<string name="no_video_editor_found">Aucun éditeur de vidéo trouvé</string>
<string name="unknown_file_location">Emplacement du fichier inconnu</string>
<string name="error_saving_file">Impossible de remplacer le fichier source</string>
<string name="rotate_left">Pivoter à gauche</string>
<string name="rotate_right">Pivoter à droite</string>
<string name="rotate_one_eighty">Pivoter à 180º</string>
<string name="transform">Transformer</string>
<string name="crop">Rogner</string>
<string name="draw">Dessiner</string>
<string name="flip">Retourner</string>
<string name="flip_horizontally">Retourner horizontalement</string>
<string name="flip_vertically">Retourner verticalement</string>
<string name="free_aspect_ratio">Libre</string>
<!-- available as an option: 1:1, 4:3, 16:9, free -->
<string name="other_aspect_ratio">Autre</string>
<!-- available as an option: 1:1, 4:3, 16:9, free, other -->
<!-- Set wallpaper -->
<string name="simple_wallpaper">Fond d\'écran simple</string>
<string name="set_as_wallpaper">Définir comme fond d\'écran</string>
<string name="set_as_wallpaper_failed">Échec de la définition en tant que fond d\'écran</string>
<string name="set_as_wallpaper_with">Définir comme fond d\'écran avec :</string>
<string name="setting_wallpaper">Définition du fond d\'écran en cours…</string>
<string name="wallpaper_set_successfully">Fond d\'écran défini</string>
<string name="portrait_aspect_ratio">Rapport d\'affichage portrait</string>
<string name="landscape_aspect_ratio">Rapport d\'affichage paysage</string>
<string name="home_screen">Écran d\'accueil</string>
<string name="lock_screen">Écran de déverrouillage</string>
<string name="home_and_lock_screen">Écran d\'accueil et écran de déverrouillage</string>
<string name="allow_changing_aspect_ratio">Autoriser la modification du rapport d\'aspect</string>
<!-- Slideshow -->
<string name="slideshow">Diaporama</string>
<string name="interval">Intervalle</string>
<string name="include_photos">Inclure les images</string>
<string name="include_videos">Inclure les vidéos</string>
<string name="include_gifs">Inclure les GIF</string>
<string name="random_order">Ordre aléatoire</string>
<string name="move_backwards">Défilement inversé</string>
<string name="loop_slideshow">Diaporama en boucle</string>
<string name="animation">Animation</string>
<string name="no_animation">Aucune</string>
<string name="fade">Fondu</string>
<string name="slide">Glissement</string>
<string name="slideshow_ended">Diaporama terminé</string>
<string name="no_media_for_slideshow">Aucun média trouvé pour le diaporama</string>
<!-- View types -->
<string name="group_direct_subfolders">Mode sous-dossiers</string>
<!-- Grouping at media thumbnails -->
<string name="group_by">Grouper par</string>
<string name="do_not_group_files">Ne pas grouper les fichiers</string>
<string name="by_folder">Dossier</string>
<string name="by_last_modified">Date de modification</string>
<string name="by_last_modified_daily">Date de modification (par jour)</string>
<string name="by_last_modified_monthly">Date de modification (par mois)</string>
<string name="by_date_taken">Date de prise de vue</string>
<string name="by_date_taken_daily">Date de prise de vue (par jour)</string>
<string name="by_date_taken_monthly">Date de prise de vue (par mois)</string>
<string name="by_file_type">Type de fichier</string>
<string name="by_extension">Extension</string>
<string name="show_file_count_section_header">Afficher le nombre d\'éléments dans les entêtes</string>
<string name="grouping_and_sorting">Grouper par et Trier par sont deux modes indépendants</string>
<!-- Widgets -->
<string name="folder_on_widget">Dossier affiché dans le widget :</string>
<string name="show_folder_name">Afficher le nom du dossier</string>
<!-- Settings -->
<string name="autoplay_videos">Lecture automatique des vidéos</string>
<string name="remember_last_video_position">Mémoriser la position de lecture des vidéos</string>
<string name="loop_videos">Lecture en boucle des vidéos</string>
<string name="animate_gifs">Animer les miniatures des GIF</string>
<string name="max_brightness">Luminosité maximale</string>
<string name="crop_thumbnails">Recadrer les miniatures en carré</string>
<string name="show_thumbnail_video_duration">Afficher la durée des vidéos</string>
<string name="screen_rotation_by">Orientation de l\'affichage</string>
<string name="screen_rotation_system_setting">Paramètres système</string>
<string name="screen_rotation_device_rotation">Rotation de l\'appareil</string>
<string name="screen_rotation_aspect_ratio">Rapport d\'affichage</string>
<string name="black_background_at_fullscreen">Arrière-plan et barre d\'état noirs</string>
<string name="scroll_thumbnails_horizontally">Défiler les miniatures horizontalement</string>
<string name="hide_system_ui_at_fullscreen">Masquer automatiquement l\'interface utilisateur</string>
<string name="delete_empty_folders">Supprimer les dossiers vides après avoir supprimé leur contenu</string>
<string name="allow_photo_gestures">Contrôler la luminosité des images par gestes verticaux</string>
<string name="allow_video_gestures">Contrôler le volume et la luminosité des vidéos avec des gestes verticaux</string>
<string name="show_media_count">Afficher le nombre de fichiers des dossiers</string>
<string name="show_extended_details">Afficher les informations supplémentaires du média en plein écran</string>
<string name="manage_extended_details">Gérer les informations supplémentaires</string>
<string name="one_finger_zoom">Activer les zoom à un doigt sur les images en plein écran</string>
<string name="allow_instant_change">Appuyer sur les cotés de l\'écran pour changer instantanément de média</string>
<string name="allow_deep_zooming_images">Activer les options de zoom avancées</string>
<string name="hide_extended_details">Cacher les informations supplémentaires si la barre d\'état est masquée</string>
<string name="show_at_bottom">Afficher les boutons d\'action</string>
<string name="show_recycle_bin">Afficher la corbeille en affichage Galerie</string>
<string name="deep_zoomable_images">Niveau de zoom</string>
<string name="show_highest_quality">Afficher les images dans la meilleure qualité possible</string>
<string name="show_recycle_bin_last">Afficher la corbeille en fin de liste sur l\'écran principal</string>
<string name="allow_down_gesture">Fermer la vue plein écran par un geste vers le bas</string>
<string name="allow_one_to_one_zoom">Permettre un zoom avant 1:1 par double appui</string>
<string name="open_videos_on_separate_screen">Ouvrir les vidéos dans une application externe</string>
<string name="show_notch">Afficher une encoche si disponible</string>
<string name="allow_rotating_gestures">Pivoter les images par gestes</string>
<string name="file_loading_priority">Priorité de chargement des fichiers</string>
<string name="speed">Rapide</string>
<string name="compromise">Compromis</string>
<string name="avoid_showing_invalid_files">Éviter l\'affichage de fichiers invalides</string>
<string name="show_image_file_types">Afficher les types d\'image</string>
<string name="allow_zooming_videos">Zoomer les vidéos par un double appui</string>
<string name="folder_thumbnail_style">Style des miniatures des dossiers</string>
<string name="file_thumbnail_style">Style des miniatures des fichiers</string>
<string name="mark_favorite_items">Marquer les éléments favoris</string>
<string name="thumbnail_spacing">Espacement des miniatures</string>
<string name="show_file_count_line">Afficher le nombre de fichiers sur une autre ligne</string>
<string name="show_file_count_brackets">Afficher le nombre de fichiers entre parenthèses</string>
<string name="show_file_count_none">Ne pas afficher le nombre de fichiers</string>
<string name="limit_folder_title">Limiter à une ligne les noms de fichiers</string>
<string name="square">Carré</string>
<string name="rounded_corners">Arrondi</string>
<string name="export_favorite_paths">Exporter les favoris</string>
<string name="import_favorite_paths">Importer les favoris</string>
<string name="paths_imported_successfully">Favoris importés</string>
<string name="media_management_prompt">Pour vous assurer que toutes les opérations de fichiers fonctionnent de manière fiable, veuillez faire de cette application l\'application de gestion des médias dans les paramètres de votre appareil.</string>
<string name="password_protect_excluded">Protection par mot de passe de la visibilité des dossiers exclus</string>
<string name="media_management_manual">Quelque chose s\'est mal passé, veuillez aller dans les paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autorisez cette application à gérer les médias.</string>
<string name="media_management_note">Si la redirection ne fonctionne pas, allez dans les paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autorisez cette application à gérer les médias.</string>
<string name="media_management_alternative">Si vous ne voulez pas le faire, vous pouvez aussi aller dans les Paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autoriser cette application à gérer les médias.</string>
<string name="alternative_media_access">Vous pouvez également n\'autoriser que l\'accès aux fichiers multimédias. Dans ce cas, vous ne pourrez cependant pas travailler avec les fichiers cachés.</string>
<string name="media_only">Médias uniquement</string>
<string name="all_files">Tous les fichiers</string>
<string name="search_all_files">Rechercher des fichiers au lieu des dossiers sur l\'écran principal</string>
<string name="show_all_folders">Afficher un bouton de menu pour afficher rapidement le contenu de tous les dossiers</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatures</string>
<string name="fullscreen_media">Plein écran</string>
<string name="extended_details">Détails supplémentaires</string>
<string name="bottom_actions">Barre d\'actions</string>
<!-- Bottom actions -->
<string name="manage_bottom_actions">Gérer la barre d\'actions</string>
<string name="toggle_favorite">Activer/désactiver le favori</string>
<string name="toggle_file_visibility">Visibilité du fichier</string>
<!-- New editor strings -->
<string name="pesdk_transform_button_freeCrop">Libre</string>
<string name="pesdk_transform_button_resetCrop">Réinitialiser</string>
<string name="pesdk_transform_button_squareCrop">Carré</string>
<string name="pesdk_transform_title_name">Transformer</string>
<string name="pesdk_filter_title_name">Filtres</string>
<string name="pesdk_filter_asset_none">Aucun</string>
<string name="pesdk_adjustments_title_name">Ajuster</string>
<string name="pesdk_adjustments_button_shadowTool">Ombres</string>
<string name="pesdk_adjustments_button_exposureTool">Exposition</string>
<string name="pesdk_adjustments_button_highlightTool">Détails</string>
<string name="pesdk_adjustments_button_brightnessTool">Luminosité</string>
<string name="pesdk_adjustments_button_contrastTool">Contraste</string>
<string name="pesdk_adjustments_button_saturationTool">Saturation</string>
<string name="pesdk_adjustments_button_clarityTool">Clarté</string>
<string name="pesdk_adjustments_button_gammaTool">Gamma</string>
<string name="pesdk_adjustments_button_blacksTool">Noirs</string>
<string name="pesdk_adjustments_button_whitesTool">Blancs</string>
<string name="pesdk_adjustments_button_temperatureTool">Température</string>
<string name="pesdk_adjustments_button_sharpnessTool">Netteté</string>
<string name="pesdk_adjustments_button_reset">Réinitialiser</string>
<string name="pesdk_focus_title_name">Floutage</string>
<string name="pesdk_focus_title_disabled">Aucun</string>
<string name="pesdk_focus_button_radial">Radial</string>
<string name="pesdk_focus_button_linear">Linéaire</string>
<string name="pesdk_focus_button_mirrored">Miroir</string>
<string name="pesdk_focus_button_gaussian">Gaussien</string>
<string name="pesdk_text_title_input">Ajouter un texte</string>
<string name="pesdk_text_title_name">Texte</string>
<string name="pesdk_text_title_options">Options du texte</string>
<string name="pesdk_text_title_textColor">Couleur du texte</string>
<string name="pesdk_text_title_font">Police</string>
<string name="pesdk_text_button_add">Ajouter</string>
<string name="pesdk_text_button_edit">Éditer</string>
<string name="pesdk_text_button_straighten">Redresser</string>
<string name="pesdk_text_button_font">Police</string>
<string name="pesdk_text_button_color">Couleur</string>
<string name="pesdk_text_button_backgroundColor">Fond</string>
<string name="pesdk_text_button_alignment">Alignement</string>
<string name="pesdk_text_button_bringToFront">Devant</string>
<string name="pesdk_text_button_delete">Supprimer</string>
<string name="pesdk_text_text_editTextPlaceholder">Votre texte</string>
<string name="pesdk_brush_title_name">Pinceau</string>
<string name="pesdk_brush_button_color">Couleur</string>
<string name="pesdk_brush_button_size">Taille</string>
<string name="pesdk_brush_button_hardness">Contour</string>
<string name="pesdk_brush_button_bringToFront">Devant</string>
<string name="pesdk_brush_button_delete">Supprimer</string>
<string name="pesdk_brush_title_brushColor">Couleur du pinceau</string>
<string name="pesdk_editor_title_name">Éditeur</string>
<string name="pesdk_editor_title_closeEditorAlert">Fermer l\'éditeur \?</string>
<string name="pesdk_editor_text_closeEditorAlert">Voulez-vous vraiment abandonner les modifications \?</string>
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Oui</string>
<string name="pesdk_editor_button_closeEditorAlertCancelation">Non</string>
<string name="pesdk_editor_cancel">Annuler</string>
<string name="pesdk_editor_accept">Accepter</string>
<string name="pesdk_editor_save">Enregistrer</string>
<string name="pesdk_editor_text_exportProgressUnknown">Exportation…</string>
<string name="pesdk_editor_text_exportProgress" formatted="false">Exportation %s</string>
<string name="pesdk_sticker_title_name">Autocollant</string>
<string name="pesdk_sticker_title_color">Couleur de l\'autocollant</string>
<string name="pesdk_sticker_title_options">Options de l\'autocollant</string>
<string name="pesdk_sticker_button_add">Ajouter</string>
<string name="pesdk_sticker_button_color">Couleur</string>
<string name="pesdk_sticker_button_delete">Supprimer</string>
<string name="pesdk_sticker_button_bringToFront">Devant</string>
<string name="pesdk_sticker_button_straighten">Redresser</string>
<string name="pesdk_sticker_button_replace">Remplacer</string>
<string name="pesdk_sticker_button_opacity">Transparence</string>
<string name="pesdk_sticker_button_contrast">Contraste</string>
<string name="pesdk_sticker_button_saturation">Saturation</string>
<string name="pesdk_sticker_button_brightness">Luminosité</string>
<string name="pesdk_sticker_category_name_custom">Téléversements</string>
<string name="pesdk_overlay_title_name">Superposition</string>
<string name="pesdk_overlay_button_blendModeNormal">Normal</string>
<string name="pesdk_overlay_button_blendModeDarken">Assombrir</string>
<string name="pesdk_overlay_button_blendModeScreen">Écran</string>
<string name="pesdk_overlay_button_blendModeOverlay">Recouvrir</string>
<string name="pesdk_overlay_button_blendModeLighten">Alléger</string>
<string name="pesdk_overlay_button_blendModeMultiply">Dupliquer</string>
<string name="pesdk_overlay_button_blendModeColorBurn">Brûlure de couleur</string>
<string name="pesdk_overlay_button_blendModeSoftLight">Lumière douce</string>
<string name="pesdk_overlay_button_blendModeHardLight">Lumière forte</string>
<string name="pesdk_overlay_asset_none">Aucune</string>
<string name="pesdk_overlay_asset_golden">Doré</string>
<string name="pesdk_overlay_asset_lightleak1">Fuite légère 1</string>
<string name="pesdk_overlay_asset_mosaic">Mosaïque</string>
<string name="pesdk_overlay_asset_paper">Papier</string>
<string name="pesdk_overlay_asset_rain">Pluie</string>
<string name="pesdk_overlay_asset_vintage">Vintage</string>
<string name="pesdk_common_button_flipH">Symétrie H</string>
<string name="pesdk_common_button_flipV">Symétrie V</string>
<string name="pesdk_common_button_undo">Annuler</string>
<string name="pesdk_common_button_redo">Refaire</string>
<string name="pesdk_common_title_colorPicker">Sélecteur de couleur</string>
<string name="pesdk_common_title_transparentColor">Transparent</string>
<string name="pesdk_common_title_whiteColor">Blanc</string>
<string name="pesdk_common_title_grayColor">Gris</string>
<string name="pesdk_common_title_blackColor">Noir</string>
<string name="pesdk_common_title_lightBlueColor">Bleu clair</string>
<string name="pesdk_common_title_blueColor">Bleu</string>
<string name="pesdk_common_title_purpleColor">Violet</string>
<string name="pesdk_common_title_orchidColor">Orchidée</string>
<string name="pesdk_common_title_pinkColor">Rose</string>
<string name="pesdk_common_title_redColor">Rouge</string>
<string name="pesdk_common_title_orangeColor">Orange</string>
<string name="pesdk_common_title_goldColor">Or</string>
<string name="pesdk_common_title_yellowColor">Jaune</string>
<string name="pesdk_common_title_oliveColor">Olive</string>
<string name="pesdk_common_title_greenColor">Vert</string>
<string name="pesdk_common_title_aquamarinColor">Aquamarin</string>
<string name="pesdk_common_title_pipettableColor">Couleur de la pipette</string>
<string name="vesdk_video_trim_title_name">Couper</string>
<!-- FAQ -->
<string name="faq_1_title">Comment faire de Simple Galerie ma galerie par défaut \?</string>
<string name="faq_1_text">Il faut dans un premier temps, trouver l\'application Galerie par défaut dans la section Applications des paramètres de l\'appareil, puis appuyer sur « Ouvrir par défaut », et enfin sélectionner « Réinitialiser les paramètres par défaut ». La prochaine fois que vous ouvrirez une image ou une vidéo, il vous sera proposé de choisir une application, choisissez Simple Galerie puis « Toujours ».</string>
<string name="faq_2_title">J\'ai verrouillé l\'application avec un mot de passe et je ne m\'en rappelle plus. Que faire \?</string>
<string name="faq_2_text">Il y a deux façons de procéder. Soit vous réinstallez l\'application, soit vous recherchez l\'application dans les paramètres de l\'appareil et appuyez sur « Effacer les données ». Ceci réinitialisera seulement les paramètres de l\'application et ne supprimera pas vos fichiers.</string>
<string name="faq_3_title">Comment faire pour qu\'un dossier soit toujours affiché tout en haut \?</string>
<string name="faq_3_text">Vous devez simplement effectuer un appui prolongé sur le dossier en question et choisir « Épingler en haut » dans le menu d\'actions. Vous pouvez en épingler plusieurs. Les éléments épinglés seront alors triés selon l\'ordre par défaut.</string>
<string name="faq_4_title">Comment avancer rapidement dans les vidéos \?</string>
<string name="faq_4_text">Appuyez deux fois sur le côté de l\'écran, ou appuyez sur la valeur de durée actuelle ou maximale près de la barre de recherche. Si vous activez l\'ouverture des vidéos sur un écran séparé dans les paramètres de l\'application, vous pouvez également utiliser des gestes horizontaux.</string>
<string name="faq_5_title">Quelle est la différence entre cacher et exclure un dossier \?</string>
<string name="faq_5_text">Exclure un dossier permet de ne pas l\'afficher uniquement dans Simple Galerie, alors que cacher un dossier rend le dossier invisible sur l\'ensemble de l\'appareil, y compris pour les autres applications de galerie. Dans le dernier cas, un fichier .nomedia est créé dans le dossier caché, et peut être supprimé avec n\'importe quel explorateur de fichiers. Notez que certains appareils ne permettent pas de masquer certains dossiers tels qu\'Appareil photo, Captures d\'écran et Téléchargements.</string>
<string name="faq_6_title">Pourquoi des dossiers avec des pochettes d\'albums musicaux ou des miniatures d\'images sont affichés \?</string>
<string name="faq_6_text">Il est possible que des dossiers qui ne devraient pas être affichés le soient. Vous pouvez les exclure facilement en les sélectionnant par un appui prolongé, puis en choisissant l\'option « Exclure le dossier », après quoi vous pouvez aussi sélectionner le dossier parent, ce qui devrait éviter l\'apparition de dossiers similaires.</string>
<string name="faq_7_title">Un dossier avec des images n\'apparaît pas. Que faire \?</string>
<string name="faq_7_text">Cela peut arriver pour de multiples raisons, mais c\'est facile à résoudre. Allez dans Paramètres, puis Gérer les dossiers ajoutés, appuyez sur + et sélectionnez le dossier voulu.</string>
<string name="faq_8_title">Comment faire apparaître uniquement certains dossiers \?</string>
<string name="faq_8_text">Ajouter un dossier dans les « Dossiers ajoutés » rend visible l\'ensemble du contenu du dossier. Pour exclure certains dossiers, il faut aller dans Paramètres, puis « Gérer les dossiers exclus », exclure le dossier racine /, puis ajouter les dossiers souhaités dans « Paramètres », puis « Gérer les dossiers ajoutés ». Seuls les dossiers sélectionnés seront visibles, du fait que les exclusions et inclusions sont récursives, et si un dossier est à la fois exclus et inclus, il sera affiché.</string>
<string name="faq_10_title">Puis-je recadrer des images avec cette application \?</string>
<string name="faq_10_text">Oui, vous pouvez recadrer les images dans l\'éditeur en faisant glisser les coins de l\'image. Vous pouvez accéder à l\'éditeur en appuyant longuement sur une vignette d\'image et en sélectionnant « Modifier », ou en sélectionnant « Modifier » en mode plein écran.</string>
<string name="faq_11_title">Puis-je regrouper les miniatures des fichiers multimédias \?</string>
<string name="faq_11_text">Bien sûr, il vous suffit d\'utiliser l\'option de menu « Grouper par » lorsque vous êtes dans l\'affichage des miniatures. Vous pouvez regrouper les fichiers selon plusieurs critères, y compris la date de prise de vue. Si vous utilisez la fonction « Afficher tous les contenus », vous pouvez également les regrouper par dossier.</string>
<string name="faq_12_title">Le tri par date de prise de vue ne semble pas fonctionner correctement, comment puis-je le corriger \?</string>
<string name="faq_12_text">Cela est probablement dû au fait que les fichiers ont été copiés depuis quelque part. Vous pouvez corriger cela en sélectionnant les miniatures de fichier et en sélectionnant « Corriger les dates de prise de vue ».</string>
<string name="faq_13_title">Je vois des bandes de couleurs sur les images. Comment puis-je améliorer la qualité \?</string>
<string name="faq_13_text">La solution actuelle d\'affichage des images fonctionne bien dans la grande majorité des cas, mais si vous voulez une qualité d\'image encore meilleure, vous pouvez activer l\'option « Afficher les images dans la meilleure qualité possible » dans la section « Niveau de zoom » des paramètres de l\'application.</string>
<string name="faq_14_title">J\'ai caché un fichier ou un dossier. Comment puis-je en rétablir l\'affichage \?</string>
<string name="faq_14_text">Vous pouvez soit appuyer sur l\'option « Afficher les fichiers cachés » du menu de l\'écran principal, ou appuyer sur le bouton « Afficher les fichiers cachés » dans les paramètres de l\'application. Si vous voulez rétablir leur affichage, effectuez un appui prolongé dessus et appuyez sur le symbole « Œil » permettant l\'affichage. Les dossiers sont cachés en ajoutant un fichier .nomedia à leur racine, vous pouvez également supprimer ce fichier avec n\'importe quel explorateur de fichiers. Notez que le masquage fonctionne de manière récursive, donc si vous masquez un dossier, tous les sous-dossiers seront également masqués. Donc, pour afficher les sous-dossiers, vous devez afficher le dossier parent.</string>
<string name="faq_15_title">Pourquoi l\'application prend-elle tant de place \?</string>
<string name="faq_15_text">Le cache d\'application peut prendre jusqu\'à 250 Mo pour accélérer le chargement des images. Si l\'application occupe encore plus d\'espace, c\'est probablement parce que vous avez des éléments dans la corbeille. Ces fichiers comptent pour la taille de l\'application. Vous pouvez vider la corbeille en l\'ouvrant et en supprimant tous les fichiers ou à partir des paramètres de l\'application. Chaque fichier de la corbeille est automatiquement supprimé après 30 jours.</string>
<string name="faq_16_title">Qu\'est ce qui se passe avec les fichiers et dossiers cachés et pourquoi je ne peux plus les voir \?</string>
<string name="faq_16_text">À partir d\'Android 11, vous ne pouvez plus masquer ou démasquer des fichiers ou des dossiers, et vous ne pouvez pas non plus voir ceux qui sont masqués dans les applications de la galerie. Vous devrez utiliser un gestionnaire de fichiers pour cela.</string>
<string name="faq_16_text_extra">Vous pouvez également accorder à cette galerie l\'accès à tous les fichiers via les paramètres de votre appareil, ce qui nous permettra de montrer les éléments cachés et de rendre les opérations sur les fichiers plus fiables en général.</string>
<string name="faq_17_title">Pourquoi je ne peux plus inclure des dossiers manquants \?</string>
<string name="faq_17_text">Cette fonctionnalité ne fonctionne plus en raison des modifications apportées au système avec Android 11. L\'application ne peut plus parcourir les dossiers réels, elle s\'appuie sur le MediaStore pour récupérer les données.</string>
<string name="faq_18_title">Pourquoi des publicités apparaissent pendant la lecture d\'une vidéo \?</string>
<string name="faq_18_text">Nos applications ne comportent aucune publicité. Si vous en voyez pendant la lecture d\'une vidéo, vous devez sûrement utiliser le lecteur vidéo d\'une autre application. Essayez de trouver le lecteur vidéo par défaut dans les paramètres de votre appareil, puis faites « Supprimer les valeurs par défaut ». Lors du prochain lancement d\'une vidéo, une invite de sélection d\'application s\'affichera, et vous pourrez choisir l\'application que vous souhaitez utiliser.</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
<!-- <string name="app_name">&lt;!&ndash;Simple Galerie&ndash;&gt;</string>-->
<!-- <string name="app_launcher_name">Galerie</string>-->
<!-- <string name="edit">Modifier</string>-->
<!-- <string name="open_camera">Ouvrir l\'appareil photo</string>-->
<!-- <string name="hidden">(caché)</string>-->
<!-- <string name="excluded">(exclu)</string>-->
<!-- <string name="pin_folder">Épingler le dossier</string>-->
<!-- <string name="unpin_folder">Libérer le dossier</string>-->
<!-- <string name="pin_to_the_top">Épingler le dossier</string>-->
<!-- <string name="show_all">Affichage Dossiers</string>-->
<!-- <string name="all_folders">Dossiers</string>-->
<!-- <string name="folder_view">Affichage Galerie</string>-->
<!-- <string name="other_folder">Autre dossier</string>-->
<!-- <string name="show_on_map">Afficher sur la carte</string>-->
<!-- <string name="unknown_location">Position inconnue</string>-->
<!-- <string name="volume">Volume</string>-->
<!-- <string name="brightness">Luminosité</string>-->
<!-- <string name="lock_orientation">Verrouiller la rotation</string>-->
<!-- <string name="unlock_orientation">Déverrouiller la rotation</string>-->
<!-- <string name="change_orientation">Orientation</string>-->
<!-- <string name="force_portrait">Forcer la vue portrait</string>-->
<!-- <string name="force_landscape">Forcer la vue paysage</string>-->
<!-- <string name="use_default_orientation">Utiliser l\'orientation par défaut</string>-->
<!-- <string name="fix_date_taken">Corriger les dates de prise de vue</string>-->
<!-- <string name="fixing">Correction en cours…</string>-->
<!-- <string name="dates_fixed_successfully">Dates corrigées</string>-->
<!-- <string name="no_date_takens_found">Aucune date de prise de vue trouvée</string>-->
<!-- <string name="share_resized">Partager une version redimensionnée</string>-->
<!-- <string name="switch_to_file_search">Basculer vers la recherche de fichiers</string>-->
<!-- <string name="set_as_default_folder">Dossier par défaut</string>-->
<!-- <string name="unset_as_default_folder">Oublier le dossier</string>-->
<!-- <string name="reorder_by_dragging">Réordonner par glisser</string>-->
<!-- <string name="reorder_by_dragging_pro">Réordonner par glisser (Pro)</string>-->
<!-- <string name="restore_to_path">Restauration vers « %s »</string>-->
<!-- &lt;!&ndash; Filter &ndash;&gt;-->
<!-- <string name="filter_media">Filtrer les médias</string>-->
<!-- <string name="images">Images</string>-->
<!-- <string name="videos">Vidéos</string>-->
<!-- <string name="gifs">GIF</string>-->
<!-- <string name="raw_images">Images RAW</string>-->
<!-- <string name="svgs">SVG</string>-->
<!-- <string name="portraits">Portraits</string>-->
<!-- <string name="no_media_with_filters">Aucun fichier média trouvé avec les filtres sélectionnés.</string>-->
<!-- <string name="change_filters_underlined"><u>Modifier les filtres</u></string>-->
<!-- &lt;!&ndash; Hide / Exclude &ndash;&gt;-->
<!-- <string name="hide_folder_description">Cette option cache le dossier en y ajoutant un fichier .nomedia, elle cachera aussi tous les sous-dossiers. Vous pouvez afficher ces dossiers avec l\'option « Afficher les fichiers cachés » dans les paramètres. Continuer \?</string>-->
<!-- <string name="exclude_folder_description">La sélection sera exclue ainsi que ses sous-dossiers dans Simple Galerie uniquement. Vous pouvez gérer les dossiers exclus depuis les paramètres.</string>-->
<!-- <string name="exclude_folder_parent">Exclure un dossier parent \?</string>-->
<!-- <string name="excluded_activity_placeholder">Exclure des dossiers les cachera ainsi que leurs sous-dossiers uniquement dans Simple Galerie, ils seront toujours visibles depuis d\'autres applications.-->
<!--\n-->
<!--\nSi vous voulez aussi les cacher ailleurs, utilisez la fonction Cacher.</string>-->
<!-- <string name="hidden_folders">Dossiers cachés</string>-->
<!-- <string name="manage_hidden_folders">Gérer les dossiers cachés</string>-->
<!-- <string name="hidden_folders_placeholder">Il semblerait que vous n\'ayez pas de dossier caché par un fichier .nomedia.</string>-->
<!-- <string name="hidden_all_files">Vous devez accorder à l\'application l\'accès à tous les fichiers pour voir les fichiers cachés, sinon elle ne peut pas fonctionner.</string>-->
<!--&lt;!&ndash; <string name="cant_unhide_folder">Si un dossier ou l'un de ses dossiers parents a un point avant son nom, il est caché et ne peut pas être affiché comme ceci. Vous devez supprimer le point en le renommant.</string>&ndash;&gt;-->
<!-- &lt;!&ndash; Include folders &ndash;&gt;-->
<!-- <string name="include_folders">Dossiers ajoutés</string>-->
<!-- <string name="manage_included_folders">Gérer les dossiers ajoutés</string>-->
<!-- <string name="add_folder">Ajouter un dossier</string>-->
<!-- <string name="included_activity_placeholder">Si vous avez des dossiers contenant des médias qui ne sont pas affichés dans l\'application, vous pouvez les ajouter manuellement ici.-->
<!--\n-->
<!--\nCet ajout n\'exclura aucun autre dossier.</string>-->
<!-- <string name="no_media_add_included">Aucun fichier multimédia n\'a été trouvé. Vous pouvez ajouter manuellement des dossiers contenant des fichiers multimédia.</string>-->
<!-- &lt;!&ndash; Resizing &ndash;&gt;-->
<!-- <string name="resize_and_save">Redimensionner la sélection et enregistrer</string>-->
<!-- <string name="width">Largeur</string>-->
<!-- <string name="height">Hauteur</string>-->
<!-- <string name="keep_aspect_ratio">Conserver le rapport d\'affichage</string>-->
<!-- <string name="invalid_values">Veuillez entrer une résolution valide</string>-->
<!-- <string name="resize_multiple_images">Redimensionner plusieurs images</string>-->
<!-- <string name="resize_factor">Facteur de redimensionnement</string>-->
<!-- <string name="resize_factor_info">Redimensionner les images au pourcentage donné, la valeur doit être comprise entre 10 et 90.</string>-->
<!-- <string name="resize_factor_error">Entrer un nombre entre 10 et 90</string>-->
<!-- <plurals name="failed_to_resize_images">-->
<!-- <item quantity="one">Échec de redimensionnement de %d image</item>-->
<!-- <item quantity="many">Échec de redimensionnement de %d images</item>-->
<!-- <item quantity="other">Échec de redimensionnement de %d images</item>-->
<!-- </plurals>-->
<!-- <string name="images_resized_successfully">Les images ont été redimensionnées avec succès</string>-->
<!-- &lt;!&ndash; Editor &ndash;&gt;-->
<!-- <string name="editor">Éditeur</string>-->
<!-- <string name="basic_editor">Éditeur simple</string>-->
<!-- <string name="advanced_editor">Éditeur avancé</string>-->
<!-- <string name="rotate">Pivoter</string>-->
<!-- <string name="invalid_image_path">Emplacement d\'image invalide</string>-->
<!-- <string name="invalid_video_path">Emplacement de vidéo invalide</string>-->
<!-- <string name="image_editing_failed">L\'édition de l\'image a échoué</string>-->
<!-- <string name="video_editing_failed">L\'édition de la vidéo a échoué</string>-->
<!-- <string name="image_editing_cancelled">L\'édition de l\'image a été annulée</string>-->
<!-- <string name="video_editing_cancelled">L\'édition de la vidéo a été annulée</string>-->
<!-- <string name="file_edited_successfully">Le fichier a été édité avec succès</string>-->
<!-- <string name="image_edited_successfully">L\'image a été éditée avec succès</string>-->
<!-- <string name="video_edited_successfully">La vidéo a été éditée avec succès</string>-->
<!-- <string name="edit_image_with">Modifier l\'image avec :</string>-->
<!-- <string name="edit_video_with">Modifier la vidéo avec :</string>-->
<!-- <string name="no_image_editor_found">Aucun éditeur d\'image trouvé</string>-->
<!-- <string name="no_video_editor_found">Aucun éditeur de vidéo trouvé</string>-->
<!-- <string name="unknown_file_location">Emplacement du fichier inconnu</string>-->
<!-- <string name="error_saving_file">Impossible de remplacer le fichier source</string>-->
<!-- <string name="rotate_left">Pivoter à gauche</string>-->
<!-- <string name="rotate_right">Pivoter à droite</string>-->
<!-- <string name="rotate_one_eighty">Pivoter à 180º</string>-->
<!-- <string name="transform">Transformer</string>-->
<!-- <string name="crop">Rogner</string>-->
<!-- <string name="draw">Dessiner</string>-->
<!-- <string name="flip">Retourner</string>-->
<!-- <string name="flip_horizontally">Retourner horizontalement</string>-->
<!-- <string name="flip_vertically">Retourner verticalement</string>-->
<!-- <string name="free_aspect_ratio">Libre</string>-->
<!-- &lt;!&ndash; available as an option: 1:1, 4:3, 16:9, free &ndash;&gt;-->
<!-- <string name="other_aspect_ratio">Autre</string>-->
<!-- &lt;!&ndash; available as an option: 1:1, 4:3, 16:9, free, other &ndash;&gt;-->
<!-- &lt;!&ndash; Set wallpaper &ndash;&gt;-->
<!-- <string name="simple_wallpaper">Fond d\'écran simple</string>-->
<!-- <string name="set_as_wallpaper">Définir comme fond d\'écran</string>-->
<!-- <string name="set_as_wallpaper_failed">Échec de la définition en tant que fond d\'écran</string>-->
<!-- <string name="set_as_wallpaper_with">Définir comme fond d\'écran avec :</string>-->
<!-- <string name="setting_wallpaper">Définition du fond d\'écran en cours…</string>-->
<!-- <string name="wallpaper_set_successfully">Fond d\'écran défini</string>-->
<!-- <string name="portrait_aspect_ratio">Rapport d\'affichage portrait</string>-->
<!-- <string name="landscape_aspect_ratio">Rapport d\'affichage paysage</string>-->
<!-- <string name="home_screen">Écran d\'accueil</string>-->
<!-- <string name="lock_screen">Écran de déverrouillage</string>-->
<!-- <string name="home_and_lock_screen">Écran d\'accueil et écran de déverrouillage</string>-->
<!-- <string name="allow_changing_aspect_ratio">Autoriser la modification du rapport d\'aspect</string>-->
<!-- &lt;!&ndash; Slideshow &ndash;&gt;-->
<!-- <string name="slideshow">Diaporama</string>-->
<!-- <string name="interval">Intervalle</string>-->
<!-- <string name="include_photos">Inclure les images</string>-->
<!-- <string name="include_videos">Inclure les vidéos</string>-->
<!-- <string name="include_gifs">Inclure les GIF</string>-->
<!-- <string name="random_order">Ordre aléatoire</string>-->
<!-- <string name="move_backwards">Défilement inversé</string>-->
<!-- <string name="loop_slideshow">Diaporama en boucle</string>-->
<!-- <string name="animation">Animation</string>-->
<!-- <string name="no_animation">Aucune</string>-->
<!-- <string name="fade">Fondu</string>-->
<!-- <string name="slide">Glissement</string>-->
<!-- <string name="slideshow_ended">Diaporama terminé</string>-->
<!-- <string name="no_media_for_slideshow">Aucun média trouvé pour le diaporama</string>-->
<!-- &lt;!&ndash; View types &ndash;&gt;-->
<!-- <string name="group_direct_subfolders">Mode sous-dossiers</string>-->
<!-- &lt;!&ndash; Grouping at media thumbnails &ndash;&gt;-->
<!-- <string name="group_by">Grouper par</string>-->
<!-- <string name="do_not_group_files">Ne pas grouper les fichiers</string>-->
<!-- <string name="by_folder">Dossier</string>-->
<!-- <string name="by_last_modified">Date de modification</string>-->
<!-- <string name="by_last_modified_daily">Date de modification (par jour)</string>-->
<!-- <string name="by_last_modified_monthly">Date de modification (par mois)</string>-->
<!-- <string name="by_date_taken">Date de prise de vue</string>-->
<!-- <string name="by_date_taken_daily">Date de prise de vue (par jour)</string>-->
<!-- <string name="by_date_taken_monthly">Date de prise de vue (par mois)</string>-->
<!-- <string name="by_file_type">Type de fichier</string>-->
<!-- <string name="by_extension">Extension</string>-->
<!-- <string name="show_file_count_section_header">Afficher le nombre d\'éléments dans les entêtes</string>-->
<!-- <string name="grouping_and_sorting">Grouper par et Trier par sont deux modes indépendants</string>-->
<!-- &lt;!&ndash; Widgets &ndash;&gt;-->
<!-- <string name="folder_on_widget">Dossier affiché dans le widget :</string>-->
<!-- <string name="show_folder_name">Afficher le nom du dossier</string>-->
<!-- &lt;!&ndash; Settings &ndash;&gt;-->
<!-- <string name="autoplay_videos">Lecture automatique des vidéos</string>-->
<!-- <string name="remember_last_video_position">Mémoriser la position de lecture des vidéos</string>-->
<!-- <string name="loop_videos">Lecture en boucle des vidéos</string>-->
<!-- <string name="animate_gifs">Animer les miniatures des GIF</string>-->
<!-- <string name="max_brightness">Luminosité maximale</string>-->
<!-- <string name="crop_thumbnails">Recadrer les miniatures en carré</string>-->
<!-- <string name="show_thumbnail_video_duration">Afficher la durée des vidéos</string>-->
<!-- <string name="screen_rotation_by">Orientation de l\'affichage</string>-->
<!-- <string name="screen_rotation_system_setting">Paramètres système</string>-->
<!-- <string name="screen_rotation_device_rotation">Rotation de l\'appareil</string>-->
<!-- <string name="screen_rotation_aspect_ratio">Rapport d\'affichage</string>-->
<!-- <string name="black_background_at_fullscreen">Arrière-plan et barre d\'état noirs</string>-->
<!-- <string name="scroll_thumbnails_horizontally">Défiler les miniatures horizontalement</string>-->
<!-- <string name="hide_system_ui_at_fullscreen">Masquer automatiquement l\'interface utilisateur</string>-->
<!-- <string name="delete_empty_folders">Supprimer les dossiers vides après avoir supprimé leur contenu</string>-->
<!-- <string name="allow_photo_gestures">Contrôler la luminosité des images par gestes verticaux</string>-->
<!-- <string name="allow_video_gestures">Contrôler le volume et la luminosité des vidéos avec des gestes verticaux</string>-->
<!-- <string name="show_media_count">Afficher le nombre de fichiers des dossiers</string>-->
<!-- <string name="show_extended_details">Afficher les informations supplémentaires du média en plein écran</string>-->
<!-- <string name="manage_extended_details">Gérer les informations supplémentaires</string>-->
<!-- <string name="one_finger_zoom">Activer les zoom à un doigt sur les images en plein écran</string>-->
<!-- <string name="allow_instant_change">Appuyer sur les cotés de l\'écran pour changer instantanément de média</string>-->
<!-- <string name="allow_deep_zooming_images">Activer les options de zoom avancées</string>-->
<!-- <string name="hide_extended_details">Cacher les informations supplémentaires si la barre d\'état est masquée</string>-->
<!-- <string name="show_at_bottom">Afficher les boutons d\'action</string>-->
<!-- <string name="show_recycle_bin">Afficher la corbeille en affichage Galerie</string>-->
<!-- <string name="deep_zoomable_images">Niveau de zoom</string>-->
<!-- <string name="show_highest_quality">Afficher les images dans la meilleure qualité possible</string>-->
<!-- <string name="show_recycle_bin_last">Afficher la corbeille en fin de liste sur l\'écran principal</string>-->
<!-- <string name="allow_down_gesture">Fermer la vue plein écran par un geste vers le bas</string>-->
<!-- <string name="allow_one_to_one_zoom">Permettre un zoom avant 1:1 par double appui</string>-->
<!-- <string name="open_videos_on_separate_screen">Ouvrir les vidéos dans une application externe</string>-->
<!-- <string name="show_notch">Afficher une encoche si disponible</string>-->
<!-- <string name="allow_rotating_gestures">Pivoter les images par gestes</string>-->
<!-- <string name="file_loading_priority">Priorité de chargement des fichiers</string>-->
<!-- <string name="speed">Rapide</string>-->
<!-- <string name="compromise">Compromis</string>-->
<!-- <string name="avoid_showing_invalid_files">Éviter l\'affichage de fichiers invalides</string>-->
<!-- <string name="show_image_file_types">Afficher les types d\'image</string>-->
<!-- <string name="allow_zooming_videos">Zoomer les vidéos par un double appui</string>-->
<!-- <string name="folder_thumbnail_style">Style des miniatures des dossiers</string>-->
<!-- <string name="file_thumbnail_style">Style des miniatures des fichiers</string>-->
<!-- <string name="mark_favorite_items">Marquer les éléments favoris</string>-->
<!-- <string name="thumbnail_spacing">Espacement des miniatures</string>-->
<!-- <string name="show_file_count_line">Afficher le nombre de fichiers sur une autre ligne</string>-->
<!-- <string name="show_file_count_brackets">Afficher le nombre de fichiers entre parenthèses</string>-->
<!-- <string name="show_file_count_none">Ne pas afficher le nombre de fichiers</string>-->
<!-- <string name="limit_folder_title">Limiter à une ligne les noms de fichiers</string>-->
<!-- <string name="square">Carré</string>-->
<!-- <string name="rounded_corners">Arrondi</string>-->
<!-- <string name="export_favorite_paths">Exporter les favoris</string>-->
<!-- <string name="import_favorite_paths">Importer les favoris</string>-->
<!-- <string name="paths_imported_successfully">Favoris importés</string>-->
<!-- <string name="media_management_prompt">Pour vous assurer que toutes les opérations de fichiers fonctionnent de manière fiable, veuillez faire de cette application l\'application de gestion des médias dans les paramètres de votre appareil.</string>-->
<!-- <string name="password_protect_excluded">Protection par mot de passe de la visibilité des dossiers exclus</string>-->
<!-- <string name="media_management_manual">Quelque chose s\'est mal passé, veuillez aller dans les paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autorisez cette application à gérer les médias.</string>-->
<!-- <string name="media_management_note">Si la redirection ne fonctionne pas, allez dans les paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autorisez cette application à gérer les médias.</string>-->
<!-- <string name="media_management_alternative">Si vous ne voulez pas le faire, vous pouvez aussi aller dans les Paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autoriser cette application à gérer les médias.</string>-->
<!-- <string name="alternative_media_access">Vous pouvez également n\'autoriser que l\'accès aux fichiers multimédias. Dans ce cas, vous ne pourrez cependant pas travailler avec les fichiers cachés.</string>-->
<!-- <string name="media_only">Médias uniquement</string>-->
<!-- <string name="all_files">Tous les fichiers</string>-->
<!-- <string name="search_all_files">Rechercher des fichiers au lieu des dossiers sur l\'écran principal</string>-->
<!-- <string name="show_all_folders">Afficher un bouton de menu pour afficher rapidement le contenu de tous les dossiers</string>-->
<!-- &lt;!&ndash; Setting sections &ndash;&gt;-->
<!-- <string name="thumbnails">Miniatures</string>-->
<!-- <string name="fullscreen_media">Plein écran</string>-->
<!-- <string name="extended_details">Détails supplémentaires</string>-->
<!-- <string name="bottom_actions">Barre d\'actions</string>-->
<!-- &lt;!&ndash; Bottom actions &ndash;&gt;-->
<!-- <string name="manage_bottom_actions">Gérer la barre d\'actions</string>-->
<!-- <string name="toggle_favorite">Activer/désactiver le favori</string>-->
<!-- <string name="toggle_file_visibility">Visibilité du fichier</string>-->
<!-- &lt;!&ndash; New editor strings &ndash;&gt;-->
<!-- <string name="pesdk_transform_button_freeCrop">Libre</string>-->
<!-- <string name="pesdk_transform_button_resetCrop">Réinitialiser</string>-->
<!-- <string name="pesdk_transform_button_squareCrop">Carré</string>-->
<!-- <string name="pesdk_transform_title_name">Transformer</string>-->
<!-- <string name="pesdk_filter_title_name">Filtres</string>-->
<!-- <string name="pesdk_filter_asset_none">Aucun</string>-->
<!-- <string name="pesdk_adjustments_title_name">Ajuster</string>-->
<!-- <string name="pesdk_adjustments_button_shadowTool">Ombres</string>-->
<!-- <string name="pesdk_adjustments_button_exposureTool">Exposition</string>-->
<!-- <string name="pesdk_adjustments_button_highlightTool">Détails</string>-->
<!-- <string name="pesdk_adjustments_button_brightnessTool">Luminosité</string>-->
<!-- <string name="pesdk_adjustments_button_contrastTool">Contraste</string>-->
<!-- <string name="pesdk_adjustments_button_saturationTool">Saturation</string>-->
<!-- <string name="pesdk_adjustments_button_clarityTool">Clarté</string>-->
<!-- <string name="pesdk_adjustments_button_gammaTool">Gamma</string>-->
<!-- <string name="pesdk_adjustments_button_blacksTool">Noirs</string>-->
<!-- <string name="pesdk_adjustments_button_whitesTool">Blancs</string>-->
<!-- <string name="pesdk_adjustments_button_temperatureTool">Température</string>-->
<!-- <string name="pesdk_adjustments_button_sharpnessTool">Netteté</string>-->
<!-- <string name="pesdk_adjustments_button_reset">Réinitialiser</string>-->
<!-- <string name="pesdk_focus_title_name">Floutage</string>-->
<!-- <string name="pesdk_focus_title_disabled">Aucun</string>-->
<!-- <string name="pesdk_focus_button_radial">Radial</string>-->
<!-- <string name="pesdk_focus_button_linear">Linéaire</string>-->
<!-- <string name="pesdk_focus_button_mirrored">Miroir</string>-->
<!-- <string name="pesdk_focus_button_gaussian">Gaussien</string>-->
<!-- <string name="pesdk_text_title_input">Ajouter un texte</string>-->
<!-- <string name="pesdk_text_title_name">Texte</string>-->
<!-- <string name="pesdk_text_title_options">Options du texte</string>-->
<!-- <string name="pesdk_text_title_textColor">Couleur du texte</string>-->
<!-- <string name="pesdk_text_title_font">Police</string>-->
<!-- <string name="pesdk_text_button_add">Ajouter</string>-->
<!-- <string name="pesdk_text_button_edit">Éditer</string>-->
<!-- <string name="pesdk_text_button_straighten">Redresser</string>-->
<!-- <string name="pesdk_text_button_font">Police</string>-->
<!-- <string name="pesdk_text_button_color">Couleur</string>-->
<!-- <string name="pesdk_text_button_backgroundColor">Fond</string>-->
<!-- <string name="pesdk_text_button_alignment">Alignement</string>-->
<!-- <string name="pesdk_text_button_bringToFront">Devant</string>-->
<!-- <string name="pesdk_text_button_delete">Supprimer</string>-->
<!-- <string name="pesdk_text_text_editTextPlaceholder">Votre texte</string>-->
<!-- <string name="pesdk_brush_title_name">Pinceau</string>-->
<!-- <string name="pesdk_brush_button_color">Couleur</string>-->
<!-- <string name="pesdk_brush_button_size">Taille</string>-->
<!-- <string name="pesdk_brush_button_hardness">Contour</string>-->
<!-- <string name="pesdk_brush_button_bringToFront">Devant</string>-->
<!-- <string name="pesdk_brush_button_delete">Supprimer</string>-->
<!-- <string name="pesdk_brush_title_brushColor">Couleur du pinceau</string>-->
<!-- <string name="pesdk_editor_title_name">Éditeur</string>-->
<!-- <string name="pesdk_editor_title_closeEditorAlert">Fermer l\'éditeur \?</string>-->
<!-- <string name="pesdk_editor_text_closeEditorAlert">Voulez-vous vraiment abandonner les modifications \?</string>-->
<!-- <string name="pesdk_editor_button_closeEditorAlertConfirmation">Oui</string>-->
<!-- <string name="pesdk_editor_button_closeEditorAlertCancelation">Non</string>-->
<!-- <string name="pesdk_editor_cancel">Annuler</string>-->
<!-- <string name="pesdk_editor_accept">Accepter</string>-->
<!-- <string name="pesdk_editor_save">Enregistrer</string>-->
<!-- <string name="pesdk_editor_text_exportProgressUnknown">Exportation…</string>-->
<!-- <string name="pesdk_editor_text_exportProgress" formatted="false">Exportation %s</string>-->
<!-- <string name="pesdk_sticker_title_name">Autocollant</string>-->
<!-- <string name="pesdk_sticker_title_color">Couleur de l\'autocollant</string>-->
<!-- <string name="pesdk_sticker_title_options">Options de l\'autocollant</string>-->
<!-- <string name="pesdk_sticker_button_add">Ajouter</string>-->
<!-- <string name="pesdk_sticker_button_color">Couleur</string>-->
<!-- <string name="pesdk_sticker_button_delete">Supprimer</string>-->
<!-- <string name="pesdk_sticker_button_bringToFront">Devant</string>-->
<!-- <string name="pesdk_sticker_button_straighten">Redresser</string>-->
<!-- <string name="pesdk_sticker_button_replace">Remplacer</string>-->
<!-- <string name="pesdk_sticker_button_opacity">Transparence</string>-->
<!-- <string name="pesdk_sticker_button_contrast">Contraste</string>-->
<!-- <string name="pesdk_sticker_button_saturation">Saturation</string>-->
<!-- <string name="pesdk_sticker_button_brightness">Luminosité</string>-->
<!-- <string name="pesdk_sticker_category_name_custom">Téléversements</string>-->
<!-- <string name="pesdk_overlay_title_name">Superposition</string>-->
<!-- <string name="pesdk_overlay_button_blendModeNormal">Normal</string>-->
<!-- <string name="pesdk_overlay_button_blendModeDarken">Assombrir</string>-->
<!-- <string name="pesdk_overlay_button_blendModeScreen">Écran</string>-->
<!-- <string name="pesdk_overlay_button_blendModeOverlay">Recouvrir</string>-->
<!-- <string name="pesdk_overlay_button_blendModeLighten">Alléger</string>-->
<!-- <string name="pesdk_overlay_button_blendModeMultiply">Dupliquer</string>-->
<!-- <string name="pesdk_overlay_button_blendModeColorBurn">Brûlure de couleur</string>-->
<!-- <string name="pesdk_overlay_button_blendModeSoftLight">Lumière douce</string>-->
<!-- <string name="pesdk_overlay_button_blendModeHardLight">Lumière forte</string>-->
<!-- <string name="pesdk_overlay_asset_none">Aucune</string>-->
<!-- <string name="pesdk_overlay_asset_golden">Doré</string>-->
<!-- <string name="pesdk_overlay_asset_lightleak1">Fuite légère 1</string>-->
<!-- <string name="pesdk_overlay_asset_mosaic">Mosaïque</string>-->
<!-- <string name="pesdk_overlay_asset_paper">Papier</string>-->
<!-- <string name="pesdk_overlay_asset_rain">Pluie</string>-->
<!-- <string name="pesdk_overlay_asset_vintage">Vintage</string>-->
<!-- <string name="pesdk_common_button_flipH">Symétrie H</string>-->
<!-- <string name="pesdk_common_button_flipV">Symétrie V</string>-->
<!-- <string name="pesdk_common_button_undo">Annuler</string>-->
<!-- <string name="pesdk_common_button_redo">Refaire</string>-->
<!-- <string name="pesdk_common_title_colorPicker">Sélecteur de couleur</string>-->
<!-- <string name="pesdk_common_title_transparentColor">Transparent</string>-->
<!-- <string name="pesdk_common_title_whiteColor">Blanc</string>-->
<!-- <string name="pesdk_common_title_grayColor">Gris</string>-->
<!-- <string name="pesdk_common_title_blackColor">Noir</string>-->
<!-- <string name="pesdk_common_title_lightBlueColor">Bleu clair</string>-->
<!-- <string name="pesdk_common_title_blueColor">Bleu</string>-->
<!-- <string name="pesdk_common_title_purpleColor">Violet</string>-->
<!-- <string name="pesdk_common_title_orchidColor">Orchidée</string>-->
<!-- <string name="pesdk_common_title_pinkColor">Rose</string>-->
<!-- <string name="pesdk_common_title_redColor">Rouge</string>-->
<!-- <string name="pesdk_common_title_orangeColor">Orange</string>-->
<!-- <string name="pesdk_common_title_goldColor">Or</string>-->
<!-- <string name="pesdk_common_title_yellowColor">Jaune</string>-->
<!-- <string name="pesdk_common_title_oliveColor">Olive</string>-->
<!-- <string name="pesdk_common_title_greenColor">Vert</string>-->
<!-- <string name="pesdk_common_title_aquamarinColor">Aquamarin</string>-->
<!-- <string name="pesdk_common_title_pipettableColor">Couleur de la pipette</string>-->
<!-- <string name="vesdk_video_trim_title_name">Couper</string>-->
<!-- &lt;!&ndash; FAQ &ndash;&gt;-->
<!-- <string name="faq_1_title">Comment faire de Simple Galerie ma galerie par défaut \?</string>-->
<!-- <string name="faq_1_text">Il faut dans un premier temps, trouver l\'application Galerie par défaut dans la section Applications des paramètres de l\'appareil, puis appuyer sur « Ouvrir par défaut », et enfin sélectionner « Réinitialiser les paramètres par défaut ». La prochaine fois que vous ouvrirez une image ou une vidéo, il vous sera proposé de choisir une application, choisissez Simple Galerie puis « Toujours ».</string>-->
<!-- <string name="faq_2_title">J\'ai verrouillé l\'application avec un mot de passe et je ne m\'en rappelle plus. Que faire \?</string>-->
<!-- <string name="faq_2_text">Il y a deux façons de procéder. Soit vous réinstallez l\'application, soit vous recherchez l\'application dans les paramètres de l\'appareil et appuyez sur « Effacer les données ». Ceci réinitialisera seulement les paramètres de l\'application et ne supprimera pas vos fichiers.</string>-->
<!-- <string name="faq_3_title">Comment faire pour qu\'un dossier soit toujours affiché tout en haut \?</string>-->
<!-- <string name="faq_3_text">Vous devez simplement effectuer un appui prolongé sur le dossier en question et choisir « Épingler en haut » dans le menu d\'actions. Vous pouvez en épingler plusieurs. Les éléments épinglés seront alors triés selon l\'ordre par défaut.</string>-->
<!-- <string name="faq_4_title">Comment avancer rapidement dans les vidéos \?</string>-->
<!-- <string name="faq_4_text">Appuyez deux fois sur le côté de l\'écran, ou appuyez sur la valeur de durée actuelle ou maximale près de la barre de recherche. Si vous activez l\'ouverture des vidéos sur un écran séparé dans les paramètres de l\'application, vous pouvez également utiliser des gestes horizontaux.</string>-->
<!-- <string name="faq_5_title">Quelle est la différence entre cacher et exclure un dossier \?</string>-->
<!-- <string name="faq_5_text">Exclure un dossier permet de ne pas l\'afficher uniquement dans Simple Galerie, alors que cacher un dossier rend le dossier invisible sur l\'ensemble de l\'appareil, y compris pour les autres applications de galerie. Dans le dernier cas, un fichier .nomedia est créé dans le dossier caché, et peut être supprimé avec n\'importe quel explorateur de fichiers. Notez que certains appareils ne permettent pas de masquer certains dossiers tels qu\'Appareil photo, Captures d\'écran et Téléchargements.</string>-->
<!-- <string name="faq_6_title">Pourquoi des dossiers avec des pochettes d\'albums musicaux ou des miniatures d\'images sont affichés \?</string>-->
<!-- <string name="faq_6_text">Il est possible que des dossiers qui ne devraient pas être affichés le soient. Vous pouvez les exclure facilement en les sélectionnant par un appui prolongé, puis en choisissant l\'option « Exclure le dossier », après quoi vous pouvez aussi sélectionner le dossier parent, ce qui devrait éviter l\'apparition de dossiers similaires.</string>-->
<!-- <string name="faq_7_title">Un dossier avec des images n\'apparaît pas. Que faire \?</string>-->
<!-- <string name="faq_7_text">Cela peut arriver pour de multiples raisons, mais c\'est facile à résoudre. Allez dans Paramètres, puis Gérer les dossiers ajoutés, appuyez sur + et sélectionnez le dossier voulu.</string>-->
<!-- <string name="faq_8_title">Comment faire apparaître uniquement certains dossiers \?</string>-->
<!-- <string name="faq_8_text">Ajouter un dossier dans les « Dossiers ajoutés » rend visible l\'ensemble du contenu du dossier. Pour exclure certains dossiers, il faut aller dans Paramètres, puis « Gérer les dossiers exclus », exclure le dossier racine /, puis ajouter les dossiers souhaités dans « Paramètres », puis « Gérer les dossiers ajoutés ». Seuls les dossiers sélectionnés seront visibles, du fait que les exclusions et inclusions sont récursives, et si un dossier est à la fois exclus et inclus, il sera affiché.</string>-->
<!-- <string name="faq_10_title">Puis-je recadrer des images avec cette application \?</string>-->
<!-- <string name="faq_10_text">Oui, vous pouvez recadrer les images dans l\'éditeur en faisant glisser les coins de l\'image. Vous pouvez accéder à l\'éditeur en appuyant longuement sur une vignette d\'image et en sélectionnant « Modifier », ou en sélectionnant « Modifier » en mode plein écran.</string>-->
<!-- <string name="faq_11_title">Puis-je regrouper les miniatures des fichiers multimédias \?</string>-->
<!-- <string name="faq_11_text">Bien sûr, il vous suffit d\'utiliser l\'option de menu « Grouper par » lorsque vous êtes dans l\'affichage des miniatures. Vous pouvez regrouper les fichiers selon plusieurs critères, y compris la date de prise de vue. Si vous utilisez la fonction « Afficher tous les contenus », vous pouvez également les regrouper par dossier.</string>-->
<!-- <string name="faq_12_title">Le tri par date de prise de vue ne semble pas fonctionner correctement, comment puis-je le corriger \?</string>-->
<!-- <string name="faq_12_text">Cela est probablement dû au fait que les fichiers ont été copiés depuis quelque part. Vous pouvez corriger cela en sélectionnant les miniatures de fichier et en sélectionnant « Corriger les dates de prise de vue ».</string>-->
<!-- <string name="faq_13_title">Je vois des bandes de couleurs sur les images. Comment puis-je améliorer la qualité \?</string>-->
<!-- <string name="faq_13_text">La solution actuelle d\'affichage des images fonctionne bien dans la grande majorité des cas, mais si vous voulez une qualité d\'image encore meilleure, vous pouvez activer l\'option « Afficher les images dans la meilleure qualité possible » dans la section « Niveau de zoom » des paramètres de l\'application.</string>-->
<!-- <string name="faq_14_title">J\'ai caché un fichier ou un dossier. Comment puis-je en rétablir l\'affichage \?</string>-->
<!-- <string name="faq_14_text">Vous pouvez soit appuyer sur l\'option « Afficher les fichiers cachés » du menu de l\'écran principal, ou appuyer sur le bouton « Afficher les fichiers cachés » dans les paramètres de l\'application. Si vous voulez rétablir leur affichage, effectuez un appui prolongé dessus et appuyez sur le symbole « Œil » permettant l\'affichage. Les dossiers sont cachés en ajoutant un fichier .nomedia à leur racine, vous pouvez également supprimer ce fichier avec n\'importe quel explorateur de fichiers. Notez que le masquage fonctionne de manière récursive, donc si vous masquez un dossier, tous les sous-dossiers seront également masqués. Donc, pour afficher les sous-dossiers, vous devez afficher le dossier parent.</string>-->
<!-- <string name="faq_15_title">Pourquoi l\'application prend-elle tant de place \?</string>-->
<!-- <string name="faq_15_text">Le cache d\'application peut prendre jusqu\'à 250 Mo pour accélérer le chargement des images. Si l\'application occupe encore plus d\'espace, c\'est probablement parce que vous avez des éléments dans la corbeille. Ces fichiers comptent pour la taille de l\'application. Vous pouvez vider la corbeille en l\'ouvrant et en supprimant tous les fichiers ou à partir des paramètres de l\'application. Chaque fichier de la corbeille est automatiquement supprimé après 30 jours.</string>-->
<!-- <string name="faq_16_title">Qu\'est ce qui se passe avec les fichiers et dossiers cachés et pourquoi je ne peux plus les voir \?</string>-->
<!-- <string name="faq_16_text">À partir d\'Android 11, vous ne pouvez plus masquer ou démasquer des fichiers ou des dossiers, et vous ne pouvez pas non plus voir ceux qui sont masqués dans les applications de la galerie. Vous devrez utiliser un gestionnaire de fichiers pour cela.</string>-->
<!-- <string name="faq_16_text_extra">Vous pouvez également accorder à cette galerie l\'accès à tous les fichiers via les paramètres de votre appareil, ce qui nous permettra de montrer les éléments cachés et de rendre les opérations sur les fichiers plus fiables en général.</string>-->
<!-- <string name="faq_17_title">Pourquoi je ne peux plus inclure des dossiers manquants \?</string>-->
<!-- <string name="faq_17_text">Cette fonctionnalité ne fonctionne plus en raison des modifications apportées au système avec Android 11. L\'application ne peut plus parcourir les dossiers réels, elle s\'appuie sur le MediaStore pour récupérer les données.</string>-->
<!-- <string name="faq_18_title">Pourquoi des publicités apparaissent pendant la lecture d\'une vidéo \?</string>-->
<!-- <string name="faq_18_text">Nos applications ne comportent aucune publicité. Si vous en voyez pendant la lecture d\'une vidéo, vous devez sûrement utiliser le lecteur vidéo d\'une autre application. Essayez de trouver le lecteur vidéo par défaut dans les paramètres de votre appareil, puis faites « Supprimer les valeurs par défaut ». Lors du prochain lancement d\'une vidéo, une invite de sélection d\'application s\'affichera, et vous pourrez choisir l\'application que vous souhaitez utiliser.</string>-->
<!-- &lt;!&ndash;-->
<!-- Haven't found some strings? There's more at-->
<!-- https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res-->
<!-- &ndash;&gt;-->
</resources>

View file

@ -66,7 +66,7 @@ class NewPhotoEditActivity : SimpleActivity() {
if (it) {
initEditActivity()
} else {
toast(R.string.no_storage_permissions)
toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish()
}
}
@ -214,7 +214,7 @@ class NewPhotoEditActivity : SimpleActivity() {
if (success) {
callback()
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
finish()
}
}

View file

@ -61,7 +61,7 @@ class NewVideoEditActivity : SimpleActivity() {
if (it) {
initEditActivity()
} else {
toast(R.string.no_storage_permissions)
toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish()
}
}
@ -198,7 +198,7 @@ class NewVideoEditActivity : SimpleActivity() {
if (success) {
callback()
} else {
toast(R.string.unknown_error_occurred)
toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
finish()
}
}

View file

@ -10,7 +10,7 @@ buildscript {
propVersionName = '5.34.26'
}*/
ext.kotlin_version = '1.6.21'
ext.kotlin_version = '1.9.0'
ext.is_proprietary = gradle.startParameter.taskNames.any { task -> task.contains("Proprietary") }
repositories {
@ -22,7 +22,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath 'com.android.tools.build:gradle:8.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
if (is_proprietary) {
classpath 'ly.img.android.pesdk:plugin:10.7.3'

View file

@ -1,3 +1,4 @@
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
org.gradle.jvmargs=-Xmx1536m
android.nonTransitiveRClass=true

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip