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

View file

@ -11,33 +11,36 @@ import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.ManageFoldersAdapter import com.simplemobiletools.gallery.pro.adapters.ManageFoldersAdapter
import com.simplemobiletools.gallery.pro.databinding.ActivityManageFoldersBinding
import com.simplemobiletools.gallery.pro.extensions.config import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.activity_manage_folders.*
class ExcludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener { class ExcludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private lateinit var binding: ActivityManageFoldersBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_folders) binding = ActivityManageFoldersBinding.inflate(layoutInflater)
setContentView(binding.root)
updateFolders() updateFolders()
setupOptionsMenu() 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) updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(manage_folders_list, manage_folders_toolbar) setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(manage_folders_toolbar, NavigationIcon.Arrow) setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
} }
private fun updateFolders() { private fun updateFolders() {
val folders = ArrayList<String>() val folders = ArrayList<String>()
config.excludedFolders.mapTo(folders) { it } config.excludedFolders.mapTo(folders) { it }
var placeholderText = getString(R.string.excluded_activity_placeholder) var placeholderText = getString(R.string.excluded_activity_placeholder)
manage_folders_placeholder.apply { binding.manageFoldersPlaceholder.apply {
beVisibleIf(folders.isEmpty()) beVisibleIf(folders.isEmpty())
setTextColor(getProperTextColor()) setTextColor(getProperTextColor())
@ -48,12 +51,12 @@ class ExcludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
text = placeholderText text = placeholderText
} }
val adapter = ManageFoldersAdapter(this, folders, true, this, manage_folders_list) {} val adapter = ManageFoldersAdapter(this, folders, true, this, binding.manageFoldersList) {}
manage_folders_list.adapter = adapter binding.manageFoldersList.adapter = adapter
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {
manage_folders_toolbar.setOnMenuItemClickListener { menuItem -> binding.manageFoldersToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.add_folder -> addFolder() R.id.add_folder -> addFolder()
else -> return@setOnMenuItemClickListener false 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.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.ManageHiddenFoldersAdapter 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.addNoMedia
import com.simplemobiletools.gallery.pro.extensions.config import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.getNoMediaFolders import com.simplemobiletools.gallery.pro.extensions.getNoMediaFolders
import kotlinx.android.synthetic.main.activity_manage_folders.*
class HiddenFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener { class HiddenFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private lateinit var binding: ActivityManageFoldersBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_folders) binding = ActivityManageFoldersBinding.inflate(layoutInflater)
setContentView(binding.root)
updateFolders() updateFolders()
setupOptionsMenu() 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) updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(manage_folders_list, manage_folders_toolbar) setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(manage_folders_toolbar, NavigationIcon.Arrow) setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
} }
private fun updateFolders() { private fun updateFolders() {
getNoMediaFolders { getNoMediaFolders {
runOnUiThread { runOnUiThread {
manage_folders_placeholder.apply { binding.manageFoldersPlaceholder.apply {
text = getString(R.string.hidden_folders_placeholder) text = getString(R.string.hidden_folders_placeholder)
beVisibleIf(it.isEmpty()) beVisibleIf(it.isEmpty())
setTextColor(getProperTextColor()) setTextColor(getProperTextColor())
} }
val adapter = ManageHiddenFoldersAdapter(this, it, this, manage_folders_list) {} val adapter = ManageHiddenFoldersAdapter(this, it, this, binding.manageFoldersList) {}
manage_folders_list.adapter = adapter binding.manageFoldersList.adapter = adapter
} }
} }
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {
manage_folders_toolbar.setOnMenuItemClickListener { menuItem -> binding.manageFoldersToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.add_folder -> addFolder() R.id.add_folder -> addFolder()
else -> return@setOnMenuItemClickListener false 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.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.ManageFoldersAdapter import com.simplemobiletools.gallery.pro.adapters.ManageFoldersAdapter
import com.simplemobiletools.gallery.pro.databinding.ActivityManageFoldersBinding
import com.simplemobiletools.gallery.pro.extensions.config import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.activity_manage_folders.*
class IncludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener { class IncludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
private lateinit var binding: ActivityManageFoldersBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_folders) binding = ActivityManageFoldersBinding.inflate(layoutInflater)
setContentView(binding.root)
updateFolders() updateFolders()
setupOptionsMenu() 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) updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(manage_folders_list, manage_folders_toolbar) setupMaterialScrollListener(binding.manageFoldersList, binding.manageFoldersToolbar)
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(manage_folders_toolbar, NavigationIcon.Arrow) setupToolbar(binding.manageFoldersToolbar, NavigationIcon.Arrow)
} }
private fun updateFolders() { private fun updateFolders() {
val folders = ArrayList<String>() val folders = ArrayList<String>()
config.includedFolders.mapTo(folders) { it } config.includedFolders.mapTo(folders) { it }
manage_folders_placeholder.apply { binding.manageFoldersPlaceholder.apply {
text = getString(R.string.included_activity_placeholder) text = getString(R.string.included_activity_placeholder)
beVisibleIf(folders.isEmpty()) beVisibleIf(folders.isEmpty())
setTextColor(getProperTextColor()) setTextColor(getProperTextColor())
} }
val adapter = ManageFoldersAdapter(this, folders, false, this, manage_folders_list) {} val adapter = ManageFoldersAdapter(this, folders, false, this, binding.manageFoldersList) {}
manage_folders_list.adapter = adapter binding.manageFoldersList.adapter = adapter
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {
manage_folders_toolbar.setOnMenuItemClickListener { menuItem -> binding.manageFoldersToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.add_folder -> addFolder() R.id.add_folder -> addFolder()
else -> return@setOnMenuItemClickListener false 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.R
import com.simplemobiletools.gallery.pro.adapters.DirectoryAdapter import com.simplemobiletools.gallery.pro.adapters.DirectoryAdapter
import com.simplemobiletools.gallery.pro.databases.GalleryDatabase 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.ChangeSortingDialog
import com.simplemobiletools.gallery.pro.dialogs.ChangeViewTypeDialog import com.simplemobiletools.gallery.pro.dialogs.ChangeViewTypeDialog
import com.simplemobiletools.gallery.pro.dialogs.FilterMediaDialog 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.jobs.NewPhotoFetcher
import com.simplemobiletools.gallery.pro.models.Directory import com.simplemobiletools.gallery.pro.models.Directory
import com.simplemobiletools.gallery.pro.models.Medium import com.simplemobiletools.gallery.pro.models.Medium
import kotlinx.android.synthetic.main.activity_main.*
import java.io.* import java.io.*
class MainActivity : SimpleActivity(), DirectoryOperationsListener { class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private val PICK_MEDIA = 2 companion object {
private val PICK_WALLPAPER = 3 private const val PICK_MEDIA = 2
private val LAST_MEDIA_CHECK_PERIOD = 3000L private const val PICK_WALLPAPER = 3
private const val LAST_MEDIA_CHECK_PERIOD = 3000L
}
private var mIsPickImageIntent = false private var mIsPickImageIntent = false
private var mIsPickVideoIntent = false private var mIsPickVideoIntent = false
@ -81,11 +83,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private var mStoredTextColor = 0 private var mStoredTextColor = 0
private var mStoredPrimaryColor = 0 private var mStoredPrimaryColor = 0
private var mStoredStyleString = "" private var mStoredStyleString = ""
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID) appLaunched(BuildConfig.APPLICATION_ID)
if (savedInstanceState == null) { if (savedInstanceState == null) {
@ -111,9 +115,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupOptionsMenu() setupOptionsMenu()
refreshMenuItems() 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() storeStateVariables()
checkWhatsNewDialog() checkWhatsNewDialog()
@ -146,32 +155,25 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
updateWidgets() updateWidgets()
registerFileUpdateListener() registerFileUpdateListener()
directories_switch_searching.setOnClickListener { binding.directoriesSwitchSearching.setOnClickListener {
launchSearchActivity() launchSearchActivity()
} }
// just request the permission, tryLoadGallery will then trigger in onResume // just request the permission, tryLoadGallery will then trigger in onResume
handleMediaPermissions { success -> handleMediaPermissions { success ->
if (!success) { if (!success) {
toast(R.string.no_storage_permissions) toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish() finish()
} }
} }
} }
private fun handleMediaPermissions(callback: (granted: Boolean) -> Unit) { private fun handleMediaPermissions(force: Boolean = false, callback: (granted: Boolean) -> Unit) {
handlePermission(getPermissionToRequest()) { granted -> handlePartialMediaPermissions(getPermissionsToRequest(), force) {
callback(granted) callback(it)
if (granted && isRPlus()) { if (!mWasMediaManagementPromptShown) {
handlePermission(PERMISSION_MEDIA_LOCATION) {} mWasMediaManagementPromptShown = true
if (isTiramisuPlus()) { handleMediaManagementPrompt { }
handlePermission(PERMISSION_READ_MEDIA_VIDEO) {}
}
if (!mWasMediaManagementPromptShown) {
mWasMediaManagementPromptShown = true
handleMediaManagementPrompt { }
}
} }
} }
} }
@ -200,7 +202,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (mStoredScrollHorizontally != config.scrollHorizontally) { if (mStoredScrollHorizontally != config.scrollHorizontally) {
mLoadedInitialPhotos = false mLoadedInitialPhotos = false
directories_grid.adapter = null binding.directoriesGrid.adapter = null
getDirectories() getDirectories()
} }
@ -218,20 +220,20 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupAdapter(mDirs, forceRecreate = true) setupAdapter(mDirs, forceRecreate = true)
} }
directories_fastscroller.updateColors(primaryColor) binding.directoriesFastscroller.updateColors(primaryColor)
directories_refresh_layout.isEnabled = config.enablePullToRefresh binding.directoriesRefreshLayout.isEnabled = config.enablePullToRefresh
getRecyclerAdapter()?.apply { getRecyclerAdapter()?.apply {
dateFormat = config.dateFormat dateFormat = config.dateFormat
timeFormat = getTimeFormat() timeFormat = getTimeFormat()
} }
directories_empty_placeholder.setTextColor(getProperTextColor()) binding.directoriesEmptyPlaceholder.setTextColor(getProperTextColor())
directories_empty_placeholder_2.setTextColor(primaryColor) binding.directoriesEmptyPlaceholder2.setTextColor(primaryColor)
directories_switch_searching.setTextColor(primaryColor) binding.directoriesSwitchSearching.setTextColor(primaryColor)
directories_switch_searching.underlineText() binding.directoriesSwitchSearching.underlineText()
directories_empty_placeholder_2.bringToFront() binding.directoriesEmptyPlaceholder2.bringToFront()
if (!main_menu.isSearchOpen) { if (!binding.mainMenu.isSearchOpen) {
refreshMenuItems() refreshMenuItems()
if (mIsPasswordProtectionPending && !mWasProtectionHandled) { if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
handleAppPasswordProtection { handleAppPasswordProtection {
@ -249,15 +251,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
} }
if (config.searchAllFilesByDefault) { if (config.searchAllFilesByDefault) {
main_menu.updateHintText(getString(R.string.search_files)) binding.mainMenu.updateHintText(getString(com.simplemobiletools.commons.R.string.search_files))
} else { } else {
main_menu.updateHintText(getString(R.string.search_folders)) binding.mainMenu.updateHintText(getString(com.simplemobiletools.commons.R.string.search_folders))
} }
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
directories_refresh_layout.isRefreshing = false binding.directoriesRefreshLayout.isRefreshing = false
mIsGettingDirs = false mIsGettingDirs = false
storeStateVariables() storeStateVariables()
mLastMediaHandler.removeCallbacksAndMessages(null) mLastMediaHandler.removeCallbacksAndMessages(null)
@ -297,8 +299,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
} }
override fun onBackPressed() { override fun onBackPressed() {
if (main_menu.isSearchOpen) { if (binding.mainMenu.isSearchOpen) {
main_menu.closeSearch() binding.mainMenu.closeSearch()
} else if (config.groupDirectSubfolders) { } else if (config.groupDirectSubfolders) {
if (mCurrentPathPrefix.isEmpty()) { if (mCurrentPathPrefix.isEmpty()) {
super.onBackPressed() super.onBackPressed()
@ -345,15 +347,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun refreshMenuItems() { private fun refreshMenuItems() {
if (!mIsThirdPartyIntent) { 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.column_count).isVisible = config.viewTypeFolders == VIEW_TYPE_GRID
findItem(R.id.set_as_default_folder).isVisible = !config.defaultFolder.isEmpty() 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.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.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
@ -369,23 +371,23 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
R.menu.menu_main R.menu.menu_main
} }
main_menu.getToolbar().inflateMenu(menuId) binding.mainMenu.getToolbar().inflateMenu(menuId)
main_menu.toggleHideOnScroll(!config.scrollHorizontally) binding.mainMenu.toggleHideOnScroll(!config.scrollHorizontally)
main_menu.setupMenu() binding.mainMenu.setupMenu()
main_menu.onSearchOpenListener = { binding.mainMenu.onSearchOpenListener = {
if (config.searchAllFilesByDefault) { if (config.searchAllFilesByDefault) {
launchSearchActivity() launchSearchActivity()
} }
} }
main_menu.onSearchTextChangedListener = { text -> binding.mainMenu.onSearchTextChangedListener = { text ->
setupAdapter(mDirsIgnoringSearch, text) setupAdapter(mDirsIgnoringSearch, text)
directories_refresh_layout.isEnabled = text.isEmpty() && config.enablePullToRefresh binding.directoriesRefreshLayout.isEnabled = text.isEmpty() && config.enablePullToRefresh
directories_switch_searching.beVisibleIf(text.isNotEmpty()) binding.directoriesSwitchSearching.beVisibleIf(text.isNotEmpty())
} }
main_menu.getToolbar().setOnMenuItemClickListener { menuItem -> binding.mainMenu.getToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.sort -> showSortingDialog() R.id.sort -> showSortingDialog()
R.id.filter -> showFilterMediaDialog() R.id.filter -> showFilterMediaDialog()
@ -396,6 +398,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden() R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden()
R.id.temporarily_show_excluded -> tryToggleTemporarilyShowExcluded() R.id.temporarily_show_excluded -> tryToggleTemporarilyShowExcluded()
R.id.stop_showing_excluded -> tryToggleTemporarilyShowExcluded() R.id.stop_showing_excluded -> tryToggleTemporarilyShowExcluded()
R.id.access_more_media -> handleMediaPermissions(force = true) { }
R.id.create_new_folder -> createNewFolder() R.id.create_new_folder -> createNewFolder()
R.id.open_recycle_bin -> openRecycleBin() R.id.open_recycle_bin -> openRecycleBin()
R.id.column_count -> changeColumnCount() R.id.column_count -> changeColumnCount()
@ -421,10 +424,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun updateMenuColors() { private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor()) 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() { private fun storeStateVariables() {
mStoredTextColor = getProperTextColor() mStoredTextColor = getProperTextColor()
@ -451,7 +454,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val newFolder = File(config.tempFolderPath) val newFolder = File(config.tempFolderPath)
if (getDoesFilePathExist(newFolder.absolutePath) && newFolder.isDirectory) { if (getDoesFilePathExist(newFolder.absolutePath) && newFolder.isDirectory) {
if (newFolder.getProperSize(true) == 0L && newFolder.getFileCount(true) == 0 && newFolder.list()?.isEmpty() == true) { 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) tryDeleteFileDirItem(newFolder.toFileDirItem(applicationContext), true, true)
} }
} }
@ -503,7 +506,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
} }
if (isPackageInstalled("com.simplemobiletools.gallery")) { 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() checkOTGPath()
@ -517,7 +527,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupLayoutManager() setupLayoutManager()
} else { } else {
toast(R.string.no_storage_permissions) toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish() finish()
} }
} }
@ -544,14 +554,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
startActivity(this) startActivity(this)
} }
main_menu.postDelayed({ binding.mainMenu.postDelayed({
main_menu.closeSearch() binding.mainMenu.closeSearch()
}, 500) }, 500)
} }
private fun showSortingDialog() { private fun showSortingDialog() {
ChangeSortingDialog(this, true, false) { 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) { if (config.directorySorting and SORT_BY_DATE_MODIFIED != 0 || config.directorySorting and SORT_BY_DATE_TAKEN != 0) {
getDirectories() getDirectories()
} else { } else {
@ -567,8 +577,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun showFilterMediaDialog() { private fun showFilterMediaDialog() {
FilterMediaDialog(this) { FilterMediaDialog(this) {
mShouldStopFetching = true mShouldStopFetching = true
directories_refresh_layout.isRefreshing = true binding.directoriesRefreshLayout.isRefreshing = true
directories_grid.adapter = null binding.directoriesGrid.adapter = null
getDirectories() getDirectories()
} }
} }
@ -592,7 +602,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
ChangeViewTypeDialog(this, true) { ChangeViewTypeDialog(this, true) {
refreshMenuItems() refreshMenuItems()
setupLayoutManager() setupLayoutManager()
directories_grid.adapter = null binding.directoriesGrid.adapter = null
setupAdapter(getRecyclerAdapter()?.dirs ?: mDirs) setupAdapter(getRecyclerAdapter()?.dirs ?: mDirs)
} }
} }
@ -614,7 +624,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun toggleTemporarilyShowHidden(show: Boolean) { private fun toggleTemporarilyShowHidden(show: Boolean) {
mLoadedInitialPhotos = false mLoadedInitialPhotos = false
config.temporarilyShowHidden = show config.temporarilyShowHidden = show
directories_grid.adapter = null binding.directoriesGrid.adapter = null
getDirectories() getDirectories()
refreshMenuItems() refreshMenuItems()
} }
@ -632,7 +642,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun toggleTemporarilyShowExcluded(show: Boolean) { private fun toggleTemporarilyShowExcluded(show: Boolean) {
mLoadedInitialPhotos = false mLoadedInitialPhotos = false
config.temporarilyShowExcluded = show config.temporarilyShowExcluded = show
directories_grid.adapter = null binding.directoriesGrid.adapter = null
getDirectories() getDirectories()
refreshMenuItems() refreshMenuItems()
} }
@ -644,14 +654,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
fileDirItems.isEmpty() -> return fileDirItems.isEmpty() -> return
fileDirItems.size == 1 -> { fileDirItems.size == 1 -> {
try { 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) { } catch (e: Exception) {
showErrorToast(e) showErrorToast(e)
} }
} }
else -> { 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) val deletingItems = resources.getQuantityString(baseString, fileDirItems.size, fileDirItems.size)
toast(deletingItems) toast(deletingItems)
} }
@ -680,7 +691,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (it) { if (it) {
deleteFilteredFileDirItems(itemsToDelete, folders) deleteFilteredFileDirItems(itemsToDelete, folders)
} else { } else {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
} }
} }
} else { } else {
@ -717,33 +728,35 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupListLayoutManager() 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() { private fun setupGridLayoutManager() {
val layoutManager = directories_grid.layoutManager as MyGridLayoutManager val layoutManager = binding.directoriesGrid.layoutManager as MyGridLayoutManager
if (config.scrollHorizontally) { if (config.scrollHorizontally) {
layoutManager.orientation = RecyclerView.HORIZONTAL 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 { } else {
layoutManager.orientation = RecyclerView.VERTICAL 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 layoutManager.spanCount = config.dirColumnCnt
} }
private fun setupListLayoutManager() { private fun setupListLayoutManager() {
val layoutManager = directories_grid.layoutManager as MyGridLayoutManager val layoutManager = binding.directoriesGrid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1 layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL 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 mZoomListener = null
} }
private fun initZoomListener() { private fun initZoomListener() {
if (config.viewTypeFolders == VIEW_TYPE_GRID) { if (config.viewTypeFolders == VIEW_TYPE_GRID) {
val layoutManager = directories_grid.layoutManager as MyGridLayoutManager val layoutManager = binding.directoriesGrid.layoutManager as MyGridLayoutManager
mZoomListener = object : MyRecyclerView.MyZoomListener { mZoomListener = object : MyRecyclerView.MyZoomListener {
override fun zoomIn() { override fun zoomIn() {
if (layoutManager.spanCount > 1) { if (layoutManager.spanCount > 1) {
@ -778,10 +791,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun changeColumnCount() { private fun changeColumnCount() {
val items = ArrayList<RadioItem>() val items = ArrayList<RadioItem>()
for (i in 1..MAX_COLUMN_COUNT) { 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) { RadioGroupDialog(this, items, currentColumnCount) {
val newColumnCount = it as Int val newColumnCount = it as Int
if (currentColumnCount != newColumnCount) { if (currentColumnCount != newColumnCount) {
@ -802,7 +815,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
} }
private fun columnCountChanged() { private fun columnCountChanged() {
(directories_grid.layoutManager as MyGridLayoutManager).spanCount = config.dirColumnCnt (binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount = config.dirColumnCnt
refreshMenuItems() refreshMenuItems()
getRecyclerAdapter()?.apply { getRecyclerAdapter()?.apply {
notifyItemRangeChanged(0, dirs.size) notifyItemRangeChanged(0, dirs.size)
@ -953,7 +966,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (mediaDB.getDeletedMediaCount() > 0) { if (mediaDB.getDeletedMediaCount() > 0) {
val recycleBin = Directory().apply { val recycleBin = Directory().apply {
path = RECYCLE_BIN path = RECYCLE_BIN
name = getString(R.string.recycle_bin) name = getString(com.simplemobiletools.commons.R.string.recycle_bin)
location = LOCATION_INTERNAL location = LOCATION_INTERNAL
} }
@ -967,7 +980,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (mediaDB.getFavoritesCount() > 0) { if (mediaDB.getFavoritesCount() > 0) {
val favorites = Directory().apply { val favorites = Directory().apply {
path = FAVORITES path = FAVORITES
name = getString(R.string.favorites) name = getString(com.simplemobiletools.commons.R.string.favorites)
location = LOCATION_INTERNAL location = LOCATION_INTERNAL
} }
@ -1114,9 +1127,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (isPlaceholderVisible) { if (isPlaceholderVisible) {
isPlaceholderVisible = false isPlaceholderVisible = false
runOnUiThread { runOnUiThread {
directories_empty_placeholder.beGone() binding.directoriesEmptyPlaceholder.beGone()
directories_empty_placeholder_2.beGone() binding.directoriesEmptyPlaceholder2.beGone()
directories_fastscroller.beVisible() binding.directoriesFastscroller.beVisible()
} }
} }
@ -1142,7 +1155,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
} }
runOnUiThread { runOnUiThread {
directories_refresh_layout.isRefreshing = false binding.directoriesRefreshLayout.isRefreshing = false
checkPlaceholderVisibility(dirs) checkPlaceholderVisibility(dirs)
} }
@ -1201,41 +1214,41 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
} }
private fun checkPlaceholderVisibility(dirs: ArrayList<Directory>) { private fun checkPlaceholderVisibility(dirs: ArrayList<Directory>) {
directories_empty_placeholder.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos) binding.directoriesEmptyPlaceholder.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
directories_empty_placeholder_2.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos) binding.directoriesEmptyPlaceholder2.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
if (main_menu.isSearchOpen) { if (binding.mainMenu.isSearchOpen) {
directories_empty_placeholder.text = getString(R.string.no_items_found) binding.directoriesEmptyPlaceholder.text = getString(com.simplemobiletools.commons.R.string.no_items_found)
directories_empty_placeholder_2.beGone() binding.directoriesEmptyPlaceholder2.beGone()
} else if (dirs.isEmpty() && config.filterMedia == getDefaultFileFilter()) { } else if (dirs.isEmpty() && config.filterMedia == getDefaultFileFilter()) {
if (isRPlus() && !isExternalStorageManager()) { if (isRPlus() && !isExternalStorageManager()) {
directories_empty_placeholder.text = getString(R.string.no_items_found) binding.directoriesEmptyPlaceholder.text = getString(com.simplemobiletools.commons.R.string.no_items_found)
directories_empty_placeholder_2.beGone() binding.directoriesEmptyPlaceholder2.beGone()
} else { } else {
directories_empty_placeholder.text = getString(R.string.no_media_add_included) binding.directoriesEmptyPlaceholder.text = getString(R.string.no_media_add_included)
directories_empty_placeholder_2.text = getString(R.string.add_folder) binding.directoriesEmptyPlaceholder2.text = getString(R.string.add_folder)
} }
directories_empty_placeholder_2.setOnClickListener { binding.directoriesEmptyPlaceholder2.setOnClickListener {
showAddIncludedFolderDialog { showAddIncludedFolderDialog {
refreshItems() refreshItems()
} }
} }
} else { } else {
directories_empty_placeholder.text = getString(R.string.no_media_with_filters) binding.directoriesEmptyPlaceholder.text = getString(R.string.no_media_with_filters)
directories_empty_placeholder_2.text = getString(R.string.change_filters_underlined) binding.directoriesEmptyPlaceholder2.text = getString(R.string.change_filters_underlined)
directories_empty_placeholder_2.setOnClickListener { binding.directoriesEmptyPlaceholder2.setOnClickListener {
showFilterMediaDialog() showFilterMediaDialog()
} }
} }
directories_empty_placeholder_2.underlineText() binding.directoriesEmptyPlaceholder2.underlineText()
directories_fastscroller.beVisibleIf(directories_empty_placeholder.isGone()) binding.directoriesFastscroller.beVisibleIf(binding.directoriesEmptyPlaceholder.isGone())
} }
private fun setupAdapter(dirs: ArrayList<Directory>, textToSearch: String = main_menu.getCurrentQuery(), forceRecreate: Boolean = false) { private fun setupAdapter(dirs: ArrayList<Directory>, textToSearch: String = binding.mainMenu.getCurrentQuery(), forceRecreate: Boolean = false) {
val currAdapter = directories_grid.adapter val currAdapter = binding.directoriesGrid.adapter
val distinctDirs = dirs.distinctBy { it.path.getDistinctPath() }.toMutableList() as ArrayList<Directory> val distinctDirs = dirs.distinctBy { it.path.getDistinctPath() }.toMutableList() as ArrayList<Directory>
val sortedDirs = getSortedDirectories(distinctDirs) val sortedDirs = getSortedDirectories(distinctDirs)
var dirsToShow = getDirsToShow(sortedDirs, mDirs, mCurrentPathPrefix).clone() as ArrayList<Directory> var dirsToShow = getDirsToShow(sortedDirs, mDirs, mCurrentPathPrefix).clone() as ArrayList<Directory>
@ -1247,9 +1260,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
this, this,
dirsToShow, dirsToShow,
this, this,
directories_grid, binding.directoriesGrid,
isPickIntent(intent) || isGetAnyContentIntent(intent), isPickIntent(intent) || isGetAnyContentIntent(intent),
directories_refresh_layout binding.directoriesRefreshLayout
) { ) {
val clickedDir = it as Directory val clickedDir = it as Directory
val path = clickedDir.path val path = clickedDir.path
@ -1265,11 +1278,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}.apply { }.apply {
setupZoomListener(mZoomListener) setupZoomListener(mZoomListener)
runOnUiThread { runOnUiThread {
directories_grid.adapter = this binding.directoriesGrid.adapter = this
setupScrollDirection() setupScrollDirection()
if (config.viewTypeFolders == VIEW_TYPE_LIST && areSystemAnimationsEnabled) { if (config.viewTypeFolders == VIEW_TYPE_LIST && areSystemAnimationsEnabled) {
directories_grid.scheduleLayoutAnimation() binding.directoriesGrid.scheduleLayoutAnimation()
} }
} }
} }
@ -1281,19 +1294,19 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
} }
checkPlaceholderVisibility(dirsToShow) 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 // recyclerview sometimes becomes empty at init/update, triggering an invisible refresh like this seems to work fine
directories_grid.postDelayed({ binding.directoriesGrid.postDelayed({
directories_grid.scrollBy(0, 0) binding.directoriesGrid.scrollBy(0, 0)
}, 500) }, 500)
} }
private fun setupScrollDirection() { private fun setupScrollDirection() {
val scrollHorizontally = config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID val scrollHorizontally = config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID
directories_fastscroller.setScrollVertically(!scrollHorizontally) binding.directoriesFastscroller.setScrollVertically(!scrollHorizontally)
} }
private fun checkInvalidDirectories(dirs: ArrayList<Directory>) { 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.adapters.MediaAdapter
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.pro.databases.GalleryDatabase 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.dialogs.*
import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.* 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.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection import com.simplemobiletools.gallery.pro.models.ThumbnailSection
import kotlinx.android.synthetic.main.activity_media.*
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
@ -70,6 +70,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private var mStoredPrimaryColor = 0 private var mStoredPrimaryColor = 0
private var mStoredThumbnailSpacing = 0 private var mStoredThumbnailSpacing = 0
private lateinit var binding: ActivityMediaBinding
companion object { companion object {
var mMedia = ArrayList<ThumbnailItem>() var mMedia = ArrayList<ThumbnailItem>()
} }
@ -77,7 +79,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_media) binding = ActivityMediaBinding.inflate(layoutInflater)
setContentView(binding.root)
intent.apply { intent.apply {
mIsGetImageIntent = getBooleanExtra(GET_IMAGE_INTENT, false) mIsGetImageIntent = getBooleanExtra(GET_IMAGE_INTENT, false)
@ -86,7 +89,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mAllowPickingMultiple = getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) mAllowPickingMultiple = getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
} }
media_refresh_layout.setOnRefreshListener { getMedia() } binding.mediaRefreshLayout.setOnRefreshListener { getMedia() }
try { try {
mPath = intent.getStringExtra(DIRECTORY) ?: "" mPath = intent.getStringExtra(DIRECTORY) ?: ""
} catch (e: Exception) { } catch (e: Exception) {
@ -98,17 +101,24 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
setupOptionsMenu() setupOptionsMenu()
refreshMenuItems() refreshMenuItems()
storeStateVariables() storeStateVariables()
updateMaterialActivityViews(media_coordinator, media_grid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true) updateMaterialActivityViews(binding.mediaCoordinator, binding.mediaGrid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true)
if (mShowAll) { if (mShowAll) {
registerFileUpdateListener() registerFileUpdateListener()
if (isPackageInstalled("com.simplemobiletools.gallery")) { 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() showFilterMediaDialog()
} }
@ -133,7 +143,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
if (mStoredScrollHorizontally != config.scrollHorizontally) { if (mStoredScrollHorizontally != config.scrollHorizontally) {
mLoadedInitialPhotos = false mLoadedInitialPhotos = false
media_grid.adapter = null binding.mediaGrid.adapter = null
getMedia() getMedia()
} }
@ -155,22 +165,22 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|| mStoredRoundedCorners != config.fileRoundedCorners || mStoredRoundedCorners != config.fileRoundedCorners
|| mStoredMarkFavoriteItems != config.markFavoriteItems || mStoredMarkFavoriteItems != config.markFavoriteItems
) { ) {
media_grid.adapter = null binding.mediaGrid.adapter = null
setupAdapter() setupAdapter()
} }
refreshMenuItems() refreshMenuItems()
media_fastscroller.updateColors(primaryColor) binding.mediaFastscroller.updateColors(primaryColor)
media_refresh_layout.isEnabled = config.enablePullToRefresh binding.mediaRefreshLayout.isEnabled = config.enablePullToRefresh
getMediaAdapter()?.apply { getMediaAdapter()?.apply {
dateFormat = config.dateFormat dateFormat = config.dateFormat
timeFormat = getTimeFormat() timeFormat = getTimeFormat()
} }
media_empty_text_placeholder.setTextColor(getProperTextColor()) binding.mediaEmptyTextPlaceholder.setTextColor(getProperTextColor())
media_empty_text_placeholder_2.setTextColor(getProperPrimaryColor()) binding.mediaEmptyTextPlaceholder2.setTextColor(getProperPrimaryColor())
media_empty_text_placeholder_2.bringToFront() binding.mediaEmptyTextPlaceholder2.bringToFront()
// do not refresh Random sorted files after opening a fullscreen image and going Back // do not refresh Random sorted files after opening a fullscreen image and going Back
val isRandomSorting = config.getFolderSorting(mPath) and SORT_BY_RANDOM != 0 val isRandomSorting = config.getFolderSorting(mPath) and SORT_BY_RANDOM != 0
@ -192,7 +202,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
mIsGettingMedia = false mIsGettingMedia = false
media_refresh_layout.isRefreshing = false binding.mediaRefreshLayout.isRefreshing = false
storeStateVariables() storeStateVariables()
mLastMediaHandler.removeCallbacksAndMessages(null) mLastMediaHandler.removeCallbacksAndMessages(null)
@ -229,8 +239,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} }
override fun onBackPressed() { override fun onBackPressed() {
if (media_menu.isSearchOpen) { if (binding.mediaMenu.isSearchOpen) {
media_menu.closeSearch() binding.mediaMenu.closeSearch()
} else { } else {
super.onBackPressed() super.onBackPressed()
} }
@ -249,7 +259,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun refreshMenuItems() { private fun refreshMenuItems() {
val isDefaultFolder = !config.defaultFolder.isEmpty() && File(config.defaultFolder).compareTo(File(mPath)) == 0 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.group).isVisible = !config.scrollHorizontally
findItem(R.id.empty_recycle_bin).isVisible = mPath == RECYCLE_BIN findItem(R.id.empty_recycle_bin).isVisible = mPath == RECYCLE_BIN
@ -275,17 +285,17 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {
media_menu.getToolbar().inflateMenu(R.menu.menu_media) binding.mediaMenu.getToolbar().inflateMenu(R.menu.menu_media)
media_menu.toggleHideOnScroll(!config.scrollHorizontally) binding.mediaMenu.toggleHideOnScroll(!config.scrollHorizontally)
media_menu.setupMenu() binding.mediaMenu.setupMenu()
media_menu.onSearchTextChangedListener = { text -> binding.mediaMenu.onSearchTextChangedListener = { text ->
mLastSearchedText = text mLastSearchedText = text
searchQueryChanged(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) { when (menuItem.itemId) {
R.id.sort -> showSortingDialog() R.id.sort -> showSortingDialog()
R.id.filter -> showFilterMediaDialog() R.id.filter -> showFilterMediaDialog()
@ -329,7 +339,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun updateMenuColors() { private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor()) updateStatusbarColor(getProperBackgroundColor())
media_menu.updateColors() binding.mediaMenu.updateColors()
} }
private fun storeStateVariables() { private fun storeStateVariables() {
@ -355,12 +365,12 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList<Medium>, mPath) val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList<Medium>, mPath)
runOnUiThread { runOnUiThread {
if (grouped.isEmpty()) { if (grouped.isEmpty()) {
media_empty_text_placeholder.text = getString(R.string.no_items_found) binding.mediaEmptyTextPlaceholder.text = getString(com.simplemobiletools.commons.R.string.no_items_found)
media_empty_text_placeholder.beVisible() binding.mediaEmptyTextPlaceholder.beVisible()
media_fastscroller.beGone() binding.mediaFastscroller.beGone()
} else { } else {
media_empty_text_placeholder.beGone() binding.mediaEmptyTextPlaceholder.beGone()
media_fastscroller.beVisible() binding.mediaFastscroller.beVisible()
} }
handleGridSpacing(grouped) handleGridSpacing(grouped)
@ -375,22 +385,22 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
handlePermission(getPermissionToRequest()) { handlePermission(getPermissionToRequest()) {
if (it) { if (it) {
val dirName = when { val dirName = when {
mPath == FAVORITES -> getString(R.string.favorites) mPath == FAVORITES -> getString(com.simplemobiletools.commons.R.string.favorites)
mPath == RECYCLE_BIN -> getString(R.string.recycle_bin) mPath == RECYCLE_BIN -> getString(com.simplemobiletools.commons.R.string.recycle_bin)
mPath == config.OTGPath -> getString(R.string.usb) mPath == config.OTGPath -> getString(com.simplemobiletools.commons.R.string.usb)
else -> getHumanizedFilename(mPath) else -> getHumanizedFilename(mPath)
} }
val searchHint = if (mShowAll) { val searchHint = if (mShowAll) {
getString(R.string.search_files) getString(com.simplemobiletools.commons.R.string.search_files)
} else { } 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) { if (!mShowAll) {
media_menu.toggleForceArrowBackIcon(true) binding.mediaMenu.toggleForceArrowBackIcon(true)
media_menu.onNavigateBackClickListener = { binding.mediaMenu.onNavigateBackClickListener = {
onBackPressed() onBackPressed()
} }
} }
@ -398,37 +408,37 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
getMedia() getMedia()
setupLayoutManager() setupLayoutManager()
} else { } else {
toast(R.string.no_storage_permissions) toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish() finish()
} }
} }
} }
private fun getMediaAdapter() = media_grid.adapter as? MediaAdapter private fun getMediaAdapter() = binding.mediaGrid.adapter as? MediaAdapter
private fun setupAdapter() { private fun setupAdapter() {
if (!mShowAll && isDirEmpty()) { if (!mShowAll && isDirEmpty()) {
return return
} }
val currAdapter = media_grid.adapter val currAdapter = binding.mediaGrid.adapter
if (currAdapter == null) { if (currAdapter == null) {
initZoomListener() initZoomListener()
MediaAdapter( MediaAdapter(
this, mMedia.clone() as ArrayList<ThumbnailItem>, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent, this, mMedia.clone() as ArrayList<ThumbnailItem>, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent,
mAllowPickingMultiple, mPath, media_grid mAllowPickingMultiple, mPath, binding.mediaGrid
) { ) {
if (it is Medium && !isFinishing) { if (it is Medium && !isFinishing) {
itemClicked(it.path) itemClicked(it.path)
} }
}.apply { }.apply {
setupZoomListener(mZoomListener) setupZoomListener(mZoomListener)
media_grid.adapter = this binding.mediaGrid.adapter = this
} }
val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath)
if (viewType == VIEW_TYPE_LIST && areSystemAnimationsEnabled) { if (viewType == VIEW_TYPE_LIST && areSystemAnimationsEnabled) {
media_grid.scheduleLayoutAnimation() binding.mediaGrid.scheduleLayoutAnimation()
} }
setupLayoutManager() setupLayoutManager()
@ -446,7 +456,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun setupScrollDirection() { private fun setupScrollDirection() {
val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath)
val scrollHorizontally = config.scrollHorizontally && viewType == VIEW_TYPE_GRID val scrollHorizontally = config.scrollHorizontally && viewType == VIEW_TYPE_GRID
media_fastscroller.setScrollVertically(!scrollHorizontally) binding.mediaFastscroller.setScrollVertically(!scrollHorizontally)
} }
private fun checkLastMediaChanged() { private fun checkLastMediaChanged() {
@ -475,7 +485,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun showSortingDialog() { private fun showSortingDialog() {
ChangeSortingDialog(this, false, true, mPath) { ChangeSortingDialog(this, false, true, mPath) {
mLoadedInitialPhotos = false mLoadedInitialPhotos = false
media_grid.adapter = null binding.mediaGrid.adapter = null
getMedia() getMedia()
} }
} }
@ -483,8 +493,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun showFilterMediaDialog() { private fun showFilterMediaDialog() {
FilterMediaDialog(this) { FilterMediaDialog(this) {
mLoadedInitialPhotos = false mLoadedInitialPhotos = false
media_refresh_layout.isRefreshing = true binding.mediaRefreshLayout.isRefreshing = true
media_grid.adapter = null binding.mediaGrid.adapter = null
getMedia() getMedia()
} }
} }
@ -531,7 +541,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
ChangeViewTypeDialog(this, false, mPath) { ChangeViewTypeDialog(this, false, mPath) {
refreshMenuItems() refreshMenuItems()
setupLayoutManager() setupLayoutManager()
media_grid.adapter = null binding.mediaGrid.adapter = null
setupAdapter() setupAdapter()
} }
} }
@ -539,7 +549,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun showGroupByDialog() { private fun showGroupByDialog() {
ChangeGroupingDialog(this, mPath) { ChangeGroupingDialog(this, mPath) {
mLoadedInitialPhotos = false mLoadedInitialPhotos = false
media_grid.adapter = null binding.mediaGrid.adapter = null
getMedia() getMedia()
} }
} }
@ -569,7 +579,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
getCachedMedia(mPath, mIsGetVideoIntent, mIsGetImageIntent) { getCachedMedia(mPath, mIsGetVideoIntent, mIsGetImageIntent) {
if (it.isEmpty()) { if (it.isEmpty()) {
runOnUiThread { runOnUiThread {
media_refresh_layout.isRefreshing = true binding.mediaRefreshLayout.isRefreshing = true
} }
} else { } else {
gotMedia(it, true) gotMedia(it, true)
@ -622,9 +632,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} }
if (mPath == RECYCLE_BIN) { if (mPath == RECYCLE_BIN) {
media_empty_text_placeholder.setText(R.string.no_items_found) binding.mediaEmptyTextPlaceholder.setText(com.simplemobiletools.commons.R.string.no_items_found)
media_empty_text_placeholder.beVisible() binding.mediaEmptyTextPlaceholder.beVisible()
media_empty_text_placeholder_2.beGone() binding.mediaEmptyTextPlaceholder2.beGone()
} else { } else {
finish() finish()
} }
@ -681,13 +691,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} }
private fun setupGridLayoutManager() { private fun setupGridLayoutManager() {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
if (config.scrollHorizontally) { if (config.scrollHorizontally) {
layoutManager.orientation = RecyclerView.HORIZONTAL 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 { } else {
layoutManager.orientation = RecyclerView.VERTICAL 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 layoutManager.spanCount = config.mediaColumnCnt
@ -704,10 +714,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} }
private fun setupListLayoutManager() { private fun setupListLayoutManager() {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1 layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL 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 mZoomListener = null
} }
@ -719,17 +729,17 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val useGridPosition = media.firstOrNull() is ThumbnailSection val useGridPosition = media.firstOrNull() is ThumbnailSection
var currentGridDecoration: GridSpacingItemDecoration? = null var currentGridDecoration: GridSpacingItemDecoration? = null
if (media_grid.itemDecorationCount > 0) { if (binding.mediaGrid.itemDecorationCount > 0) {
currentGridDecoration = media_grid.getItemDecorationAt(0) as GridSpacingItemDecoration currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration.items = media currentGridDecoration.items = media
} }
val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition) val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)
if (currentGridDecoration.toString() != newGridDecoration.toString()) { if (currentGridDecoration.toString() != newGridDecoration.toString()) {
if (currentGridDecoration != null) { 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() { private fun initZoomListener() {
val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath)
if (viewType == VIEW_TYPE_GRID) { if (viewType == VIEW_TYPE_GRID) {
val layoutManager = media_grid.layoutManager as MyGridLayoutManager val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
mZoomListener = object : MyRecyclerView.MyZoomListener { mZoomListener = object : MyRecyclerView.MyZoomListener {
override fun zoomIn() { override fun zoomIn() {
if (layoutManager.spanCount > 1) { if (layoutManager.spanCount > 1) {
@ -761,10 +771,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun changeColumnCount() { private fun changeColumnCount() {
val items = ArrayList<RadioItem>() val items = ArrayList<RadioItem>()
for (i in 1..MAX_COLUMN_COUNT) { 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) { RadioGroupDialog(this, items, currentColumnCount) {
val newColumnCount = it as Int val newColumnCount = it as Int
if (currentColumnCount != newColumnCount) { if (currentColumnCount != newColumnCount) {
@ -785,7 +795,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} }
private fun columnCountChanged() { private fun columnCountChanged() {
(media_grid.layoutManager as MyGridLayoutManager).spanCount = config.mediaColumnCnt (binding.mediaGrid.layoutManager as MyGridLayoutManager).spanCount = config.mediaColumnCnt
handleGridSpacing() handleGridSpacing()
refreshMenuItems() refreshMenuItems()
getMediaAdapter()?.apply { getMediaAdapter()?.apply {
@ -863,14 +873,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mMedia = media mMedia = media
runOnUiThread { runOnUiThread {
media_refresh_layout.isRefreshing = false binding.mediaRefreshLayout.isRefreshing = false
media_empty_text_placeholder.beVisibleIf(media.isEmpty() && !isFromCache) binding.mediaEmptyTextPlaceholder.beVisibleIf(media.isEmpty() && !isFromCache)
media_empty_text_placeholder_2.beVisibleIf(media.isEmpty() && !isFromCache) binding.mediaEmptyTextPlaceholder2.beVisibleIf(media.isEmpty() && !isFromCache)
if (media_empty_text_placeholder.isVisible()) { if (binding.mediaEmptyTextPlaceholder.isVisible()) {
media_empty_text_placeholder.text = getString(R.string.no_media_with_filters) 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() setupAdapter()
} }
@ -894,18 +904,18 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} }
if (config.useRecycleBin && !skipRecycleBin && !filtered.first().path.startsWith(recycleBinPath)) { 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) toast(movingItems)
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>) { movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>) {
if (it) { if (it) {
deleteFilteredFiles(filtered) deleteFilteredFiles(filtered)
} else { } else {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
} }
} }
} else { } 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) toast(deletingItems)
deleteFilteredFiles(filtered) deleteFilteredFiles(filtered)
} }
@ -916,7 +926,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun deleteFilteredFiles(filtered: ArrayList<FileDirItem>) { private fun deleteFilteredFiles(filtered: ArrayList<FileDirItem>) {
deleteFiles(filtered) { deleteFiles(filtered) {
if (!it) { if (!it) {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return@deleteFiles return@deleteFiles
} }
@ -961,8 +971,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
} }
} }
if (media_grid.itemDecorationCount > 0) { if (binding.mediaGrid.itemDecorationCount > 0) {
val currentGridDecoration = media_grid.getItemDecorationAt(0) as GridSpacingItemDecoration val currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration.items = media 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.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isRPlus import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.gallery.pro.R 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.config
import com.simplemobiletools.gallery.pro.extensions.hideSystemUI import com.simplemobiletools.gallery.pro.extensions.hideSystemUI
import com.simplemobiletools.gallery.pro.extensions.showSystemUI import com.simplemobiletools.gallery.pro.extensions.showSystemUI
import com.simplemobiletools.gallery.pro.helpers.PATH import com.simplemobiletools.gallery.pro.helpers.PATH
import kotlinx.android.synthetic.main.activity_panorama_photo.*
open class PanoramaPhotoActivity : SimpleActivity() { open class PanoramaPhotoActivity : SimpleActivity() {
private val CARDBOARD_DISPLAY_MODE = 3 private val CARDBOARD_DISPLAY_MODE = 3
@ -29,23 +29,26 @@ open class PanoramaPhotoActivity : SimpleActivity() {
private var isExploreEnabled = true private var isExploreEnabled = true
private var isRendering = false private var isRendering = false
private lateinit var binding: ActivityPanoramaPhotoBinding
public override fun onCreate(savedInstanceState: Bundle?) { public override fun onCreate(savedInstanceState: Bundle?) {
useDynamicTheme = false useDynamicTheme = false
requestWindowFeature(Window.FEATURE_NO_TITLE) requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_panorama_photo) binding = ActivityPanoramaPhotoBinding.inflate(layoutInflater)
setContentView(binding.root)
checkNotchSupport() checkNotchSupport()
setupButtonMargins() setupButtonMargins()
cardboard.setOnClickListener { binding.cardboard.setOnClickListener {
panorama_view.displayMode = CARDBOARD_DISPLAY_MODE binding.panoramaView.displayMode = CARDBOARD_DISPLAY_MODE
} }
explore.setOnClickListener { binding.explore.setOnClickListener {
isExploreEnabled = !isExploreEnabled isExploreEnabled = !isExploreEnabled
panorama_view.setPureTouchTracking(isExploreEnabled) binding.panoramaView.setPureTouchTracking(isExploreEnabled)
explore.setImageResource(if (isExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector) binding.explore.setImageResource(if (isExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
} }
checkIntent() checkIntent()
@ -57,7 +60,7 @@ open class PanoramaPhotoActivity : SimpleActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
panorama_view.resumeRendering() binding.panoramaView.resumeRendering()
isRendering = true isRendering = true
if (config.blackBackground) { if (config.blackBackground) {
updateStatusbarColor(Color.BLACK) updateStatusbarColor(Color.BLACK)
@ -74,14 +77,14 @@ open class PanoramaPhotoActivity : SimpleActivity() {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
panorama_view.pauseRendering() binding.panoramaView.pauseRendering()
isRendering = false isRendering = false
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
if (isRendering) { if (isRendering) {
panorama_view.shutdown() binding.panoramaView.shutdown()
} }
} }
@ -106,7 +109,7 @@ open class PanoramaPhotoActivity : SimpleActivity() {
ensureBackgroundThread { ensureBackgroundThread {
val bitmap = getBitmapToLoad(path) val bitmap = getBitmapToLoad(path)
runOnUiThread { runOnUiThread {
panorama_view.apply { binding.panoramaView.apply {
beVisible() beVisible()
loadImageFromBitmap(bitmap, options) loadImageFromBitmap(bitmap, options)
setFlingingEnabled(true) setFlingingEnabled(true)
@ -164,20 +167,20 @@ open class PanoramaPhotoActivity : SimpleActivity() {
private fun setupButtonMargins() { private fun setupButtonMargins() {
val navBarHeight = navigationBarHeight val navBarHeight = navigationBarHeight
(cardboard.layoutParams as RelativeLayout.LayoutParams).apply { (binding.cardboard.layoutParams as RelativeLayout.LayoutParams).apply {
bottomMargin = navBarHeight bottomMargin = navBarHeight
rightMargin = navigationBarWidth rightMargin = navigationBarWidth
} }
(explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = navigationBarHeight (binding.explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = navigationBarHeight
cardboard.onGlobalLayout { binding.cardboard.onGlobalLayout {
panorama_gradient_background.layoutParams.height = navBarHeight + cardboard.height binding.panoramaGradientBackground.layoutParams.height = navBarHeight + binding.cardboard.height
} }
} }
private fun toggleButtonVisibility() { 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.animate().alpha(if (isFullscreen) 0f else 1f)
it.isClickable = !isFullscreen 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.extensions.*
import com.simplemobiletools.commons.helpers.isRPlus import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.gallery.pro.R 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.config
import com.simplemobiletools.gallery.pro.extensions.hasNavBar import com.simplemobiletools.gallery.pro.extensions.hasNavBar
import com.simplemobiletools.gallery.pro.extensions.hideSystemUI import com.simplemobiletools.gallery.pro.extensions.hideSystemUI
import com.simplemobiletools.gallery.pro.extensions.showSystemUI import com.simplemobiletools.gallery.pro.extensions.showSystemUI
import com.simplemobiletools.gallery.pro.helpers.MIN_SKIP_LENGTH import com.simplemobiletools.gallery.pro.helpers.MIN_SKIP_LENGTH
import com.simplemobiletools.gallery.pro.helpers.PATH 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 import java.io.File
open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener { open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener {
@ -39,12 +38,14 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
private var mCurrTime = 0 private var mCurrTime = 0
private var mTimerHandler = Handler() private var mTimerHandler = Handler()
private lateinit var binding: ActivityPanoramaVideoBinding
public override fun onCreate(savedInstanceState: Bundle?) { public override fun onCreate(savedInstanceState: Bundle?) {
useDynamicTheme = false useDynamicTheme = false
requestWindowFeature(Window.FEATURE_NO_TITLE) requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_panorama_video) binding = ActivityPanoramaVideoBinding.inflate(layoutInflater)
setContentView(binding.root)
checkNotchSupport() checkNotchSupport()
checkIntent() checkIntent()
@ -56,7 +57,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
vr_video_view.resumeRendering() binding.vrVideoView.resumeRendering()
mIsRendering = true mIsRendering = true
if (config.blackBackground) { if (config.blackBackground) {
updateStatusbarColor(Color.BLACK) updateStatusbarColor(Color.BLACK)
@ -73,14 +74,14 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
vr_video_view.pauseRendering() binding.vrVideoView.pauseRendering()
mIsRendering = false mIsRendering = false
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
if (mIsRendering) { if (mIsRendering) {
vr_video_view.shutdown() binding.vrVideoView.shutdown()
} }
if (!isChangingConfigurations) { if (!isChangingConfigurations) {
@ -104,8 +105,8 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
setupButtons() setupButtons()
intent.removeExtra(PATH) intent.removeExtra(PATH)
video_curr_time.setOnClickListener { skip(false) } binding.bottomVideoTimeHolder.videoCurrTime.setOnClickListener { skip(false) }
video_duration.setOnClickListener { skip(true) } binding.bottomVideoTimeHolder.videoDuration.setOnClickListener { skip(true) }
try { try {
val options = VrVideoView.Options() val options = VrVideoView.Options()
@ -116,7 +117,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
Uri.fromFile(File(path)) Uri.fromFile(File(path))
} }
vr_video_view.apply { binding.vrVideoView.apply {
loadVideo(uri, options) loadVideo(uri, options)
pauseVideo() pauseVideo()
@ -149,9 +150,9 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
mIsPlaying = true mIsPlaying = true
resumeVideo() resumeVideo()
} else { } 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() { override fun onCompletion() {
@ -160,7 +161,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
}) })
} }
video_toggle_play_pause.setOnClickListener { binding.bottomVideoTimeHolder.videoTogglePlayPause.setOnClickListener {
togglePlayPause() togglePlayPause()
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -175,8 +176,8 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
private fun setupDuration(duration: Long) { private fun setupDuration(duration: Long) {
mDuration = (duration / 1000).toInt() mDuration = (duration / 1000).toInt()
video_seekbar.max = mDuration binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
video_duration.text = mDuration.getFormattedDuration() binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
setVideoProgress(0) setVideoProgress(0)
} }
@ -184,9 +185,9 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
runOnUiThread(object : Runnable { runOnUiThread(object : Runnable {
override fun run() { override fun run() {
if (mIsPlaying && !mIsDragged) { if (mIsPlaying && !mIsDragged) {
mCurrTime = (vr_video_view!!.currentPosition / 1000).toInt() mCurrTime = (binding.vrVideoView.currentPosition / 1000).toInt()
video_seekbar.progress = mCurrTime binding.bottomVideoTimeHolder.videoSeekbar.progress = mCurrTime
video_curr_time.text = mCurrTime.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
} }
mTimerHandler.postDelayed(this, 1000) mTimerHandler.postDelayed(this, 1000)
@ -204,35 +205,35 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
} }
private fun resumeVideo() { 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) { if (mCurrTime == mDuration) {
setVideoProgress(0) setVideoProgress(0)
mPlayOnReady = true mPlayOnReady = true
return return
} }
vr_video_view.playVideo() binding.vrVideoView.playVideo()
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} }
private fun pauseVideo() { private fun pauseVideo() {
vr_video_view.pauseVideo() binding.vrVideoView.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)
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} }
private fun setVideoProgress(seconds: Int) { private fun setVideoProgress(seconds: Int) {
vr_video_view.seekTo(seconds * 1000L) binding.vrVideoView.seekTo(seconds * 1000L)
video_seekbar.progress = seconds binding.bottomVideoTimeHolder.videoSeekbar.progress = seconds
mCurrTime = seconds mCurrTime = seconds
video_curr_time.text = seconds.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = seconds.getFormattedDuration()
} }
private fun videoCompleted() { private fun videoCompleted() {
mIsPlaying = false mIsPlaying = false
mCurrTime = (vr_video_view.duration / 1000).toInt() mCurrTime = (binding.vrVideoView.duration / 1000).toInt()
video_seekbar.progress = video_seekbar.max binding.bottomVideoTimeHolder.videoSeekbar.progress = binding.bottomVideoTimeHolder.videoSeekbar.max
video_curr_time.text = mDuration.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = mDuration.getFormattedDuration()
pauseVideo() pauseVideo()
} }
@ -249,44 +250,50 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
} }
} }
video_time_holder.setPadding(0, 0, right, bottom) binding.bottomVideoTimeHolder.root.setPadding(0, 0, right, bottom)
video_time_holder.background = resources.getDrawable(R.drawable.gradient_background) binding.bottomVideoTimeHolder.root.background = resources.getDrawable(R.drawable.gradient_background)
video_time_holder.onGlobalLayout { binding.bottomVideoTimeHolder.root.onGlobalLayout {
val newBottomMargin = video_time_holder.height - resources.getDimension(R.dimen.video_player_play_pause_size) val newBottomMargin = binding.bottomVideoTimeHolder.root.height - resources.getDimension(R.dimen.video_player_play_pause_size)
.toInt() - resources.getDimension(R.dimen.activity_margin).toInt() .toInt() - resources.getDimension(com.simplemobiletools.commons.R.dimen.activity_margin).toInt()
(explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = newBottomMargin (binding.explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = newBottomMargin
(cardboard.layoutParams as RelativeLayout.LayoutParams).apply { (binding.cardboard.layoutParams as RelativeLayout.LayoutParams).apply {
bottomMargin = newBottomMargin bottomMargin = newBottomMargin
rightMargin = navigationBarWidth 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 { binding.cardboard.setOnClickListener {
vr_video_view.displayMode = CARDBOARD_DISPLAY_MODE binding.vrVideoView.displayMode = CARDBOARD_DISPLAY_MODE
} }
explore.setOnClickListener { binding.explore.setOnClickListener {
mIsExploreEnabled = !mIsExploreEnabled mIsExploreEnabled = !mIsExploreEnabled
vr_video_view.setPureTouchTracking(mIsExploreEnabled) binding.vrVideoView.setPureTouchTracking(mIsExploreEnabled)
explore.setImageResource(if (mIsExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector) binding.explore.setImageResource(if (mIsExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
} }
} }
private fun toggleButtonVisibility() { private fun toggleButtonVisibility() {
val newAlpha = if (mIsFullscreen) 0f else 1f val newAlpha = if (mIsFullscreen) 0f else 1f
arrayOf(cardboard, explore).forEach { arrayOf(binding.cardboard, binding.explore).forEach {
it.animate().alpha(newAlpha) 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 it.isClickable = !mIsFullscreen
} }
video_seekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this) binding.bottomVideoTimeHolder.videoSeekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
video_time_holder.animate().alpha(newAlpha).start() binding.bottomVideoTimeHolder.videoTimeHolder.animate().alpha(newAlpha).start()
} }
private fun handleClick() { private fun handleClick() {
@ -304,11 +311,11 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
return return
} }
val curr = vr_video_view.currentPosition val curr = binding.vrVideoView.currentPosition
val twoPercents = Math.max((vr_video_view.duration / 50).toInt(), MIN_SKIP_LENGTH) val twoPercents = Math.max((binding.vrVideoView.duration / 50).toInt(), MIN_SKIP_LENGTH)
val newProgress = if (forward) curr + twoPercents else curr - twoPercents val newProgress = if (forward) curr + twoPercents else curr - twoPercents
val roundProgress = Math.round(newProgress / 1000f) 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) setVideoProgress(limitedProgress)
if (!mIsPlaying) { if (!mIsPlaying) {
togglePlayPause() togglePlayPause()
@ -322,7 +329,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
} }
override fun onStartTrackingTouch(seekBar: SeekBar?) { override fun onStartTrackingTouch(seekBar: SeekBar?) {
vr_video_view.pauseVideo() binding.vrVideoView.pauseVideo()
mIsDragged = true mIsDragged = true
} }

View file

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

View file

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

View file

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

View file

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

View file

@ -27,12 +27,12 @@ import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource import androidx.media3.exoplayer.source.ProgressiveMediaSource
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.ActivityVideoPlayerBinding
import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.* 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 val PLAY_WHEN_READY_DRAG_DELAY = 100L
private var mIsFullscreen = false private var mIsFullscreen = false
@ -58,10 +58,13 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
private var mIgnoreCloseDown = false private var mIgnoreCloseDown = false
private lateinit var binding: ActivityVideoPlayerBinding
public override fun onCreate(savedInstanceState: Bundle?) { public override fun onCreate(savedInstanceState: Bundle?) {
showTransparentTop = true showTransparentTop = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video_player) binding = ActivityVideoPlayerBinding.inflate(layoutInflater)
setContentView(binding.root)
setupOptionsMenu() setupOptionsMenu()
setupOrientation() setupOrientation()
checkNotchSupport() checkNotchSupport()
@ -70,11 +73,11 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
top_shadow.layoutParams.height = statusBarHeight + actionBarHeight binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
window.statusBarColor = Color.TRANSPARENT window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT window.navigationBarColor = Color.TRANSPARENT
if (config.blackBackground) { if (config.blackBackground) {
video_player_holder.background = ColorDrawable(Color.BLACK) binding.videoPlayerHolder.background = ColorDrawable(Color.BLACK)
} }
if (config.maxBrightness) { if (config.maxBrightness) {
@ -83,12 +86,12 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
window.attributes = attributes window.attributes = attributes
} }
updateTextColors(video_player_holder) updateTextColors(binding.videoPlayerHolder)
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) { if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
video_toolbar.setPadding(0, 0, navigationBarWidth, 0) binding.videoToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else { } 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() super.onDestroy()
if (!isChangingConfigurations) { if (!isChangingConfigurations) {
pauseVideo() pauseVideo()
video_curr_time.text = 0.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = 0.getFormattedDuration()
releaseExoPlayer() releaseExoPlayer()
video_seekbar.progress = 0 binding.bottomVideoTimeHolder.videoSeekbar.progress = 0
mTimerHandler.removeCallbacksAndMessages(null) mTimerHandler.removeCallbacksAndMessages(null)
mPlayWhenReadyHandler.removeCallbacksAndMessages(null) mPlayWhenReadyHandler.removeCallbacksAndMessages(null)
} }
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {
(video_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight (binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
video_toolbar.apply { binding.videoToolbar.apply {
setTitleTextColor(Color.WHITE) setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(R.drawable.ic_three_dots_vector, Color.WHITE) overflowIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(R.drawable.ic_arrow_left_vector, Color.WHITE) navigationIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)
} }
updateMenuItemColors(video_toolbar.menu, forceWhiteIcons = true) updateMenuItemColors(binding.videoToolbar.menu, forceWhiteIcons = true)
video_toolbar.setOnMenuItemClickListener { menuItem -> binding.videoToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.menu_change_orientation -> changeOrientation() R.id.menu_change_orientation -> changeOrientation()
R.id.menu_open_with -> openPath(mUri!!.toString(), true) 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 return@setOnMenuItemClickListener true
} }
video_toolbar.setNavigationOnClickListener { binding.videoToolbar.setNavigationOnClickListener {
finish() finish()
} }
} }
@ -141,16 +144,16 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
setVideoSize() setVideoSize()
initTimeHolder() initTimeHolder()
video_surface_frame.onGlobalLayout { binding.videoSurfaceFrame.onGlobalLayout {
video_surface_frame.controller.resetState() binding.videoSurfaceFrame.controller.resetState()
} }
top_shadow.layoutParams.height = statusBarHeight + actionBarHeight binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
(video_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight (binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) { if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
video_toolbar.setPadding(0, 0, navigationBarWidth, 0) binding.videoToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else { } 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() { private fun initPlayer() {
mUri = intent.data ?: return mUri = intent.data ?: return
video_toolbar.title = getFilenameFromUri(mUri!!) binding.videoToolbar.title = getFilenameFromUri(mUri!!)
initTimeHolder() initTimeHolder()
showSystemUI(true) showSystemUI(true)
@ -175,17 +178,17 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
fullscreenToggled(isFullscreen) fullscreenToggled(isFullscreen)
} }
video_curr_time.setOnClickListener { doSkip(false) } binding.bottomVideoTimeHolder.videoCurrTime.setOnClickListener { doSkip(false) }
video_duration.setOnClickListener { doSkip(true) } binding.bottomVideoTimeHolder.videoDuration.setOnClickListener { doSkip(true) }
video_toggle_play_pause.setOnClickListener { togglePlayPause() } binding.bottomVideoTimeHolder.videoTogglePlayPause.setOnClickListener { togglePlayPause() }
video_surface_frame.setOnClickListener { toggleFullscreen() } binding.videoSurfaceFrame.setOnClickListener { toggleFullscreen() }
video_surface_frame.controller.settings.swallowDoubleTaps = true binding.videoSurfaceFrame.controller.settings.swallowDoubleTaps = true
video_next_file.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false)) binding.bottomVideoTimeHolder.videoNextFile.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false))
video_next_file.setOnClickListener { handleNextFile() } binding.bottomVideoTimeHolder.videoNextFile.setOnClickListener { handleNextFile() }
video_prev_file.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false)) binding.bottomVideoTimeHolder.videoPrevFile.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false))
video_prev_file.setOnClickListener { handlePrevFile() } binding.bottomVideoTimeHolder.videoPrevFile.setOnClickListener { handlePrevFile() }
val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() { val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent): Boolean { 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) handleEvent(event)
gestureDetector.onTouchEvent(event) gestureDetector.onTouchEvent(event)
false false
} }
initExoPlayer() initExoPlayer()
video_surface.surfaceTextureListener = this binding.videoSurface.surfaceTextureListener = this
if (config.allowVideoGestures) { 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() toggleFullscreen()
}, doubleTap = { x, y -> }, doubleTap = { x, y ->
doSkip(false) 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() toggleFullscreen()
}, doubleTap = { x, y -> }, doubleTap = { x, y ->
doSkip(true) doSkip(true)
}) })
} else { } else {
video_brightness_controller.beGone() binding.videoBrightnessController.beGone()
video_volume_controller.beGone() binding.videoVolumeController.beGone()
} }
if (config.hideSystemUI) { 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) { override fun onPositionDiscontinuity(oldPosition: Player.PositionInfo, newPosition: Player.PositionInfo, @Player.DiscontinuityReason reason: Int) {
// Reset progress views when video loops. // Reset progress views when video loops.
if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) { if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
video_seekbar.progress = 0 binding.bottomVideoTimeHolder.videoSeekbar.progress = 0
video_curr_time.text = 0.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = 0.getFormattedDuration()
} }
} }
@ -289,10 +292,10 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
private fun videoPrepared() { private fun videoPrepared() {
if (!mWasVideoStarted) { if (!mWasVideoStarted) {
video_toggle_play_pause.beVisible() binding.bottomVideoTimeHolder.videoTogglePlayPause.beVisible()
mDuration = (mExoPlayer!!.duration / 1000).toInt() mDuration = (mExoPlayer!!.duration / 1000).toInt()
video_seekbar.max = mDuration binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
video_duration.text = mDuration.getFormattedDuration() binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
setPosition(mCurrTime) setPosition(mCurrTime)
if (config.rememberLastVideoPosition) { if (config.rememberLastVideoPosition) {
@ -302,7 +305,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
if (config.autoplayVideos) { if (config.autoplayVideos) {
resumeVideo() resumeVideo()
} else { } 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() { 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) { if (mExoPlayer == null) {
return return
} }
@ -334,7 +337,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
} }
private fun pauseVideo() { 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) { if (mExoPlayer == null) {
return return
} }
@ -358,8 +361,8 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
private fun setPosition(seconds: Int) { private fun setPosition(seconds: Int) {
mExoPlayer?.seekTo(seconds * 1000L) mExoPlayer?.seekTo(seconds * 1000L)
video_seekbar.progress = seconds binding.bottomVideoTimeHolder.videoSeekbar.progress = seconds
video_curr_time.text = seconds.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = seconds.getFormattedDuration()
} }
private fun setLastVideoSavedPosition() { private fun setLastVideoSavedPosition() {
@ -376,8 +379,8 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
clearLastVideoSavedProgress() clearLastVideoSavedProgress()
mCurrTime = (mExoPlayer!!.duration / 1000).toInt() mCurrTime = (mExoPlayer!!.duration / 1000).toInt()
video_seekbar.progress = video_seekbar.max binding.bottomVideoTimeHolder.videoSeekbar.progress = binding.bottomVideoTimeHolder.videoSeekbar.max
video_curr_time.text = mDuration.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = mDuration.getFormattedDuration()
pauseVideo() pauseVideo()
} }
@ -410,7 +413,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
val screenProportion = screenWidth.toFloat() / screenHeight.toFloat() val screenProportion = screenWidth.toFloat() / screenHeight.toFloat()
video_surface.layoutParams.apply { binding.videoSurface.layoutParams.apply {
if (videoProportion > screenProportion) { if (videoProportion > screenProportion) {
width = screenWidth width = screenWidth
height = (screenWidth.toFloat() / videoProportion).toInt() height = (screenWidth.toFloat() / videoProportion).toInt()
@ -418,7 +421,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
width = (videoProportion * screenHeight.toFloat()).toInt() width = (videoProportion * screenHeight.toFloat()).toInt()
height = screenHeight height = screenHeight
} }
video_surface.layoutParams = this binding.videoSurface.layoutParams = this
} }
val multiplier = if (screenWidth > screenHeight) 0.5 else 0.8 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 val newAlpha = if (isFullScreen) 0f else 1f
arrayOf( arrayOf(
video_prev_file, binding.bottomVideoTimeHolder.videoPrevFile,
video_toggle_play_pause, binding.bottomVideoTimeHolder.videoTogglePlayPause,
video_next_file, binding.bottomVideoTimeHolder.videoNextFile,
video_curr_time, binding.bottomVideoTimeHolder.videoCurrTime,
video_seekbar, binding.bottomVideoTimeHolder.videoSeekbar,
video_duration, binding.bottomVideoTimeHolder.videoDuration,
top_shadow, binding.topShadow,
video_bottom_gradient binding.videoBottomGradient
).forEach { ).forEach {
it.animate().alpha(newAlpha).start() it.animate().alpha(newAlpha).start()
} }
video_seekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this) binding.bottomVideoTimeHolder.videoSeekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
arrayOf(video_prev_file, video_next_file, video_curr_time, video_duration).forEach { arrayOf(
binding.bottomVideoTimeHolder.videoPrevFile,
binding.bottomVideoTimeHolder.videoNextFile,
binding.bottomVideoTimeHolder.videoCurrTime,
binding.bottomVideoTimeHolder.videoDuration,
).forEach {
it.isClickable = !mIsFullscreen it.isClickable = !mIsFullscreen
} }
video_appbar.animate().alpha(newAlpha).withStartAction { binding.videoAppbar.animate().alpha(newAlpha).withStartAction {
video_appbar.beVisible() binding.videoAppbar.beVisible()
}.withEndAction { }.withEndAction {
video_appbar.beVisibleIf(newAlpha == 1f) binding.videoAppbar.beVisibleIf(newAlpha == 1f)
}.start() }.start()
} }
@ -492,11 +500,11 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
} }
} }
video_time_holder.setPadding(0, 0, right, bottom) binding.bottomVideoTimeHolder.videoTimeHolder.setPadding(0, 0, right, bottom)
video_seekbar.setOnSeekBarChangeListener(this) binding.bottomVideoTimeHolder.videoSeekbar.setOnSeekBarChangeListener(this)
video_seekbar.max = mDuration binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
video_duration.text = mDuration.getFormattedDuration() binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
video_curr_time.text = mCurrTime.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
setupTimer() setupTimer()
} }
@ -505,8 +513,8 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
override fun run() { override fun run() {
if (mExoPlayer != null && !mIsDragged && mIsPlaying) { if (mExoPlayer != null && !mIsDragged && mIsPlaying) {
mCurrTime = (mExoPlayer!!.currentPosition / 1000).toInt() mCurrTime = (mExoPlayer!!.currentPosition / 1000).toInt()
video_seekbar.progress = mCurrTime binding.bottomVideoTimeHolder.videoSeekbar.progress = mCurrTime
video_curr_time.text = mCurrTime.getFormattedDuration() binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
} }
mTimerHandler.postDelayed(this, 1000) mTimerHandler.postDelayed(this, 1000)
@ -543,9 +551,13 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
val diffX = event.rawX - mTouchDownX val diffX = event.rawX - mTouchDownX
val diffY = event.rawY - mTouchDownY 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) { 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() it.animate().alpha(1f).start()
} }
} }
@ -570,7 +582,7 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
val downGestureDuration = System.currentTimeMillis() - mTouchDownTime val downGestureDuration = System.currentTimeMillis() - mTouchDownTime
if (config.allowDownGesture && !mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold && if (config.allowDownGesture && !mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold &&
downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION && downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION &&
video_surface_frame.controller.state.zoom == 1f binding.videoSurfaceFrame.controller.state.zoom == 1f
) { ) {
supportFinishAfterTransition() supportFinishAfterTransition()
} }
@ -578,7 +590,11 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.*
mIgnoreCloseDown = false mIgnoreCloseDown = false
if (mIsDragged) { if (mIsDragged) {
if (mIsFullscreen) { 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() 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 onSurfaceTextureDestroyed(surface: SurfaceTexture) = false
override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) { 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) {} 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.R
import com.simplemobiletools.gallery.pro.adapters.MyPagerAdapter import com.simplemobiletools.gallery.pro.adapters.MyPagerAdapter
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask 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.DeleteWithRememberDialog
import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog
import com.simplemobiletools.gallery.pro.dialogs.SlideshowDialog 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.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem 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 java.io.File
import kotlin.math.min import kotlin.math.min
@ -83,15 +82,18 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mFavoritePaths = ArrayList<String>() private var mFavoritePaths = ArrayList<String>()
private var mIgnoredPaths = ArrayList<String>() private var mIgnoredPaths = ArrayList<String>()
private lateinit var binding: ActivityMediumBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
showTransparentTop = true showTransparentTop = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_medium) binding = ActivityMediumBinding.inflate(layoutInflater)
setContentView(binding.root)
setupOptionsMenu() setupOptionsMenu()
refreshMenuItems() refreshMenuItems()
window.decorView.setBackgroundColor(getProperBackgroundColor()) window.decorView.setBackgroundColor(getProperBackgroundColor())
top_shadow.layoutParams.height = statusBarHeight + actionBarHeight binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
checkNotchSupport() checkNotchSupport()
(MediaActivity.mMedia.clone() as ArrayList<ThumbnailItem>).filterIsInstanceTo(mMediaFiles, Medium::class.java) (MediaActivity.mMedia.clone() as ArrayList<ThumbnailItem>).filterIsInstanceTo(mMediaFiles, Medium::class.java)
@ -99,7 +101,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (it) { if (it) {
initViewPager() initViewPager()
} else { } else {
toast(R.string.no_storage_permissions) toast(com.simplemobiletools.commons.R.string.no_storage_permissions)
finish() finish()
} }
} }
@ -132,7 +134,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
refreshMenuItems() refreshMenuItems()
val filename = getCurrentMedium()?.name ?: mPath.getFilenameFromPath() val filename = getCurrentMedium()?.name ?: mPath.getFilenameFromPath()
medium_viewer_toolbar.title = filename binding.mediumViewerToolbar.title = filename
} }
override fun onPause() { override fun onPause() {
@ -162,7 +164,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
runOnUiThread { runOnUiThread {
val rotationDegrees = getCurrentPhotoFragment()?.mCurrentRotationDegrees ?: 0 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_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_slideshow).isVisible = visibleBottomActions and BOTTOM_ACTION_SLIDESHOW == 0
findItem(R.id.menu_properties).isVisible = visibleBottomActions and BOTTOM_ACTION_PROPERTIES == 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() { private fun setupOptionsMenu() {
(medium_viewer_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight (binding.mediumViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
medium_viewer_toolbar.apply { binding.mediumViewerToolbar.apply {
setTitleTextColor(Color.WHITE) setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(R.drawable.ic_three_dots_vector, Color.WHITE) overflowIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(R.drawable.ic_arrow_left_vector, Color.WHITE) navigationIcon = resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)
} }
updateMenuItemColors(medium_viewer_toolbar.menu, forceWhiteIcons = true) updateMenuItemColors(binding.mediumViewerToolbar.menu, forceWhiteIcons = true)
medium_viewer_toolbar.setOnMenuItemClickListener { menuItem -> binding.mediumViewerToolbar.setOnMenuItemClickListener { menuItem ->
if (getCurrentMedium() == null) { if (getCurrentMedium() == null) {
return@setOnMenuItemClickListener true return@setOnMenuItemClickListener true
} }
@ -255,7 +257,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return@setOnMenuItemClickListener true return@setOnMenuItemClickListener true
} }
medium_viewer_toolbar.setNavigationOnClickListener { binding.mediumViewerToolbar.setNavigationOnClickListener {
finish() finish()
} }
} }
@ -280,7 +282,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
initBottomActionsLayout() initBottomActionsLayout()
(medium_viewer_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight (binding.mediumViewerAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
} }
private fun initViewPager() { private fun initViewPager() {
@ -314,7 +316,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
if (mPath.isEmpty()) { if (mPath.isEmpty()) {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
finish() finish()
return return
} }
@ -368,9 +370,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
isShowingRecycleBin -> RECYCLE_BIN isShowingRecycleBin -> RECYCLE_BIN
else -> mPath.getParentPath() else -> mPath.getParentPath()
} }
medium_viewer_toolbar.title = mPath.getFilenameFromPath() binding.mediumViewerToolbar.title = mPath.getFilenameFromPath()
view_pager.onGlobalLayout { binding.viewPager.onGlobalLayout {
if (!isDestroyed) { if (!isDestroyed) {
if (mMediaFiles.isNotEmpty()) { if (mMediaFiles.isNotEmpty()) {
gotMedia(mMediaFiles as ArrayList<ThumbnailItem>, refetchViewPagerPosition = true) gotMedia(mMediaFiles as ArrayList<ThumbnailItem>, refetchViewPagerPosition = true)
@ -390,14 +392,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
refreshViewPager(true) refreshViewPager(true)
view_pager.offscreenPageLimit = 2 binding.viewPager.offscreenPageLimit = 2
if (config.blackBackground) { if (config.blackBackground) {
view_pager.background = ColorDrawable(Color.BLACK) binding.viewPager.background = ColorDrawable(Color.BLACK)
} }
if (config.hideSystemUI) { if (config.hideSystemUI) {
view_pager.onGlobalLayout { binding.viewPager.onGlobalLayout {
Handler().postDelayed({ Handler().postDelayed({
fragmentClicked() fragmentClicked()
}, HIDE_SYSTEM_UI_DELAY) }, HIDE_SYSTEM_UI_DELAY)
@ -469,7 +471,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, media) val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, media)
if (!isDestroyed) { if (!isDestroyed) {
pagerAdapter.shouldInitFragment = mPos < 5 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 // must remove the listener before changing adapter, otherwise it might cause `mPos` to be set to 0
removeOnPageChangeListener(this@ViewPagerActivity) removeOnPageChangeListener(this@ViewPagerActivity)
adapter = pagerAdapter adapter = pagerAdapter
@ -494,10 +496,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun startSlideshow() { private fun startSlideshow() {
if (getMediaForSlideshow()) { if (getMediaForSlideshow()) {
view_pager.onGlobalLayout { binding.viewPager.onGlobalLayout {
if (!isDestroyed) { if (!isDestroyed) {
if (config.slideshowAnimation == SLIDESHOW_ANIMATION_FADE) { if (config.slideshowAnimation == SLIDESHOW_ANIMATION_FADE) {
view_pager.setPageTransformer(false, FadePageTransformer()) binding.viewPager.setPageTransformer(false, FadePageTransformer())
} }
hideSystemUI(true) hideSystemUI(true)
@ -513,35 +515,35 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
private fun goToNextMedium(forward: Boolean) { private fun goToNextMedium(forward: Boolean) {
val oldPosition = view_pager.currentItem val oldPosition = binding.viewPager.currentItem
val newPosition = if (forward) oldPosition + 1 else oldPosition - 1 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) slideshowEnded(forward)
} else { } else {
view_pager.setCurrentItem(newPosition, false) binding.viewPager.setCurrentItem(newPosition, false)
} }
} }
private fun animatePagerTransition(forward: Boolean) { private fun animatePagerTransition(forward: Boolean) {
val oldPosition = view_pager.currentItem val oldPosition = binding.viewPager.currentItem
val animator = ValueAnimator.ofInt(0, view_pager.width) val animator = ValueAnimator.ofInt(0, binding.viewPager.width)
animator.addListener(object : Animator.AnimatorListener { animator.addListener(object : Animator.AnimatorListener {
override fun onAnimationEnd(animation: Animator) { override fun onAnimationEnd(animation: Animator) {
if (view_pager.isFakeDragging) { if (binding.viewPager.isFakeDragging) {
try { try {
view_pager.endFakeDrag() binding.viewPager.endFakeDrag()
} catch (ignored: Exception) { } catch (ignored: Exception) {
stopSlideshow() stopSlideshow()
} }
if (view_pager.currentItem == oldPosition) { if (binding.viewPager.currentItem == oldPosition) {
slideshowEnded(forward) slideshowEnded(forward)
} }
} }
} }
override fun onAnimationCancel(animation: Animator) { override fun onAnimationCancel(animation: Animator) {
view_pager.endFakeDrag() binding.viewPager.endFakeDrag()
} }
override fun onAnimationStart(animation: Animator) {} override fun onAnimationStart(animation: Animator) {}
@ -559,12 +561,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener { animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener {
var oldDragPosition = 0 var oldDragPosition = 0
override fun onAnimationUpdate(animation: ValueAnimator) { override fun onAnimationUpdate(animation: ValueAnimator) {
if (view_pager?.isFakeDragging == true) { if (binding.viewPager?.isFakeDragging == true) {
val dragPosition = animation.animatedValue as Int val dragPosition = animation.animatedValue as Int
val dragOffset = dragPosition - oldDragPosition val dragOffset = dragPosition - oldDragPosition
oldDragPosition = dragPosition oldDragPosition = dragPosition
try { try {
view_pager.fakeDragBy(dragOffset * (if (forward) -1f else 1f)) binding.viewPager.fakeDragBy(dragOffset * (if (forward) -1f else 1f))
} catch (e: Exception) { } catch (e: Exception) {
stopSlideshow() stopSlideshow()
} }
@ -572,16 +574,16 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
}) })
view_pager.beginFakeDrag() binding.viewPager.beginFakeDrag()
animator.start() animator.start()
} }
private fun slideshowEnded(forward: Boolean) { private fun slideshowEnded(forward: Boolean) {
if (config.loopSlideshow) { if (config.loopSlideshow) {
if (forward) { if (forward) {
view_pager.setCurrentItem(0, false) binding.viewPager.setCurrentItem(0, false)
} else { } else {
view_pager.setCurrentItem(view_pager.adapter!!.count - 1, false) binding.viewPager.setCurrentItem(binding.viewPager.adapter!!.count - 1, false)
} }
} else { } else {
stopSlideshow() stopSlideshow()
@ -591,7 +593,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun stopSlideshow() { private fun stopSlideshow() {
if (mIsSlideshowActive) { if (mIsSlideshowActive) {
view_pager.setPageTransformer(false, DefaultPageTransformer()) binding.viewPager.setPageTransformer(false, DefaultPageTransformer())
mIsSlideshowActive = false mIsSlideshowActive = false
showSystemUI(true) showSystemUI(true)
mSlideshowHandler.removeCallbacksAndMessages(null) mSlideshowHandler.removeCallbacksAndMessages(null)
@ -665,7 +667,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun copyMoveTo(isCopyOperation: Boolean) { private fun copyMoveTo(isCopyOperation: Boolean) {
val currPath = getCurrentPath() val currPath = getCurrentPath()
if (!isCopyOperation && currPath.startsWith(recycleBinPath)) { 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 return
} }
@ -687,7 +689,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun toggleFileVisibility(hide: Boolean, callback: (() -> Unit)? = null) { private fun toggleFileVisibility(hide: Boolean, callback: (() -> Unit)? = null) {
toggleFileVisibility(getCurrentPath(), hide) { toggleFileVisibility(getCurrentPath(), hide) {
val newFileName = it.getFilenameFromPath() val newFileName = it.getFilenameFromPath()
medium_viewer_toolbar.title = newFileName binding.mediumViewerToolbar.title = newFileName
getCurrentMedium()!!.apply { getCurrentMedium()!!.apply {
name = newFileName name = newFileName
@ -727,12 +729,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun getChangeOrientationIcon(): Int { private fun getChangeOrientationIcon(): Int {
return if (mIsOrientationLocked) { return if (mIsOrientationLocked) {
if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
R.drawable.ic_orientation_portrait_vector com.simplemobiletools.commons.R.drawable.ic_orientation_portrait_vector
} else { } else {
R.drawable.ic_orientation_landscape_vector com.simplemobiletools.commons.R.drawable.ic_orientation_landscape_vector
} }
} else { } 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 return@handleSAFDialog
} }
toast(R.string.saving) toast(com.simplemobiletools.commons.R.string.saving)
ensureBackgroundThread { ensureBackgroundThread {
val photoFragment = getCurrentPhotoFragment() ?: return@ensureBackgroundThread val photoFragment = getCurrentPhotoFragment() ?: return@ensureBackgroundThread
saveRotatedImageToFile(currPath, newPath, photoFragment.mCurrentRotationDegrees, true) { saveRotatedImageToFile(currPath, newPath, photoFragment.mCurrentRotationDegrees, true) {
toast(R.string.file_saved) toast(com.simplemobiletools.commons.R.string.file_saved)
getCurrentPhotoFragment()?.mCurrentRotationDegrees = 0 getCurrentPhotoFragment()?.mCurrentRotationDegrees = 0
refreshMenuItems() refreshMenuItems()
} }
@ -814,7 +816,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return false 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() { private fun showProperties() {
if (getCurrentMedium() != null) { if (getCurrentMedium() != null) {
@ -823,63 +825,63 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
private fun initBottomActionsLayout() { 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) { if (config.bottomActions) {
bottom_actions.beVisible() binding.bottomActions.root.beVisible()
} else { } else {
bottom_actions.beGone() binding.bottomActions.root.beGone()
} }
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) { if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
medium_viewer_toolbar.setPadding(0, 0, navigationBarWidth, 0) binding.mediumViewerToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else { } else {
medium_viewer_toolbar.setPadding(0, 0, 0, 0) binding.mediumViewerToolbar.setPadding(0, 0, 0, 0)
} }
} }
private fun initBottomActionButtons() { private fun initBottomActionButtons() {
val currentMedium = getCurrentMedium() val currentMedium = getCurrentMedium()
val visibleBottomActions = if (config.bottomActions) config.visibleBottomActions else 0 val visibleBottomActions = if (config.bottomActions) config.visibleBottomActions else 0
bottom_favorite.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0 && currentMedium?.getIsInRecycleBin() == false) binding.bottomActions.bottomFavorite.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0 && currentMedium?.getIsInRecycleBin() == false)
bottom_favorite.setOnLongClickListener { toast(R.string.toggle_favorite); true } binding.bottomActions.bottomFavorite.setOnLongClickListener { toast(R.string.toggle_favorite); true }
bottom_favorite.setOnClickListener { binding.bottomActions.bottomFavorite.setOnClickListener {
toggleFavorite() toggleFavorite()
} }
bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && currentMedium?.isSVG() == false) binding.bottomActions.bottomEdit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && currentMedium?.isSVG() == false)
bottom_edit.setOnLongClickListener { toast(R.string.edit); true } binding.bottomActions.bottomEdit.setOnLongClickListener { toast(R.string.edit); true }
bottom_edit.setOnClickListener { binding.bottomActions.bottomEdit.setOnClickListener {
openEditor(getCurrentPath()) openEditor(getCurrentPath())
} }
bottom_share.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHARE != 0) binding.bottomActions.bottomShare.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHARE != 0)
bottom_share.setOnLongClickListener { toast(R.string.share); true } binding.bottomActions.bottomShare.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.share); true }
bottom_share.setOnClickListener { binding.bottomActions.bottomShare.setOnClickListener {
shareMediumPath(getCurrentPath()) shareMediumPath(getCurrentPath())
} }
bottom_delete.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_DELETE != 0) binding.bottomActions.bottomDelete.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_DELETE != 0)
bottom_delete.setOnLongClickListener { toast(R.string.delete); true } binding.bottomActions.bottomDelete.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.delete); true }
bottom_delete.setOnClickListener { binding.bottomActions.bottomDelete.setOnClickListener {
checkDeleteConfirmation() checkDeleteConfirmation()
} }
bottom_rotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && getCurrentMedium()?.isImage() == true) binding.bottomActions.bottomRotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && getCurrentMedium()?.isImage() == true)
bottom_rotate.setOnLongClickListener { toast(R.string.rotate); true } binding.bottomActions.bottomRotate.setOnLongClickListener { toast(R.string.rotate); true }
bottom_rotate.setOnClickListener { binding.bottomActions.bottomRotate.setOnClickListener {
rotateImage(90) rotateImage(90)
} }
bottom_properties.applyColorFilter(Color.WHITE) binding.bottomActions.bottomProperties.applyColorFilter(Color.WHITE)
bottom_properties.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_PROPERTIES != 0) binding.bottomActions.bottomProperties.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_PROPERTIES != 0)
bottom_properties.setOnLongClickListener { toast(R.string.properties); true } binding.bottomActions.bottomProperties.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.properties); true }
bottom_properties.setOnClickListener { binding.bottomActions.bottomProperties.setOnClickListener {
showProperties() showProperties()
} }
bottom_change_orientation.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0) binding.bottomActions.bottomChangeOrientation.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0)
bottom_change_orientation.setOnLongClickListener { toast(R.string.change_orientation); true } binding.bottomActions.bottomChangeOrientation.setOnLongClickListener { toast(R.string.change_orientation); true }
bottom_change_orientation.setOnClickListener { binding.bottomActions.bottomChangeOrientation.setOnClickListener {
requestedOrientation = when (requestedOrientation) { requestedOrientation = when (requestedOrientation) {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT -> ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE ActivityInfo.SCREEN_ORIENTATION_PORTRAIT -> ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
@ -889,24 +891,24 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
updateBottomActionIcons(currentMedium) updateBottomActionIcons(currentMedium)
} }
bottom_slideshow.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SLIDESHOW != 0) binding.bottomActions.bottomSlideshow.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SLIDESHOW != 0)
bottom_slideshow.setOnLongClickListener { toast(R.string.slideshow); true } binding.bottomActions.bottomSlideshow.setOnLongClickListener { toast(R.string.slideshow); true }
bottom_slideshow.setOnClickListener { binding.bottomActions.bottomSlideshow.setOnClickListener {
initSlideshow() initSlideshow()
} }
bottom_show_on_map.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHOW_ON_MAP != 0) binding.bottomActions.bottomShowOnMap.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SHOW_ON_MAP != 0)
bottom_show_on_map.setOnLongClickListener { toast(R.string.show_on_map); true } binding.bottomActions.bottomShowOnMap.setOnLongClickListener { toast(R.string.show_on_map); true }
bottom_show_on_map.setOnClickListener { binding.bottomActions.bottomShowOnMap.setOnClickListener {
showFileOnMap(getCurrentPath()) showFileOnMap(getCurrentPath())
} }
bottom_toggle_file_visibility.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0) binding.bottomActions.bottomToggleFileVisibility.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0)
bottom_toggle_file_visibility.setOnLongClickListener { binding.bottomActions.bottomToggleFileVisibility.setOnLongClickListener {
toast(if (currentMedium?.isHidden() == true) R.string.unhide else R.string.hide); true 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 { currentMedium?.apply {
toggleFileVisibility(!isHidden()) { toggleFileVisibility(!isHidden()) {
updateBottomActionIcons(currentMedium) updateBottomActionIcons(currentMedium)
@ -914,33 +916,33 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
} }
bottom_rename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 && currentMedium?.getIsInRecycleBin() == false) binding.bottomActions.bottomRename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 && currentMedium?.getIsInRecycleBin() == false)
bottom_rename.setOnLongClickListener { toast(R.string.rename); true } binding.bottomActions.bottomRename.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.rename); true }
bottom_rename.setOnClickListener { binding.bottomActions.bottomRename.setOnClickListener {
checkMediaManagementAndRename() checkMediaManagementAndRename()
} }
bottom_set_as.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0) binding.bottomActions.bottomSetAs.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0)
bottom_set_as.setOnLongClickListener { toast(R.string.set_as); true } binding.bottomActions.bottomSetAs.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.set_as); true }
bottom_set_as.setOnClickListener { binding.bottomActions.bottomSetAs.setOnClickListener {
setAs(getCurrentPath()) setAs(getCurrentPath())
} }
bottom_copy.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_COPY != 0) binding.bottomActions.bottomCopy.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_COPY != 0)
bottom_copy.setOnLongClickListener { toast(R.string.copy); true } binding.bottomActions.bottomCopy.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.copy); true }
bottom_copy.setOnClickListener { binding.bottomActions.bottomCopy.setOnClickListener {
checkMediaManagementAndCopy(true) checkMediaManagementAndCopy(true)
} }
bottom_move.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_MOVE != 0) binding.bottomActions.bottomMove.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_MOVE != 0)
bottom_move.setOnLongClickListener { toast(R.string.move); true } binding.bottomActions.bottomMove.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.move); true }
bottom_move.setOnClickListener { binding.bottomActions.bottomMove.setOnClickListener {
moveFileTo() moveFileTo()
} }
bottom_resize.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RESIZE != 0 && currentMedium?.isImage() == true) binding.bottomActions.bottomResize.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RESIZE != 0 && currentMedium?.isImage() == true)
bottom_resize.setOnLongClickListener { toast(R.string.resize); true } binding.bottomActions.bottomResize.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.resize); true }
bottom_resize.setOnClickListener { binding.bottomActions.bottomResize.setOnClickListener {
resizeImage() resizeImage()
} }
} }
@ -950,14 +952,16 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return return
} }
val favoriteIcon = if (medium.isFavorite) R.drawable.ic_star_vector else R.drawable.ic_star_outline_vector val favoriteIcon =
bottom_favorite.setImageResource(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 val hideIcon =
bottom_toggle_file_visibility.setImageResource(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) binding.bottomActions.bottomRotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && getCurrentMedium()?.isImage() == true)
bottom_change_orientation.setImageResource(getChangeOrientationIcon()) binding.bottomActions.bottomChangeOrientation.setImageResource(getChangeOrientationIcon())
} }
private fun toggleFavorite() { private fun toggleFavorite() {
@ -989,7 +993,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
try { try {
val resolution = path.getImageResolution(this) val resolution = path.getImageResolution(this)
if (resolution == null) { if (resolution == null) {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return return
} }
@ -1073,9 +1077,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val isInRecycleBin = getCurrentMedium()!!.getIsInRecycleBin() val isInRecycleBin = getCurrentMedium()!!.getIsInRecycleBin()
val baseString = if (config.useRecycleBin && !config.tempSkipRecycleBin && !isInRecycleBin) { 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 { } else {
R.string.deletion_confirmation com.simplemobiletools.commons.R.string.deletion_confirmation
} }
val message = String.format(resources.getString(baseString), filenameAndSize) val message = String.format(resources.getString(baseString), filenameAndSize)
@ -1128,7 +1132,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
} }
} else { } 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) val isSDOrOtgRootFolder = isAStorageRootFolder(oldPath.getParentPath()) && !oldPath.startsWith(internalStoragePath)
if (isRPlus() && isSDOrOtgRootFolder && !isExternalStorageManager()) { 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 return
} }
@ -1320,12 +1324,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun isSlideShowActive() = mIsSlideshowActive override fun isSlideShowActive() = mIsSlideshowActive
override fun goToPrevItem() { override fun goToPrevItem() {
view_pager.setCurrentItem(view_pager.currentItem - 1, false) binding.viewPager.setCurrentItem(binding.viewPager.currentItem - 1, false)
checkOrientation() checkOrientation()
} }
override fun goToNextItem() { override fun goToNextItem() {
view_pager.setCurrentItem(view_pager.currentItem + 1, false) binding.viewPager.setCurrentItem(binding.viewPager.currentItem + 1, false)
checkOrientation() checkOrientation()
} }
@ -1340,14 +1344,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
putExtra(IS_FROM_GALLERY, true) putExtra(IS_FROM_GALLERY, true)
putExtra(REAL_FILE_PATH, path) putExtra(REAL_FILE_PATH, path)
putExtra(SHOW_PREV_ITEM, view_pager.currentItem != 0) putExtra(SHOW_PREV_ITEM, binding.viewPager.currentItem != 0)
putExtra(SHOW_NEXT_ITEM, view_pager.currentItem != mMediaFiles.lastIndex) putExtra(SHOW_NEXT_ITEM, binding.viewPager.currentItem != mMediaFiles.lastIndex)
try { try {
startActivityForResult(this, REQUEST_VIEW_VIDEO) startActivityForResult(this, REQUEST_VIEW_VIDEO)
} catch (e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
if (!tryGenericMimeType(this, mimeType, newUri)) { if (!tryGenericMimeType(this, mimeType, newUri)) {
toast(R.string.no_app_found) toast(com.simplemobiletools.commons.R.string.no_app_found)
} }
} catch (e: Exception) { } catch (e: Exception) {
showErrorToast(e) showErrorToast(e)
@ -1366,20 +1370,20 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
private fun fullscreenToggled() { private fun fullscreenToggled() {
view_pager.adapter?.let { binding.viewPager.adapter?.let {
(it as MyPagerAdapter).toggleFullscreen(mIsFullScreen) (it as MyPagerAdapter).toggleFullscreen(mIsFullScreen)
val newAlpha = if (mIsFullScreen) 0f else 1f val newAlpha = if (mIsFullScreen) 0f else 1f
top_shadow.animate().alpha(newAlpha).start() binding.topShadow.animate().alpha(newAlpha).start()
bottom_actions.animate().alpha(newAlpha).withStartAction { binding.bottomActions.root.animate().alpha(newAlpha).withStartAction {
bottom_actions.beVisible() binding.bottomActions.root.beVisible()
}.withEndAction { }.withEndAction {
bottom_actions.beVisibleIf(newAlpha == 1f) binding.bottomActions.root.beVisibleIf(newAlpha == 1f)
}.start() }.start()
medium_viewer_appbar.animate().alpha(newAlpha).withStartAction { binding.mediumViewerAppbar.animate().alpha(newAlpha).withStartAction {
medium_viewer_appbar.beVisible() binding.mediumViewerAppbar.beVisible()
}.withEndAction { }.withEndAction {
medium_viewer_appbar.beVisibleIf(newAlpha == 1f) binding.mediumViewerAppbar.beVisibleIf(newAlpha == 1f)
}.start() }.start()
} }
} }
@ -1388,7 +1392,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
runOnUiThread { runOnUiThread {
val medium = getCurrentMedium() val medium = getCurrentMedium()
if (medium != null) { 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.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R 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.dialogs.PickDirectoryDialog
import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.MyWidgetProvider import com.simplemobiletools.gallery.pro.helpers.MyWidgetProvider
import com.simplemobiletools.gallery.pro.helpers.ROUNDED_CORNERS_NONE import com.simplemobiletools.gallery.pro.helpers.ROUNDED_CORNERS_NONE
import com.simplemobiletools.gallery.pro.models.Directory import com.simplemobiletools.gallery.pro.models.Directory
import com.simplemobiletools.gallery.pro.models.Widget import com.simplemobiletools.gallery.pro.models.Widget
import kotlinx.android.synthetic.main.activity_widget_config.*
class WidgetConfigureActivity : SimpleActivity() { class WidgetConfigureActivity : SimpleActivity() {
private var mBgAlpha = 0f private var mBgAlpha = 0f
@ -30,11 +30,14 @@ class WidgetConfigureActivity : SimpleActivity() {
private var mFolderPath = "" private var mFolderPath = ""
private var mDirectories = ArrayList<Directory>() private var mDirectories = ArrayList<Directory>()
private lateinit var binding: ActivityWidgetConfigBinding
public override fun onCreate(savedInstanceState: Bundle?) { public override fun onCreate(savedInstanceState: Bundle?) {
useDynamicTheme = false useDynamicTheme = false
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setResult(RESULT_CANCELED) setResult(RESULT_CANCELED)
setContentView(R.layout.activity_widget_config) binding = ActivityWidgetConfigBinding.inflate(layoutInflater)
setContentView(binding.root)
initVariables() initVariables()
mWidgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: AppWidgetManager.INVALID_APPWIDGET_ID mWidgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: AppWidgetManager.INVALID_APPWIDGET_ID
@ -43,21 +46,21 @@ class WidgetConfigureActivity : SimpleActivity() {
finish() finish()
} }
config_save.setOnClickListener { saveConfig() } binding.configSave.setOnClickListener { saveConfig() }
config_bg_color.setOnClickListener { pickBackgroundColor() } binding.configBgColor.setOnClickListener { pickBackgroundColor() }
config_text_color.setOnClickListener { pickTextColor() } binding.configTextColor.setOnClickListener { pickTextColor() }
folder_picker_value.setOnClickListener { changeSelectedFolder() } binding.folderPickerValue.setOnClickListener { changeSelectedFolder() }
config_image_holder.setOnClickListener { changeSelectedFolder() } binding.configImageHolder.setOnClickListener { changeSelectedFolder() }
updateTextColors(folder_picker_holder) updateTextColors(binding.folderPickerHolder)
val primaryColor = getProperPrimaryColor() val primaryColor = getProperPrimaryColor()
config_bg_seekbar.setColors(mTextColor, primaryColor, primaryColor) binding.configBgSeekbar.setColors(mTextColor, primaryColor, primaryColor)
folder_picker_holder.background = ColorDrawable(getProperBackgroundColor()) binding.folderPickerHolder.background = ColorDrawable(getProperBackgroundColor())
folder_picker_show_folder_name.isChecked = config.showWidgetFolderName binding.folderPickerShowFolderName.isChecked = config.showWidgetFolderName
handleFolderNameDisplay() handleFolderNameDisplay()
folder_picker_show_folder_name_holder.setOnClickListener { binding.folderPickerShowFolderNameHolder.setOnClickListener {
folder_picker_show_folder_name.toggle() binding.folderPickerShowFolderName.toggle()
handleFolderNameDisplay() handleFolderNameDisplay()
} }
@ -75,7 +78,7 @@ class WidgetConfigureActivity : SimpleActivity() {
mBgAlpha = Color.alpha(mBgColor) / 255f mBgAlpha = Color.alpha(mBgColor) / 255f
mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor)) mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor))
config_bg_seekbar.apply { binding.configBgSeekbar.apply {
progress = (mBgAlpha * 100).toInt() progress = (mBgAlpha * 100).toInt()
onSeekBarChangeListener { progress -> onSeekBarChangeListener { progress ->
@ -86,8 +89,8 @@ class WidgetConfigureActivity : SimpleActivity() {
updateBackgroundColor() updateBackgroundColor()
mTextColor = config.widgetTextColor mTextColor = config.widgetTextColor
if (mTextColor == resources.getColor(R.color.default_widget_text_color) && config.isUsingSystemTheme) { if (mTextColor == resources.getColor(com.simplemobiletools.commons.R.color.default_widget_text_color) && config.isUsingSystemTheme) {
mTextColor = resources.getColor(R.color.you_primary_color, theme) mTextColor = resources.getColor(com.simplemobiletools.commons.R.color.you_primary_color, theme)
} }
updateTextColor() updateTextColor()
@ -97,7 +100,7 @@ class WidgetConfigureActivity : SimpleActivity() {
val views = RemoteViews(packageName, R.layout.widget) val views = RemoteViews(packageName, R.layout.widget)
views.setBackgroundColor(R.id.widget_holder, mBgColor) views.setBackgroundColor(R.id.widget_holder, mBgColor)
AppWidgetManager.getInstance(this)?.updateAppWidget(mWidgetId, views) ?: return 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) val widget = Widget(null, mWidgetId, mFolderPath)
ensureBackgroundThread { ensureBackgroundThread {
widgetsDB.insertOrUpdate(widget) widgetsDB.insertOrUpdate(widget)
@ -128,16 +131,16 @@ class WidgetConfigureActivity : SimpleActivity() {
} }
private fun updateTextColor() { private fun updateTextColor() {
config_folder_name.setTextColor(mTextColor) binding.configFolderName.setTextColor(mTextColor)
config_text_color.setFillWithStroke(mTextColor, mTextColor) binding.configTextColor.setFillWithStroke(mTextColor, mTextColor)
config_save.setTextColor(getProperPrimaryColor().getContrastColor()) binding.configSave.setTextColor(getProperPrimaryColor().getContrastColor())
} }
private fun updateBackgroundColor() { private fun updateBackgroundColor() {
mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha) mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha)
config_image_holder.background.applyColorFilter(mBgColor) binding.configImageHolder.background.applyColorFilter(mBgColor)
config_bg_color.setFillWithStroke(mBgColor, mBgColor) binding.configBgColor.setFillWithStroke(mBgColor, mBgColor)
config_save.backgroundTintList = ColorStateList.valueOf(getProperPrimaryColor()) binding.configSave.backgroundTintList = ColorStateList.valueOf(getProperPrimaryColor())
} }
private fun pickBackgroundColor() { private fun pickBackgroundColor() {
@ -167,8 +170,8 @@ class WidgetConfigureActivity : SimpleActivity() {
private fun updateFolderImage(folderPath: String) { private fun updateFolderImage(folderPath: String) {
mFolderPath = folderPath mFolderPath = folderPath
runOnUiThread { runOnUiThread {
folder_picker_value.text = getFolderNameFromPath(folderPath) binding.folderPickerValue.text = getFolderNameFromPath(folderPath)
config_folder_name.text = getFolderNameFromPath(folderPath) binding.configFolderName.text = getFolderNameFromPath(folderPath)
} }
ensureBackgroundThread { ensureBackgroundThread {
@ -176,14 +179,14 @@ class WidgetConfigureActivity : SimpleActivity() {
if (path != null) { if (path != null) {
runOnUiThread { runOnUiThread {
val signature = ObjectKey(System.currentTimeMillis().toString()) 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() { private fun handleFolderNameDisplay() {
val showFolderName = folder_picker_show_folder_name.isChecked val showFolderName = binding.folderPickerShowFolderName.isChecked
config_folder_name.beVisibleIf(showFolderName) 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.commons.views.MyRecyclerView
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.MediaActivity 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.ConfirmDeleteFolderDialog
import com.simplemobiletools.gallery.pro.dialogs.ExcludeFolderDialog import com.simplemobiletools.gallery.pro.dialogs.ExcludeFolderDialog
import com.simplemobiletools.gallery.pro.dialogs.PickMediumDialog 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.interfaces.DirectoryOperationsListener
import com.simplemobiletools.gallery.pro.models.AlbumCover import com.simplemobiletools.gallery.pro.models.AlbumCover
import com.simplemobiletools.gallery.pro.models.Directory 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.io.File
import java.util.* import java.util.*
import kotlin.collections.ArrayList
class DirectoryAdapter( class DirectoryAdapter(
activity: BaseSimpleActivity, var dirs: ArrayList<Directory>, val listener: DirectoryOperationsListener?, recyclerView: MyRecyclerView, 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 getActionMenuId() = R.menu.cab_directories
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layoutType = when { val binding = when {
isListViewType -> R.layout.directory_item_list isListViewType -> DirectoryItemListBinding.inflate(layoutInflater, parent, false)
folderStyle == FOLDER_STYLE_SQUARE -> R.layout.directory_item_grid_square folderStyle == FOLDER_STYLE_SQUARE -> DirectoryItemGridSquareBinding.inflate(layoutInflater, parent, false)
else -> R.layout.directory_item_grid_rounded_corners else -> DirectoryItemGridRoundedCornersBinding.inflate(layoutInflater, parent, false)
} }
return createViewHolder(layoutType, parent) return createViewHolder(binding.root)
} }
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
@ -188,7 +179,7 @@ class DirectoryAdapter(
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isDestroyed) { 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 sourcePath = firstDir.path
val dir = File(sourcePath) val dir = File(sourcePath)
if (activity.isAStorageRootFolder(dir.absolutePath)) { if (activity.isAStorageRootFolder(dir.absolutePath)) {
activity.toast(R.string.rename_folder_root) activity.toast(com.simplemobiletools.commons.R.string.rename_folder_root)
return return
} }
@ -306,7 +297,7 @@ class DirectoryAdapter(
} }
} else { } else {
if (selectedPaths.any { it.isThisOrParentFolderHidden() }) { 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 return
} }
@ -602,7 +593,13 @@ class DirectoryAdapter(
else -> { else -> {
val itemsCnt = selectedKeys.size val itemsCnt = selectedKeys.size
if (itemsCnt == 1 && getSelectedItems().first().isRecycleBin()) { 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() deleteFolders()
} }
return return
@ -612,18 +609,18 @@ class DirectoryAdapter(
val folder = getSelectedPaths().first().getFilenameFromPath() val folder = getSelectedPaths().first().getFilenameFromPath()
"\"$folder\"" "\"$folder\""
} else { } 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 fileDirItem = getFirstSelectedItem() ?: return
val baseString = if (!config.useRecycleBin || config.tempSkipRecycleBin || (isOneItemSelected() && fileDirItem.areFavorites())) { val baseString = if (!config.useRecycleBin || config.tempSkipRecycleBin || (isOneItemSelected() && fileDirItem.areFavorites())) {
R.string.deletion_confirmation com.simplemobiletools.commons.R.string.deletion_confirmation
} else { } 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 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) { ConfirmDeleteFolderDialog(activity, question, warning) {
deleteFolders() deleteFolders()
} }
@ -772,8 +769,8 @@ class DirectoryAdapter(
private fun setupView(view: View, directory: Directory, holder: ViewHolder) { private fun setupView(view: View, directory: Directory, holder: ViewHolder) {
val isSelected = selectedKeys.contains(directory.path.hashCode()) val isSelected = selectedKeys.contains(directory.path.hashCode())
view.apply { bindItem(view).apply {
dir_path?.text = "${directory.path.substringBeforeLast("/")}/" dirPath?.text = "${directory.path.substringBeforeLast("/")}/"
val thumbnailType = when { val thumbnailType = when {
directory.tmb.isVideoFast() -> TYPE_VIDEOS directory.tmb.isVideoFast() -> TYPE_VIDEOS
directory.tmb.isGif() -> TYPE_GIFS directory.tmb.isGif() -> TYPE_GIFS
@ -782,25 +779,25 @@ class DirectoryAdapter(
else -> TYPE_IMAGES else -> TYPE_IMAGES
} }
dir_check?.beVisibleIf(isSelected) dirCheck.beVisibleIf(isSelected)
if (isSelected) { if (isSelected) {
dir_check.background?.applyColorFilter(properPrimaryColor) dirCheck.background?.applyColorFilter(properPrimaryColor)
dir_check.applyColorFilter(contrastColor) dirCheck.applyColorFilter(contrastColor)
} }
if (isListViewType) { if (isListViewType) {
dir_holder.isSelected = isSelected dirHolder.isSelected = isSelected
} }
if (scrollHorizontally && !isListViewType && folderStyle == FOLDER_STYLE_ROUNDED_CORNERS) { 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 photoCntParams = (photoCnt.layoutParams as RelativeLayout.LayoutParams)
val nameParams = (dir_name.layoutParams as RelativeLayout.LayoutParams) val nameParams = (dirName.layoutParams as RelativeLayout.LayoutParams)
nameParams.removeRule(RelativeLayout.BELOW) nameParams.removeRule(RelativeLayout.BELOW)
if (config.showFolderMediaCount == FOLDER_MEDIA_CNT_LINE) { 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) nameParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM)
photoCntParams.removeRule(RelativeLayout.BELOW) photoCntParams.removeRule(RelativeLayout.BELOW)
@ -811,11 +808,11 @@ class DirectoryAdapter(
} }
if (lockedFolderPaths.contains(directory.path)) { if (lockedFolderPaths.contains(directory.path)) {
dir_lock.beVisible() dirLock.beVisible()
dir_lock.background = ColorDrawable(context.getProperBackgroundColor()) dirLock.background = ColorDrawable(root.context.getProperBackgroundColor())
dir_lock.applyColorFilter(context.getProperBackgroundColor().getContrastColor()) dirLock.applyColorFilter(root.context.getProperBackgroundColor().getContrastColor())
} else { } else {
dir_lock.beGone() dirLock.beGone()
val roundedCorners = when { val roundedCorners = when {
isListViewType -> ROUNDED_CORNERS_SMALL isListViewType -> ROUNDED_CORNERS_SMALL
folderStyle == FOLDER_STYLE_SQUARE -> ROUNDED_CORNERS_NONE folderStyle == FOLDER_STYLE_SQUARE -> ROUNDED_CORNERS_NONE
@ -825,7 +822,7 @@ class DirectoryAdapter(
activity.loadImage( activity.loadImage(
thumbnailType, thumbnailType,
directory.tmb, directory.tmb,
dir_thumbnail, dirThumbnail,
scrollHorizontally, scrollHorizontally,
animateGifs, animateGifs,
cropThumbnails, cropThumbnails,
@ -834,18 +831,18 @@ class DirectoryAdapter(
) )
} }
dir_pin.beVisibleIf(pinnedFolders.contains(directory.path)) dirPin.beVisibleIf(pinnedFolders.contains(directory.path))
dir_location.beVisibleIf(directory.location != LOCATION_INTERNAL) dirLocation.beVisibleIf(directory.location != LOCATION_INTERNAL)
if (dir_location.isVisible()) { if (dirLocation.isVisible()) {
dir_location.setImageResource(if (directory.location == LOCATION_SD) R.drawable.ic_sd_card_vector else R.drawable.ic_usb_vector) 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() photoCnt.text = directory.subfoldersMediaCount.toString()
photo_cnt.beVisibleIf(showMediaCount == FOLDER_MEDIA_CNT_LINE) photoCnt.beVisibleIf(showMediaCount == FOLDER_MEDIA_CNT_LINE)
if (limitFolderTitle) { if (limitFolderTitle) {
dir_name.setSingleLine() dirName.setSingleLine()
dir_name.ellipsize = TextUtils.TruncateAt.MIDDLE dirName.ellipsize = TextUtils.TruncateAt.MIDDLE
} }
var nameCount = directory.name var nameCount = directory.name
@ -859,26 +856,26 @@ class DirectoryAdapter(
} }
} }
dir_name.text = nameCount dirName.text = nameCount
if (isListViewType || folderStyle == FOLDER_STYLE_ROUNDED_CORNERS) { if (isListViewType || folderStyle == FOLDER_STYLE_ROUNDED_CORNERS) {
photo_cnt.setTextColor(textColor) photoCnt.setTextColor(textColor)
dir_name.setTextColor(textColor) dirName.setTextColor(textColor)
dir_location.applyColorFilter(textColor) dirLocation.applyColorFilter(textColor)
} }
if (isListViewType) { if (isListViewType) {
dir_path.setTextColor(textColor) dirPath?.setTextColor(textColor)
dir_pin.applyColorFilter(textColor) dirPin.applyColorFilter(textColor)
dir_location.applyColorFilter(textColor) dirLocation.applyColorFilter(textColor)
dir_drag_handle.beVisibleIf(isDragAndDropping) dirDragHandle.beVisibleIf(isDragAndDropping)
} else { } else {
dir_drag_handle_wrapper.beVisibleIf(isDragAndDropping) dirDragHandleWrapper?.beVisibleIf(isDragAndDropping)
} }
if (isDragAndDropping) { if (isDragAndDropping) {
dir_drag_handle.applyColorFilter(textColor) dirDragHandle.applyColorFilter(textColor)
dir_drag_handle.setOnTouchListener { v, event -> dirDragHandle.setOnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_DOWN) { if (event.action == MotionEvent.ACTION_DOWN) {
startReorderDragListener?.requestDrag(holder) startReorderDragListener?.requestDrag(holder)
} }
@ -911,4 +908,12 @@ class DirectoryAdapter(
} }
override fun onChange(position: Int) = dirs.getOrNull(position)?.getBubbleText(directorySorting, activity, dateFormat, timeFormat) ?: "" 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 android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.EditorFilterItemBinding
import com.simplemobiletools.gallery.pro.models.FilterItem 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) : class FiltersAdapter(val context: Context, val filterItems: ArrayList<FilterItem>, val itemClick: (Int) -> Unit) :
RecyclerView.Adapter<FiltersAdapter.ViewHolder>() { 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 { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.editor_filter_item, parent, false) val binding = EditorFilterItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(view) return ViewHolder(binding)
} }
override fun getItemCount() = filterItems.size 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 { fun bindView(filterItem: FilterItem): View {
itemView.apply { binding.apply {
editor_filter_item_label.text = filterItem.filter.name editorFilterItemLabel.text = filterItem.filter.name
editor_filter_item_thumbnail.setImageBitmap(filterItem.bitmap) editorFilterItemThumbnail.setImageBitmap(filterItem.bitmap)
editor_filter_item_thumbnail.background = if (getCurrentFilter() == filterItem) { editorFilterItemThumbnail.background = if (getCurrentFilter() == filterItem) {
strokeBackground strokeBackground
} else { } else {
null null
} }
setOnClickListener { root.setOnClickListener {
setCurrentFilter(adapterPosition) setCurrentFilter(adapterPosition)
} }
} }

View file

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

View file

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

View file

@ -10,6 +10,7 @@ import android.view.Menu
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.core.view.allViews
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import com.simplemobiletools.commons.activities.BaseSimpleActivity 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.commons.views.MyRecyclerView
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.ViewPagerActivity 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.dialogs.DeleteWithRememberDialog
import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.* 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.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection 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( class MediaAdapter(
activity: BaseSimpleActivity, var media: ArrayList<ThumbnailItem>, val listener: MediaOperationsListener?, val isAGetIntent: Boolean, 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 getActionMenuId() = R.menu.cab_media
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layoutType = if (viewType == ITEM_SECTION) { val binding = if (viewType == ITEM_SECTION) {
R.layout.thumbnail_section ThumbnailSectionBinding.inflate(layoutInflater, parent, false)
} else { } else {
if (isListViewType) { if (isListViewType) {
if (viewType == ITEM_MEDIUM_PHOTO) { if (viewType == ITEM_MEDIUM_PHOTO) {
R.layout.photo_item_list PhotoItemListBinding.inflate(layoutInflater, parent, false)
} else { } else {
R.layout.video_item_list VideoItemListBinding.inflate(layoutInflater, parent, false)
} }
} else { } else {
if (viewType == ITEM_MEDIUM_PHOTO) { if (viewType == ITEM_MEDIUM_PHOTO) {
R.layout.photo_item_grid PhotoItemGridBinding.inflate(layoutInflater, parent, false)
} else { } 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) { override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
@ -196,8 +195,8 @@ class MediaAdapter(
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isDestroyed) { if (!activity.isDestroyed) {
val itemView = holder.itemView val itemView = holder.itemView
visibleItemPaths.remove(itemView.medium_name?.tag) visibleItemPaths.remove(itemView.allViews.firstOrNull { it.id == R.id.medium_name }?.tag)
val tmb = itemView.medium_thumbnail val tmb = itemView.allViews.firstOrNull { it.id == R.id.medium_thumbnail }
if (tmb != null) { if (tmb != null) {
Glide.with(activity).clear(tmb) Glide.with(activity).clear(tmb)
} }
@ -242,7 +241,7 @@ class MediaAdapter(
val isSDOrOtgRootFolder = activity.isAStorageRootFolder(firstPath.getParentPath()) && !firstPath.startsWith(activity.internalStoragePath) val isSDOrOtgRootFolder = activity.isAStorageRootFolder(firstPath.getParentPath()) && !firstPath.startsWith(activity.internalStoragePath)
if (isRPlus() && isSDOrOtgRootFolder && !isExternalStorageManager()) { 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() finishActMode()
return return
} }
@ -354,7 +353,7 @@ class MediaAdapter(
private fun handleRotate(paths: List<String>, degrees: Int) { private fun handleRotate(paths: List<String>, degrees: Int) {
var fileCnt = paths.size var fileCnt = paths.size
rotatedImagePaths.clear() rotatedImagePaths.clear()
activity.toast(R.string.saving) activity.toast(com.simplemobiletools.commons.R.string.saving)
ensureBackgroundThread { ensureBackgroundThread {
paths.forEach { paths.forEach {
rotatedImagePaths.add(it) rotatedImagePaths.add(it)
@ -406,7 +405,7 @@ class MediaAdapter(
}.toMutableList() as ArrayList }.toMutableList() as ArrayList
if (!isCopyOperation && paths.any { it.startsWith(recycleBinPath) }) { 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()) { if (fileDirItems.isEmpty()) {
@ -500,13 +499,13 @@ class MediaAdapter(
fileDirItems.add(curFileDirItem) fileDirItems.add(curFileDirItem)
} }
val fileSize = fileDirItems.sumByLong { it.getProperSize(activity, countHidden = true) }.formatSize() 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)" "$deleteItemsString ($fileSize)"
} }
val isRecycleBin = firstPath.startsWith(activity.recycleBinPath) val isRecycleBin = firstPath.startsWith(activity.recycleBinPath)
val baseString = 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 question = String.format(resources.getString(baseString), itemsAndSize)
val showSkipRecycleBinOption = config.useRecycleBin && !isRecycleBin val showSkipRecycleBinOption = config.useRecycleBin && !isRecycleBin
@ -607,62 +606,62 @@ class MediaAdapter(
private fun setupThumbnail(view: View, medium: Medium) { private fun setupThumbnail(view: View, medium: Medium) {
val isSelected = selectedKeys.contains(medium.path.hashCode()) val isSelected = selectedKeys.contains(medium.path.hashCode())
view.apply { bindItem(view, medium).apply {
val padding = if (config.thumbnailSpacing <= 1) { val padding = if (config.thumbnailSpacing <= 1) {
config.thumbnailSpacing config.thumbnailSpacing
} else { } else {
0 0
} }
media_item_holder.setPadding(padding, padding, padding, padding) mediaItemHolder.setPadding(padding, padding, padding, padding)
favorite.beVisibleIf(medium.isFavorite && config.markFavoriteItems) favorite.beVisibleIf(medium.isFavorite && config.markFavoriteItems)
play_portrait_outline?.beVisibleIf(medium.isVideo() || medium.isPortrait()) playPortraitOutline?.beVisibleIf(medium.isVideo() || medium.isPortrait())
if (medium.isVideo()) { if (medium.isVideo()) {
play_portrait_outline?.setImageResource(R.drawable.ic_play_outline_vector) playPortraitOutline?.setImageResource(com.simplemobiletools.commons.R.drawable.ic_play_outline_vector)
play_portrait_outline?.beVisible() playPortraitOutline?.beVisible()
} else if (medium.isPortrait()) { } else if (medium.isPortrait()) {
play_portrait_outline?.setImageResource(R.drawable.ic_portrait_photo_vector) playPortraitOutline?.setImageResource(R.drawable.ic_portrait_photo_vector)
play_portrait_outline?.beVisibleIf(showFileTypes) playPortraitOutline?.beVisibleIf(showFileTypes)
} }
if (showFileTypes && (medium.isGIF() || medium.isRaw() || medium.isSVG())) { if (showFileTypes && (medium.isGIF() || medium.isRaw() || medium.isSVG())) {
file_type.setText( fileType?.setText(
when (medium.type) { when (medium.type) {
TYPE_GIFS -> R.string.gif TYPE_GIFS -> R.string.gif
TYPE_RAWS -> R.string.raw TYPE_RAWS -> R.string.raw
else -> R.string.svg else -> R.string.svg
} }
) )
file_type.beVisible() fileType?.beVisible()
} else { } else {
file_type?.beGone() fileType?.beGone()
} }
medium_name.beVisibleIf(displayFilenames || isListViewType) mediumName.beVisibleIf(displayFilenames || isListViewType)
medium_name.text = medium.name mediumName.text = medium.name
medium_name.tag = medium.path mediumName.tag = medium.path
val showVideoDuration = medium.isVideo() && config.showThumbnailVideoDuration val showVideoDuration = medium.isVideo() && config.showThumbnailVideoDuration
if (showVideoDuration) { 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) { if (isSelected) {
medium_check?.background?.applyColorFilter(properPrimaryColor) mediumCheck.background?.applyColorFilter(properPrimaryColor)
medium_check.applyColorFilter(contrastColor) mediumCheck.applyColorFilter(contrastColor)
} }
if (isListViewType) { if (isListViewType) {
media_item_holder.isSelected = isSelected mediaItemHolder.isSelected = isSelected
} }
var path = medium.path var path = medium.path
if (hasOTGConnected && context.isPathOnOTG(path)) { if (hasOTGConnected && root.context.isPathOnOTG(path)) {
path = path.getOTGPublicPath(context) path = path.getOTGPublicPath(root.context)
} }
val roundedCorners = when { val roundedCorners = when {
@ -673,16 +672,16 @@ class MediaAdapter(
if (loadImageInstantly) { if (loadImageInstantly) {
activity.loadImage( 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 { } else {
medium_thumbnail.setImageDrawable(null) mediumThumbnail.setImageDrawable(null)
medium_thumbnail.isHorizontalScrolling = scrollHorizontally mediumThumbnail.isHorizontalScrolling = scrollHorizontally
delayHandler.postDelayed({ delayHandler.postDelayed({
val isVisible = visibleItemPaths.contains(medium.path) val isVisible = visibleItemPaths.contains(medium.path)
if (isVisible) { if (isVisible) {
activity.loadImage( activity.loadImage(
medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners, medium.type, path, mediumThumbnail, scrollHorizontally, animateGifs, cropThumbnails, roundedCorners,
medium.getKey(), rotatedImagePaths medium.getKey(), rotatedImagePaths
) )
} }
@ -690,16 +689,16 @@ class MediaAdapter(
} }
if (isListViewType) { if (isListViewType) {
medium_name.setTextColor(textColor) mediumName.setTextColor(textColor)
play_portrait_outline?.applyColorFilter(textColor) playPortraitOutline?.applyColorFilter(textColor)
} }
} }
} }
private fun setupSection(view: View, section: ThumbnailSection) { private fun setupSection(view: View, section: ThumbnailSection) {
view.apply { ThumbnailSectionBinding.bind(view).apply {
thumbnail_section.text = section.title thumbnailSection.text = section.title
thumbnail_section.setTextColor(textColor) thumbnailSection.setTextColor(textColor)
} }
} }
@ -711,4 +710,20 @@ class MediaAdapter(
return (media[realIndex] as? Medium)?.getBubbleText(sorting, activity, dateFormat, timeFormat) ?: "" 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.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.extensions.getFileKey import com.simplemobiletools.commons.extensions.getFileKey
import com.simplemobiletools.gallery.pro.R 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) : class PortraitPhotosAdapter(val context: Context, val photos: ArrayList<String>, val sideElementWidth: Int, val itemClick: (Int, Int) -> Unit) :
RecyclerView.Adapter<PortraitPhotosAdapter.ViewHolder>() { 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 { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.portrait_photo_item, parent, false) val binding = PortraitPhotoItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(view) return ViewHolder(binding.root)
} }
override fun getItemCount() = photos.size 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) { inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bindView(photo: String, position: Int): View { fun bindView(photo: String, position: Int): View {
itemView.apply { PortraitPhotoItemBinding.bind(itemView).apply {
portrait_photo_item_thumbnail.layoutParams.width = if (position == 0 || position == photos.lastIndex) { portraitPhotoItemThumbnail.layoutParams.width = if (position == 0 || position == photos.lastIndex) {
sideElementWidth sideElementWidth
} else { } else {
itemWidth itemWidth
} }
portrait_photo_item_thumbnail.background = if (photo.isEmpty() || position != currentSelectionIndex) { portraitPhotoItemThumbnail.background = if (photo.isEmpty() || position != currentSelectionIndex) {
null null
} else { } else {
strokeBackground strokeBackground
@ -68,17 +68,17 @@ class PortraitPhotosAdapter(val context: Context, val photos: ArrayList<String>,
.load(photo) .load(photo)
.transition(DrawableTransitionOptions.withCrossFade()) .transition(DrawableTransitionOptions.withCrossFade())
.apply(options) .apply(options)
.into(portrait_photo_item_thumbnail) .into(portraitPhotoItemThumbnail)
if (photo.isNotEmpty()) { if (photo.isNotEmpty()) {
isClickable = true root.isClickable = true
views[position] = this views[position] = root
setOnClickListener { root.setOnClickListener {
itemClick(position, x.toInt()) itemClick(position, root.x.toInt())
setCurrentPhoto(position) setCurrentPhoto(position)
} }
} else { } else {
isClickable = false root.isClickable = false
} }
} }
return itemView return itemView

View file

@ -13,7 +13,7 @@ class AllFilesPermissionDialog(
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
init { 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 view.findViewById<TextView>(R.id.message).text = message
activity.getAlertDialogBuilder().setPositiveButton(R.string.all_files) { dialog, which -> positivePressed() } activity.getAlertDialogBuilder().setPositiveButton(R.string.all_files) { dialog, which -> positivePressed() }

View file

@ -1,36 +1,34 @@
package com.simplemobiletools.gallery.pro.dialogs package com.simplemobiletools.gallery.pro.dialogs
import android.content.DialogInterface import android.content.DialogInterface
import android.view.View
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.models.RadioItem 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 com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.dialog_change_file_thumbnail_style.view.*
class ChangeFileThumbnailStyleDialog(val activity: BaseSimpleActivity) : DialogInterface.OnClickListener { class ChangeFileThumbnailStyleDialog(val activity: BaseSimpleActivity) : DialogInterface.OnClickListener {
private var config = activity.config private var config = activity.config
private var view: View private val binding: DialogChangeFileThumbnailStyleBinding
private var thumbnailSpacing = config.thumbnailSpacing private var thumbnailSpacing = config.thumbnailSpacing
init { init {
view = activity.layoutInflater.inflate(R.layout.dialog_change_file_thumbnail_style, null).apply { binding = DialogChangeFileThumbnailStyleBinding.inflate(activity.layoutInflater).apply {
dialog_file_style_rounded_corners.isChecked = config.fileRoundedCorners dialogFileStyleRoundedCorners.isChecked = config.fileRoundedCorners
dialog_file_style_animate_gifs.isChecked = config.animateGifs dialogFileStyleAnimateGifs.isChecked = config.animateGifs
dialog_file_style_show_thumbnail_video_duration.isChecked = config.showThumbnailVideoDuration dialogFileStyleShowThumbnailVideoDuration.isChecked = config.showThumbnailVideoDuration
dialog_file_style_show_thumbnail_file_types.isChecked = config.showThumbnailFileTypes dialogFileStyleShowThumbnailFileTypes.isChecked = config.showThumbnailFileTypes
dialog_file_style_mark_favorite_items.isChecked = config.markFavoriteItems dialogFileStyleMarkFavoriteItems.isChecked = config.markFavoriteItems
dialog_file_style_rounded_corners_holder.setOnClickListener { dialog_file_style_rounded_corners.toggle() } dialogFileStyleRoundedCornersHolder.setOnClickListener { dialogFileStyleRoundedCorners.toggle() }
dialog_file_style_animate_gifs_holder.setOnClickListener { dialog_file_style_animate_gifs.toggle() } dialogFileStyleAnimateGifsHolder.setOnClickListener { dialogFileStyleAnimateGifs.toggle() }
dialog_file_style_show_thumbnail_video_duration_holder.setOnClickListener { dialog_file_style_show_thumbnail_video_duration.toggle() } dialogFileStyleShowThumbnailVideoDurationHolder.setOnClickListener { dialogFileStyleShowThumbnailVideoDuration.toggle() }
dialog_file_style_show_thumbnail_file_types_holder.setOnClickListener { dialog_file_style_show_thumbnail_file_types.toggle() } dialogFileStyleShowThumbnailFileTypesHolder.setOnClickListener { dialogFileStyleShowThumbnailFileTypes.toggle() }
dialog_file_style_mark_favorite_items_holder.setOnClickListener { dialog_file_style_mark_favorite_items.toggle() } dialogFileStyleMarkFavoriteItemsHolder.setOnClickListener { dialogFileStyleMarkFavoriteItems.toggle() }
dialog_file_style_spacing_holder.setOnClickListener { dialogFileStyleSpacingHolder.setOnClickListener {
val items = arrayListOf( val items = arrayListOf(
RadioItem(0, "0x"), RadioItem(0, "0x"),
RadioItem(1, "1x"), RadioItem(1, "1x"),
@ -52,23 +50,23 @@ class ChangeFileThumbnailStyleDialog(val activity: BaseSimpleActivity) : DialogI
updateThumbnailSpacingText() updateThumbnailSpacingText()
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, this) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, this)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this) activity.setupDialogStuff(binding.root, this)
} }
} }
override fun onClick(dialog: DialogInterface, which: Int) { override fun onClick(dialog: DialogInterface, which: Int) {
config.fileRoundedCorners = view.dialog_file_style_rounded_corners.isChecked config.fileRoundedCorners = binding.dialogFileStyleRoundedCorners.isChecked
config.animateGifs = view.dialog_file_style_animate_gifs.isChecked config.animateGifs = binding.dialogFileStyleAnimateGifs.isChecked
config.showThumbnailVideoDuration = view.dialog_file_style_show_thumbnail_video_duration.isChecked config.showThumbnailVideoDuration = binding.dialogFileStyleShowThumbnailVideoDuration.isChecked
config.showThumbnailFileTypes = view.dialog_file_style_show_thumbnail_file_types.isChecked config.showThumbnailFileTypes = binding.dialogFileStyleShowThumbnailFileTypes.isChecked
config.markFavoriteItems = view.dialog_file_style_mark_favorite_items.isChecked config.markFavoriteItems = binding.dialogFileStyleMarkFavoriteItems.isChecked
config.thumbnailSpacing = thumbnailSpacing config.thumbnailSpacing = thumbnailSpacing
} }
private fun updateThumbnailSpacingText() { 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.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R 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.extensions.config
import com.simplemobiletools.gallery.pro.helpers.* 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 { class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) : DialogInterface.OnClickListener {
private var config = activity.config private var config = activity.config
private var view = activity.layoutInflater.inflate(R.layout.dialog_change_folder_thumbnail_style, null).apply { private val binding = DialogChangeFolderThumbnailStyleBinding.inflate(activity.layoutInflater).apply {
dialog_folder_limit_title.isChecked = config.limitFolderTitle dialogFolderLimitTitle.isChecked = config.limitFolderTitle
} }
init { init {
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, this) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, this)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this) { activity.setupDialogStuff(binding.root, this) {
setupStyle() setupStyle()
setupMediaCount() setupMediaCount()
updateSample() updateSample()
@ -34,29 +36,29 @@ class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val cal
} }
private fun setupStyle() { private fun setupStyle() {
val styleRadio = view.dialog_radio_folder_style val styleRadio = binding.dialogRadioFolderStyle
styleRadio.setOnCheckedChangeListener { group, checkedId -> styleRadio.setOnCheckedChangeListener { group, checkedId ->
updateSample() updateSample()
} }
val styleBtn = when (config.folderStyle) { val styleBtn = when (config.folderStyle) {
FOLDER_STYLE_SQUARE -> styleRadio.dialog_radio_folder_square FOLDER_STYLE_SQUARE -> binding.dialogRadioFolderSquare
else -> styleRadio.dialog_radio_folder_rounded_corners else -> binding.dialogRadioFolderRoundedCorners
} }
styleBtn.isChecked = true styleBtn.isChecked = true
} }
private fun setupMediaCount() { private fun setupMediaCount() {
val countRadio = view.dialog_radio_folder_count_holder val countRadio = binding.dialogRadioFolderCountHolder
countRadio.setOnCheckedChangeListener { group, checkedId -> countRadio.setOnCheckedChangeListener { group, checkedId ->
updateSample() updateSample()
} }
val countBtn = when (config.showFolderMediaCount) { val countBtn = when (config.showFolderMediaCount) {
FOLDER_MEDIA_CNT_LINE -> countRadio.dialog_radio_folder_count_line FOLDER_MEDIA_CNT_LINE -> binding.dialogRadioFolderCountLine
FOLDER_MEDIA_CNT_BRACKETS -> countRadio.dialog_radio_folder_count_brackets FOLDER_MEDIA_CNT_BRACKETS -> binding.dialogRadioFolderCountBrackets
else -> countRadio.dialog_radio_folder_count_none else -> binding.dialogRadioFolderCountNone
} }
countBtn.isChecked = true countBtn.isChecked = true
@ -65,30 +67,36 @@ class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val cal
private fun updateSample() { private fun updateSample() {
val photoCount = 36 val photoCount = 36
val folderName = "Camera" val folderName = "Camera"
view.apply { binding.apply {
val useRoundedCornersLayout = dialog_radio_folder_style.checkedRadioButtonId == R.id.dialog_radio_folder_rounded_corners val useRoundedCornersLayout = binding.dialogRadioFolderStyle.checkedRadioButtonId == R.id.dialog_radio_folder_rounded_corners
dialog_folder_sample_holder.removeAllViews() binding.dialogFolderSampleHolder.removeAllViews()
val layout = if (useRoundedCornersLayout) R.layout.directory_item_grid_rounded_corners else R.layout.directory_item_grid_square val sampleBinding = if (useRoundedCornersLayout) {
val sampleView = activity.layoutInflater.inflate(layout, null) DirectoryItemGridRoundedCornersBinding.inflate(activity.layoutInflater).toItemBinding()
dialog_folder_sample_holder.addView(sampleView) } 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.width = activity.resources.getDimension(R.dimen.sample_thumbnail_size).toInt()
(sampleView.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.CENTER_HORIZONTAL) (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 -> { R.id.dialog_radio_folder_count_line -> {
dir_name.text = folderName sampleBinding.dirName.text = folderName
photo_cnt.text = photoCount.toString() sampleBinding.photoCnt.text = photoCount.toString()
photo_cnt.beVisible() sampleBinding.photoCnt.beVisible()
} }
R.id.dialog_radio_folder_count_brackets -> { R.id.dialog_radio_folder_count_brackets -> {
photo_cnt.beGone() sampleBinding.photoCnt.beGone()
dir_name.text = "$folderName ($photoCount)" sampleBinding.dirName.text = "$folderName ($photoCount)"
} }
else -> { else -> {
dir_name.text = folderName sampleBinding.dirName.text = folderName
photo_cnt?.beGone() sampleBinding.photoCnt.beGone()
} }
} }
@ -98,23 +106,23 @@ class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val cal
.apply(options) .apply(options)
if (useRoundedCornersLayout) { 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)) builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
dir_name.setTextColor(activity.getProperTextColor()) sampleBinding.dirName.setTextColor(activity.getProperTextColor())
photo_cnt.setTextColor(activity.getProperTextColor()) sampleBinding.photoCnt.setTextColor(activity.getProperTextColor())
} }
builder.into(dir_thumbnail) builder.into(sampleBinding.dirThumbnail)
} }
} }
override fun onClick(dialog: DialogInterface, which: Int) { 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 R.id.dialog_radio_folder_square -> FOLDER_STYLE_SQUARE
else -> FOLDER_STYLE_ROUNDED_CORNERS 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_line -> FOLDER_MEDIA_CNT_LINE
R.id.dialog_radio_folder_count_brackets -> FOLDER_MEDIA_CNT_BRACKETS R.id.dialog_radio_folder_count_brackets -> FOLDER_MEDIA_CNT_BRACKETS
else -> FOLDER_MEDIA_CNT_NONE else -> FOLDER_MEDIA_CNT_NONE
@ -122,7 +130,7 @@ class ChangeFolderThumbnailStyleDialog(val activity: BaseSimpleActivity, val cal
config.folderStyle = style config.folderStyle = style
config.showFolderMediaCount = count config.showFolderMediaCount = count
config.limitFolderTitle = view.dialog_folder_limit_title.isChecked config.limitFolderTitle = binding.dialogFolderLimitTitle.isChecked
callback() callback()
} }
} }

View file

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

View file

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

View file

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

View file

@ -4,22 +4,21 @@ import android.app.Activity
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.databinding.DialogConfirmDeleteFolderBinding
import kotlinx.android.synthetic.main.dialog_confirm_delete_folder.view.*
class ConfirmDeleteFolderDialog(activity: Activity, message: String, warningMessage: String, val callback: () -> Unit) { class ConfirmDeleteFolderDialog(activity: Activity, message: String, warningMessage: String, val callback: () -> Unit) {
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
init { init {
val view = activity.layoutInflater.inflate(R.layout.dialog_confirm_delete_folder, null) val binding = DialogConfirmDeleteFolderBinding.inflate(activity.layoutInflater)
view.message.text = message binding.message.text = message
view.message_warning.text = warningMessage binding.messageWarning.text = warningMessage
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.yes) { dialog, which -> dialogConfirmed() } .setPositiveButton(com.simplemobiletools.commons.R.string.yes) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.no, null) .setNegativeButton(com.simplemobiletools.commons.R.string.no, null)
.apply { .apply {
activity.setupDialogStuff(view, this) { alertDialog -> activity.setupDialogStuff(binding.root, this) { alertDialog ->
dialog = 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.setupDialogStuff
import com.simplemobiletools.commons.extensions.showKeyboard import com.simplemobiletools.commons.extensions.showKeyboard
import com.simplemobiletools.commons.extensions.value import com.simplemobiletools.commons.extensions.value
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.databinding.DialogCustomAspectRatioBinding
import kotlinx.android.synthetic.main.dialog_custom_aspect_ratio.view.*
class CustomAspectRatioDialog( class CustomAspectRatioDialog(
val activity: BaseSimpleActivity, val defaultCustomAspectRatio: Pair<Float, Float>?, val callback: (aspectRatio: Pair<Float, Float>) -> Unit val activity: BaseSimpleActivity, val defaultCustomAspectRatio: Pair<Float, Float>?, val callback: (aspectRatio: Pair<Float, Float>) -> Unit
) { ) {
init { init {
val view = activity.layoutInflater.inflate(R.layout.dialog_custom_aspect_ratio, null).apply { val binding = DialogCustomAspectRatioBinding.inflate(activity.layoutInflater).apply {
aspect_ratio_width.setText(defaultCustomAspectRatio?.first?.toInt()?.toString() ?: "") aspectRatioWidth.setText(defaultCustomAspectRatio?.first?.toInt()?.toString() ?: "")
aspect_ratio_height.setText(defaultCustomAspectRatio?.second?.toInt()?.toString() ?: "") aspectRatioHeight.setText(defaultCustomAspectRatio?.second?.toInt()?.toString() ?: "")
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this) { alertDialog -> activity.setupDialogStuff(binding.root, this) { alertDialog ->
alertDialog.showKeyboard(view.aspect_ratio_width) alertDialog.showKeyboard(binding.aspectRatioWidth)
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val width = getViewValue(view.aspect_ratio_width) val width = getViewValue(binding.aspectRatioWidth)
val height = getViewValue(view.aspect_ratio_height) val height = getViewValue(binding.aspectRatioHeight)
callback(Pair(width, height)) callback(Pair(width, height))
alertDialog.dismiss() alertDialog.dismiss()
} }

View file

@ -5,8 +5,7 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.beGoneIf import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.databinding.DialogDeleteWithRememberBinding
import kotlinx.android.synthetic.main.dialog_delete_with_remember.view.*
class DeleteWithRememberDialog( class DeleteWithRememberDialog(
private val activity: Activity, private val activity: Activity,
@ -16,16 +15,16 @@ class DeleteWithRememberDialog(
) { ) {
private var dialog: AlertDialog? = null 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 { init {
view.delete_remember_title.text = message binding.deleteRememberTitle.text = message
view.skip_the_recycle_bin_checkbox.beGoneIf(!showSkipRecycleBinOption) binding.skipTheRecycleBinCheckbox.beGoneIf(!showSkipRecycleBinOption)
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.yes) { dialog, which -> dialogConfirmed() } .setPositiveButton(com.simplemobiletools.commons.R.string.yes) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.no, null) .setNegativeButton(com.simplemobiletools.commons.R.string.no, null)
.apply { .apply {
activity.setupDialogStuff(view, this) { alertDialog -> activity.setupDialogStuff(binding.root, this) { alertDialog ->
dialog = alertDialog dialog = alertDialog
} }
} }
@ -33,6 +32,6 @@ class DeleteWithRememberDialog(
private fun dialogConfirmed() { private fun dialogConfirmed() {
dialog?.dismiss() 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 package com.simplemobiletools.gallery.pro.dialogs
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.RadioButton
import android.widget.RadioGroup import android.widget.RadioGroup
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.databinding.RadioButtonBinding
import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.getBasePath import com.simplemobiletools.commons.extensions.getBasePath
import com.simplemobiletools.commons.extensions.setupDialogStuff 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 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) { class ExcludeFolderDialog(val activity: BaseSimpleActivity, val selectedPaths: List<String>, val callback: () -> Unit) {
private val alternativePaths = getAlternativePathsList() private val alternativePaths = getAlternativePathsList()
private var radioGroup: RadioGroup? = null private var radioGroup: RadioGroup? = null
init { init {
val view = activity.layoutInflater.inflate(R.layout.dialog_exclude_folder, null).apply { val binding = DialogExcludeFolderBinding.inflate(activity.layoutInflater).apply {
exclude_folder_parent.beVisibleIf(alternativePaths.size > 1) excludeFolderParent.beVisibleIf(alternativePaths.size > 1)
radioGroup = exclude_folder_radio_group radioGroup = excludeFolderRadioGroup
exclude_folder_radio_group.beVisibleIf(alternativePaths.size > 1) excludeFolderRadioGroup.beVisibleIf(alternativePaths.size > 1)
} }
alternativePaths.forEachIndexed { index, value -> 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] text = alternativePaths[index]
isChecked = index == 0 isChecked = index == 0
id = index id = index
@ -34,10 +33,10 @@ class ExcludeFolderDialog(val activity: BaseSimpleActivity, val selectedPaths: L
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .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.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.databinding.DialogExportFavoritesBinding
import com.simplemobiletools.gallery.pro.extensions.config import com.simplemobiletools.gallery.pro.extensions.config
import kotlinx.android.synthetic.main.dialog_export_favorites.view.*
class ExportFavoritesDialog( class ExportFavoritesDialog(
val activity: BaseSimpleActivity, val defaultFilename: String, val hidePath: Boolean, val activity: BaseSimpleActivity, val defaultFilename: String, val hidePath: Boolean,
@ -21,17 +21,17 @@ class ExportFavoritesDialog(
activity.internalStoragePath activity.internalStoragePath
} }
val view = activity.layoutInflater.inflate(R.layout.dialog_export_favorites, null).apply { val binding = DialogExportFavoritesBinding.inflate(activity.layoutInflater).apply {
export_favorites_filename.setText(defaultFilename.removeSuffix(".txt")) exportFavoritesFilename.setText(defaultFilename.removeSuffix(".txt"))
if (hidePath) { if (hidePath) {
export_favorites_path_label.beGone() exportFavoritesPathLabel.beGone()
export_favorites_path.beGone() exportFavoritesPath.beGone()
} else { } else {
export_favorites_path.text = activity.humanizePath(folder) exportFavoritesPath.text = activity.humanizePath(folder)
export_favorites_path.setOnClickListener { exportFavoritesPath.setOnClickListener {
FilePickerDialog(activity, folder, false, showFAB = true) { FilePickerDialog(activity, folder, false, showFAB = true) {
export_favorites_path.text = activity.humanizePath(it) exportFavoritesPath.text = activity.humanizePath(it)
folder = it folder = it
} }
} }
@ -39,27 +39,30 @@ class ExportFavoritesDialog(
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .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 { alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
var filename = view.export_favorites_filename.value var filename = binding.exportFavoritesFilename.value
if (filename.isEmpty()) { if (filename.isEmpty()) {
activity.toast(R.string.filename_cannot_be_empty) activity.toast(com.simplemobiletools.commons.R.string.filename_cannot_be_empty)
return@setOnClickListener return@setOnClickListener
} }
filename += ".txt" filename += ".txt"
val newPath = "${folder.trimEnd('/')}/$filename" val newPath = "${folder.trimEnd('/')}/$filename"
if (!newPath.getFilenameFromPath().isAValidFilename()) { if (!newPath.getFilenameFromPath().isAValidFilename()) {
activity.toast(R.string.filename_invalid_characters) activity.toast(com.simplemobiletools.commons.R.string.filename_invalid_characters)
return@setOnClickListener return@setOnClickListener
} }
activity.config.lastExportedFavoritesFolder = folder activity.config.lastExportedFavoritesFolder = folder
if (!hidePath && activity.getDoesFilePathExist(newPath)) { 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) { ConfirmationDialog(activity, title) {
callback(newPath, filename) callback(newPath, filename)
alertDialog.dismiss() 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.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.pro.R 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.extensions.config
import com.simplemobiletools.gallery.pro.helpers.* 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) { 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 { init {
val filterMedia = activity.config.filterMedia val filterMedia = activity.config.filterMedia
view.apply { binding.apply {
filter_media_images.isChecked = filterMedia and TYPE_IMAGES != 0 filterMediaImages.isChecked = filterMedia and TYPE_IMAGES != 0
filter_media_videos.isChecked = filterMedia and TYPE_VIDEOS != 0 filterMediaVideos.isChecked = filterMedia and TYPE_VIDEOS != 0
filter_media_gifs.isChecked = filterMedia and TYPE_GIFS != 0 filterMediaGifs.isChecked = filterMedia and TYPE_GIFS != 0
filter_media_raws.isChecked = filterMedia and TYPE_RAWS != 0 filterMediaRaws.isChecked = filterMedia and TYPE_RAWS != 0
filter_media_svgs.isChecked = filterMedia and TYPE_SVGS != 0 filterMediaSvgs.isChecked = filterMedia and TYPE_SVGS != 0
filter_media_portraits.isChecked = filterMedia and TYPE_PORTRAITS != 0 filterMediaPortraits.isChecked = filterMedia and TYPE_PORTRAITS != 0
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this, R.string.filter_media) activity.setupDialogStuff(binding.root, this, R.string.filter_media)
} }
} }
private fun dialogConfirmed() { private fun dialogConfirmed() {
var result = 0 var result = 0
if (view.filter_media_images.isChecked) if (binding.filterMediaImages.isChecked)
result += TYPE_IMAGES result += TYPE_IMAGES
if (view.filter_media_videos.isChecked) if (binding.filterMediaVideos.isChecked)
result += TYPE_VIDEOS result += TYPE_VIDEOS
if (view.filter_media_gifs.isChecked) if (binding.filterMediaGifs.isChecked)
result += TYPE_GIFS result += TYPE_GIFS
if (view.filter_media_raws.isChecked) if (binding.filterMediaRaws.isChecked)
result += TYPE_RAWS result += TYPE_RAWS
if (view.filter_media_svgs.isChecked) if (binding.filterMediaSvgs.isChecked)
result += TYPE_SVGS result += TYPE_SVGS
if (view.filter_media_portraits.isChecked) if (binding.filterMediaPortraits.isChecked)
result += TYPE_PORTRAITS result += TYPE_PORTRAITS
if (result == 0) { if (result == 0) {

View file

@ -1,25 +1,23 @@
package com.simplemobiletools.gallery.pro.dialogs package com.simplemobiletools.gallery.pro.dialogs
import android.view.View
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.applyColorFilter
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.getProperTextColor import com.simplemobiletools.commons.extensions.getProperTextColor
import com.simplemobiletools.commons.extensions.setupDialogStuff 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 com.simplemobiletools.gallery.pro.extensions.launchGrantAllFilesIntent
import kotlinx.android.synthetic.main.dialog_grant_all_files.view.*
class GrantAllFilesDialog(val activity: BaseSimpleActivity) { class GrantAllFilesDialog(val activity: BaseSimpleActivity) {
init { init {
val view: View = activity.layoutInflater.inflate(R.layout.dialog_grant_all_files, null) val binding = DialogGrantAllFilesBinding.inflate(activity.layoutInflater)
view.grant_all_files_image.applyColorFilter(activity.getProperTextColor()) binding.grantAllFilesImage.applyColorFilter(activity.getProperTextColor())
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> activity.launchGrantAllFilesIntent() } .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> activity.launchGrantAllFilesIntent() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .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.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff 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.extensions.config
import com.simplemobiletools.gallery.pro.helpers.* 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) { 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 { init {
val actions = activity.config.visibleBottomActions val actions = activity.config.visibleBottomActions
view.apply { binding.apply {
manage_bottom_actions_toggle_favorite.isChecked = actions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0 manageBottomActionsToggleFavorite.isChecked = actions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0
manage_bottom_actions_edit.isChecked = actions and BOTTOM_ACTION_EDIT != 0 manageBottomActionsEdit.isChecked = actions and BOTTOM_ACTION_EDIT != 0
manage_bottom_actions_share.isChecked = actions and BOTTOM_ACTION_SHARE != 0 manageBottomActionsShare.isChecked = actions and BOTTOM_ACTION_SHARE != 0
manage_bottom_actions_delete.isChecked = actions and BOTTOM_ACTION_DELETE != 0 manageBottomActionsDelete.isChecked = actions and BOTTOM_ACTION_DELETE != 0
manage_bottom_actions_rotate.isChecked = actions and BOTTOM_ACTION_ROTATE != 0 manageBottomActionsRotate.isChecked = actions and BOTTOM_ACTION_ROTATE != 0
manage_bottom_actions_properties.isChecked = actions and BOTTOM_ACTION_PROPERTIES != 0 manageBottomActionsProperties.isChecked = actions and BOTTOM_ACTION_PROPERTIES != 0
manage_bottom_actions_change_orientation.isChecked = actions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0 manageBottomActionsChangeOrientation.isChecked = actions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0
manage_bottom_actions_slideshow.isChecked = actions and BOTTOM_ACTION_SLIDESHOW != 0 manageBottomActionsSlideshow.isChecked = actions and BOTTOM_ACTION_SLIDESHOW != 0
manage_bottom_actions_show_on_map.isChecked = actions and BOTTOM_ACTION_SHOW_ON_MAP != 0 manageBottomActionsShowOnMap.isChecked = actions and BOTTOM_ACTION_SHOW_ON_MAP != 0
manage_bottom_actions_toggle_visibility.isChecked = actions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0 manageBottomActionsToggleVisibility.isChecked = actions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0
manage_bottom_actions_rename.isChecked = actions and BOTTOM_ACTION_RENAME != 0 manageBottomActionsRename.isChecked = actions and BOTTOM_ACTION_RENAME != 0
manage_bottom_actions_set_as.isChecked = actions and BOTTOM_ACTION_SET_AS != 0 manageBottomActionsSetAs.isChecked = actions and BOTTOM_ACTION_SET_AS != 0
manage_bottom_actions_copy.isChecked = actions and BOTTOM_ACTION_COPY != 0 manageBottomActionsCopy.isChecked = actions and BOTTOM_ACTION_COPY != 0
manage_bottom_actions_move.isChecked = actions and BOTTOM_ACTION_MOVE != 0 manageBottomActionsMove.isChecked = actions and BOTTOM_ACTION_MOVE != 0
manage_bottom_actions_resize.isChecked = actions and BOTTOM_ACTION_RESIZE != 0 manageBottomActionsResize.isChecked = actions and BOTTOM_ACTION_RESIZE != 0
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this) activity.setupDialogStuff(binding.root, this)
} }
} }
private fun dialogConfirmed() { private fun dialogConfirmed() {
var result = 0 var result = 0
view.apply { binding.apply {
if (manage_bottom_actions_toggle_favorite.isChecked) if (manageBottomActionsToggleFavorite.isChecked)
result += BOTTOM_ACTION_TOGGLE_FAVORITE result += BOTTOM_ACTION_TOGGLE_FAVORITE
if (manage_bottom_actions_edit.isChecked) if (manageBottomActionsEdit.isChecked)
result += BOTTOM_ACTION_EDIT result += BOTTOM_ACTION_EDIT
if (manage_bottom_actions_share.isChecked) if (manageBottomActionsShare.isChecked)
result += BOTTOM_ACTION_SHARE result += BOTTOM_ACTION_SHARE
if (manage_bottom_actions_delete.isChecked) if (manageBottomActionsDelete.isChecked)
result += BOTTOM_ACTION_DELETE result += BOTTOM_ACTION_DELETE
if (manage_bottom_actions_rotate.isChecked) if (manageBottomActionsRotate.isChecked)
result += BOTTOM_ACTION_ROTATE result += BOTTOM_ACTION_ROTATE
if (manage_bottom_actions_properties.isChecked) if (manageBottomActionsProperties.isChecked)
result += BOTTOM_ACTION_PROPERTIES result += BOTTOM_ACTION_PROPERTIES
if (manage_bottom_actions_change_orientation.isChecked) if (manageBottomActionsChangeOrientation.isChecked)
result += BOTTOM_ACTION_CHANGE_ORIENTATION result += BOTTOM_ACTION_CHANGE_ORIENTATION
if (manage_bottom_actions_slideshow.isChecked) if (manageBottomActionsSlideshow.isChecked)
result += BOTTOM_ACTION_SLIDESHOW result += BOTTOM_ACTION_SLIDESHOW
if (manage_bottom_actions_show_on_map.isChecked) if (manageBottomActionsShowOnMap.isChecked)
result += BOTTOM_ACTION_SHOW_ON_MAP result += BOTTOM_ACTION_SHOW_ON_MAP
if (manage_bottom_actions_toggle_visibility.isChecked) if (manageBottomActionsToggleVisibility.isChecked)
result += BOTTOM_ACTION_TOGGLE_VISIBILITY result += BOTTOM_ACTION_TOGGLE_VISIBILITY
if (manage_bottom_actions_rename.isChecked) if (manageBottomActionsRename.isChecked)
result += BOTTOM_ACTION_RENAME result += BOTTOM_ACTION_RENAME
if (manage_bottom_actions_set_as.isChecked) if (manageBottomActionsSetAs.isChecked)
result += BOTTOM_ACTION_SET_AS result += BOTTOM_ACTION_SET_AS
if (manage_bottom_actions_copy.isChecked) if (manageBottomActionsCopy.isChecked)
result += BOTTOM_ACTION_COPY result += BOTTOM_ACTION_COPY
if (manage_bottom_actions_move.isChecked) if (manageBottomActionsMove.isChecked)
result += BOTTOM_ACTION_MOVE result += BOTTOM_ACTION_MOVE
if (manage_bottom_actions_resize.isChecked) if (manageBottomActionsResize.isChecked)
result += BOTTOM_ACTION_RESIZE 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.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff 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.extensions.config
import com.simplemobiletools.gallery.pro.helpers.* 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) { 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 { init {
val details = activity.config.extendedDetails val details = activity.config.extendedDetails
view.apply { binding.apply {
manage_extended_details_name.isChecked = details and EXT_NAME != 0 manageExtendedDetailsName.isChecked = details and EXT_NAME != 0
manage_extended_details_path.isChecked = details and EXT_PATH != 0 manageExtendedDetailsPath.isChecked = details and EXT_PATH != 0
manage_extended_details_size.isChecked = details and EXT_SIZE != 0 manageExtendedDetailsSize.isChecked = details and EXT_SIZE != 0
manage_extended_details_resolution.isChecked = details and EXT_RESOLUTION != 0 manageExtendedDetailsResolution.isChecked = details and EXT_RESOLUTION != 0
manage_extended_details_last_modified.isChecked = details and EXT_LAST_MODIFIED != 0 manageExtendedDetailsLastModified.isChecked = details and EXT_LAST_MODIFIED != 0
manage_extended_details_date_taken.isChecked = details and EXT_DATE_TAKEN != 0 manageExtendedDetailsDateTaken.isChecked = details and EXT_DATE_TAKEN != 0
manage_extended_details_camera.isChecked = details and EXT_CAMERA_MODEL != 0 manageExtendedDetailsCamera.isChecked = details and EXT_CAMERA_MODEL != 0
manage_extended_details_exif.isChecked = details and EXT_EXIF_PROPERTIES != 0 manageExtendedDetailsExif.isChecked = details and EXT_EXIF_PROPERTIES != 0
manage_extended_details_gps_coordinates.isChecked = details and EXT_GPS != 0 manageExtendedDetailsGpsCoordinates.isChecked = details and EXT_GPS != 0
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this) activity.setupDialogStuff(binding.root, this)
} }
} }
private fun dialogConfirmed() { private fun dialogConfirmed() {
var result = 0 var result = 0
view.apply { binding.apply {
if (manage_extended_details_name.isChecked) if (manageExtendedDetailsName.isChecked)
result += EXT_NAME result += EXT_NAME
if (manage_extended_details_path.isChecked) if (manageExtendedDetailsPath.isChecked)
result += EXT_PATH result += EXT_PATH
if (manage_extended_details_size.isChecked) if (manageExtendedDetailsSize.isChecked)
result += EXT_SIZE result += EXT_SIZE
if (manage_extended_details_resolution.isChecked) if (manageExtendedDetailsResolution.isChecked)
result += EXT_RESOLUTION result += EXT_RESOLUTION
if (manage_extended_details_last_modified.isChecked) if (manageExtendedDetailsLastModified.isChecked)
result += EXT_LAST_MODIFIED result += EXT_LAST_MODIFIED
if (manage_extended_details_date_taken.isChecked) if (manageExtendedDetailsDateTaken.isChecked)
result += EXT_DATE_TAKEN result += EXT_DATE_TAKEN
if (manage_extended_details_camera.isChecked) if (manageExtendedDetailsCamera.isChecked)
result += EXT_CAMERA_MODEL result += EXT_CAMERA_MODEL
if (manage_extended_details_exif.isChecked) if (manageExtendedDetailsExif.isChecked)
result += EXT_EXIF_PROPERTIES result += EXT_EXIF_PROPERTIES
if (manage_extended_details_gps_coordinates.isChecked) if (manageExtendedDetailsGpsCoordinates.isChecked)
result += EXT_GPS result += EXT_GPS
} }

View file

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

View file

@ -2,10 +2,7 @@ package com.simplemobiletools.gallery.pro.dialogs
import android.graphics.Color import android.graphics.Color
import android.view.KeyEvent import android.view.KeyEvent
import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.ImageView
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -17,9 +14,9 @@ import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.commons.views.MySearchMenu import com.simplemobiletools.commons.views.MySearchMenu
import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.DirectoryAdapter 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.extensions.*
import com.simplemobiletools.gallery.pro.models.Directory import com.simplemobiletools.gallery.pro.models.Directory
import kotlinx.android.synthetic.main.dialog_directory_picker.view.*
class PickDirectoryDialog( class PickDirectoryDialog(
val activity: BaseSimpleActivity, val activity: BaseSimpleActivity,
@ -34,28 +31,28 @@ class PickDirectoryDialog(
private var shownDirectories = ArrayList<Directory>() private var shownDirectories = ArrayList<Directory>()
private var allDirectories = ArrayList<Directory>() private var allDirectories = ArrayList<Directory>()
private var openedSubfolders = arrayListOf("") 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 isGridViewType = activity.config.viewTypeFolders == VIEW_TYPE_GRID
private var showHidden = activity.config.shouldShowHidden private var showHidden = activity.config.shouldShowHidden
private var currentPathPrefix = "" private var currentPathPrefix = ""
private val config = activity.config private val config = activity.config
private val searchView = view.folder_search_view private val searchView = binding.folderSearchView
private val searchEditText = view.findViewById<EditText>(R.id.top_toolbar_search) private val searchEditText = searchView.binding.topToolbarSearch
private val searchViewAppBarLayout = view.findViewById<View>(R.id.top_app_bar_layout) private val searchViewAppBarLayout = searchView.binding.topAppBarLayout
init { 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 orientation = if (activity.config.scrollHorizontally && isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL
spanCount = if (isGridViewType) activity.config.dirColumnCnt else 1 spanCount = if (isGridViewType) activity.config.dirColumnCnt else 1
} }
view.directories_fastscroller.updateColors(activity.getProperPrimaryColor()) binding.directoriesFastscroller.updateColors(activity.getProperPrimaryColor())
configureSearchView() configureSearchView()
val builder = activity.getAlertDialogBuilder() val builder = activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.setOnKeyListener { dialogInterface, i, keyEvent -> .setOnKeyListener { dialogInterface, i, keyEvent ->
if (keyEvent.action == KeyEvent.ACTION_UP && i == KeyEvent.KEYCODE_BACK) { if (keyEvent.action == KeyEvent.ACTION_UP && i == KeyEvent.KEYCODE_BACK) {
backPressed() backPressed()
@ -68,12 +65,12 @@ class PickDirectoryDialog(
} }
builder.apply { 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 dialog = alertDialog
view.directories_show_hidden.beVisibleIf(!context.config.shouldShowHidden) binding.directoriesShowHidden.beVisibleIf(!context.config.shouldShowHidden)
view.directories_show_hidden.setOnClickListener { binding.directoriesShowHidden.setOnClickListener {
activity.handleHiddenFolderPasswordProtection { activity.handleHiddenFolderPasswordProtection {
view.directories_show_hidden.beGone() binding.directoriesShowHidden.beGone()
showHidden = true showHidden = true
fetchDirectories(true) fetchDirectories(true)
} }
@ -85,7 +82,7 @@ class PickDirectoryDialog(
} }
private fun configureSearchView() = with(searchView) { 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 searchEditText.imeOptions = EditorInfo.IME_ACTION_DONE
toggleHideOnScroll(!config.scrollHorizontally) toggleHideOnScroll(!config.scrollHorizontally)
@ -103,13 +100,13 @@ class PickDirectoryDialog(
private fun MySearchMenu.setSearchViewListeners() { private fun MySearchMenu.setSearchViewListeners() {
onSearchOpenListener = { onSearchOpenListener = {
updateSearchViewLeftIcon(R.drawable.ic_cross_vector) updateSearchViewLeftIcon(com.simplemobiletools.commons.R.drawable.ic_cross_vector)
} }
onSearchClosedListener = { onSearchClosedListener = {
searchEditText.clearFocus() searchEditText.clearFocus()
activity.hideKeyboard(searchEditText) activity.hideKeyboard(searchEditText)
updateSearchViewLeftIcon(R.drawable.ic_search_vector) updateSearchViewLeftIcon(com.simplemobiletools.commons.R.drawable.ic_search_vector)
} }
onSearchTextChangedListener = { text -> 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 { post {
setImageResource(iconResId) setImageResource(iconResId)
} }
} }
private fun filterFolderListBySearchQuery(query: String) { private fun filterFolderListBySearchQuery(query: String) {
val adapter = view.directories_grid.adapter as? DirectoryAdapter val adapter = binding.directoriesGrid.adapter as? DirectoryAdapter
var dirsToShow = allDirectories var dirsToShow = allDirectories
if (query.isNotEmpty()) { if (query.isNotEmpty()) {
dirsToShow = dirsToShow.filter { it.name.contains(query, true) }.toMutableList() as ArrayList dirsToShow = dirsToShow.filter { it.name.contains(query, true) }.toMutableList() as ArrayList
@ -136,7 +133,7 @@ class PickDirectoryDialog(
if (filteredFolderListUpdated) { if (filteredFolderListUpdated) {
adapter?.updateDirs(dirsToShow) adapter?.updateDirs(dirsToShow)
view.directories_grid.apply { binding.directoriesGrid.apply {
post { post {
scrollToPosition(0) scrollToPosition(0)
} }
@ -144,14 +141,14 @@ class PickDirectoryDialog(
} }
} }
private fun checkPlaceholderVisibility(dirs: ArrayList<Directory>) = with(view) { private fun checkPlaceholderVisibility(dirs: ArrayList<Directory>) = with(binding) {
directories_empty_placeholder.beVisibleIf(dirs.isEmpty()) directoriesEmptyPlaceholder.beVisibleIf(dirs.isEmpty())
if (folder_search_view.isSearchOpen) { if (folderSearchView.isSearchOpen) {
directories_empty_placeholder.text = context.getString(R.string.no_items_found) 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) { private fun fetchDirectories(forceShowHiddenAndExcluded: Boolean) {
@ -201,15 +198,15 @@ class PickDirectoryDialog(
} }
shownDirectories = dirs 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 clickedDir = it as Directory
val path = clickedDir.path val path = clickedDir.path
if (clickedDir.subfoldersCount == 1 || !activity.config.groupDirectSubfolders) { if (clickedDir.subfoldersCount == 1 || !activity.config.groupDirectSubfolders) {
if (isPickingCopyMoveDestination && path.trimEnd('/') == sourcePath) { 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 return@DirectoryAdapter
} else if (isPickingCopyMoveDestination && activity.isRestrictedWithSAFSdk30(path) && !activity.isInDownloadDir(path)) { } 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 return@DirectoryAdapter
} else { } else {
activity.handleLockedFolderOpening(path) { success -> activity.handleLockedFolderOpening(path) { success ->
@ -227,9 +224,9 @@ class PickDirectoryDialog(
} }
val scrollHorizontally = activity.config.scrollHorizontally && isGridViewType val scrollHorizontally = activity.config.scrollHorizontally && isGridViewType
view.apply { binding.apply {
directories_grid.adapter = adapter directoriesGrid.adapter = adapter
directories_fastscroller.setScrollVertically(!scrollHorizontally) 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.R
import com.simplemobiletools.gallery.pro.adapters.MediaAdapter import com.simplemobiletools.gallery.pro.adapters.MediaAdapter
import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask 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.config
import com.simplemobiletools.gallery.pro.extensions.getCachedMedia import com.simplemobiletools.gallery.pro.extensions.getCachedMedia
import com.simplemobiletools.gallery.pro.helpers.GridSpacingItemDecoration 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.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection 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) { class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val callback: (path: String) -> Unit) {
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
private var shownMedia = ArrayList<ThumbnailItem>() 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 config = activity.config
private val viewType = config.getFolderViewType(if (config.showAll) SHOW_ALL else path) private val viewType = config.getFolderViewType(if (config.showAll) SHOW_ALL else path)
private var isGridViewType = viewType == VIEW_TYPE_GRID private var isGridViewType = viewType == VIEW_TYPE_GRID
init { init {
(view.media_grid.layoutManager as MyGridLayoutManager).apply { (binding.mediaGrid.layoutManager as MyGridLayoutManager).apply {
orientation = if (config.scrollHorizontally && isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL orientation = if (config.scrollHorizontally && isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL
spanCount = if (isGridViewType) config.mediaColumnCnt else 1 spanCount = if (isGridViewType) config.mediaColumnCnt else 1
} }
view.media_fastscroller.updateColors(activity.getProperPrimaryColor()) binding.mediaFastscroller.updateColors(activity.getProperPrimaryColor())
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.setNeutralButton(R.string.other_folder) { dialogInterface, i -> showOtherFolder() } .setNeutralButton(R.string.other_folder) { dialogInterface, i -> showOtherFolder() }
.apply { .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 dialog = alertDialog
} }
} }
@ -72,7 +72,7 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
return return
shownMedia = media 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) { if (it is Medium) {
callback(it.path) callback(it.path)
dialog?.dismiss() dialog?.dismiss()
@ -80,9 +80,9 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
} }
val scrollHorizontally = config.scrollHorizontally && isGridViewType val scrollHorizontally = config.scrollHorizontally && isGridViewType
view.apply { binding.apply {
media_grid.adapter = adapter mediaGrid.adapter = adapter
media_fastscroller.setScrollVertically(!scrollHorizontally) mediaFastscroller.setScrollVertically(!scrollHorizontally)
} }
handleGridSpacing(media) handleGridSpacing(media)
} }
@ -94,17 +94,17 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
val useGridPosition = media.firstOrNull() is ThumbnailSection val useGridPosition = media.firstOrNull() is ThumbnailSection
var currentGridDecoration: GridSpacingItemDecoration? = null var currentGridDecoration: GridSpacingItemDecoration? = null
if (view.media_grid.itemDecorationCount > 0) { if (binding.mediaGrid.itemDecorationCount > 0) {
currentGridDecoration = view.media_grid.getItemDecorationAt(0) as GridSpacingItemDecoration currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration.items = media currentGridDecoration.items = media
} }
val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition) val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)
if (currentGridDecoration.toString() != newGridDecoration.toString()) { if (currentGridDecoration.toString() != newGridDecoration.toString()) {
if (currentGridDecoration != null) { 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.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.pro.R 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) { class ResizeDialog(val activity: BaseSimpleActivity, val size: Point, val callback: (newSize: Point) -> Unit) {
init { init {
val view = activity.layoutInflater.inflate(R.layout.dialog_resize_image, null) val binding = DialogResizeImageBinding.inflate(activity.layoutInflater)
val widthView = view.resize_image_width val widthView = binding.resizeImageWidth
val heightView = view.resize_image_height val heightView = binding.resizeImageHeight
widthView.setText(size.x.toString()) widthView.setText(size.x.toString())
heightView.setText(size.y.toString()) heightView.setText(size.y.toString())
@ -27,7 +27,7 @@ class ResizeDialog(val activity: BaseSimpleActivity, val size: Point, val callba
width = size.x width = size.x
} }
if (view.keep_aspect_ratio.isChecked) { if (binding.keepAspectRatio.isChecked) {
heightView.setText((width / ratio).toInt().toString()) heightView.setText((width / ratio).toInt().toString())
} }
} }
@ -41,18 +41,18 @@ class ResizeDialog(val activity: BaseSimpleActivity, val size: Point, val callba
height = size.y height = size.y
} }
if (view.keep_aspect_ratio.isChecked) { if (binding.keepAspectRatio.isChecked) {
widthView.setText((height * ratio).toInt().toString()) widthView.setText((height * ratio).toInt().toString())
} }
} }
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this, R.string.resize_and_save) { alertDialog -> activity.setupDialogStuff(binding.root, this, R.string.resize_and_save) { alertDialog ->
alertDialog.showKeyboard(view.resize_image_width) alertDialog.showKeyboard(binding.resizeImageWidth)
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val width = getViewValue(widthView) val width = getViewValue(widthView)
val height = getViewValue(heightView) 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.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R 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.ensureWriteAccess
import com.simplemobiletools.gallery.pro.extensions.rescanPathsAndUpdateLastModified import com.simplemobiletools.gallery.pro.extensions.rescanPathsAndUpdateLastModified
import com.simplemobiletools.gallery.pro.extensions.resizeImage 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 java.io.File
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -25,9 +23,9 @@ class ResizeMultipleImagesDialog(
) { ) {
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
private val view = activity.layoutInflater.inflate(R.layout.dialog_resize_multiple_images, null) private val binding = DialogResizeMultipleImagesBinding.inflate(activity.layoutInflater)
private val progressView = view.resize_progress private val progressView = binding.resizeProgress
private val resizeFactorEditText = view.resize_factor_edit_text private val resizeFactorEditText = binding.resizeFactorEditText
init { init {
resizeFactorEditText.setText(DEFAULT_RESIZE_FACTOR) resizeFactorEditText.setText(DEFAULT_RESIZE_FACTOR)
@ -37,10 +35,10 @@ class ResizeMultipleImagesDialog(
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this, R.string.resize_multiple_images) { alertDialog -> activity.setupDialogStuff(binding.root, this, R.string.resize_multiple_images) { alertDialog ->
dialog = alertDialog dialog = alertDialog
alertDialog.showKeyboard(resizeFactorEditText) alertDialog.showKeyboard(resizeFactorEditText)
@ -56,7 +54,7 @@ class ResizeMultipleImagesDialog(
val resizeFactor = resizeFactorText.toFloat().div(100) val resizeFactor = resizeFactorText.toFloat().div(100)
alertDialog.setCanceledOnTouchOutside(false) alertDialog.setCanceledOnTouchOutside(false)
arrayOf(view.resize_factor_input_layout, positiveButton, negativeButton).forEach { arrayOf(binding.resizeFactorInputLayout, positiveButton, negativeButton).forEach {
it.isEnabled = false it.isEnabled = false
it.alpha = 0.6f it.alpha = 0.6f
} }
@ -97,7 +95,7 @@ class ResizeMultipleImagesDialog(
} }
} }
} catch (e: OutOfMemoryError) { } catch (e: OutOfMemoryError) {
toast(R.string.out_of_memory_error) toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
} catch (e: Exception) { } catch (e: Exception) {
showErrorToast(e) showErrorToast(e)
} }

View file

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

View file

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

View file

@ -1,6 +1,5 @@
package com.simplemobiletools.gallery.pro.dialogs package com.simplemobiletools.gallery.pro.dialogs
import android.view.View
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog 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.extensions.value
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.pro.R 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.extensions.config
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_FADE 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_NONE
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_SLIDE import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_ANIMATION_SLIDE
import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_DEFAULT_INTERVAL 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) { class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) {
private val view: View private val binding: DialogSlideshowBinding
init { init {
view = activity.layoutInflater.inflate(R.layout.dialog_slideshow, null).apply { binding = DialogSlideshowBinding.inflate(activity.layoutInflater).apply {
interval_hint.hint = activity.getString(R.string.seconds_raw).replaceFirstChar { it.uppercaseChar() } intervalHint.hint = activity.getString(com.simplemobiletools.commons.R.string.seconds_raw).replaceFirstChar { it.uppercaseChar() }
interval_value.setOnClickListener { intervalValue.setOnClickListener {
interval_value.selectAll() intervalValue.selectAll()
} }
interval_value.setOnFocusChangeListener { v, hasFocus -> intervalValue.setOnFocusChangeListener { v, hasFocus ->
if (!hasFocus) if (!hasFocus)
activity.hideKeyboard(v) activity.hideKeyboard(v)
} }
animation_holder.setOnClickListener { animationHolder.setOnClickListener {
val items = arrayListOf( val items = arrayListOf(
RadioItem(SLIDESHOW_ANIMATION_NONE, activity.getString(R.string.no_animation)), RadioItem(SLIDESHOW_ANIMATION_NONE, activity.getString(R.string.no_animation)),
RadioItem(SLIDESHOW_ANIMATION_SLIDE, activity.getString(R.string.slide)), 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) { RadioGroupDialog(activity, items, activity.config.slideshowAnimation) {
activity.config.slideshowAnimation = it as Int activity.config.slideshowAnimation = it as Int
animation_value.text = getAnimationText() animationValue.text = getAnimationText()
} }
} }
include_videos_holder.setOnClickListener { includeVideosHolder.setOnClickListener {
interval_value.clearFocus() intervalValue.clearFocus()
include_videos.toggle() includeVideos.toggle()
} }
include_gifs_holder.setOnClickListener { includeGifsHolder.setOnClickListener {
interval_value.clearFocus() intervalValue.clearFocus()
include_gifs.toggle() includeGifs.toggle()
} }
random_order_holder.setOnClickListener { randomOrderHolder.setOnClickListener {
interval_value.clearFocus() intervalValue.clearFocus()
random_order.toggle() randomOrder.toggle()
} }
move_backwards_holder.setOnClickListener { moveBackwardsHolder.setOnClickListener {
interval_value.clearFocus() intervalValue.clearFocus()
move_backwards.toggle() moveBackwards.toggle()
} }
loop_slideshow_holder.setOnClickListener { loopSlideshowHolder.setOnClickListener {
interval_value.clearFocus() intervalValue.clearFocus()
loop_slideshow.toggle() loopSlideshow.toggle()
} }
} }
setupValues() setupValues()
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null) .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this) { alertDialog -> activity.setupDialogStuff(binding.root, this) { alertDialog ->
alertDialog.hideKeyboard() alertDialog.hideKeyboard()
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
storeValues() storeValues()
@ -89,30 +88,30 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit
private fun setupValues() { private fun setupValues() {
val config = activity.config val config = activity.config
view.apply { binding.apply {
interval_value.setText(config.slideshowInterval.toString()) intervalValue.setText(config.slideshowInterval.toString())
animation_value.text = getAnimationText() animationValue.text = getAnimationText()
include_videos.isChecked = config.slideshowIncludeVideos includeVideos.isChecked = config.slideshowIncludeVideos
include_gifs.isChecked = config.slideshowIncludeGIFs includeGifs.isChecked = config.slideshowIncludeGIFs
random_order.isChecked = config.slideshowRandomOrder randomOrder.isChecked = config.slideshowRandomOrder
move_backwards.isChecked = config.slideshowMoveBackwards moveBackwards.isChecked = config.slideshowMoveBackwards
loop_slideshow.isChecked = config.loopSlideshow loopSlideshow.isChecked = config.loopSlideshow
} }
} }
private fun storeValues() { private fun storeValues() {
var interval = view.interval_value.text.toString() var interval = binding.intervalValue.text.toString()
if (interval.trim('0').isEmpty()) if (interval.trim('0').isEmpty())
interval = SLIDESHOW_DEFAULT_INTERVAL.toString() interval = SLIDESHOW_DEFAULT_INTERVAL.toString()
activity.config.apply { activity.config.apply {
slideshowAnimation = getAnimationValue(view.animation_value.value) slideshowAnimation = getAnimationValue(binding.animationValue.value)
slideshowInterval = interval.toInt() slideshowInterval = interval.toInt()
slideshowIncludeVideos = view.include_videos.isChecked slideshowIncludeVideos = binding.includeVideos.isChecked
slideshowIncludeGIFs = view.include_gifs.isChecked slideshowIncludeGIFs = binding.includeGifs.isChecked
slideshowRandomOrder = view.random_order.isChecked slideshowRandomOrder = binding.randomOrder.isChecked
slideshowMoveBackwards = view.move_backwards.isChecked slideshowMoveBackwards = binding.moveBackwards.isChecked
loopSlideshow = view.loop_slideshow.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_7_title, R.string.faq_7_text),
FAQItem(R.string.faq_14_title, R.string.faq_14_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_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_5_title, R.string.faq_5_text),
FAQItem(R.string.faq_4_title, R.string.faq_4_text), FAQItem(R.string.faq_4_title, R.string.faq_4_text),
FAQItem(R.string.faq_6_title, R.string.faq_6_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_15_title, R.string.faq_15_text),
FAQItem(R.string.faq_2_title, R.string.faq_2_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_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)) { if (!resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations)) {
faqItems.add(FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons)) faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_2_title_commons, com.simplemobiletools.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(com.simplemobiletools.commons.R.string.faq_6_title_commons, com.simplemobiletools.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(com.simplemobiletools.commons.R.string.faq_7_title_commons, com.simplemobiletools.commons.R.string.faq_7_text_commons))
faqItems.add(FAQItem(R.string.faq_10_title_commons, R.string.faq_10_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()) { if (isRPlus() && !isExternalStorageManager()) {
@ -138,7 +138,7 @@ fun BaseSimpleActivity.handleMediaManagementPrompt(callback: () -> Unit) {
if (Environment.isExternalStorageManager()) { if (Environment.isExternalStorageManager()) {
callback() callback()
} else { } else {
var messagePrompt = getString(R.string.access_storage_prompt) var messagePrompt = getString(com.simplemobiletools.commons.R.string.access_storage_prompt)
messagePrompt += if (isSPlus()) { messagePrompt += if (isSPlus()) {
"\n\n${getString(R.string.media_management_alternative)}" "\n\n${getString(R.string.media_management_alternative)}"
} else { } else {
@ -214,7 +214,7 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
addNoMediaIntoMediaStore(file.absolutePath) addNoMediaIntoMediaStore(file.absolutePath)
callback() callback()
} else { } else {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
callback() callback()
} }
} }
@ -225,7 +225,7 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
addNoMediaIntoMediaStore(file.absolutePath) addNoMediaIntoMediaStore(file.absolutePath)
} }
} else { } else {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
} }
} catch (e: Exception) { } catch (e: Exception) {
showErrorToast(e) 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) { fun BaseSimpleActivity.tryCopyMoveFilesTo(fileDirItems: ArrayList<FileDirItem>, isCopyOperation: Boolean, callback: (destinationPath: String) -> Unit) {
if (fileDirItems.isEmpty()) { if (fileDirItems.isEmpty()) {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
return return
} }
@ -477,10 +477,10 @@ fun BaseSimpleActivity.emptyTheRecycleBin(callback: (() -> Unit)? = null) {
recycleBin.deleteRecursively() recycleBin.deleteRecursively()
mediaDB.clearRecycleBin() mediaDB.clearRecycleBin()
directoryDB.deleteRecycleBin() directoryDB.deleteRecycleBin()
toast(R.string.recycle_bin_emptied) toast(com.simplemobiletools.commons.R.string.recycle_bin_emptied)
callback?.invoke() callback?.invoke()
} catch (e: Exception) { } 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) { 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() callback()
} }
} }
@ -611,7 +617,7 @@ fun AppCompatActivity.fixDateTaken(
runOnUiThread { runOnUiThread {
if (showToasts) { 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() callback?.invoke()
@ -647,7 +653,7 @@ fun BaseSimpleActivity.saveRotatedImageToFile(oldPath: String, newPath: String,
getFileOutputStream(tmpFileDirItem) { getFileOutputStream(tmpFileDirItem) {
if (it == null) { if (it == null) {
if (showToasts) { if (showToasts) {
toast(R.string.unknown_error_occurred) toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
} }
return@getFileOutputStream return@getFileOutputStream
} }
@ -672,7 +678,7 @@ fun BaseSimpleActivity.saveRotatedImageToFile(oldPath: String, newPath: String,
} }
} catch (e: OutOfMemoryError) { } catch (e: OutOfMemoryError) {
if (showToasts) { if (showToasts) {
toast(R.string.out_of_memory_error) toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
} }
} catch (e: Exception) { } catch (e: Exception) {
if (showToasts) { if (showToasts) {
@ -692,7 +698,7 @@ fun Activity.tryRotateByExif(path: String, degrees: Int, showToasts: Boolean, ca
fileRotatedSuccessfully(path, oldLastModified) fileRotatedSuccessfully(path, oldLastModified)
callback.invoke() callback.invoke()
if (showToasts) { if (showToasts) {
toast(R.string.file_saved) toast(com.simplemobiletools.commons.R.string.file_saved)
} }
true true
} else { } else {
@ -801,7 +807,7 @@ fun BaseSimpleActivity.launchResizeImageDialog(path: String, callback: (() -> Un
try { try {
resizeImage(path, newPath, newSize) { success -> resizeImage(path, newPath, newSize) { success ->
if (success) { if (success) {
toast(R.string.file_saved) toast(com.simplemobiletools.commons.R.string.file_saved)
val paths = arrayListOf(file.absolutePath) val paths = arrayListOf(file.absolutePath)
rescanPathsAndUpdateLastModified(paths, pathLastModifiedMap) { rescanPathsAndUpdateLastModified(paths, pathLastModifiedMap) {
@ -814,7 +820,7 @@ fun BaseSimpleActivity.launchResizeImageDialog(path: String, callback: (() -> Un
} }
} }
} catch (e: OutOfMemoryError) { } catch (e: OutOfMemoryError) {
toast(R.string.out_of_memory_error) toast(com.simplemobiletools.commons.R.string.out_of_memory_error)
} catch (e: Exception) { } catch (e: Exception) {
showErrorToast(e) showErrorToast(e)
} }
@ -882,7 +888,7 @@ fun Activity.getShortcutImage(tmb: String, drawable: Drawable, callback: () -> U
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.fitCenter() .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) val builder = Glide.with(this)
.asDrawable() .asDrawable()
.load(tmb) .load(tmb)

View file

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

View file

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

View file

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

View file

@ -1,9 +1,6 @@
package com.simplemobiletools.gallery.pro.helpers package com.simplemobiletools.gallery.pro.helpers
import com.simplemobiletools.commons.helpers.MONTH_SECONDS import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.helpers.PERMISSION_READ_MEDIA_IMAGES
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.isTiramisuPlus
// shared preferences // shared preferences
const val DIRECTORY_SORT_ORDER = "directory_sort_order" 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 const val FOLDER_STYLE_ROUNDED_CORNERS = 2
fun getPermissionToRequest() = if (isTiramisuPlus()) PERMISSION_READ_MEDIA_IMAGES else PERMISSION_WRITE_STORAGE 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 android.graphics.Bitmap
import com.simplemobiletools.gallery.pro.models.FilterItem import com.simplemobiletools.gallery.pro.models.FilterItem
import java.util.*
class FilterThumbnailsManager { class FilterThumbnailsManager {
private var filterThumbnails = ArrayList<FilterItem>(10) 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.ThumbnailItem
import com.simplemobiletools.gallery.pro.models.ThumbnailSection import com.simplemobiletools.gallery.pro.models.ThumbnailSection
import java.io.File import java.io.File
import java.util.* import java.util.Calendar
import java.util.Locale
class MediaFetcher(val context: Context) { class MediaFetcher(val context: Context) {
var shouldStop = false var shouldStop = false
@ -777,6 +778,7 @@ class MediaFetcher(val context: Context) {
o1.name.normalizeString().toLowerCase().compareTo(o2.name.normalizeString().toLowerCase()) o1.name.normalizeString().toLowerCase().compareTo(o2.name.normalizeString().toLowerCase())
} }
} }
sorting and SORT_BY_PATH != 0 -> { sorting and SORT_BY_PATH != 0 -> {
if (sorting and SORT_USE_NUMERIC_VALUE != 0) { if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase()) AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
@ -784,6 +786,7 @@ class MediaFetcher(val context: Context) {
o1.path.toLowerCase().compareTo(o2.path.toLowerCase()) o1.path.toLowerCase().compareTo(o2.path.toLowerCase())
} }
} }
sorting and SORT_BY_SIZE != 0 -> o1.size.compareTo(o2.size) sorting and SORT_BY_SIZE != 0 -> o1.size.compareTo(o2.size)
sorting and SORT_BY_DATE_MODIFIED != 0 -> o1.modified.compareTo(o2.modified) sorting and SORT_BY_DATE_MODIFIED != 0 -> o1.modified.compareTo(o2.modified)
else -> o1.taken.compareTo(o2.taken) else -> o1.taken.compareTo(o2.taken)
@ -860,6 +863,7 @@ class MediaFetcher(val context: Context) {
today, today,
yesterday yesterday
) )
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 || grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -> formatDate(key, false) 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_FILE_TYPE != 0 -> getFileTypeString(key)
grouping and GROUP_BY_EXTENSION != 0 -> key.toUpperCase() grouping and GROUP_BY_EXTENSION != 0 -> key.toUpperCase()
@ -868,7 +872,7 @@ class MediaFetcher(val context: Context) {
} }
if (result.isEmpty()) { 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) { 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 { private fun getFinalDate(date: String, today: String, yesterday: String): String {
return when (date) { return when (date) {
today -> context.getString(R.string.today) today -> context.getString(com.simplemobiletools.commons.R.string.today)
yesterday -> context.getString(R.string.yesterday) yesterday -> context.getString(com.simplemobiletools.commons.R.string.yesterday)
else -> date else -> date
} }
} }

View file

@ -15,4 +15,5 @@ data class DateTaken(
@ColumnInfo(name = "parent_path") var parentPath: String, @ColumnInfo(name = "parent_path") var parentPath: String,
@ColumnInfo(name = "date_taken") var taken: Long, @ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "last_fixed") var lastFixed: Int, @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 com.simplemobiletools.gallery.pro.helpers.*
import java.io.File import java.io.File
import java.io.Serializable 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))]) @Entity(tableName = "media", indices = [(Index(value = ["full_path"], unique = true))])
data class Medium( data class Medium(

View file

@ -17,7 +17,13 @@ class SvgSoftwareLayerSetter : RequestListener<PictureDrawable> {
return false 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 val view = (target as ImageViewTarget<*>).view
view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null) view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null)
return false return false

View file

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

View file

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

View file

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

View file

@ -11,7 +11,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="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 <ImageView
android:id="@+id/explore" android:id="@+id/explore"

View file

@ -46,7 +46,9 @@
android:background="@drawable/gradient_background" android:background="@drawable/gradient_background"
tools:ignore="UnknownIdInLayout" /> 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 <TextView
android:id="@+id/slide_info" android:id="@+id/slide_info"

View file

@ -66,7 +66,9 @@
android:visibility="gone" android:visibility="gone"
tools:text="My video\nAnother line" /> 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 <TextView
android:id="@+id/slide_info" android:id="@+id/slide_info"

View file

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

View file

@ -1,389 +1,389 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">Simple Galerie</string> <!-- <string name="app_name">&lt;!&ndash;Simple Galerie&ndash;&gt;</string>-->
<string name="app_launcher_name">Galerie</string> <!-- <string name="app_launcher_name">Galerie</string>-->
<string name="edit">Modifier</string> <!-- <string name="edit">Modifier</string>-->
<string name="open_camera">Ouvrir l\'appareil photo</string> <!-- <string name="open_camera">Ouvrir l\'appareil photo</string>-->
<string name="hidden">(caché)</string> <!-- <string name="hidden">(caché)</string>-->
<string name="excluded">(exclu)</string> <!-- <string name="excluded">(exclu)</string>-->
<string name="pin_folder">Épingler le dossier</string> <!-- <string name="pin_folder">Épingler le dossier</string>-->
<string name="unpin_folder">Libérer le dossier</string> <!-- <string name="unpin_folder">Libérer le dossier</string>-->
<string name="pin_to_the_top">Épingler le dossier</string> <!-- <string name="pin_to_the_top">Épingler le dossier</string>-->
<string name="show_all">Affichage Dossiers</string> <!-- <string name="show_all">Affichage Dossiers</string>-->
<string name="all_folders">Dossiers</string> <!-- <string name="all_folders">Dossiers</string>-->
<string name="folder_view">Affichage Galerie</string> <!-- <string name="folder_view">Affichage Galerie</string>-->
<string name="other_folder">Autre dossier</string> <!-- <string name="other_folder">Autre dossier</string>-->
<string name="show_on_map">Afficher sur la carte</string> <!-- <string name="show_on_map">Afficher sur la carte</string>-->
<string name="unknown_location">Position inconnue</string> <!-- <string name="unknown_location">Position inconnue</string>-->
<string name="volume">Volume</string> <!-- <string name="volume">Volume</string>-->
<string name="brightness">Luminosité</string> <!-- <string name="brightness">Luminosité</string>-->
<string name="lock_orientation">Verrouiller la rotation</string> <!-- <string name="lock_orientation">Verrouiller la rotation</string>-->
<string name="unlock_orientation">Déverrouiller la rotation</string> <!-- <string name="unlock_orientation">Déverrouiller la rotation</string>-->
<string name="change_orientation">Orientation</string> <!-- <string name="change_orientation">Orientation</string>-->
<string name="force_portrait">Forcer la vue portrait</string> <!-- <string name="force_portrait">Forcer la vue portrait</string>-->
<string name="force_landscape">Forcer la vue paysage</string> <!-- <string name="force_landscape">Forcer la vue paysage</string>-->
<string name="use_default_orientation">Utiliser l\'orientation par défaut</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="fix_date_taken">Corriger les dates de prise de vue</string>-->
<string name="fixing">Correction en cours…</string> <!-- <string name="fixing">Correction en cours…</string>-->
<string name="dates_fixed_successfully">Dates corrigées</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="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="share_resized">Partager une version redimensionnée</string>-->
<string name="switch_to_file_search">Basculer vers la recherche de fichiers</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="set_as_default_folder">Dossier par défaut</string>-->
<string name="unset_as_default_folder">Oublier le dossier</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">Réordonner par glisser</string>-->
<string name="reorder_by_dragging_pro">Réordonner par glisser (Pro)</string> <!-- <string name="reorder_by_dragging_pro">Réordonner par glisser (Pro)</string>-->
<string name="restore_to_path">Restauration vers « %s »</string> <!-- <string name="restore_to_path">Restauration vers « %s »</string>-->
<!-- Filter --> <!-- &lt;!&ndash; Filter &ndash;&gt;-->
<string name="filter_media">Filtrer les médias</string> <!-- <string name="filter_media">Filtrer les médias</string>-->
<string name="images">Images</string> <!-- <string name="images">Images</string>-->
<string name="videos">Vidéos</string> <!-- <string name="videos">Vidéos</string>-->
<string name="gifs">GIF</string> <!-- <string name="gifs">GIF</string>-->
<string name="raw_images">Images RAW</string> <!-- <string name="raw_images">Images RAW</string>-->
<string name="svgs">SVG</string> <!-- <string name="svgs">SVG</string>-->
<string name="portraits">Portraits</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="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> <!-- <string name="change_filters_underlined"><u>Modifier les filtres</u></string>-->
<!-- Hide / Exclude --> <!-- &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="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_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="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. <!-- <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 <!--\n-->
\nSi vous voulez aussi les cacher ailleurs, utilisez la fonction Cacher.</string> <!--\nSi vous voulez aussi les cacher ailleurs, utilisez la fonction Cacher.</string>-->
<string name="hidden_folders">Dossiers cachés</string> <!-- <string name="hidden_folders">Dossiers cachés</string>-->
<string name="manage_hidden_folders">Gérer les 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_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="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> <!--&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;-->
<!-- Include folders --> <!-- &lt;!&ndash; Include folders &ndash;&gt;-->
<string name="include_folders">Dossiers ajoutés</string> <!-- <string name="include_folders">Dossiers ajoutés</string>-->
<string name="manage_included_folders">Gérer les 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="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. <!-- <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 <!--\n-->
\nCet ajout n\'exclura aucun autre dossier.</string> <!--\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> <!-- <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 --> <!-- &lt;!&ndash; Resizing &ndash;&gt;-->
<string name="resize_and_save">Redimensionner la sélection et enregistrer</string> <!-- <string name="resize_and_save">Redimensionner la sélection et enregistrer</string>-->
<string name="width">Largeur</string> <!-- <string name="width">Largeur</string>-->
<string name="height">Hauteur</string> <!-- <string name="height">Hauteur</string>-->
<string name="keep_aspect_ratio">Conserver le rapport d\'affichage</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="invalid_values">Veuillez entrer une résolution valide</string>-->
<string name="resize_multiple_images">Redimensionner plusieurs images</string> <!-- <string name="resize_multiple_images">Redimensionner plusieurs images</string>-->
<string name="resize_factor">Facteur de redimensionnement</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_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> <!-- <string name="resize_factor_error">Entrer un nombre entre 10 et 90</string>-->
<plurals name="failed_to_resize_images"> <!-- <plurals name="failed_to_resize_images">-->
<item quantity="one">Échec de redimensionnement de %d image</item> <!-- <item quantity="one">Échec de redimensionnement de %d image</item>-->
<item quantity="many">Échec de redimensionnement de %d images</item> <!-- <item quantity="many">Échec de redimensionnement de %d images</item>-->
<item quantity="other">Échec de redimensionnement de %d images</item> <!-- <item quantity="other">Échec de redimensionnement de %d images</item>-->
</plurals> <!-- </plurals>-->
<string name="images_resized_successfully">Les images ont été redimensionnées avec succès</string> <!-- <string name="images_resized_successfully">Les images ont été redimensionnées avec succès</string>-->
<!-- Editor --> <!-- &lt;!&ndash; Editor &ndash;&gt;-->
<string name="editor">Éditeur</string> <!-- <string name="editor">Éditeur</string>-->
<string name="basic_editor">Éditeur simple</string> <!-- <string name="basic_editor">Éditeur simple</string>-->
<string name="advanced_editor">Éditeur avancé</string> <!-- <string name="advanced_editor">Éditeur avancé</string>-->
<string name="rotate">Pivoter</string> <!-- <string name="rotate">Pivoter</string>-->
<string name="invalid_image_path">Emplacement d\'image invalide</string> <!-- <string name="invalid_image_path">Emplacement d\'image invalide</string>-->
<string name="invalid_video_path">Emplacement de vidéo 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="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="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="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="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="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="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="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_image_with">Modifier l\'image avec :</string>-->
<string name="edit_video_with">Modifier la vidéo 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_image_editor_found">Aucun éditeur d\'image trouvé</string>-->
<string name="no_video_editor_found">Aucun éditeur de vidéo 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="unknown_file_location">Emplacement du fichier inconnu</string>-->
<string name="error_saving_file">Impossible de remplacer le fichier source</string> <!-- <string name="error_saving_file">Impossible de remplacer le fichier source</string>-->
<string name="rotate_left">Pivoter à gauche</string> <!-- <string name="rotate_left">Pivoter à gauche</string>-->
<string name="rotate_right">Pivoter à droite</string> <!-- <string name="rotate_right">Pivoter à droite</string>-->
<string name="rotate_one_eighty">Pivoter à 180º</string> <!-- <string name="rotate_one_eighty">Pivoter à 180º</string>-->
<string name="transform">Transformer</string> <!-- <string name="transform">Transformer</string>-->
<string name="crop">Rogner</string> <!-- <string name="crop">Rogner</string>-->
<string name="draw">Dessiner</string> <!-- <string name="draw">Dessiner</string>-->
<string name="flip">Retourner</string> <!-- <string name="flip">Retourner</string>-->
<string name="flip_horizontally">Retourner horizontalement</string> <!-- <string name="flip_horizontally">Retourner horizontalement</string>-->
<string name="flip_vertically">Retourner verticalement</string> <!-- <string name="flip_vertically">Retourner verticalement</string>-->
<string name="free_aspect_ratio">Libre</string> <!-- <string name="free_aspect_ratio">Libre</string>-->
<!-- available as an option: 1:1, 4:3, 16:9, free --> <!-- &lt;!&ndash; available as an option: 1:1, 4:3, 16:9, free &ndash;&gt;-->
<string name="other_aspect_ratio">Autre</string> <!-- <string name="other_aspect_ratio">Autre</string>-->
<!-- available as an option: 1:1, 4:3, 16:9, free, other --> <!-- &lt;!&ndash; available as an option: 1:1, 4:3, 16:9, free, other &ndash;&gt;-->
<!-- Set wallpaper --> <!-- &lt;!&ndash; Set wallpaper &ndash;&gt;-->
<string name="simple_wallpaper">Fond d\'écran simple</string> <!-- <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">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_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="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="setting_wallpaper">Définition du fond d\'écran en cours…</string>-->
<string name="wallpaper_set_successfully">Fond d\'écran défini</string> <!-- <string name="wallpaper_set_successfully">Fond d\'écran défini</string>-->
<string name="portrait_aspect_ratio">Rapport d\'affichage portrait</string> <!-- <string name="portrait_aspect_ratio">Rapport d\'affichage portrait</string>-->
<string name="landscape_aspect_ratio">Rapport d\'affichage paysage</string> <!-- <string name="landscape_aspect_ratio">Rapport d\'affichage paysage</string>-->
<string name="home_screen">Écran d\'accueil</string> <!-- <string name="home_screen">Écran d\'accueil</string>-->
<string name="lock_screen">Écran de déverrouillage</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="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> <!-- <string name="allow_changing_aspect_ratio">Autoriser la modification du rapport d\'aspect</string>-->
<!-- Slideshow --> <!-- &lt;!&ndash; Slideshow &ndash;&gt;-->
<string name="slideshow">Diaporama</string> <!-- <string name="slideshow">Diaporama</string>-->
<string name="interval">Intervalle</string> <!-- <string name="interval">Intervalle</string>-->
<string name="include_photos">Inclure les images</string> <!-- <string name="include_photos">Inclure les images</string>-->
<string name="include_videos">Inclure les vidéos</string> <!-- <string name="include_videos">Inclure les vidéos</string>-->
<string name="include_gifs">Inclure les GIF</string> <!-- <string name="include_gifs">Inclure les GIF</string>-->
<string name="random_order">Ordre aléatoire</string> <!-- <string name="random_order">Ordre aléatoire</string>-->
<string name="move_backwards">Défilement inversé</string> <!-- <string name="move_backwards">Défilement inversé</string>-->
<string name="loop_slideshow">Diaporama en boucle</string> <!-- <string name="loop_slideshow">Diaporama en boucle</string>-->
<string name="animation">Animation</string> <!-- <string name="animation">Animation</string>-->
<string name="no_animation">Aucune</string> <!-- <string name="no_animation">Aucune</string>-->
<string name="fade">Fondu</string> <!-- <string name="fade">Fondu</string>-->
<string name="slide">Glissement</string> <!-- <string name="slide">Glissement</string>-->
<string name="slideshow_ended">Diaporama terminé</string> <!-- <string name="slideshow_ended">Diaporama terminé</string>-->
<string name="no_media_for_slideshow">Aucun média trouvé pour le diaporama</string> <!-- <string name="no_media_for_slideshow">Aucun média trouvé pour le diaporama</string>-->
<!-- View types --> <!-- &lt;!&ndash; View types &ndash;&gt;-->
<string name="group_direct_subfolders">Mode sous-dossiers</string> <!-- <string name="group_direct_subfolders">Mode sous-dossiers</string>-->
<!-- Grouping at media thumbnails --> <!-- &lt;!&ndash; Grouping at media thumbnails &ndash;&gt;-->
<string name="group_by">Grouper par</string> <!-- <string name="group_by">Grouper par</string>-->
<string name="do_not_group_files">Ne pas grouper les fichiers</string> <!-- <string name="do_not_group_files">Ne pas grouper les fichiers</string>-->
<string name="by_folder">Dossier</string> <!-- <string name="by_folder">Dossier</string>-->
<string name="by_last_modified">Date de modification</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_daily">Date de modification (par jour)</string>-->
<string name="by_last_modified_monthly">Date de modification (par mois)</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">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_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_date_taken_monthly">Date de prise de vue (par mois)</string>-->
<string name="by_file_type">Type de fichier</string> <!-- <string name="by_file_type">Type de fichier</string>-->
<string name="by_extension">Extension</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="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> <!-- <string name="grouping_and_sorting">Grouper par et Trier par sont deux modes indépendants</string>-->
<!-- Widgets --> <!-- &lt;!&ndash; Widgets &ndash;&gt;-->
<string name="folder_on_widget">Dossier affiché dans le widget :</string> <!-- <string name="folder_on_widget">Dossier affiché dans le widget :</string>-->
<string name="show_folder_name">Afficher le nom du dossier</string> <!-- <string name="show_folder_name">Afficher le nom du dossier</string>-->
<!-- Settings --> <!-- &lt;!&ndash; Settings &ndash;&gt;-->
<string name="autoplay_videos">Lecture automatique des vidéos</string> <!-- <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="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="loop_videos">Lecture en boucle des vidéos</string>-->
<string name="animate_gifs">Animer les miniatures des GIF</string> <!-- <string name="animate_gifs">Animer les miniatures des GIF</string>-->
<string name="max_brightness">Luminosité maximale</string> <!-- <string name="max_brightness">Luminosité maximale</string>-->
<string name="crop_thumbnails">Recadrer les miniatures en carré</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="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_by">Orientation de l\'affichage</string>-->
<string name="screen_rotation_system_setting">Paramètres système</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_device_rotation">Rotation de l\'appareil</string>-->
<string name="screen_rotation_aspect_ratio">Rapport d\'affichage</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="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="scroll_thumbnails_horizontally">Défiler les miniatures horizontalement</string>-->
<string name="hide_system_ui_at_fullscreen">Masquer automatiquement l\'interface utilisateur</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="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_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="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_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="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="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="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_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="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="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_at_bottom">Afficher les boutons d\'action</string>-->
<string name="show_recycle_bin">Afficher la corbeille en affichage Galerie</string> <!-- <string name="show_recycle_bin">Afficher la corbeille en affichage Galerie</string>-->
<string name="deep_zoomable_images">Niveau de zoom</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_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="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_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="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="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="show_notch">Afficher une encoche si disponible</string>-->
<string name="allow_rotating_gestures">Pivoter les images par gestes</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="file_loading_priority">Priorité de chargement des fichiers</string>-->
<string name="speed">Rapide</string> <!-- <string name="speed">Rapide</string>-->
<string name="compromise">Compromis</string> <!-- <string name="compromise">Compromis</string>-->
<string name="avoid_showing_invalid_files">Éviter l\'affichage de fichiers invalides</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="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="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="folder_thumbnail_style">Style des miniatures des dossiers</string>-->
<string name="file_thumbnail_style">Style des miniatures des fichiers</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="mark_favorite_items">Marquer les éléments favoris</string>-->
<string name="thumbnail_spacing">Espacement des miniatures</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_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_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="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="limit_folder_title">Limiter à une ligne les noms de fichiers</string>-->
<string name="square">Carré</string> <!-- <string name="square">Carré</string>-->
<string name="rounded_corners">Arrondi</string> <!-- <string name="rounded_corners">Arrondi</string>-->
<string name="export_favorite_paths">Exporter les favoris</string> <!-- <string name="export_favorite_paths">Exporter les favoris</string>-->
<string name="import_favorite_paths">Importer les favoris</string> <!-- <string name="import_favorite_paths">Importer les favoris</string>-->
<string name="paths_imported_successfully">Favoris importés</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="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="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_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_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="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="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="media_only">Médias uniquement</string>-->
<string name="all_files">Tous les fichiers</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="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> <!-- <string name="show_all_folders">Afficher un bouton de menu pour afficher rapidement le contenu de tous les dossiers</string>-->
<!-- Setting sections --> <!-- &lt;!&ndash; Setting sections &ndash;&gt;-->
<string name="thumbnails">Miniatures</string> <!-- <string name="thumbnails">Miniatures</string>-->
<string name="fullscreen_media">Plein écran</string> <!-- <string name="fullscreen_media">Plein écran</string>-->
<string name="extended_details">Détails supplémentaires</string> <!-- <string name="extended_details">Détails supplémentaires</string>-->
<string name="bottom_actions">Barre d\'actions</string> <!-- <string name="bottom_actions">Barre d\'actions</string>-->
<!-- Bottom actions --> <!-- &lt;!&ndash; Bottom actions &ndash;&gt;-->
<string name="manage_bottom_actions">Gérer la barre d\'actions</string> <!-- <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_favorite">Activer/désactiver le favori</string>-->
<string name="toggle_file_visibility">Visibilité du fichier</string> <!-- <string name="toggle_file_visibility">Visibilité du fichier</string>-->
<!-- New editor strings --> <!-- &lt;!&ndash; New editor strings &ndash;&gt;-->
<string name="pesdk_transform_button_freeCrop">Libre</string> <!-- <string name="pesdk_transform_button_freeCrop">Libre</string>-->
<string name="pesdk_transform_button_resetCrop">Réinitialiser</string> <!-- <string name="pesdk_transform_button_resetCrop">Réinitialiser</string>-->
<string name="pesdk_transform_button_squareCrop">Carré</string> <!-- <string name="pesdk_transform_button_squareCrop">Carré</string>-->
<string name="pesdk_transform_title_name">Transformer</string> <!-- <string name="pesdk_transform_title_name">Transformer</string>-->
<string name="pesdk_filter_title_name">Filtres</string> <!-- <string name="pesdk_filter_title_name">Filtres</string>-->
<string name="pesdk_filter_asset_none">Aucun</string> <!-- <string name="pesdk_filter_asset_none">Aucun</string>-->
<string name="pesdk_adjustments_title_name">Ajuster</string> <!-- <string name="pesdk_adjustments_title_name">Ajuster</string>-->
<string name="pesdk_adjustments_button_shadowTool">Ombres</string> <!-- <string name="pesdk_adjustments_button_shadowTool">Ombres</string>-->
<string name="pesdk_adjustments_button_exposureTool">Exposition</string> <!-- <string name="pesdk_adjustments_button_exposureTool">Exposition</string>-->
<string name="pesdk_adjustments_button_highlightTool">Détails</string> <!-- <string name="pesdk_adjustments_button_highlightTool">Détails</string>-->
<string name="pesdk_adjustments_button_brightnessTool">Luminosité</string> <!-- <string name="pesdk_adjustments_button_brightnessTool">Luminosité</string>-->
<string name="pesdk_adjustments_button_contrastTool">Contraste</string> <!-- <string name="pesdk_adjustments_button_contrastTool">Contraste</string>-->
<string name="pesdk_adjustments_button_saturationTool">Saturation</string> <!-- <string name="pesdk_adjustments_button_saturationTool">Saturation</string>-->
<string name="pesdk_adjustments_button_clarityTool">Clarté</string> <!-- <string name="pesdk_adjustments_button_clarityTool">Clarté</string>-->
<string name="pesdk_adjustments_button_gammaTool">Gamma</string> <!-- <string name="pesdk_adjustments_button_gammaTool">Gamma</string>-->
<string name="pesdk_adjustments_button_blacksTool">Noirs</string> <!-- <string name="pesdk_adjustments_button_blacksTool">Noirs</string>-->
<string name="pesdk_adjustments_button_whitesTool">Blancs</string> <!-- <string name="pesdk_adjustments_button_whitesTool">Blancs</string>-->
<string name="pesdk_adjustments_button_temperatureTool">Température</string> <!-- <string name="pesdk_adjustments_button_temperatureTool">Température</string>-->
<string name="pesdk_adjustments_button_sharpnessTool">Netteté</string> <!-- <string name="pesdk_adjustments_button_sharpnessTool">Netteté</string>-->
<string name="pesdk_adjustments_button_reset">Réinitialiser</string> <!-- <string name="pesdk_adjustments_button_reset">Réinitialiser</string>-->
<string name="pesdk_focus_title_name">Floutage</string> <!-- <string name="pesdk_focus_title_name">Floutage</string>-->
<string name="pesdk_focus_title_disabled">Aucun</string> <!-- <string name="pesdk_focus_title_disabled">Aucun</string>-->
<string name="pesdk_focus_button_radial">Radial</string> <!-- <string name="pesdk_focus_button_radial">Radial</string>-->
<string name="pesdk_focus_button_linear">Linéaire</string> <!-- <string name="pesdk_focus_button_linear">Linéaire</string>-->
<string name="pesdk_focus_button_mirrored">Miroir</string> <!-- <string name="pesdk_focus_button_mirrored">Miroir</string>-->
<string name="pesdk_focus_button_gaussian">Gaussien</string> <!-- <string name="pesdk_focus_button_gaussian">Gaussien</string>-->
<string name="pesdk_text_title_input">Ajouter un texte</string> <!-- <string name="pesdk_text_title_input">Ajouter un texte</string>-->
<string name="pesdk_text_title_name">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_options">Options du texte</string>-->
<string name="pesdk_text_title_textColor">Couleur 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_title_font">Police</string>-->
<string name="pesdk_text_button_add">Ajouter</string> <!-- <string name="pesdk_text_button_add">Ajouter</string>-->
<string name="pesdk_text_button_edit">Éditer</string> <!-- <string name="pesdk_text_button_edit">Éditer</string>-->
<string name="pesdk_text_button_straighten">Redresser</string> <!-- <string name="pesdk_text_button_straighten">Redresser</string>-->
<string name="pesdk_text_button_font">Police</string> <!-- <string name="pesdk_text_button_font">Police</string>-->
<string name="pesdk_text_button_color">Couleur</string> <!-- <string name="pesdk_text_button_color">Couleur</string>-->
<string name="pesdk_text_button_backgroundColor">Fond</string> <!-- <string name="pesdk_text_button_backgroundColor">Fond</string>-->
<string name="pesdk_text_button_alignment">Alignement</string> <!-- <string name="pesdk_text_button_alignment">Alignement</string>-->
<string name="pesdk_text_button_bringToFront">Devant</string> <!-- <string name="pesdk_text_button_bringToFront">Devant</string>-->
<string name="pesdk_text_button_delete">Supprimer</string> <!-- <string name="pesdk_text_button_delete">Supprimer</string>-->
<string name="pesdk_text_text_editTextPlaceholder">Votre texte</string> <!-- <string name="pesdk_text_text_editTextPlaceholder">Votre texte</string>-->
<string name="pesdk_brush_title_name">Pinceau</string> <!-- <string name="pesdk_brush_title_name">Pinceau</string>-->
<string name="pesdk_brush_button_color">Couleur</string> <!-- <string name="pesdk_brush_button_color">Couleur</string>-->
<string name="pesdk_brush_button_size">Taille</string> <!-- <string name="pesdk_brush_button_size">Taille</string>-->
<string name="pesdk_brush_button_hardness">Contour</string> <!-- <string name="pesdk_brush_button_hardness">Contour</string>-->
<string name="pesdk_brush_button_bringToFront">Devant</string> <!-- <string name="pesdk_brush_button_bringToFront">Devant</string>-->
<string name="pesdk_brush_button_delete">Supprimer</string> <!-- <string name="pesdk_brush_button_delete">Supprimer</string>-->
<string name="pesdk_brush_title_brushColor">Couleur du pinceau</string> <!-- <string name="pesdk_brush_title_brushColor">Couleur du pinceau</string>-->
<string name="pesdk_editor_title_name">Éditeur</string> <!-- <string name="pesdk_editor_title_name">Éditeur</string>-->
<string name="pesdk_editor_title_closeEditorAlert">Fermer l\'é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_text_closeEditorAlert">Voulez-vous vraiment abandonner les modifications \?</string>-->
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Oui</string> <!-- <string name="pesdk_editor_button_closeEditorAlertConfirmation">Oui</string>-->
<string name="pesdk_editor_button_closeEditorAlertCancelation">Non</string> <!-- <string name="pesdk_editor_button_closeEditorAlertCancelation">Non</string>-->
<string name="pesdk_editor_cancel">Annuler</string> <!-- <string name="pesdk_editor_cancel">Annuler</string>-->
<string name="pesdk_editor_accept">Accepter</string> <!-- <string name="pesdk_editor_accept">Accepter</string>-->
<string name="pesdk_editor_save">Enregistrer</string> <!-- <string name="pesdk_editor_save">Enregistrer</string>-->
<string name="pesdk_editor_text_exportProgressUnknown">Exportation…</string> <!-- <string name="pesdk_editor_text_exportProgressUnknown">Exportation…</string>-->
<string name="pesdk_editor_text_exportProgress" formatted="false">Exportation %s</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_name">Autocollant</string>-->
<string name="pesdk_sticker_title_color">Couleur de l\'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_title_options">Options de l\'autocollant</string>-->
<string name="pesdk_sticker_button_add">Ajouter</string> <!-- <string name="pesdk_sticker_button_add">Ajouter</string>-->
<string name="pesdk_sticker_button_color">Couleur</string> <!-- <string name="pesdk_sticker_button_color">Couleur</string>-->
<string name="pesdk_sticker_button_delete">Supprimer</string> <!-- <string name="pesdk_sticker_button_delete">Supprimer</string>-->
<string name="pesdk_sticker_button_bringToFront">Devant</string> <!-- <string name="pesdk_sticker_button_bringToFront">Devant</string>-->
<string name="pesdk_sticker_button_straighten">Redresser</string> <!-- <string name="pesdk_sticker_button_straighten">Redresser</string>-->
<string name="pesdk_sticker_button_replace">Remplacer</string> <!-- <string name="pesdk_sticker_button_replace">Remplacer</string>-->
<string name="pesdk_sticker_button_opacity">Transparence</string> <!-- <string name="pesdk_sticker_button_opacity">Transparence</string>-->
<string name="pesdk_sticker_button_contrast">Contraste</string> <!-- <string name="pesdk_sticker_button_contrast">Contraste</string>-->
<string name="pesdk_sticker_button_saturation">Saturation</string> <!-- <string name="pesdk_sticker_button_saturation">Saturation</string>-->
<string name="pesdk_sticker_button_brightness">Luminosité</string> <!-- <string name="pesdk_sticker_button_brightness">Luminosité</string>-->
<string name="pesdk_sticker_category_name_custom">Téléversements</string> <!-- <string name="pesdk_sticker_category_name_custom">Téléversements</string>-->
<string name="pesdk_overlay_title_name">Superposition</string> <!-- <string name="pesdk_overlay_title_name">Superposition</string>-->
<string name="pesdk_overlay_button_blendModeNormal">Normal</string> <!-- <string name="pesdk_overlay_button_blendModeNormal">Normal</string>-->
<string name="pesdk_overlay_button_blendModeDarken">Assombrir</string> <!-- <string name="pesdk_overlay_button_blendModeDarken">Assombrir</string>-->
<string name="pesdk_overlay_button_blendModeScreen">Écran</string> <!-- <string name="pesdk_overlay_button_blendModeScreen">Écran</string>-->
<string name="pesdk_overlay_button_blendModeOverlay">Recouvrir</string> <!-- <string name="pesdk_overlay_button_blendModeOverlay">Recouvrir</string>-->
<string name="pesdk_overlay_button_blendModeLighten">Alléger</string> <!-- <string name="pesdk_overlay_button_blendModeLighten">Alléger</string>-->
<string name="pesdk_overlay_button_blendModeMultiply">Dupliquer</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_blendModeColorBurn">Brûlure de couleur</string>-->
<string name="pesdk_overlay_button_blendModeSoftLight">Lumière douce</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_button_blendModeHardLight">Lumière forte</string>-->
<string name="pesdk_overlay_asset_none">Aucune</string> <!-- <string name="pesdk_overlay_asset_none">Aucune</string>-->
<string name="pesdk_overlay_asset_golden">Doré</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_lightleak1">Fuite légère 1</string>-->
<string name="pesdk_overlay_asset_mosaic">Mosaïque</string> <!-- <string name="pesdk_overlay_asset_mosaic">Mosaïque</string>-->
<string name="pesdk_overlay_asset_paper">Papier</string> <!-- <string name="pesdk_overlay_asset_paper">Papier</string>-->
<string name="pesdk_overlay_asset_rain">Pluie</string> <!-- <string name="pesdk_overlay_asset_rain">Pluie</string>-->
<string name="pesdk_overlay_asset_vintage">Vintage</string> <!-- <string name="pesdk_overlay_asset_vintage">Vintage</string>-->
<string name="pesdk_common_button_flipH">Symétrie H</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_flipV">Symétrie V</string>-->
<string name="pesdk_common_button_undo">Annuler</string> <!-- <string name="pesdk_common_button_undo">Annuler</string>-->
<string name="pesdk_common_button_redo">Refaire</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_colorPicker">Sélecteur de couleur</string>-->
<string name="pesdk_common_title_transparentColor">Transparent</string> <!-- <string name="pesdk_common_title_transparentColor">Transparent</string>-->
<string name="pesdk_common_title_whiteColor">Blanc</string> <!-- <string name="pesdk_common_title_whiteColor">Blanc</string>-->
<string name="pesdk_common_title_grayColor">Gris</string> <!-- <string name="pesdk_common_title_grayColor">Gris</string>-->
<string name="pesdk_common_title_blackColor">Noir</string> <!-- <string name="pesdk_common_title_blackColor">Noir</string>-->
<string name="pesdk_common_title_lightBlueColor">Bleu clair</string> <!-- <string name="pesdk_common_title_lightBlueColor">Bleu clair</string>-->
<string name="pesdk_common_title_blueColor">Bleu</string> <!-- <string name="pesdk_common_title_blueColor">Bleu</string>-->
<string name="pesdk_common_title_purpleColor">Violet</string> <!-- <string name="pesdk_common_title_purpleColor">Violet</string>-->
<string name="pesdk_common_title_orchidColor">Orchidée</string> <!-- <string name="pesdk_common_title_orchidColor">Orchidée</string>-->
<string name="pesdk_common_title_pinkColor">Rose</string> <!-- <string name="pesdk_common_title_pinkColor">Rose</string>-->
<string name="pesdk_common_title_redColor">Rouge</string> <!-- <string name="pesdk_common_title_redColor">Rouge</string>-->
<string name="pesdk_common_title_orangeColor">Orange</string> <!-- <string name="pesdk_common_title_orangeColor">Orange</string>-->
<string name="pesdk_common_title_goldColor">Or</string> <!-- <string name="pesdk_common_title_goldColor">Or</string>-->
<string name="pesdk_common_title_yellowColor">Jaune</string> <!-- <string name="pesdk_common_title_yellowColor">Jaune</string>-->
<string name="pesdk_common_title_oliveColor">Olive</string> <!-- <string name="pesdk_common_title_oliveColor">Olive</string>-->
<string name="pesdk_common_title_greenColor">Vert</string> <!-- <string name="pesdk_common_title_greenColor">Vert</string>-->
<string name="pesdk_common_title_aquamarinColor">Aquamarin</string> <!-- <string name="pesdk_common_title_aquamarinColor">Aquamarin</string>-->
<string name="pesdk_common_title_pipettableColor">Couleur de la pipette</string> <!-- <string name="pesdk_common_title_pipettableColor">Couleur de la pipette</string>-->
<string name="vesdk_video_trim_title_name">Couper</string> <!-- <string name="vesdk_video_trim_title_name">Couper</string>-->
<!-- FAQ --> <!-- &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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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">À 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_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_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_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_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> <!-- <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 <!-- Haven't found some strings? There's more at-->
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res <!-- https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res-->
--> <!-- &ndash;&gt;-->
</resources> </resources>

View file

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

View file

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

View file

@ -10,7 +10,7 @@ buildscript {
propVersionName = '5.34.26' 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") } ext.is_proprietary = gradle.startParameter.taskNames.any { task -> task.contains("Proprietary") }
repositories { repositories {
@ -22,7 +22,7 @@ buildscript {
} }
dependencies { 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" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
if (is_proprietary) { if (is_proprietary) {
classpath 'ly.img.android.pesdk:plugin:10.7.3' classpath 'ly.img.android.pesdk:plugin:10.7.3'

View file

@ -1,3 +1,4 @@
android.enableJetifier=true android.enableJetifier=true
android.useAndroidX=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 distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists 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