diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..1606d61fc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided this notice is +# preserved. This file is offered as-is, without any warranty. +# Names of contributors must not be used to endorse or promote products +# derived from this file without specific prior written permission. + +# EditorConfig +# http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# LF end-of-line, insert an empty new line and UTF-8 +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +continuation_indent_size = 8 + +[*.xml] +continuation_indent_size = 4 diff --git a/CHANGELOG.md b/CHANGELOG.md index c4d6db2ea..9f2d794c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,66 @@ Changelog ========== +Version 6.13.4 *(2020-03-08)* +---------------------------- + + * Fixed some hiding, excluding and including related glitches + * Flipped Pin and Properties icons at the top menu for better user experience + * Avoid showing Portrait image folders at the main folders screen + +Version 6.13.3 *(2020-03-01)* +---------------------------- + + * Avoid showing the "No Date Takens found" error in some cases + +Version 6.13.2 *(2020-03-01)* +---------------------------- + + * Properly handle videos at slideshows + * Fixed some gestures during video playback + * Fixed a glitch with videos randomly restarting in some cases + +Version 6.13.1 *(2020-02-28)* +---------------------------- + + * Adding a quick crashfix + +Version 6.13.0 *(2020-02-28)* +---------------------------- + + * Allow fast forwarding videos by double clicking on screen sides + * Fixed an issue with the editor producing low quality outputs in some cases + * Improve some error messages, make them clearer + * Many translation and stability improvements + +Version 6.12.5 *(2020-02-12)* +---------------------------- + + * Fixed some sorting related glitches + * Keep the old last modified value at file editing + +Version 6.12.4 *(2020-02-11)* +---------------------------- + + * Fixed some folder sorting related glitches + +Version 6.12.3 *(2020-02-10)* +---------------------------- + + * Fixed image disappearing at using the Editor + * Properly copy over EXIF values after editing an image + +Version 6.12.2 *(2020-02-10)* +---------------------------- + + * Fixed some sorting and thumbnail related issues + +Version 6.12.1 *(2020-02-10)* +---------------------------- + + * Improved the performance of the initial screen loading + * Fixed some editor related glitches + Version 6.12.0 *(2020-01-28)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index 759a1442b..1871664dc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,10 +17,10 @@ android { applicationId "com.simplemobiletools.gallery.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 289 - versionName "6.12.0" + versionCode 299 + versionName "6.13.4" multiDexEnabled true - setProperty("archivesBaseName", "gallery") + setProperty("archivesBaseName", "gallery-$versionCode") vectorDrawables.useSupportLibrary = true } @@ -51,6 +51,15 @@ android { sourceSets { main.java.srcDirs += 'src/main/kotlin' + if (is_proprietary) { + main.java.srcDirs += 'src/proprietary/kotlin' + } + } + + flavorDimensions "licensing" + productFlavors { + proprietary { } + foss { } } lintOptions { @@ -69,19 +78,20 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.21.28' + implementation 'com.simplemobiletools:commons:5.22.19' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1' - implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.18' + implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6' implementation 'com.google.vr:sdk-panowidget:1.180.0' implementation 'com.google.vr:sdk-videowidget:1.180.0' implementation 'org.apache.sanselan:sanselan:0.97-incubator' + implementation 'info.androidhive:imagefilters:1.0.7' implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.caverock:androidsvg-aar:1.3' - implementation 'com.github.tibbi:gestureviews:8dccb8450b' + implementation 'com.github.tibbi:gestureviews:512f929d82' implementation 'com.github.tibbi:subsampling-scale-image-view:d404e74e39' kapt 'com.github.bumptech.glide:compiler:4.10.0' @@ -92,31 +102,30 @@ dependencies { } // Apply the PESDKPlugin -apply plugin: 'ly.img.android.pesdk' +if (is_proprietary) { + apply plugin: 'ly.img.android.sdk' -pesdkConfig { - licencePath 'pesdk_license' + imglyConfig { + pesdk { + enabled true + licencePath 'pesdk_license' + } - supportLibVersion "28.0.0" + supportLibVersion "28.0.0" - modules { - include 'ly.img.android.pesdk.operation:text' - include 'ly.img.android.pesdk.operation:focus' - include 'ly.img.android.pesdk.operation:brush' - include 'ly.img.android.pesdk.operation:filter' - include 'ly.img.android.pesdk.operation:adjustment' + modules { + include 'ui:core' + include 'ui:text' + include 'ui:focus' + include 'ui:brush' + include 'ui:filter' + include 'ui:transform' + include 'ui:adjustment' - include 'ly.img.android.pesdk.ui.mobile_ui:core' - include 'ly.img.android.pesdk.ui.mobile_ui:text' - include 'ly.img.android.pesdk.ui.mobile_ui:focus' - include 'ly.img.android.pesdk.ui.mobile_ui:brush' - include 'ly.img.android.pesdk.ui.mobile_ui:filter' - include 'ly.img.android.pesdk.ui.mobile_ui:transform' - include 'ly.img.android.pesdk.ui.mobile_ui:adjustment' + include 'backend:serializer' - include 'ly.img.android.pesdk:serializer' - - include 'ly.img.android.pesdk.assets:font-basic' - include 'ly.img.android.pesdk.assets:filter-basic' + include 'assets:font-basic' + include 'assets:filter-basic' + } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 11b2f5c91..307682ab0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -201,20 +201,18 @@ - + + + - - - diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt index bdcc630f5..8d3532271 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt @@ -6,6 +6,7 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.Bitmap.CompressFormat import android.graphics.Color +import android.graphics.Point import android.media.ExifInterface import android.net.Uri import android.os.Build @@ -14,6 +15,16 @@ import android.provider.MediaStore import android.view.Menu import android.view.MenuItem import android.widget.RelativeLayout +import androidx.recyclerview.widget.LinearLayoutManager +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.DecodeFormat +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target +import com.simplemobiletools.commons.dialogs.ColorPickerDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE @@ -23,29 +34,62 @@ import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.gallery.pro.BuildConfig import com.simplemobiletools.gallery.pro.R +import com.simplemobiletools.gallery.pro.adapters.FiltersAdapter import com.simplemobiletools.gallery.pro.dialogs.OtherAspectRatioDialog +import com.simplemobiletools.gallery.pro.dialogs.ResizeDialog +import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog import com.simplemobiletools.gallery.pro.extensions.config import com.simplemobiletools.gallery.pro.extensions.fixDateTaken +import com.simplemobiletools.gallery.pro.extensions.openEditor import com.simplemobiletools.gallery.pro.helpers.* +import com.simplemobiletools.gallery.pro.models.FilterItem import com.theartofdev.edmodo.cropper.CropImageView +import com.zomato.photofilters.FilterPack +import com.zomato.photofilters.imageprocessors.Filter import kotlinx.android.synthetic.main.activity_edit.* import kotlinx.android.synthetic.main.bottom_actions_aspect_ratio.* +import kotlinx.android.synthetic.main.bottom_editor_actions_filter.* import kotlinx.android.synthetic.main.bottom_editor_crop_rotate_actions.* +import kotlinx.android.synthetic.main.bottom_editor_draw_actions.* +import kotlinx.android.synthetic.main.bottom_editor_primary_actions.* import java.io.* class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener { + companion object { + init { + System.loadLibrary("NativeImageProcessor") + } + } + 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 uri: Uri private lateinit var saveUri: Uri private var resizeWidth = 0 private var resizeHeight = 0 + private var drawColor = 0 private var lastOtherAspectRatio: Pair? = null + private var currPrimaryAction = PRIMARY_ACTION_NONE + private var currCropRotateAction = CROP_ROTATE_ASPECT_RATIO private var currAspectRatio = ASPECT_RATIO_FREE + private var isCropIntent = false + private var isEditingWithThirdParty = false private var isSharingBitmap = false + private var wasDrawCanvasPositioned = false private var oldExif: ExifInterface? = null + private var filterInitialBitmap: Bitmap? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -65,6 +109,19 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } + override fun onResume() { + super.onResume() + isEditingWithThirdParty = false + bottom_draw_width.setColors(config.textColor, getAdjustedPrimaryColor(), config.backgroundColor) + } + + override fun onStop() { + super.onStop() + if (isEditingWithThirdParty) { + finish() + } + } + override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_editor, menu) updateMenuItemColors(menu) @@ -74,6 +131,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.save_as -> saveImage() + R.id.edit -> editWith() R.id.share -> shareImage() else -> return super.onOptionsItemSelected(item) } @@ -112,9 +170,14 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener else -> uri } - (bottom_editor_crop_rotate_actions.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1) - setupCropRotateActionButtons() - setupAspectRatioButtons() + isCropIntent = intent.extras?.get(CROP) == "true" + if (isCropIntent) { + bottom_editor_primary_actions.beGone() + (bottom_editor_crop_rotate_actions.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1) + } + + loadDefaultImageView() + setupBottomActions() if (config.lastEditorCropAspectRatio == ASPECT_RATIO_OTHER) { if (config.lastEditorCropOtherAspectRatioX == 0f) { @@ -127,26 +190,115 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener lastOtherAspectRatio = Pair(config.lastEditorCropOtherAspectRatioX, config.lastEditorCropOtherAspectRatioY) } - updateAspectRatio(config.lastEditorCropAspectRatio) crop_image_view.guidelines = CropImageView.Guidelines.ON - loadCropImageView() + bottom_aspect_ratios.beVisible() + } + + private fun loadDefaultImageView() { + default_image_view.beVisible() + crop_image_view.beGone() + editor_draw_canvas.beGone() + + val options = RequestOptions() + .skipMemoryCache(true) + .diskCacheStrategy(DiskCacheStrategy.NONE) + + Glide.with(this) + .asBitmap() + .load(uri) + .apply(options) + .listener(object : RequestListener { + override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean) = false + + override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { + val currentFilter = getFiltersAdapter()?.getCurrentFilter() + if (filterInitialBitmap == null) { + loadCropImageView() + bottomCropRotateClicked() + } + + if (filterInitialBitmap != null && currentFilter != null && currentFilter.filter.name != getString(R.string.none)) { + default_image_view.onGlobalLayout { + applyFilter(currentFilter) + } + } else { + filterInitialBitmap = bitmap + } + + if (isCropIntent) { + bottom_primary_filter.beGone() + bottom_primary_draw.beGone() + } + + return false + } + }).into(default_image_view) } private fun loadCropImageView() { + default_image_view.beGone() + editor_draw_canvas.beGone() crop_image_view.apply { + beVisible() setOnCropImageCompleteListener(this@EditActivity) setImageUriAsync(uri) guidelines = CropImageView.Guidelines.ON - if (shouldCropSquare()) { - updateAspectRatio(ASPECT_RATIO_ONE_ONE) + if (isCropIntent && shouldCropSquare()) { + currAspectRatio = ASPECT_RATIO_ONE_ONE setFixedAspectRatio(true) - bottom_aspect_ratios.beGone() + bottom_aspect_ratio.beGone() } } } + private fun loadDrawCanvas() { + default_image_view.beGone() + crop_image_view.beGone() + editor_draw_canvas.beVisible() + + if (!wasDrawCanvasPositioned) { + wasDrawCanvasPositioned = true + editor_draw_canvas.onGlobalLayout { + ensureBackgroundThread { + fillCanvasBackground() + } + } + } + } + + private fun fillCanvasBackground() { + val size = Point() + windowManager.defaultDisplay.getSize(size) + val options = RequestOptions() + .format(DecodeFormat.PREFER_ARGB_8888) + .skipMemoryCache(true) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .fitCenter() + + try { + val builder = Glide.with(applicationContext) + .asBitmap() + .load(uri) + .apply(options) + .into(editor_draw_canvas.width, editor_draw_canvas.height) + + val bitmap = builder.get() + runOnUiThread { + editor_draw_canvas.apply { + updateBackgroundBitmap(bitmap) + layoutParams.width = bitmap.width + layoutParams.height = bitmap.height + y = (height - bitmap.height) / 2f + requestLayout() + } + } + } catch (e: Exception) { + showErrorToast(e) + } + } + @TargetApi(Build.VERSION_CODES.N) private fun saveImage() { var inputStream: InputStream? = null @@ -160,14 +312,66 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener inputStream?.close() } - crop_image_view.getCroppedImageAsync() + if (crop_image_view.isVisible()) { + crop_image_view.getCroppedImageAsync() + } else if (editor_draw_canvas.isVisible()) { + val bitmap = editor_draw_canvas.getBitmap() + if (saveUri.scheme == "file") { + SaveAsDialog(this, saveUri.path!!, true) { + saveBitmapToFile(bitmap, it, true) + } + } else if (saveUri.scheme == "content") { + val filePathGetter = getNewFilePath() + SaveAsDialog(this, filePathGetter.first, filePathGetter.second) { + saveBitmapToFile(bitmap, it, true) + } + } + } else { + val currentFilter = getFiltersAdapter()?.getCurrentFilter() ?: return + val filePathGetter = getNewFilePath() + SaveAsDialog(this, filePathGetter.first, filePathGetter.second) { + toast(R.string.saving) + + // clean up everything to free as much memory as possible + default_image_view.setImageResource(0) + crop_image_view.setImageBitmap(null) + bottom_actions_filter_list.adapter = null + bottom_actions_filter_list.beGone() + + ensureBackgroundThread { + try { + val originalBitmap = Glide.with(applicationContext).asBitmap().load(uri).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get() + currentFilter.filter.processFilter(originalBitmap) + saveBitmapToFile(originalBitmap, it, false) + } catch (e: OutOfMemoryError) { + toast(R.string.out_of_memory_error) + } + } + } + } } private fun shareImage() { ensureBackgroundThread { - isSharingBitmap = true - runOnUiThread { - crop_image_view.getCroppedImageAsync() + when { + default_image_view.isVisible() -> { + val currentFilter = getFiltersAdapter()?.getCurrentFilter() + if (currentFilter == null) { + toast(R.string.unknown_error_occurred) + return@ensureBackgroundThread + } + + val originalBitmap = Glide.with(applicationContext).asBitmap().load(uri).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get() + currentFilter.filter.processFilter(originalBitmap) + shareBitmap(originalBitmap) + } + crop_image_view.isVisible() -> { + isSharingBitmap = true + runOnUiThread { + crop_image_view.getCroppedImageAsync() + } + } + editor_draw_canvas.isVisible() -> shareBitmap(editor_draw_canvas.getBitmap()) } } } @@ -212,11 +416,66 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } + private fun getFiltersAdapter() = bottom_actions_filter_list.adapter as? FiltersAdapter + + private fun setupBottomActions() { + setupPrimaryActionButtons() + setupCropRotateActionButtons() + setupAspectRatioButtons() + setupDrawButtons() + } + + private fun setupPrimaryActionButtons() { + bottom_primary_filter.setOnClickListener { + bottomFilterClicked() + } + + bottom_primary_crop_rotate.setOnClickListener { + bottomCropRotateClicked() + } + + bottom_primary_draw.setOnClickListener { + bottomDrawClicked() + } + } + + private fun bottomFilterClicked() { + currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_FILTER) { + PRIMARY_ACTION_NONE + } else { + PRIMARY_ACTION_FILTER + } + updatePrimaryActionButtons() + } + + private fun bottomCropRotateClicked() { + currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) { + PRIMARY_ACTION_NONE + } else { + PRIMARY_ACTION_CROP_ROTATE + } + updatePrimaryActionButtons() + } + + private fun bottomDrawClicked() { + currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_DRAW) { + PRIMARY_ACTION_NONE + } else { + PRIMARY_ACTION_DRAW + } + updatePrimaryActionButtons() + } + private fun setupCropRotateActionButtons() { bottom_rotate.setOnClickListener { crop_image_view.rotateImage(90) } + bottom_resize.beGoneIf(isCropIntent) + bottom_resize.setOnClickListener { + resizeImage() + } + bottom_flip_horizontally.setOnClickListener { crop_image_view.flipImageHorizontally() } @@ -224,6 +483,19 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener bottom_flip_vertically.setOnClickListener { crop_image_view.flipImageVertically() } + + bottom_aspect_ratio.setOnClickListener { + currCropRotateAction = if (currCropRotateAction == CROP_ROTATE_ASPECT_RATIO) { + crop_image_view.guidelines = CropImageView.Guidelines.OFF + bottom_aspect_ratios.beGone() + CROP_ROTATE_NONE + } else { + crop_image_view.guidelines = CropImageView.Guidelines.ON + bottom_aspect_ratios.beVisible() + CROP_ROTATE_ASPECT_RATIO + } + updateCropRotateActionButtons() + } } private fun setupAspectRatioButtons() { @@ -255,6 +527,126 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener updateAspectRatioButtons() } + private fun setupDrawButtons() { + updateDrawColor(config.lastEditorDrawColor) + bottom_draw_width.progress = config.lastEditorBrushSize + updateBrushSize(config.lastEditorBrushSize) + + bottom_draw_color_clickable.setOnClickListener { + ColorPickerDialog(this, drawColor) { wasPositivePressed, color -> + if (wasPositivePressed) { + updateDrawColor(color) + } + } + } + + bottom_draw_width.onSeekBarChangeListener { + config.lastEditorBrushSize = it + updateBrushSize(it) + } + + bottom_draw_undo.setOnClickListener { + editor_draw_canvas.undo() + } + } + + private fun updateBrushSize(percent: Int) { + editor_draw_canvas.updateBrushSize(percent) + val scale = Math.max(0.03f, percent / 100f) + bottom_draw_color.scaleX = scale + bottom_draw_color.scaleY = scale + } + + private fun updatePrimaryActionButtons() { + if (crop_image_view.isGone() && currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) { + loadCropImageView() + } else if (default_image_view.isGone() && currPrimaryAction == PRIMARY_ACTION_FILTER) { + loadDefaultImageView() + } else if (editor_draw_canvas.isGone() && currPrimaryAction == PRIMARY_ACTION_DRAW) { + loadDrawCanvas() + } + + arrayOf(bottom_primary_filter, bottom_primary_crop_rotate, bottom_primary_draw).forEach { + it.applyColorFilter(Color.WHITE) + } + + val currentPrimaryActionButton = when (currPrimaryAction) { + PRIMARY_ACTION_FILTER -> bottom_primary_filter + PRIMARY_ACTION_CROP_ROTATE -> bottom_primary_crop_rotate + PRIMARY_ACTION_DRAW -> bottom_primary_draw + else -> null + } + + currentPrimaryActionButton?.applyColorFilter(getAdjustedPrimaryColor()) + bottom_editor_filter_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_FILTER) + bottom_editor_crop_rotate_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) + bottom_editor_draw_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_DRAW) + + if (currPrimaryAction == PRIMARY_ACTION_FILTER && bottom_actions_filter_list.adapter == null) { + ensureBackgroundThread { + val thumbnailSize = resources.getDimension(R.dimen.bottom_filters_thumbnail_size).toInt() + + val bitmap = try { + Glide.with(this) + .asBitmap() + .load(uri).listener(object : RequestListener { + override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { + showErrorToast(e.toString()) + return false + } + + override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean) = false + }) + .submit(thumbnailSize, thumbnailSize) + .get() + } catch (e: GlideException) { + showErrorToast(e) + finish() + return@ensureBackgroundThread + } + + runOnUiThread { + val filterThumbnailsManager = FilterThumbnailsManager() + filterThumbnailsManager.clearThumbs() + + val noFilter = Filter(getString(R.string.none)) + filterThumbnailsManager.addThumb(FilterItem(bitmap, noFilter)) + + FilterPack.getFilterPack(this).forEach { + val filterItem = FilterItem(bitmap, it) + filterThumbnailsManager.addThumb(filterItem) + } + + val filterItems = filterThumbnailsManager.processThumbs() + val adapter = FiltersAdapter(applicationContext, filterItems) { + val layoutManager = bottom_actions_filter_list.layoutManager as LinearLayoutManager + applyFilter(filterItems[it]) + + if (it == layoutManager.findLastCompletelyVisibleItemPosition() || it == layoutManager.findLastVisibleItemPosition()) { + bottom_actions_filter_list.smoothScrollBy(thumbnailSize, 0) + } else if (it == layoutManager.findFirstCompletelyVisibleItemPosition() || it == layoutManager.findFirstVisibleItemPosition()) { + bottom_actions_filter_list.smoothScrollBy(-thumbnailSize, 0) + } + } + + bottom_actions_filter_list.adapter = adapter + adapter.notifyDataSetChanged() + } + } + } + + if (currPrimaryAction != PRIMARY_ACTION_CROP_ROTATE) { + bottom_aspect_ratios.beGone() + currCropRotateAction = CROP_ROTATE_NONE + } + updateCropRotateActionButtons() + } + + private fun applyFilter(filterItem: FilterItem) { + val newBitmap = Bitmap.createBitmap(filterInitialBitmap!!) + default_image_view.setImageBitmap(filterItem.filter.processFilter(newBitmap)) + } + private fun updateAspectRatio(aspectRatio: Int) { currAspectRatio = aspectRatio config.lastEditorCropAspectRatio = aspectRatio @@ -292,6 +684,40 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener currentAspectRatioButton.setTextColor(getAdjustedPrimaryColor()) } + private fun updateCropRotateActionButtons() { + arrayOf(bottom_aspect_ratio).forEach { + it.applyColorFilter(Color.WHITE) + } + + val primaryActionView = when (currCropRotateAction) { + CROP_ROTATE_ASPECT_RATIO -> bottom_aspect_ratio + else -> null + } + + primaryActionView?.applyColorFilter(getAdjustedPrimaryColor()) + } + + private fun updateDrawColor(color: Int) { + drawColor = color + bottom_draw_color.applyColorFilter(color) + config.lastEditorDrawColor = color + editor_draw_canvas.updateColor(color) + } + + private fun resizeImage() { + val point = getAreaSize() + if (point == null) { + toast(R.string.unknown_error_occurred) + return + } + + ResizeDialog(this, point) { + resizeWidth = it.x + resizeHeight = it.y + crop_image_view.getCroppedImageAsync() + } + } + private fun shouldCropSquare(): Boolean { val extras = intent.extras return if (extras != null && extras.containsKey(ASPECT_X) && extras.containsKey(ASPECT_Y)) { @@ -301,6 +727,16 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } + private fun getAreaSize(): Point? { + val rect = crop_image_view.cropRect ?: return null + val rotation = crop_image_view.rotatedDegrees + return if (rotation == 0 || rotation == 180) { + Point(rect.width(), rect.height()) + } else { + Point(rect.height(), rect.width()) + } + } + override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) { if (result.error == null) { val bitmap = result.bitmap @@ -310,35 +746,72 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener return } - if (saveUri.scheme == "file") { - saveBitmapToFile(bitmap, saveUri.path!!) - } else { - var inputStream: InputStream? = null - var outputStream: OutputStream? = null - try { - val stream = ByteArrayOutputStream() - bitmap.compress(CompressFormat.JPEG, 100, stream) - inputStream = ByteArrayInputStream(stream.toByteArray()) - outputStream = contentResolver.openOutputStream(saveUri) - inputStream.copyTo(outputStream!!) - } finally { - inputStream?.close() - outputStream?.close() - } + if (isCropIntent) { + if (saveUri.scheme == "file") { + saveBitmapToFile(bitmap, saveUri.path!!, true) + } else { + var inputStream: InputStream? = null + var outputStream: OutputStream? = null + try { + val stream = ByteArrayOutputStream() + bitmap.compress(CompressFormat.JPEG, 100, stream) + inputStream = ByteArrayInputStream(stream.toByteArray()) + outputStream = contentResolver.openOutputStream(saveUri) + inputStream.copyTo(outputStream!!) + } finally { + inputStream?.close() + outputStream?.close() + } - Intent().apply { - data = saveUri - addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - setResult(RESULT_OK, this) + Intent().apply { + data = saveUri + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + setResult(RESULT_OK, this) + } + finish() } - finish() + } else if (saveUri.scheme == "file") { + SaveAsDialog(this, saveUri.path!!, true) { + saveBitmapToFile(bitmap, it, true) + } + } else if (saveUri.scheme == "content") { + val filePathGetter = getNewFilePath() + SaveAsDialog(this, filePathGetter.first, filePathGetter.second) { + saveBitmapToFile(bitmap, it, true) + } + } else { + toast(R.string.unknown_file_location) } } else { toast("${getString(R.string.image_editing_failed)}: ${result.error.message}") } } - private fun saveBitmapToFile(bitmap: Bitmap, path: String) { + private fun getNewFilePath(): Pair { + var newPath = applicationContext.getRealPathFromURI(saveUri) ?: "" + if (newPath.startsWith("/mnt/")) { + newPath = "" + } + + var shouldAppendFilename = true + if (newPath.isEmpty()) { + val filename = applicationContext.getFilenameFromContentUri(saveUri) ?: "" + if (filename.isNotEmpty()) { + val path = if (intent.extras?.containsKey(REAL_FILE_PATH) == true) intent.getStringExtra(REAL_FILE_PATH).getParentPath() else internalStoragePath + newPath = "$path/$filename" + shouldAppendFilename = false + } + } + + if (newPath.isEmpty()) { + newPath = "$internalStoragePath/${getCurrentFormattedDateTime()}.${saveUri.toString().getFilenameExtension()}" + shouldAppendFilename = false + } + + return Pair(newPath, shouldAppendFilename) + } + + private fun saveBitmapToFile(bitmap: Bitmap, path: String, showSavingToast: Boolean) { if (!packageName.contains("slootelibomelpmis".reversed(), true)) { if (baseConfig.appRunCount > 100) { 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() @@ -357,7 +830,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener val fileDirItem = FileDirItem(path, path.getFilenameFromPath()) getFileOutputStream(fileDirItem, true) { if (it != null) { - saveBitmap(file, bitmap, it) + saveBitmap(file, bitmap, it, showSavingToast) } else { toast(R.string.image_editing_failed) } @@ -371,8 +844,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } @TargetApi(Build.VERSION_CODES.N) - private fun saveBitmap(file: File, bitmap: Bitmap, out: OutputStream) { - toast(R.string.saving) + private fun saveBitmap(file: File, bitmap: Bitmap, out: OutputStream, showSavingToast: Boolean) { + if (showSavingToast) { + toast(R.string.saving) + } if (resizeWidth > 0 && resizeHeight > 0) { val resized = Bitmap.createScaledBitmap(bitmap, resizeWidth, resizeHeight, false) @@ -394,6 +869,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener out.close() } + private fun editWith() { + openEditor(uri.toString(), true) + isEditingWithThirdParty = true + } + private fun scanFinalPath(path: String) { val paths = arrayListOf(path) rescanPaths(paths) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt index 7cad1ca04..c5d929a84 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt @@ -73,6 +73,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private var mTempShowHiddenHandler = Handler() private var mZoomListener: MyRecyclerView.MyZoomListener? = null private var mSearchMenuItem: MenuItem? = null + private var mLastMediaFetcher: MediaFetcher? = null private var mDirs = ArrayList() private var mStoredAnimateGifs = true @@ -245,6 +246,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { unregisterFileUpdateListener() if (!config.showAll) { + mLastMediaFetcher?.shouldStop = true GalleryDatabase.destroyInstance() } } @@ -470,7 +472,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun showSortingDialog() { ChangeSortingDialog(this, true, false) { directories_grid.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() } else { ensureBackgroundThread { @@ -881,33 +883,44 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } // cached folders have been loaded, recheck folders one by one starting with the first displayed - val mediaFetcher = MediaFetcher(applicationContext) + mLastMediaFetcher?.shouldStop = true + mLastMediaFetcher = MediaFetcher(applicationContext) val getImagesOnly = mIsPickImageIntent || mIsGetImageContentIntent val getVideosOnly = mIsPickVideoIntent || mIsGetVideoContentIntent val hiddenString = getString(R.string.hidden) val albumCovers = config.parseAlbumCovers() val includedFolders = config.includedFolders val tempFolderPath = config.tempFolderPath - val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0 - val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0 val favoritePaths = getFavoritePaths() val dirPathsToRemove = ArrayList() try { for (directory in dirs) { - if (mShouldStopFetching) { + if (mShouldStopFetching || isDestroyed || isFinishing) { return } - val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperFileSize, favoritePaths, false) + val sorting = config.getFileSorting(directory.path) + val grouping = config.getFolderGrouping(directory.path) + val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 || + sorting and SORT_BY_DATE_TAKEN != 0 || + grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || + grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 + + val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 || + sorting and SORT_BY_DATE_MODIFIED != 0 || + grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || + grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 + + val curMedia = mLastMediaFetcher!!.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false) val newDir = if (curMedia.isEmpty()) { if (directory.path != tempFolderPath) { dirPathsToRemove.add(directory.path) } directory } else { - createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize) + createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize) } // we are looping through the already displayed folders looking for changes, do not do anything if nothing changed @@ -923,6 +936,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { taken = newDir.taken this@apply.size = newDir.size types = newDir.types + sortValue = getDirectorySortingValue(curMedia, path, name, size) } setupAdapter(dirs) @@ -955,7 +969,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } catch (ignored: Exception) { } - val foldersToScan = mediaFetcher.getFoldersToScan() + val foldersToScan = mLastMediaFetcher!!.getFoldersToScan() foldersToScan.add(FAVORITES) if (config.showRecycleBinAtFolders) { foldersToScan.add(RECYCLE_BIN) @@ -969,11 +983,23 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { // check the remaining folders which were not cached at all yet for (folder in foldersToScan) { - if (mShouldStopFetching) { + if (mShouldStopFetching || isDestroyed || isFinishing) { return } - val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperFileSize, favoritePaths, false) + val sorting = config.getFileSorting(folder) + val grouping = config.getFolderGrouping(folder) + val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 || + sorting and SORT_BY_DATE_TAKEN != 0 || + grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || + grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 + + val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 || + sorting and SORT_BY_DATE_MODIFIED != 0 || + grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || + grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 + + val newMedia = mLastMediaFetcher!!.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false) if (newMedia.isEmpty()) { continue } @@ -987,7 +1013,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } } - val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize) + val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize) dirs.add(newDir) setupAdapter(dirs) try { @@ -1129,7 +1155,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } else if (it.path != config.tempFolderPath) { val children = if (isPathOnOTG(it.path)) getOTGFolderChildrenNames(it.path) else File(it.path).list()?.asList() val hasMediaFile = children?.any { - it?.isMediaFile() == true || (File(it!!).isDirectory && it.startsWith("img_", true)) + it != null && (it.isMediaFile() || (File(it).isDirectory && it.startsWith("img_", true))) } ?: false if (!hasMediaFile) { @@ -1289,6 +1315,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { add(Release(225, R.string.release_225)) add(Release(258, R.string.release_258)) add(Release(277, R.string.release_277)) + add(Release(295, R.string.release_295)) checkWhatsNew(this, BuildConfig.VERSION_CODE) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt index 7f05afad3..06ad3005c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt @@ -60,6 +60,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private var mShowAll = false private var mLoadedInitialPhotos = false private var mIsSearchOpen = false + private var mLastSearchedText = "" private var mLatestMediaId = 0L private var mLatestMediaDateId = 0L private var mLastMediaHandler = Handler() @@ -301,6 +302,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { override fun onQueryTextChange(newText: String): Boolean { if (mIsSearchOpen) { + mLastSearchedText = newText searchQueryChanged(newText) } return true @@ -319,6 +321,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { if (mIsSearchOpen) { mIsSearchOpen = false + mLastSearchedText = "" + media_refresh_layout.isEnabled = config.enablePullToRefresh searchQueryChanged("") } @@ -389,11 +393,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { media_grid.adapter = this } setupLayoutManager() - } else { + measureRecyclerViewContent(mMedia) + } else if (mLastSearchedText.isEmpty()) { (currAdapter as MediaAdapter).updateMedia(mMedia) + measureRecyclerViewContent(mMedia) + } else { + searchQueryChanged(mLastSearchedText) } - measureRecyclerViewContent(mMedia) setupScrollDirection() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt index 9ea20f4a9..96dbc0fde 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt @@ -359,4 +359,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList override fun goToNextItem() {} override fun launchViewVideoIntent(path: String) {} + + override fun isSlideShowActive() = false } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt index 2ef59a3bc..69bfa3200 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt @@ -134,11 +134,14 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener { media_grid.adapter = this } setupLayoutManager() - } else { + measureRecyclerViewContent(mAllMedia) + } else if (mLastSearchedText.isEmpty()) { (currAdapter as MediaAdapter).updateMedia(mAllMedia) + measureRecyclerViewContent(mAllMedia) + } else { + textChanged(mLastSearchedText) } - measureRecyclerViewContent(mAllMedia) setupScrollDirection() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt index 27839af11..ef1a6d537 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt @@ -159,10 +159,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen fullscreenToggled(isFullscreen) } - video_curr_time.setOnClickListener { skip(false) } - video_duration.setOnClickListener { skip(true) } + video_curr_time.setOnClickListener { doSkip(false) } + video_duration.setOnClickListener { doSkip(true) } video_toggle_play_pause.setOnClickListener { togglePlayPause() } video_surface_frame.setOnClickListener { toggleFullscreen() } + video_surface_frame.controller.settings.swallowDoubleTaps = true video_next_file.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false)) video_next_file.setOnClickListener { handleNextFile() } @@ -170,8 +171,20 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_prev_file.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false)) video_prev_file.setOnClickListener { handlePrevFile() } + + val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() { + override fun onDoubleTap(e: MotionEvent?): Boolean { + if (e != null) { + handleDoubleTap(e.rawX) + } + + return true + } + }) + video_surface_frame.setOnTouchListener { view, event -> handleEvent(event) + gestureDetector.onTouchEvent(event) false } @@ -179,13 +192,17 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_surface.surfaceTextureListener = this if (config.allowVideoGestures) { - video_brightness_controller.initialize(this, slide_info, true, video_player_holder) { x, y -> + video_brightness_controller.initialize(this, slide_info, true, video_player_holder, singleTap = { x, y -> toggleFullscreen() - } + }, doubleTap = { x, y -> + doSkip(false) + }) - video_volume_controller.initialize(this, slide_info, false, video_player_holder) { x, y -> + video_volume_controller.initialize(this, slide_info, false, video_player_holder, singleTap = { x, y -> toggleFullscreen() - } + }, doubleTap = { x, y -> + doSkip(true) + }) } else { video_brightness_controller.beGone() video_volume_controller.beGone() @@ -287,6 +304,15 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } } + private fun handleDoubleTap(x: Float) { + val instantWidth = mScreenWidth / 7 + when { + x <= instantWidth -> doSkip(false) + x >= mScreenWidth - instantWidth -> doSkip(true) + else -> togglePlayPause() + } + } + private fun resumeVideo() { video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) if (mExoPlayer == null) { @@ -470,16 +496,15 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen }) } - private fun skip(forward: Boolean) { + private fun doSkip(forward: Boolean) { if (mExoPlayer == null) { return } val curr = mExoPlayer!!.currentPosition - val twoPercents = Math.max((mExoPlayer!!.duration / 50).toInt(), MIN_SKIP_LENGTH) - val newProgress = if (forward) curr + twoPercents else curr - twoPercents + val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS val roundProgress = Math.round(newProgress / 1000f) - val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt(), roundProgress), 0) + val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0) setPosition(limitedProgress) if (!mIsPlaying) { togglePlayPause() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt index 089d3da5d..77dffb031 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt @@ -1104,7 +1104,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun gotMedia(thumbnailItems: ArrayList) { val media = thumbnailItems.asSequence().filter { it is Medium && !mIgnoredPaths.contains(it.path) }.map { it as Medium }.toMutableList() as ArrayList - if (isDirEmpty(media) || media.hashCode() == mPrevHashcode) { + if (isDirEmpty(media) || media.hashCode() == mPrevHashcode || (getCurrentFragment() as? VideoFragment)?.mIsPlaying == true) { return } @@ -1185,6 +1185,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View return mIsSlideshowActive } + override fun isSlideShowActive() = mIsSlideshowActive + override fun goToPrevItem() { view_pager.setCurrentItem(view_pager.currentItem - 1, false) checkOrientation() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/FiltersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/FiltersAdapter.kt new file mode 100644 index 000000000..b614787b8 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/FiltersAdapter.kt @@ -0,0 +1,58 @@ +package com.simplemobiletools.gallery.pro.adapters + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.gallery.pro.R +import com.simplemobiletools.gallery.pro.models.FilterItem +import kotlinx.android.synthetic.main.editor_filter_item.view.* +import java.util.* + +class FiltersAdapter(val context: Context, val filterItems: ArrayList, val itemClick: (Int) -> Unit) : RecyclerView.Adapter() { + + private var currentSelection = filterItems.first() + private var strokeBackground = context.resources.getDrawable(R.drawable.stroke_background) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bindView(filterItems[position]) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.editor_filter_item, parent, false) + return ViewHolder(view) + } + + override fun getItemCount() = filterItems.size + + fun getCurrentFilter() = currentSelection + + private fun setCurrentFilter(position: Int) { + val filterItem = filterItems.getOrNull(position) ?: return + if (currentSelection != filterItem) { + currentSelection = filterItem + notifyDataSetChanged() + itemClick.invoke(position) + } + } + + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView(filterItem: FilterItem): View { + itemView.apply { + editor_filter_item_label.text = filterItem.filter.name + editor_filter_item_thumbnail.setImageBitmap(filterItem.bitmap) + editor_filter_item_thumbnail.background = if (getCurrentFilter() == filterItem) { + strokeBackground + } else { + null + } + + setOnClickListener { + setCurrentFilter(adapterPosition) + } + } + return itemView + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt index 365eb673d..c459a0b30 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.gallery.pro.asynctasks import android.content.Context import android.os.AsyncTask +import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED import com.simplemobiletools.commons.helpers.SORT_BY_DATE_TAKEN import com.simplemobiletools.commons.helpers.SORT_BY_SIZE import com.simplemobiletools.gallery.pro.extensions.config @@ -18,22 +19,31 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage override fun doInBackground(vararg params: Void): ArrayList { val pathToUse = if (showAll) SHOW_ALL else mPath - val getProperDateTaken = context.config.getFileSorting(pathToUse) and SORT_BY_DATE_TAKEN != 0 || context.config.getFolderGrouping(pathToUse) and GROUP_BY_DATE_TAKEN_DAILY != 0 - val getProperFileSize = context.config.getFileSorting(pathToUse) and SORT_BY_SIZE != 0 + val folderGrouping = context.config.getFolderGrouping(pathToUse) + val fileSorting = context.config.getFileSorting(pathToUse) + val getProperDateTaken = fileSorting and SORT_BY_DATE_TAKEN != 0 || + folderGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || + folderGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 + + val getProperLastModified = fileSorting and SORT_BY_DATE_MODIFIED != 0 || + folderGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || + folderGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 + + val getProperFileSize = fileSorting and SORT_BY_SIZE != 0 val favoritePaths = context.getFavoritePaths() val getVideoDurations = context.config.showThumbnailVideoDuration val media = if (showAll) { val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES && !context.config.isFolderProtected(it) } val media = ArrayList() foldersToScan.forEach { - val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations, false) + val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations) media.addAll(newMedia) } mediaFetcher.sortMedia(media, context.config.getFileSorting(SHOW_ALL)) media } else { - mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations) + mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations) } return mediaFetcher.groupMedia(media, pathToUse) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/databases/GalleryDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/databases/GalleryDatabase.kt index 690ce2fe5..6e2be4788 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/databases/GalleryDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/databases/GalleryDatabase.kt @@ -9,7 +9,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase import com.simplemobiletools.gallery.pro.interfaces.* import com.simplemobiletools.gallery.pro.models.* -@Database(entities = [Directory::class, Medium::class, Widget::class, DateTaken::class, Favorite::class], version = 7) +@Database(entities = [Directory::class, Medium::class, Widget::class, DateTaken::class, Favorite::class], version = 8) abstract class GalleryDatabase : RoomDatabase() { abstract fun DirectoryDao(): DirectoryDao @@ -34,6 +34,7 @@ abstract class GalleryDatabase : RoomDatabase() { .addMigrations(MIGRATION_4_5) .addMigrations(MIGRATION_5_6) .addMigrations(MIGRATION_6_7) + .addMigrations(MIGRATION_7_8) .build() } } @@ -67,5 +68,11 @@ abstract class GalleryDatabase : RoomDatabase() { database.execSQL("CREATE UNIQUE INDEX `index_favorites_full_path` ON `favorites` (`full_path`)") } } + + private val MIGRATION_7_8 = object : Migration(7, 8) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE directories ADD COLUMN sort_value TEXT default '' NOT NULL") + } + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt index b23b28522..c7703735e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt @@ -80,7 +80,7 @@ fun Activity.launchCamera() { fun SimpleActivity.launchAbout() { val licenses = LICENSE_GLIDE or LICENSE_CROPPER or LICENSE_RTL or LICENSE_SUBSAMPLING or LICENSE_PATTERN or LICENSE_REPRINT or LICENSE_GIF_DRAWABLE or - LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_GESTURE_VIEWS + LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_FILTERS or LICENSE_GESTURE_VIEWS val faqItems = arrayListOf( FAQItem(R.string.faq_5_title_commons, R.string.faq_5_text_commons), @@ -156,13 +156,10 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) { } else { try { file.createNewFile() - applicationContext.scanFileRecursively(file) { - callback() - } } catch (e: Exception) { showErrorToast(e) - callback() } + callback() } } @@ -453,6 +450,17 @@ fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, hasResc } } + if (!didUpdateFile) { + if (showToasts) { + toast(R.string.no_date_takens_found) + } + + runOnUiThread { + callback?.invoke() + } + return@ensureBackgroundThread + } + val resultSize = contentResolver.applyBatch(MediaStore.AUTHORITY, operations).size if (resultSize == 0) { didUpdateFile = false diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt index a3d542674..5834cf4fd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt @@ -165,25 +165,26 @@ fun Context.getSortedDirectories(source: ArrayList): ArrayList o1 as Directory o2 as Directory + var result = when { sorting and SORT_BY_NAME != 0 -> { if (sorting and SORT_USE_NUMERIC_VALUE != 0) { - AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase()) + AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase()) } else { - o1.name.toLowerCase().compareTo(o2.name.toLowerCase()) + o1.sortValue.toLowerCase().compareTo(o2.sortValue.toLowerCase()) } } sorting and SORT_BY_PATH != 0 -> { if (sorting and SORT_USE_NUMERIC_VALUE != 0) { - AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase()) + AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase()) } else { - o1.path.toLowerCase().compareTo(o2.path.toLowerCase()) + o1.sortValue.toLowerCase().compareTo(o2.sortValue.toLowerCase()) } } - sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase()) - sorting and SORT_BY_SIZE != 0 -> o1.size.compareTo(o2.size) - sorting and SORT_BY_DATE_MODIFIED != 0 -> o1.modified.compareTo(o2.modified) - else -> o1.taken.compareTo(o2.taken) + sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase()) + sorting and SORT_BY_SIZE != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0) + sorting and SORT_BY_DATE_MODIFIED != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0) + else -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0) } if (sorting and SORT_DESCENDING != 0) { @@ -252,7 +253,7 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList, currentPathPre val parent = File(path).parent if (parent != null && !folders.contains(parent) && dirs.none { it.path == parent }) { currentPaths.add(parent) - val isSortingAscending = config.sorting and SORT_DESCENDING == 0 + val isSortingAscending = config.sorting.isSortingAscending() val subDirs = dirs.filter { File(it.path).parent.equals(File(path).parent, true) } as ArrayList if (subDirs.isNotEmpty()) { val lastModified = if (isSortingAscending) { @@ -281,7 +282,8 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList, currentPathPre dateTaken, subDirs.sumByLong { it.size }, getPathLocation(parent), - mediaTypes) + mediaTypes, + "") directory.containsMediaFilesDirectly = false dirs.add(directory) @@ -479,7 +481,7 @@ fun Context.addTempFolderIfNeeded(dirs: ArrayList): ArrayList() - val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0) + val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0, "") directories.add(newFolder) directories.addAll(dirs) directories @@ -706,7 +708,7 @@ fun Context.updateDBMediaPath(oldPath: String, newPath: String) { fun Context.updateDBDirectory(directory: Directory) { try { - directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types) + directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types, directory.sortValue) } catch (ignored: Exception) { } } @@ -855,19 +857,27 @@ fun Context.addPathToDB(path: String) { } fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList, albumCovers: ArrayList, hiddenString: String, - includedFolders: MutableSet, isSortingAscending: Boolean, getProperFileSize: Boolean): Directory { + includedFolders: MutableSet, getProperFileSize: Boolean): Directory { val OTGPath = config.OTGPath - var thumbnail = curMedia.firstOrNull { getDoesFilePathExist(it.path, OTGPath) }?.path ?: "" + val grouped = MediaFetcher(this).groupMedia(curMedia, path) + var thumbnail: String? = null + albumCovers.forEach { if (it.path == path && getDoesFilePathExist(it.tmb, OTGPath)) { thumbnail = it.tmb } } - if (config.OTGPath.isNotEmpty() && thumbnail.startsWith(config.OTGPath)) { - thumbnail = thumbnail.getOTGPublicPath(applicationContext) + if (thumbnail == null) { + val sortedMedia = grouped.filter { it is Medium }.toMutableList() as ArrayList + thumbnail = sortedMedia.firstOrNull { getDoesFilePathExist(it.path, OTGPath) }?.path ?: "" } + if (config.OTGPath.isNotEmpty() && thumbnail!!.startsWith(config.OTGPath)) { + thumbnail = thumbnail!!.getOTGPublicPath(applicationContext) + } + + val isSortingAscending = config.directorySorting.isSortingAscending() val defaultMedium = Medium(0, "", "", "", 0L, 0L, 0L, 0, 0, false, 0L) val firstItem = curMedia.firstOrNull() ?: defaultMedium val lastItem = curMedia.lastOrNull() ?: defaultMedium @@ -876,7 +886,34 @@ fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList, val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken) val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L val mediaTypes = curMedia.getDirMediaTypes() - return Directory(null, path, thumbnail, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes) + val sortValue = getDirectorySortingValue(curMedia, path, dirName, size) + return Directory(null, path, thumbnail!!, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes, sortValue) +} + +fun Context.getDirectorySortingValue(media: ArrayList, path: String, name: String, size: Long): String { + val sorting = config.directorySorting + val sorted = when { + sorting and SORT_BY_NAME != 0 -> return name + sorting and SORT_BY_PATH != 0 -> return path + sorting and SORT_BY_SIZE != 0 -> return size.toString() + sorting and SORT_BY_DATE_MODIFIED != 0 -> media.sortedBy { it.modified } + sorting and SORT_BY_DATE_TAKEN != 0 -> media.sortedBy { it.taken } + else -> media + } + + val relevantMedium = if (sorting.isSortingAscending()) { + sorted.firstOrNull() ?: return "" + } else { + sorted.lastOrNull() ?: return "" + } + + val result: Any = when { + sorting and SORT_BY_DATE_MODIFIED != 0 -> relevantMedium.modified + sorting and SORT_BY_DATE_TAKEN != 0 -> relevantMedium.taken + else -> 0 + } + + return result.toString() } fun Context.updateDirectoryPath(path: String) { @@ -886,12 +923,23 @@ fun Context.updateDirectoryPath(path: String) { val hiddenString = getString(R.string.hidden) val albumCovers = config.parseAlbumCovers() val includedFolders = config.includedFolders - val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0 - val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 + + val sorting = config.getFileSorting(path) + val grouping = config.getFolderGrouping(path) + val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 || + sorting and SORT_BY_DATE_TAKEN != 0 || + grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || + grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 + + val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 || + sorting and SORT_BY_DATE_MODIFIED != 0 || + grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || + grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 + val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0 val favoritePaths = getFavoritePaths() - val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperFileSize, favoritePaths, false) - val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending, getProperFileSize) + val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false) + val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize) updateDBDirectory(directory) } @@ -910,7 +958,7 @@ fun Context.getFileDateTaken(path: String): Long { do { try { return cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN) - } catch (e: Exception) { + } catch (ignored: Exception) { } } while (cursor.moveToNext()) } @@ -918,5 +966,3 @@ fun Context.getFileDateTaken(path: String): Long { return 0L } - -fun Context.isChromebook() = packageManager.hasSystemFeature("org.chromium.arc.device_management") diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Int.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Int.kt new file mode 100644 index 000000000..7792ef112 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Int.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.gallery.pro.extensions + +import com.simplemobiletools.commons.helpers.SORT_DESCENDING + +fun Int.isSortingAscending() = this and SORT_DESCENDING == 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt index 3a8eb02ae..2c0420b9a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt @@ -7,9 +7,9 @@ import com.simplemobiletools.commons.helpers.NOMEDIA import java.io.File import java.io.IOException -fun String.isThisOrParentIncluded(includedPaths: MutableSet) = includedPaths.any { startsWith(it, true) } +fun String.isThisOrParentIncluded(includedPaths: MutableSet) = includedPaths.any { equals(it, true) } || includedPaths.any { "$this/".startsWith("$it/", true) } -fun String.isThisOrParentExcluded(excludedPaths: MutableSet) = excludedPaths.any { startsWith(it, true) } +fun String.isThisOrParentExcluded(excludedPaths: MutableSet) = excludedPaths.any { equals(it, true) } || excludedPaths.any { "$this/".startsWith("$it/", true) } fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPaths: MutableSet, showHidden: Boolean): Boolean { if (isEmpty()) { @@ -20,7 +20,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath if (file.name.startsWith("img_", true)) { val files = file.list() if (files != null) { - if (files.any { it.contains("portrait", true) && it.contains("burst", true) }) { + if (files.any { it.contains("burst", true) }) { return false } } @@ -32,7 +32,12 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath return true } - val containsNoMedia = if (showHidden) false else File(this, NOMEDIA).exists() + val containsNoMedia = if (showHidden) { + false + } else { + File(this, NOMEDIA).exists() + } + return if (!showHidden && containsNoMedia) { false } else if (excludedPaths.contains(this)) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt index d7555a5b4..6f7064d55 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt @@ -111,7 +111,7 @@ class PhotoFragment : ViewPagerFragment() { instant_prev_item.parentView = container instant_next_item.parentView = container - photo_brightness_controller.initialize(activity!!, slide_info, true, container) { x, y -> + photo_brightness_controller.initialize(activity!!, slide_info, true, container, singleTap = { x, y -> mView.apply { if (subsampling_view.isVisible()) { subsampling_view.sendFakeClick(x, y) @@ -119,7 +119,7 @@ class PhotoFragment : ViewPagerFragment() { gestures_view.sendFakeClick(x, y) } } - } + }) if (context.config.allowDownGesture) { gif_view.setOnTouchListener { v, event -> @@ -767,9 +767,8 @@ class PhotoFragment : ViewPagerFragment() { } private fun updateInstantSwitchWidths() { - val newWidth = resources.getDimension(R.dimen.instant_change_bar_width) + if (activity?.portrait == false) activity!!.navigationBarWidth else 0 - mView.instant_prev_item.layoutParams.width = newWidth.toInt() - mView.instant_next_item.layoutParams.width = newWidth.toInt() + mView.instant_prev_item.layoutParams.width = mScreenWidth / 7 + mView.instant_next_item.layoutParams.width = mScreenWidth / 7 } override fun fullscreenToggled(isFullscreen: Boolean) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt index bc7a69b56..76da0d990 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt @@ -44,7 +44,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S private var mWasFragmentInit = false private var mIsPanorama = false private var mIsFragmentVisible = false - private var mIsPlaying = false private var mIsDragged = false private var mWasVideoStarted = false private var mWasPlayerInited = false @@ -55,6 +54,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S private var mDuration = 0 private var mPositionWhenInit = 0 private var mPositionAtPause = 0L + var mIsPlaying = false private var mExoPlayer: SimpleExoPlayer? = null private var mVideoSize = Point(1, 1) @@ -81,14 +81,13 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mMedium = arguments!!.getSerializable(MEDIUM) as Medium mConfig = context!!.config mView = inflater.inflate(R.layout.pager_video_item, container, false).apply { - instant_prev_item.setOnClickListener { listener?.goToPrevItem() } - instant_next_item.setOnClickListener { listener?.goToNextItem() } panorama_outline.setOnClickListener { openPanorama() } video_curr_time.setOnClickListener { skip(false) } video_duration.setOnClickListener { skip(true) } video_holder.setOnClickListener { toggleFullscreen() } video_preview.setOnClickListener { toggleFullscreen() } - video_surface_frame.setOnClickListener { toggleFullscreen() } + video_surface_frame.controller.settings.swallowDoubleTaps = true + video_play_outline.setOnClickListener { if (mConfig.openVideosOnSeparateScreen) { launchVideoPlayer() @@ -114,18 +113,45 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mTextureView = video_surface mTextureView.surfaceTextureListener = this@VideoFragment - if (mConfig.allowDownGesture) { - video_preview.setOnTouchListener { view, event -> - handleEvent(event) - false + val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() { + override fun onSingleTapConfirmed(e: MotionEvent?): Boolean { + if (!mConfig.allowInstantChange) { + toggleFullscreen() + return true + } + + val viewWidth = width + val instantWidth = viewWidth / 7 + val clickedX = e?.rawX ?: 0f + when { + clickedX <= instantWidth -> listener?.goToPrevItem() + clickedX >= viewWidth - instantWidth -> listener?.goToNextItem() + else -> toggleFullscreen() + } + return true } - video_surface_frame.setOnTouchListener { view, event -> - if (video_surface_frame.controller.state.zoom == 1f) { - handleEvent(event) + override fun onDoubleTap(e: MotionEvent?): Boolean { + if (e != null) { + handleDoubleTap(e.rawX) } - false + + return true } + }) + + video_preview.setOnTouchListener { view, event -> + handleEvent(event) + false + } + + video_surface_frame.setOnTouchListener { view, event -> + if (video_surface_frame.controller.state.zoom == 1f) { + handleEvent(event) + } + + gestureDetector.onTouchEvent(event) + false } } @@ -171,13 +197,25 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S setVideoSize() mView.apply { - mBrightnessSideScroll.initialize(activity!!, slide_info, true, container) { x, y -> - video_holder.performClick() - } + mBrightnessSideScroll.initialize(activity!!, slide_info, true, container, singleTap = { x, y -> + if (mConfig.allowInstantChange) { + listener?.goToPrevItem() + } else { + toggleFullscreen() + } + }, doubleTap = { x, y -> + doSkip(false) + }) - mVolumeSideScroll.initialize(activity!!, slide_info, false, container) { x, y -> - video_holder.performClick() - } + mVolumeSideScroll.initialize(activity!!, slide_info, false, container, singleTap = { x, y -> + if (mConfig.allowInstantChange) { + listener?.goToNextItem() + } else { + toggleFullscreen() + } + }, doubleTap = { x, y -> + doSkip(true) + }) video_surface.onGlobalLayout { if (mIsFragmentVisible && mConfig.autoplayVideos && !mConfig.openVideosOnSeparateScreen) { @@ -192,7 +230,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S restoreLastVideoSavedPosition() } - updateInstantSwitchWidths() return mView } @@ -201,17 +238,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mConfig = context!!.config // make sure we get a new config, in case the user changed something in the app settings activity!!.updateTextColors(mView.video_holder) val allowVideoGestures = mConfig.allowVideoGestures - val allowInstantChange = mConfig.allowInstantChange mTextureView.beGoneIf(mConfig.openVideosOnSeparateScreen || mIsPanorama) - mView.apply { - video_surface_frame.beGoneIf(mTextureView.isGone()) + mView.video_surface_frame.beGoneIf(mTextureView.isGone()) - video_volume_controller.beVisibleIf(allowVideoGestures && !mIsPanorama) - video_brightness_controller.beVisibleIf(allowVideoGestures && !mIsPanorama) - - instant_prev_item.beVisibleIf(allowInstantChange) - instant_next_item.beVisibleIf(allowInstantChange) - } + mVolumeSideScroll.beVisibleIf(allowVideoGestures && !mIsPanorama) + mBrightnessSideScroll.beVisibleIf(allowVideoGestures && !mIsPanorama) checkExtendedDetails() initTimeHolder() @@ -251,7 +282,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S setVideoSize() initTimeHolder() checkExtendedDetails() - updateInstantSwitchWidths() mView.video_surface_frame.onGlobalLayout { mView.video_surface_frame.controller.resetState() } @@ -317,7 +347,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mExoPlayer = ExoPlayerFactory.newSimpleInstance(context) mExoPlayer!!.seekParameters = SeekParameters.CLOSEST_SYNC - if (mConfig.loopVideos) { + if (mConfig.loopVideos && listener?.isSlideShowActive() == false) { mExoPlayer?.repeatMode = Player.REPEAT_MODE_ONE } @@ -394,6 +424,16 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S listener?.fragmentClicked() } + private fun handleDoubleTap(x: Float) { + val viewWidth = mView.width + val instantWidth = viewWidth / 7 + when { + x <= instantWidth -> doSkip(false) + x >= viewWidth - instantWidth -> doSkip(true) + else -> togglePlayPause() + } + } + private fun checkExtendedDetails() { if (mConfig.showExtendedDetails) { mView.video_details.apply { @@ -453,12 +493,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } } - private fun updateInstantSwitchWidths() { - val newWidth = resources.getDimension(R.dimen.instant_change_bar_width) + if (activity?.portrait == false) activity!!.navigationBarWidth else 0 - mView.instant_prev_item.layoutParams.width = newWidth.toInt() - mView.instant_next_item.layoutParams.width = newWidth.toInt() - } - override fun fullscreenToggled(isFullscreen: Boolean) { mIsFullscreen = isFullscreen val newAlpha = if (isFullscreen) 0f else 1f @@ -505,11 +539,18 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } mPositionAtPause = 0L + doSkip(forward) + } + + private fun doSkip(forward: Boolean) { + if (mExoPlayer == null) { + return + } + val curr = mExoPlayer!!.currentPosition - val twoPercents = Math.max((mExoPlayer!!.duration / 50).toInt(), MIN_SKIP_LENGTH) - val newProgress = if (forward) curr + twoPercents else curr - twoPercents + val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS val roundProgress = Math.round(newProgress / 1000f) - val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt(), roundProgress), 0) + val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0) setPosition(limitedProgress) if (!mIsPlaying) { togglePlayPause() @@ -681,9 +722,13 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } mCurrTime = (mExoPlayer!!.duration / 1000).toInt() - mSeekBar.progress = mSeekBar.max - mCurrTimeView.text = mDuration.getFormattedDuration() - pauseVideo() + if (listener?.videoEnded() == false && mConfig.loopVideos) { + playVideo() + } else { + mSeekBar.progress = mSeekBar.max + mCurrTimeView.text = mDuration.getFormattedDuration() + pauseVideo() + } } private fun cleanup() { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt index 7473326dd..41a31afe3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt @@ -31,6 +31,8 @@ abstract class ViewPagerFragment : Fragment() { fun goToNextItem() fun launchViewVideoIntent(path: String) + + fun isSlideShowActive(): Boolean } fun getMediumExtendedDetails(medium: Medium): String { @@ -140,7 +142,7 @@ abstract class ViewPagerFragment : Fragment() { val diffY = mTouchDownY - event.y val downGestureDuration = System.currentTimeMillis() - mTouchDownTime - if (!mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold && downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION) { + if (!mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold && downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION && context?.config?.allowDownGesture == true) { activity?.supportFinishAfterTransition() } mIgnoreCloseDown = false diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt index 6769ec72d..68ff6268b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt @@ -475,6 +475,14 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getBoolean(ALLOW_ROTATING_WITH_GESTURES, true) set(allowRotatingWithGestures) = prefs.edit().putBoolean(ALLOW_ROTATING_WITH_GESTURES, allowRotatingWithGestures).apply() + var lastEditorDrawColor: Int + get() = prefs.getInt(LAST_EDITOR_DRAW_COLOR, primaryColor) + set(lastEditorDrawColor) = prefs.edit().putInt(LAST_EDITOR_DRAW_COLOR, lastEditorDrawColor).apply() + + var lastEditorBrushSize: Int + get() = prefs.getInt(LAST_EDITOR_BRUSH_SIZE, 50) + set(lastEditorBrushSize) = prefs.edit().putInt(LAST_EDITOR_BRUSH_SIZE, lastEditorBrushSize).apply() + var showNotch: Boolean get() = prefs.getBoolean(SHOW_NOTCH, true) set(showNotch) = prefs.edit().putBoolean(SHOW_NOTCH, showNotch).apply() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt index 9b549de78..248cf6393 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt @@ -73,6 +73,8 @@ const val GROUP_DIRECT_SUBFOLDERS = "group_direct_subfolders" const val SHOW_WIDGET_FOLDER_NAME = "show_widget_folder_name" const val ALLOW_ONE_TO_ONE_ZOOM = "allow_one_to_one_zoom" const val ALLOW_ROTATING_WITH_GESTURES = "allow_rotating_with_gestures" +const val LAST_EDITOR_DRAW_COLOR = "last_editor_draw_color" +const val LAST_EDITOR_BRUSH_SIZE = "last_editor_brush_size" const val SHOW_NOTCH = "show_notch" const val FILE_LOADING_PRIORITY = "file_loading_priority" const val SPAM_FOLDERS_CHECKED = "spam_folders_checked" @@ -118,6 +120,7 @@ const val MONTH_MILLISECONDS = MONTH_SECONDS * 1000L const val MIN_SKIP_LENGTH = 2000 const val HIDE_SYSTEM_UI_DELAY = 500L const val MAX_PRINT_SIDE_SIZE = 4096 +const val FAST_FORWARD_VIDEO_MS = 10000 const val DIRECTORY = "directory" const val MEDIUM = "medium" diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/FilterThumbnailsManager.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/FilterThumbnailsManager.kt new file mode 100644 index 000000000..ae043ddde --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/FilterThumbnailsManager.kt @@ -0,0 +1,27 @@ +package com.simplemobiletools.gallery.pro.helpers + +import android.graphics.Bitmap +import com.simplemobiletools.gallery.pro.models.FilterItem +import java.util.* + +class FilterThumbnailsManager { + private var filterThumbnails = ArrayList(10) + private var processedThumbnails = ArrayList(10) + + fun addThumb(filterItem: FilterItem) { + filterThumbnails.add(filterItem) + } + + fun processThumbs(): ArrayList { + for (filterItem in filterThumbnails) { + filterItem.bitmap = filterItem.filter.processFilter(Bitmap.createBitmap(filterItem.bitmap)) + processedThumbnails.add(filterItem) + } + return processedThumbnails + } + + fun clearThumbs() { + filterThumbnails = ArrayList() + processedThumbnails = ArrayList() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt index 8f060f922..f23e50b88 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt @@ -20,8 +20,8 @@ import java.util.* class MediaFetcher(val context: Context) { var shouldStop = false - fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperFileSize: Boolean, - favoritePaths: ArrayList, getVideoDurations: Boolean, sortMedia: Boolean = true): ArrayList { + fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean, + getProperFileSize: Boolean, favoritePaths: ArrayList, getVideoDurations: Boolean): ArrayList { val filterMedia = context.config.filterMedia if (filterMedia == 0) { return ArrayList() @@ -34,13 +34,11 @@ class MediaFetcher(val context: Context) { curMedia.addAll(newMedia) } } else { - val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperFileSize, favoritePaths, getVideoDurations) + val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations) curMedia.addAll(newMedia) } - if (sortMedia) { - sortMedia(curMedia, context.config.getFileSorting(curPath)) - } + sortMedia(curMedia, context.config.getFileSorting(curPath)) return curMedia } @@ -69,7 +67,6 @@ class MediaFetcher(val context: Context) { val includedPaths = config.includedFolders folders.filter { it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden) }.toMutableList() as ArrayList } catch (e: Exception) { - context.showErrorToast(e) ArrayList() } } @@ -212,7 +209,7 @@ class MediaFetcher(val context: Context) { } private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, - getProperFileSize: Boolean, favoritePaths: ArrayList, getVideoDurations: Boolean): ArrayList { + getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList, getVideoDurations: Boolean): ArrayList { val media = ArrayList() val isRecycleBin = folder == RECYCLE_BIN val deletedMedia = if (isRecycleBin) { @@ -297,12 +294,20 @@ class MediaFetcher(val context: Context) { media.add(this) } } else { - val lastModified = file.lastModified() + val lastModified = if (getProperLastModified) file.lastModified() else 0L var dateTaken = lastModified val videoDuration = if (getVideoDurations && isVideo) path.getVideoDuration() else 0 if (getProperDateTaken) { - dateTaken = dateTakens.remove(path) ?: lastModified + var newDateTaken = dateTakens.remove(path) + if (newDateTaken == null) { + newDateTaken = if (getProperLastModified) { + lastModified + } else { + file.lastModified() + } + } + dateTaken = newDateTaken } val type = when { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DirectoryDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DirectoryDao.kt index 57d6807c2..75acd43c4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DirectoryDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DirectoryDao.kt @@ -9,7 +9,7 @@ import com.simplemobiletools.gallery.pro.models.Directory @Dao interface DirectoryDao { - @Query("SELECT path, thumbnail, filename, media_count, last_modified, date_taken, size, location, media_types FROM directories") + @Query("SELECT path, thumbnail, filename, media_count, last_modified, date_taken, size, location, media_types, sort_value FROM directories") fun getAll(): List @Insert(onConflict = REPLACE) @@ -21,8 +21,8 @@ interface DirectoryDao { @Query("DELETE FROM directories WHERE path = :path COLLATE NOCASE") fun deleteDirPath(path: String) - @Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes WHERE path = :path COLLATE NOCASE") - fun updateDirectory(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int) + @Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes, sort_value = :sortValue WHERE path = :path COLLATE NOCASE") + fun updateDirectory(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int, sortValue: String) @Query("UPDATE directories SET thumbnail = :thumbnail, filename = :name, path = :newPath WHERE path = :oldPath COLLATE NOCASE") fun updateDirectoryAfterRename(thumbnail: String, name: String, newPath: String, oldPath: String) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt index 3b2ebedc5..f68ae3171 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt @@ -23,13 +23,14 @@ data class Directory( @ColumnInfo(name = "size") var size: Long, @ColumnInfo(name = "location") var location: Int, @ColumnInfo(name = "media_types") var types: Int, + @ColumnInfo(name = "sort_value") var sortValue: String, // used with "Group direct subfolders" enabled @Ignore var subfoldersCount: Int = 0, @Ignore var subfoldersMediaCount: Int = 0, @Ignore var containsMediaFilesDirectly: Boolean = true) { - constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, 0, 0) + constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, "", 0, 0) fun getBubbleText(sorting: Int, context: Context) = when { sorting and SORT_BY_NAME != 0 -> name diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/FilterItem.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/FilterItem.kt new file mode 100644 index 000000000..ce826e57e --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/FilterItem.kt @@ -0,0 +1,6 @@ +package com.simplemobiletools.gallery.pro.models + +import android.graphics.Bitmap +import com.zomato.photofilters.imageprocessors.Filter + +data class FilterItem(var bitmap: Bitmap, val filter: Filter) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/views/MediaSideScroll.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/views/MediaSideScroll.kt index 50a338666..61ff895a0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/views/MediaSideScroll.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/views/MediaSideScroll.kt @@ -6,6 +6,7 @@ import android.media.AudioManager import android.os.Handler import android.provider.Settings import android.util.AttributeSet +import android.view.GestureDetector import android.view.MotionEvent import android.view.ViewGroup import android.widget.RelativeLayout @@ -13,8 +14,6 @@ import android.widget.TextView import com.simplemobiletools.commons.extensions.onGlobalLayout import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.audioManager -import com.simplemobiletools.gallery.pro.helpers.CLICK_MAX_DISTANCE -import com.simplemobiletools.gallery.pro.helpers.CLICK_MAX_DURATION import com.simplemobiletools.gallery.pro.helpers.DRAG_THRESHOLD // allow horizontal swipes through the layout, else it can cause glitches at zoomed in images @@ -35,14 +34,17 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co private var mSlideInfoFadeHandler = Handler() private var mParentView: ViewGroup? = null private var activity: Activity? = null + private var doubleTap: ((Float, Float) -> Unit)? = null private lateinit var slideInfoView: TextView - private lateinit var callback: (Float, Float) -> Unit + private lateinit var singleTap: (Float, Float) -> Unit - fun initialize(activity: Activity, slideInfoView: TextView, isBrightness: Boolean, parentView: ViewGroup?, callback: (x: Float, y: Float) -> Unit) { + fun initialize(activity: Activity, slideInfoView: TextView, isBrightness: Boolean, parentView: ViewGroup?, singleTap: (x: Float, y: Float) -> Unit, + doubleTap: ((x: Float, y: Float) -> Unit)? = null) { this.activity = activity this.slideInfoView = slideInfoView - this.callback = callback + this.singleTap = singleTap + this.doubleTap = doubleTap mParentView = parentView mIsBrightnessScroll = isBrightness mSlideInfoText = activity.getString(if (isBrightness) R.string.brightness else R.string.volume) @@ -51,6 +53,22 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co } } + private val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() { + override fun onSingleTapConfirmed(e: MotionEvent?): Boolean { + if (e != null) { + singleTap(e.rawX, e.rawY) + } + return true + } + + override fun onDoubleTap(e: MotionEvent?): Boolean { + if (e != null && doubleTap != null) { + doubleTap!!.invoke(e.rawX, e.rawY) + } + return true + } + }) + override fun dispatchTouchEvent(ev: MotionEvent): Boolean { if (mPassTouches) { if (ev.actionMasked == MotionEvent.ACTION_DOWN) { @@ -66,6 +84,7 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co return false } + gestureDetector.onTouchEvent(event) when (event.actionMasked) { MotionEvent.ACTION_DOWN -> { mTouchDownX = event.x @@ -107,12 +126,6 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co mLastTouchY = event.y } MotionEvent.ACTION_UP -> { - val diffX = mTouchDownX - event.x - val diffY = mTouchDownY - event.y - if (Math.abs(diffX) < CLICK_MAX_DISTANCE && Math.abs(diffY) < CLICK_MAX_DISTANCE && System.currentTimeMillis() - mTouchDownTime < CLICK_MAX_DURATION) { - callback(event.rawX, event.rawY) - } - if (mIsBrightnessScroll) { mTouchDownValue = mTempBrightness } diff --git a/app/src/main/res/drawable/ic_aspect_ratio_vector.xml b/app/src/main/res/drawable/ic_aspect_ratio_vector.xml new file mode 100644 index 000000000..d0ebe2814 --- /dev/null +++ b/app/src/main/res/drawable/ic_aspect_ratio_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_crop_rotate_vector.xml b/app/src/main/res/drawable/ic_crop_rotate_vector.xml new file mode 100644 index 000000000..681d300cd --- /dev/null +++ b/app/src/main/res/drawable/ic_crop_rotate_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_draw_vector.xml b/app/src/main/res/drawable/ic_draw_vector.xml new file mode 100644 index 000000000..1e296d845 --- /dev/null +++ b/app/src/main/res/drawable/ic_draw_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_photo_filter_vector.xml b/app/src/main/res/drawable/ic_photo_filter_vector.xml new file mode 100644 index 000000000..127f154be --- /dev/null +++ b/app/src/main/res/drawable/ic_photo_filter_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index a4335621e..3dffbf1bf 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -1,38 +1,77 @@ - + + + app:cropInitialCropWindowPaddingRatio="0"/> + + + android:background="@drawable/gradient_background"/> + + + android:layout_above="@+id/bottom_editor_crop_rotate_actions" + android:visibility="gone"/> + + + android:layout_above="@+id/bottom_editor_primary_actions" + android:visibility="gone"/> + + diff --git a/app/src/main/res/layout/bottom_editor_actions_filter.xml b/app/src/main/res/layout/bottom_editor_actions_filter.xml new file mode 100644 index 000000000..734942343 --- /dev/null +++ b/app/src/main/res/layout/bottom_editor_actions_filter.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/layout/bottom_editor_crop_rotate_actions.xml b/app/src/main/res/layout/bottom_editor_crop_rotate_actions.xml index 37a93cbcb..93dcbb4e6 100644 --- a/app/src/main/res/layout/bottom_editor_crop_rotate_actions.xml +++ b/app/src/main/res/layout/bottom_editor_crop_rotate_actions.xml @@ -16,10 +16,38 @@ android:padding="@dimen/normal_margin" android:src="@drawable/ic_rotate_right_vector" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/bottom_flip_horizontally" + app:layout_constraintEnd_toStartOf="@+id/bottom_resize" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent"/> + + + + + app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio" + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent"/> diff --git a/app/src/main/res/layout/bottom_editor_draw_actions.xml b/app/src/main/res/layout/bottom_editor_draw_actions.xml new file mode 100644 index 000000000..07fe2fb2c --- /dev/null +++ b/app/src/main/res/layout/bottom_editor_draw_actions.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/bottom_editor_primary_actions.xml b/app/src/main/res/layout/bottom_editor_primary_actions.xml new file mode 100644 index 000000000..ed600ed0e --- /dev/null +++ b/app/src/main/res/layout/bottom_editor_primary_actions.xml @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/editor_filter_item.xml b/app/src/main/res/layout/editor_filter_item.xml new file mode 100644 index 000000000..dd3913336 --- /dev/null +++ b/app/src/main/res/layout/editor_filter_item.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/app/src/main/res/layout/pager_photo_item.xml b/app/src/main/res/layout/pager_photo_item.xml index 2198768c1..2b90a6bb3 100644 --- a/app/src/main/res/layout/pager_photo_item.xml +++ b/app/src/main/res/layout/pager_photo_item.xml @@ -98,12 +98,12 @@ diff --git a/app/src/main/res/layout/pager_video_item.xml b/app/src/main/res/layout/pager_video_item.xml index 4a18f5add..405f15026 100644 --- a/app/src/main/res/layout/pager_video_item.xml +++ b/app/src/main/res/layout/pager_video_item.xml @@ -35,17 +35,6 @@ android:layout_width="@dimen/media_side_slider_width" android:layout_height="match_parent"/> - - - - + - + إصلاح تاريخ إلتقاط القيمة جارٍ الإصلاح… تم إصلاح التواريخ بنجاح + No Date Taken values have been found مشاركة الصورة الذي تم تغيير حجمها مرحباً,\n\nيبدو أنك قمت بترقية التطبيق المجاني القديم. يمكنك الآن إلغاء تثبيت الإصدار القديم، الذي يحتوي على زر \'الترقية إلى Pro\' في أعلي إعدادات التطبيق.\n\nسيتم حذف عناصر سلة المحذوفات فقط، كما سيتم حذف العناصر المفضلة، كما سيتعين عليك إعادة ضبط إعدادات التطبيق .\n\nشكراً! التبديل إلي البحث فى الملفات عبر كافة المجلدات المرئية @@ -82,6 +83,7 @@ المسار مسار الصورة غير صحيح فشل تعديل الصورة + Image editing cancelled File edited successfully تعديل الصورة باستخدام: لم يتم العثور على أي محرر للصور @@ -291,7 +293,7 @@ كيف يمكنني جعل ألبوماً يظهر دائماً في الأعلى ؟ يمكنك الضغط مطولاً علي الألبوم المطلوب وحدد أيقونة "التثبيت" في قائمة الإجراءات، التي ستقوم بتثبيته في الأعلي. يمكنك تثبيت مجلدات متعددة أيضا، سيتم فرز العناصر المثبتة حسب طريقة الفرز الإفتراضية. كيف يمكنني تسريع مقاطع الفيديو؟ - يمكنك إما سحب إصبعك أفقياً على مشغل الفيديو، أو النقر على نصوص المدة الحالية أو أقصي مدة النصوص بالقرب من شريط التحكم (seekbar) . هذا سوف يحرك الفيديو إما إلى الخلف، أو إلى الأمام. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. ما هو الفرق بين إخفاء المجلد وإستبعاده ؟ الإستبعاد يمنع عرض المجلد فقط في الاستديو، بينما الإخفاء يعمل على مستوى النظام ويخفي المجلد من المعارض الأخرى أيضاً. يعمل عن طريق إنشاء ملف فارغ \ ".nomedia \" في المجلد المحدد ، والذي يمكنك إزالته بعد ذلك بواسطة أي مدير ملفات أيضًا. لماذا تظهر المجلدات مع صورة غلاف الموسيقى أو الملصقات؟ diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 449778d15..09a2a7bdb 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -31,6 +31,7 @@ Fix Date Taken value Fixing… Dates fixed successfully + No Date Taken values have been found Share a resized version Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Path Invalid image path Image editing failed + Image editing cancelled File edited successfully Edit image with: No image editor found @@ -291,8 +293,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. - How can I fast-forward videos? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index bf388a9fd..76bc342c6 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -31,6 +31,7 @@ Fixar la data de presa Fixant… Data fixada correctament + No s\’han trobat valors presos per data Comparteix una versió redimensionada Hola,\n\nsembla que heu actualitzat des de l\'antiga aplicació gratuïta. Ara podeu desinstal·lar la versió antiga, que té un botó "Actualitza a Pro" a la part superior de la configuració de l’aplicació.\nNomés s’eliminaran els elements de la paperera, els elements preferits sense marcar i també caldrà restablirla configuració de la vostra aplicació.\n\nGràcies! Canvia a la cerca de fitxers a totes les carpetes visibles @@ -82,6 +83,7 @@ Ruta Ruta de imatge no vàlida Ha fallat la edició de la imatge + S\'ha cancel·lat l\'edició de la imatge Fitxer editar satisfactoriament Editar imatge utilitzant: No s’ha trobat cap editor d’imatges @@ -292,7 +294,7 @@ Com puc fer que un àlbum sempre aparegui a la part superior? Podeu prémer l’àlbum desitjat i seleccionar la icona de la xinxeta al menú d’acció i el fixarà a la part superior. També podeu enganxar diverses carpetes, els elements fixats s’ordenaran pel mètode de classificació predeterminat. Com puc fer avançar els vídeos? - Podeu arrossegar el dit horitzontalment al reproductor de vídeo o fer clic als textos actuals o de màxima duració a prop de la barra de cerca. Això mourà el vídeo ja sigui cap enrere o cap endavant. + Podeu fer-ho tocant dues vegades el costat de la pantalla o tocant els textos de durada actual o màxima a prop de la barra de cerca. Si activeu l\’obertura de vídeos en una pantalla diferent a la configuració de l\’aplicació, també podeu fer servir gestos horitzontals. Quina és la diferència entre ocultar i excloure una carpeta? Excloure impedeix mostrar la carpeta només a Simple Galery, mentre que Ocultar també amaga la carpeta a altres galeries. Funciona creant un fitxer \". Nomedia \" buit a la carpeta donada, que podeu eliminar amb qualsevol gestor de fitxers. Per què apareixen les carpetes amb les portades de la música o adhesius? @@ -367,6 +369,9 @@ Consulteu el conjunt complet d’eines senzilles aquí: https://www.simplemobiletools.com + Lloc web de Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 9ed63b894..647f27e33 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -31,6 +31,7 @@ Opravit datum vytvoření Opravuji… Datumy byly úspěšně opraveny + No Date Taken values have been found Sdílet verzi se změněnou velikostí Zdravím,\n\nzdá se, že jste přešli ze staré bezplatné aplikace. Starou aplikaci, která má nahoře v nastavení tlačítko \'Stáhnout Pro verzi\', můžete již odinstalovat.\n\nZtratíte tím pouze soubory v odpadkovém koši, označení oblíbených souborů a také budete muset znovu nastavit položky v nastavení aplikace.\n\nDěkuji! Přepnout na vyhledávání souborů ve všech viditelných složkách @@ -82,6 +83,7 @@ Cesta Neplatná cesta Úprava souboru selhala + Image editing cancelled Soubor byl úspěšně upraven Upravit soubor pomocí: Nebyl nalezen žádný editor @@ -292,7 +294,7 @@ Jak mohu dosáhnout, aby bylo dané album stále zobrazeno jako první? Můžete označit danou složku dlouhým podržením a zvolit tlačítko s obrázkem připínáčku, to ji připne nahoru. Můžete připnout i více složek, budou seřazeny podle zvoleného řazení. Jak mohu video posunout vpřed? - Můžete toho dosáhnout buď tažením prstu vodorovně přes okno přehrávače nebo klepnutím na text aktuální či celkové délky videa, který najdete po bocích indikátoru aktuální pozice. To posune video buď zpět nebo vpřed. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Jaký je rozdíl mezi Skrytím a Vyloučením složky? Zatímco vyloučení zamezí zobrazení složky pouze vrámci Jednoduché galerie, skrytí ji ukryje v celém systému, tedy to ovlivní i ostatní galerie. Skrytí funguje pomocí vytvoření prázdného souboru \".nomedia\" v daném adresáři, který můžete vymazat i libovolným správcem souborů. Proč se mi zobrazují složky s obaly hudebních alb, nebo nálepkami? @@ -367,6 +369,9 @@ Prohlédněte si celou sadu Jednoduchých aplikací na: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index a4fc7e372..c969594f1 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -31,6 +31,7 @@ Fiks eksponeringsdato Fikser… Datoer fikset med succes + No Date Taken values have been found Del en skaleret version Hej\n\nDet ser ud til at du har opgraderet fra den gamle, gratis app. Du kan afinstallere den gamle version, som har en \"Opgrader til Pro\"-knap i toppen af appens indstillinger.\n\nDu vil blot få papirkurvens elementer slettet, favoritter vil blive umarkeret og du vil også skulle genopsætte din apps indstillinger.\n\nTak! Skift til filsøgning på tværs af synlige mapper @@ -82,6 +83,7 @@ Sti Ugyldig sti til billede Redigering af billede mislykkedes + Image editing cancelled File edited successfully Rediger billede med: Der blev ikke fundet en editor til billedbehandling @@ -292,7 +294,7 @@ Hvordan kan jeg altid få et bestemt album vist i toppen? Du kan holde fingeren nede på det ønskede album, og vælge tegnestift-ikonet i menuen, dette vil fastgøre den til toppen. Du kan fastgøre flere mapper også. Fastgjorte elementer vil blive sorteret efter standard sorterings-metoden. Hvordan kan jeg spole fremad i videoer? - Du kan enten trække din finger vandret over videoafspilleren, eller klikke på den nuværende eller maksimum varighedsteksterne, nær søgefeltet. Det vil enten spole videoen tilbage eller fremad. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Hvad er forskellen på at skjule og ekskludere en mappe? Eksludering forhindrer kun visning af mappen i Simple Gallery, mens Skjul virker på systemniveau og skjuler mappen fra andre gallerier også. Det fungerer ved at oprette en tom \".nomedia\"-fil i den givne mappe, som du kan slette med enhver filhåndterings-app. Hvorfor dukker mapper med musikomslag eller klistermærker op? @@ -367,6 +369,9 @@ Se hele suiten af Simple Tools her: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0e04da922..2bf6dfda0 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -31,6 +31,7 @@ Aufnahmedatum korrigieren Korrigiere… Datum erfolgreich korrigiert. + No Date Taken values have been found Teile eine verkleinerte Version Hey,\n\nes sieht so aus, als hättest du von der alten kostenlosen App geupgraded. Du kannst nun die alte Version deinstallieren, die oben in den App-Einstellungen einen \'Upgrade auf Pro\' Button hat.\n\nEs wird nur der Papierkorb gelöscht, die Markierungen von Favoriten entfernt und die App-Einstellungen zurückgesetzt.\n\nDanke! Zur Dateisuche in allen sichtbaren Ordnern wechseln @@ -82,6 +83,7 @@ Pfad Ungültiger Dateipfad Bildbearbeitung fehlgeschlagen + Image editing cancelled Datei erfolgreich bearbeitet Bild bearbeiten mit: Keine Bildeditor-App gefunden @@ -292,7 +294,7 @@ Wie kann ich ein Album immer zuoberst erscheinen lassen? Du kannst lange auf das gewünschte Album drücken und im Aktionsmenü das Stecknadelsymbol auswählen; es wird nun zuoberst angepinnt. Ebenso kannst du mehrere Ordner anpinnen. Angepinnte Objekte werden nach der Standardmethode sortiert. Wie kann ich in Videos vor- oder zurückspringen? - Du kannst deinen Finger horizontal über den Videoplayer ziehen oder in der Nähe der Suchleiste auf die aktuelle oder maximale Dauer klicken. Das Video wird so entweder vorwärts oder rückwärts bewegt. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Was ist der Unterschied zwischen \'Verstecken\' und \'Ausschließen\' eines Ordners? \'Ausschließen\' verhindert lediglich, dass der Ordner in Schlichte Galerie angezeigt wird. \'Verstecken\' hingegen versteckt den Ordner auch vor anderen Apps. Dies funktioniert durch das Erstellen einer leeren \".nomedia\"-Datei im betroffenen Ordner, welche du mit jedem Dateimanager wieder löschen kannst. Wieso erscheinen Ordner mit Musik-Cover oder Stickers? @@ -366,6 +368,9 @@ Schau dir die vollständige Serie der Schlichten Apps hier an: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index aa1793702..b90b37cfd 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -31,6 +31,7 @@ Διόρθωση ημερ. λήψης Διορθώνεται… Η Ημερ. διορθώθηκε με επιτυχία + Δεν βρέθηκαν Τιμές Ημερομηνίας όταν ελήφθησαν Διαμοιρασμός έκδοσης με αλλαγμένο μέγεθος Γειά σας,\n\nΦαίνεται πως αναβαθμίσατε από την παλιά δωρεάν εφαρμογή. Τώρα θα πρέπει να απεγκαταστήσετε την παλιά έκδοση, απο το πλήκτρο \"Αναβάθμιση σε Pro\" στο επάνω των ρυθμίσεων της εφαρμογής.\n\nΘα πρέπει να διαγράψετε μόνο τα αντικείμενα του Κάδου, πρέπει να επαναφέρετε τα αγαπημένα στοιχεία που δεν έχουν επισημανθεί καθώς και τις ρυθμίσεις της εφαρμογής σας.\n\nΣας ευχαριστώ! Εναλλαγή αναζήτησης αρχείων σε όλους τους ορατούς φακέλους @@ -82,6 +83,7 @@ Διαδρομή Μη έγκυρη διαδρομή εικόνας Η επεξεργασία εικόνας απέτυχε + Η επεξεργασία εικόνας ακυρώθηκε Επιτυχής επεξεργασία αρχείου Επεξεργασία εικόνας με: Δεν βρέθηκε επεργαστής εικόνων @@ -292,8 +294,8 @@ Υπάρχουν 2 λύσεις. Είτε επανεγκατάσταση της εφαρμογής, ή να εντοπίσετε την εφαρμογή στις ρυθμίσεις της συσκευής και να επιλέξετε \"Καθαρισμό δεδομένων\". Θα επαναφέρει όλες τις ρυθμίσεις και δεν θα σβήσει κάποιο αρχείο πολυμέσου. Πώς μπορώ να κάνω ένα άλμπουμ να φαίνεται στην κορυφή; Μπορείτε να πατήσετε παρατεταμένα στο άλμπουμ και να επιλέξετε το εικονίδιο καρφιτσώματος στο μενού, αυτό θα το καρφιτσώσει στην κορυφή. Επίσης μπορείτε να καρφιτσώσετε πολλαπλούς φακέλους, τα καρφιτσωμένα αντικείμενα θα είναι ταξινομημένα με την προεπιλεγμένη μέθοδο. - Πώς μπορώ να τρέξω μπροστά (fast-forward) τα βίντεο; - Μπορείτε είτε να σύρετε το δάχτυλό σας οριζόντια πάνω από το πρόγραμμα αναπαραγωγής Βίντεο ή να κάνετε κλικ στα γράμματα της τρέχουσας ή της μέγιστης διάρκειας κοντά στο Γραμμή Αναζήτησης. Αυτό θα μετακινήσει το βίντεο προς τα πίσω ή προς τα εμπρός. + Πώς μπορώ να τρέξω μπροστά (fast forward) τα βίντεο; + Μπορείτε να το κάνετε πατώντας δύο φορές την πλευρά της οθόνης ή πατώντας το κείμενο τρέχοντος ή μέγιστης διάρκειας κοντά στη γραμμή αναζήτησης. Αν ενεργοποιήσετε το άνοιγμα βίντεο σε ξεχωριστή οθόνη στις ρυθμίσεις εφαρμογής, μπορείτε επίσης να χρησιμοποιήσετε και τις οριζόντιες κινήσεις. Ποια είναι διαφορά μεταξύ απόκρυψης και εξαίρεσης ενός φακέλου; Η εξαίρεση δεν επιτρέπει την εμφάνιση του φακέλου μόνο στην Απλή Συλλογή, ενώ η απόκρυψη λειτουργεί σε επίπεδο συστήματος και θα αποκρύψει τον φάκελο και από άλλες εφαρμογές γκάλερι. Λειτουργεί δημιουργώντας ένα άδειο \".nomedia\" αρχείο στον επιλεγμένο φάκελο, το οποίο μπορείτε να το διαγράψετε και με οποιονδήποτε διαχειριστή αρχείων. Γιατί εμφανίζονται φάκελοι με εξώφυλλο μουσικής ή αυτόκολλητα; @@ -365,9 +367,12 @@ ΠΡΟΣΤΑΣΙΑ ΚΑΙ ΑΠΟΚΡΥΨΗ ΑΡΧΕΙΩΝ ΦΩΤΟ ΚΑΙ ΒΙΝΤΕΟ Χρησιμοποιώντας κωδικό, μοτίβο ή τον σαρωτή δακτυλικών αποτυπωμάτων της συσκευής σας, μπορείτε να προστατεύσετε και να αποκρύψετε φωτογραφίες, βίντεο ή ολόκληρα άλμπουμ. Μπορείτε να προστατεύσετε την ίδια την εφαρμογή ή να κλειδώσετε συγκεκριμένες λειτουργίες της. Για παράδειγμα, δεν μπορείτε να διαγράψετε ένα αρχείο χωρίς χρήση των δακτυλικών αποτυπωμάτων, συμβάλλοντας στην προστασία των αρχείων σας από τυχαία διαγραφή. - Δείτε την πλήρη σειρά των Simple Tools εδώ: + Δείτε την πλήρη σειρά των Απλών Εργαλείων εδώ: https://www.simplemobiletools.com + Αποκλειστική ιστοσελίδα της Απλή Συλλογή Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f64c4896c..e71a156ae 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -31,6 +31,7 @@ Fijar fecha de toma Fijando… Fecha fijada correctamente + No se han encontrado valores de fechas tomadas Comparte una versión redimensionada Oye,\n\nParece que actualizaste de la aplicación gratuita vieja. Ahora puedes desinstalar la versión vieja, que tiene un botón \'Actualizar a Pro\' en la aprte superior de los ajustes de la app.\n\nSolo tendrás los elementos de la Papelera de Reciclaje eliminados, favoritos desmarcados y también tendrás que reiniciar los ajustes de la app.\n\n¡Gracias! Cambiar a la búsqueda de archivos en todas las carpetas visibles @@ -82,6 +83,7 @@ Ruta Ruta de imagen no válida Falló la edición de imagen + Edición de imagen cancelada Fichero editado satisfactoriamente Editar imagen usando: No se encontró editor de imágenes @@ -292,7 +294,7 @@ ¿Cómo puedo hacer que un álbum siempre aparezca en la parte superior? Puede aguantar pulsado el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado. ¿Cómo puedo avanzar videos? - Puede arrastrar el dedo horizontalmente sobre el reproductor de video, o hacer clic en los textos de duración actual o máxima cerca de la barra de búsqueda, que moverán el video hacia atrás o hacia adelante. + Puede hacerlo tocando dos veces el costado de la pantalla o tocando los textos de duración actual o máxima cerca de la barra de búsqueda. Si habilita la apertura de videos en una pantalla separada en la configuración de la aplicación, también puede usar gestos horizontales. ¿Cuál es la diferencia entre ocultar y excluir una carpeta? Excluir evita mostrar la carpeta solo en Simple Gallery, mientras que Ocultar funciona en el sistema y oculta la carpeta de otras galerías también. Funciona al crear un archivo \".nomedia \" vacío en la carpeta determinada, que luego puede eliminar también con cualquier administrador de archivos. ¿Por qué aparecen las carpetas con la portada de la música o las pegatinas? @@ -367,6 +369,9 @@ Mira la suite completa de Simple Tools aquí: https://www.simplemobiletools.com + Sitio web de Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index ec6c7a99e..ee4727560 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -31,6 +31,7 @@ Fix Date Taken value Fixing… Dates fixed successfully + No Date Taken values have been found Share a resized version Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Polku Kuvan polkua ei ole Kuvan muokkaus epäonnistui + Image editing cancelled File edited successfully Muokkaa kuvaa: Kuvamuokkainta ei löytynyt @@ -291,8 +293,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. - How can I fast-forward videos? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2f372892e..d17748eff 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -31,6 +31,7 @@ Corriger les dates de prise de vue Correction en cours… Dates corrigées + Aucune date de prise de vue trouvée Partager une version redimensionnée Hé,\n\nvous avez apparemment fait une mise à niveau à partir de l\'ancienne application gratuite. Vous pouvez maintenant désinstaller l\'ancienne version avec le bouton \'Mettre à niveau vers Pro\' en haut des paramètres de l\'application.\n\nVos éléments de la corbeille seront supprimés, les éléments favoris seront non marqués et vous devrez également restaurer les paramètres de votre application.\n\nMerci ! Basculer vers la recherche de fichiers @@ -82,6 +83,7 @@ Emplacement Emplacement invalide L\'édition de l\'image a échoué + L\'édition de l\'image a été annulé L\'image a été éditée avec succès Modifier l\'image avec: Aucun éditeur d\'image trouvé @@ -291,7 +293,7 @@ Comment faire pour qu\'un album soit toujours affiché tout en haut ? Vous devez simplement à effectuer un appui prolongé sur l\'album en question et choisir l\'icône \"Épingler\" 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. Comment avancer rapidement dans les vidéos ? - Vous pouvez soit faire glisser votre doigt horizontalement sur le lecteur vidéo, soit cliquer sur le texte en cours ou la durée maximale près de la barre de recherche. Cela déplacera la vidéo vers l\'arrière ou vers l\'avant. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Quelle est la différence entre cacher et exclure un dossier ? \"Exclure un dossier\" permet de ne pas l\'afficher uniquement dans Simple Gallery, alors que \"Cacher un dossier\" rend le dossier invisible sur l\'ensemble de l\'appareil, y compris 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. Pourquoi des dossiers avec des pochettes d\'albums musicaux ou des miniatures d\'images sont affichés ? @@ -365,6 +367,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index dc9b48aa7..fa5ae19d5 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -31,6 +31,7 @@ Fix Date Taken value Fixing… Dates fixed successfully + No Date Taken values have been found Share a resized version Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Ruta Ruta a imaxe non válida Fallo na edición da imaxe + Image editing cancelled File edited successfully Editar imaxe con: Non se atopou ningún editor @@ -292,7 +294,7 @@ Cómo podo facer que un álbume apareza sempre arriba de todo? Pode manter premido o álbume e escoller a icona de Fixar no menú de accións, esto fixarao arriba. Pode fixar varios cartafoles tambén, os elementos fixados estarán ordenados polo criterio por omisión. Cómo podo aumentar a velocidade de reprodución de vídeo? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Cal é a diferenza entre agochar e excluír un cartafol? A Exclusión prevén que se mostre o cartafol só en Simple Gallery, mentras Agochar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Esto funciona creando un ficheiro baldeiro de nome \".nomedia\" no cartafol, que tamén pode quitar con calquer xestor de ficheiros. Por qué aparecen cartafoles de música con portadas ou pegatinas? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index ebb3c745c..f27f92a1b 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -31,6 +31,7 @@ Ispravi vrijednost datuma snimanja Popravljam… Datumi uspješno popravljeni + No Date Taken values have been found Share a resized version Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Putanja Neispravna putanja slike Uređivanje slika nije uspjelo + Image editing cancelled File edited successfully Uredi sliku pomoću: Nije pronađen uređivač slika @@ -292,7 +294,7 @@ Kako postići da je album uvijek na vrhu? Dugo pritisnute željeni album i odaberite ikonu igle na akcijskom izborniku, koji će ga pričvrstiti na vrh. Možete prikvačiti više mapa odjednom, prikvačene stavke će biti razvrstane prema zadanom načinu razvrstavanja. Kako mogu ubrzati video? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Koja je razlika između skrivanja i izuzimanja mape? Izuzimanje sprječava prikaz mape samo u Jednostavnoj galeriji, a skrivanje radi na razini sustava i skriva mapu iz drugih galerija. Djeluje stvaranjem praznih \".nomedia\" datoteka u zadanoj mapi, koju možete ukloniti pomoću bilo kojeg upraviteljem datoteka. Zašto se prikazuju mape s naslovnicama albuma i minijaturama slika? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index b052836be..524da5e32 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -31,6 +31,7 @@ Dátum javítása Javítás... Sikeres dátum javítás + No Date Taken values have been found Átméretezett verzió megosztása Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Váltás a fájlkeresésre az összes látható mappában @@ -82,6 +83,7 @@ Elérési útvonal Érvénytelen kép elérési útvonal Sikertelen kép szerkesztés + Image editing cancelled A fájl szerkesztése sikerült Kép szerkesztés ezzel: Nem található kép szerkesztő @@ -295,7 +297,7 @@ A következő alkalommal, amikor megpróbál megnyitni egy képet vagy videót, Hogyan állíthatok be egy albumot úgy, hogy mindig felül legyen? Hosszan nyomja meg a kívánt albumot, és válassza ki a Kitűzés ikont a művelet menüben, ami rögzíti felülre. Többféle mappát is kitűzhet, ezeket az elemeket az alapértelmezett rendezési mód szerint rendezi. Hogyan tudom előre tekerni a videókat? - Húzhatja az ujját vízszintesen a videolejátszón, vagy kattintson az aktuális vagy a max. időtartam szövegekre a keresősáv közelében. Ez visszafelé vagy előre mozgatja a videót. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Mi a különbség a mappa elrejtése és kizárása között? A Kizárás megakadályozza, hogy a mappát a Simple Gallery megjelenítse, az Elrejtés pedig rendszer szinten működik, és elrejti a mappát más galériákból is. Úgy működik, hogy létrehoz egy üres \". nomedia\" nevű fájlt az adott mappában, amelyet bármikor eltávolíthat bármilyen fájlkezelővel is. Miért jelennek meg a zenei borítóval vagy matricával rendelkező mappák? diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 6536c8373..314d1c2aa 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -31,6 +31,7 @@ Perbaiki Tanggal Diambil Memperbaiki… Tanggal berhasil diperbaiki + No Date Taken values have been found Bagikan versi yang diubah ukurannya Hai,\n\nsepertinya anda memperbarui dari aplikasi gratis versi lama. Anda sekarang bisa mencopot versi yang lama, yang ada tombol \'Tingkatkan ke Pro\' di bagian atas pengaturan aplikasi.\n\nHanya item Keranjang sampah yang akan dihapus, item favorit menjadi tak bertanda dan anda juga harus menyetel ulang pengaturan aplikasi.\n\nTerima kasih! Beralih ke pencarian berkas di semua folder yang terlihat @@ -82,6 +83,7 @@ Jalur Jalur gambar tidak valid Gagal menyunting gambar + Image editing cancelled File edited successfully Sunting gambar dengan: Tidak ditemukan aplikasi penyunting gambar @@ -292,7 +294,7 @@ Bagaimana agar album selalu muncul paling atas di dalam daftar? Anda bisa menekan lama album tersebut dan pilih ikon Pin di menu tindakan, hal tersebut akan membuat album tetap berada di bagian paling atas daftar. Anda juga bisa menyematkan beberapa folder, item yang di-pin akan diurutkan berdasarkan metode urutan default. Bagaimana cara mempercepat laju video? - Anda bisa menyeret jari anda secara horizontal pada pemutar video, atau klik pada teks durasi saat ini atau maks dekat bilah laju. Hal tersebut akan memundurkan atau memajukan laju video. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Apa perbedaan antara menyembunyikan dan mengecualikan folder? Mengecualikan tidak akan menampilkan folder di Simple Gallery saja, sedangkan Sembunyikan bekerja sesuai aturan sistem dan akan menyembunyikan folder dari aplikasi galeri yang lain. Cara kerjanya dengan membuat berkas \".nomedia\" kosong pada folder yang diinginkan, yang bisa anda hapus juga dengan aplikasi pengelola berkas. Mengapa folder dengan gambar album musik atau stiker muncul? @@ -367,6 +369,9 @@ Lihat semua aplikasi Simple Tools di sini: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 21a731990..a7d39d9ad 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -31,6 +31,7 @@ Perbaiki Tanggal Diambil Memperbaiki… Tanggal berhasil diperbaiki + No Date Taken values have been found Bagikan versi yang diubah ukurannya Hai,\n\nsepertinya anda memperbarui dari aplikasi gratis versi lama. Anda sekarang bisa mencopot versi yang lama, yang ada tombol \'Tingkatkan ke Pro\' di bagian atas pengaturan aplikasi.\n\nHanya item Keranjang sampah yang akan dihapus, item favorit menjadi tak bertanda dan anda juga harus menyetel ulang pengaturan aplikasi.\n\nTerima kasih! Beralih ke pencarian berkas di semua folder yang terlihat @@ -82,6 +83,7 @@ Jalur Jalur gambar tidak valid Gagal menyunting gambar + Image editing cancelled File edited successfully Sunting gambar dengan: Tidak ditemukan aplikasi penyunting gambar @@ -292,7 +294,7 @@ Bagaimana agar album selalu muncul paling atas di dalam daftar? Anda bisa menekan lama album tersebut dan pilih ikon Pin di menu tindakan, hal tersebut akan membuat album tetap berada di bagian paling atas daftar. Anda juga bisa menyematkan beberapa folder, item yang di-pin akan diurutkan berdasarkan metode urutan default. Bagaimana cara mempercepat laju video? - Anda bisa menyeret jari anda secara horizontal pada pemutar video, atau klik pada teks durasi saat ini atau maks dekat bilah laju. Hal tersebut akan memundurkan atau memajukan laju video. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Apa perbedaan antara menyembunyikan dan mengecualikan folder? Mengecualikan tidak akan menampilkan folder di Simple Gallery saja, sedangkan Sembunyikan bekerja sesuai aturan sistem dan akan menyembunyikan folder dari aplikasi galeri yang lain. Cara kerjanya dengan membuat berkas \".nomedia\" kosong pada folder yang diinginkan, yang bisa anda hapus juga dengan aplikasi pengelola berkas. Mengapa folder dengan gambar album musik atau stiker muncul? @@ -367,6 +369,9 @@ Lihat semua aplikasi Simple Tools di sini: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 34eb9b92c..bf92f199c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -31,6 +31,7 @@ Correggi valore Data acquisizione Correzione in corso… Date aggiornate correttamente + No Date Taken values have been found Condividi una versione ridimensionata Hey,\n\nhai aggiornato dalla vecchia versione gratuita. Puoi disinstallare le vecchia versione, che ha un pulsante \'Aggiorna a Pro\' in alto nelle impostazioni.\n\nNon potrai recuperare gli elementi dal cestino, gli elementi marcati come preferiti e dovrai anche reimpostare le impostazioni dell\'app.\n\nGrazie! Passa alla ricerca file su tutte le cartelle visibili @@ -82,6 +83,7 @@ Percorso Percorso dell\'immagine non valido Modifica dell\'immagine fallita + Image editing cancelled File edited successfully Modifica immagine con: Editor delle immagini non trovato @@ -292,7 +294,7 @@ Come posso fare apparire un album sempre in cima? Si può toccare a lungo l\'album desiderato e selezionare l\'icona puntina nel menù azioni, ciò lo fisserà in cima. Si possono anche fissare varie cartelle, gli elementi fissati saranno ordinati dal metodo di ordinamento predefinito. Come avanzo velocemente nei video? - Si possono trascinare le proprie dita orrizontalmente sul video, oppure cliccando i testi accanto alla barra di avanzamento. In questo modo il video andrà avanti o indietro. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Che differenza c\'è tra nascondere ed escludere una cartella? Escludere impedisce la visualizzazione della cartella solo in Semplice Galleria, mentre nascondere ha effetto in tutto il sistema e nasconde la cartella anche alle altre gallerie. Funziona creando un file vuoto \".nomedia\" nella cartella in questione, si possono anche rimuovere successivamente con qualsiasi gestore dei file. Perchè vengono mostrate cartelle con copertine o adesivi di musica? @@ -367,6 +369,9 @@ Controlla le altre applicazioni qui: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f35577c8c..d4f8effec 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -31,6 +31,7 @@ 撮影日の値を修正 修正中… 撮影日が正常に修正されました + No Date Taken values have been found リサイズした画像を共有 あなたは無料版からアップグレードしたと思われます。\"Upgrade to Pro\"というボタンが設定の上部にある無料版はアンインストールすることができます。\n\nごみ箱の中身は削除され、お気に入りもアプリの設定もリセットされることになります。\n\nありがとう! 表示されているすべてのフォルダで検索 に切り替え @@ -82,6 +83,7 @@ パス 無効な画像パス 画像の編集に失敗しました + Image editing cancelled ファイルの編集に成功しました 画像を編集: 画像エディターが見つかりません @@ -292,7 +294,7 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. 動画を早送りするにはどうすればよいですか? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index bf2c14a64..866bded0e 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -31,6 +31,7 @@ 찍은 날짜 값 교정 교정 중... 교정이 완료되었습니다 + No Date Taken values have been found 크기변경 버전 공유 Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ 경로 유효하지 않은 사진 경로 사진 편집 실패 + Image editing cancelled File edited successfully 사진 편집 프로그램 연결: 사진 편집 프로그램 없음 @@ -291,8 +293,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. - How can I fast-forward videos? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 7a8138d85..2384a7e76 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -31,6 +31,7 @@ Fix Date Taken value Fixing… Dates fixed successfully + No Date Taken values have been found Share a resized version Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Kelias Netinkamas atvaizdo kelias Atvaizdo redagavimas nepavyko + Image editing cancelled File edited successfully Redaguoti atvaizdą su: Nerasta atvaizdų redagavimo programėlės @@ -292,7 +294,7 @@ Kaip aš galiu padaryti albumą visada rodomą viršuje? Galite ilgai paspausti norimą albumą ir pasirinkti "Prisegti" piktogramą, esančią meniu "Veiksmo meniu", viršuje. Galite prisegti kelis aplankus, prisegti elementai bus rūšiuojami pagal numatytąjį rūšiavimo metodą. Kaip galėčiau greitai prasukti vaizdo įrašus? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Koks skirtumas tarp slėpimo ir išskyrimo iš aplanko? Išskyrimas neleidžia rodyti aplanko tik paprastoje galerijoje, tuo tarpu slėpimas slepia aplanką iš kitų galerijų. Tai veikia, sukuriant tuščią \ ". Nomedia \" bylą tam tikrame aplanke, kurį vėliau galite pašalinti bet kuria bylų tvarkykle. Kodėl pasirodo aplankai su muzikos viršeliu ar lipdukais? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index e0172c233..305493c05 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -31,6 +31,7 @@ Korriger Dato tatt-verdi Korrigerer… Datoer er korrigerte + No Date Taken values have been found Del versjon med endret størrelse Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Skift til filsøk i alle synlige mapper @@ -82,6 +83,7 @@ Bane Ugyldig bildebane Bilderedigering feilet + Image editing cancelled Fil vellykket redigert Rediger bilde med: Ingen bilderedigeringsapp funnet @@ -226,16 +228,16 @@ Fokus Ingen Radial - Linear - Mirrored - Gaussian + Lineær + Speilet + Gaussisk Tekst Tekstvalg Tekstfarge Skrift Legg til Rediger - Straighten + Rette Skrift Farge Bakg.farge @@ -250,38 +252,38 @@ Til front Slett Penselfarge - Editor - Close Editor? - Do you really want to discard the image? - Yes - No - Cancel - Accept - Save - Exporting image… - Exporting image %s. - Flip H - Flip V - Undo - Redo - Color Picker - Transparent - White - Gray - Black - Light blue - Blue - Purple - Orchid - Pink - Red + Redigering + Lukke Redigering? + Vil du forkaste bildet? + Ja + Nei + Avbryt + Aksepter + Lagre + Eksporterer bilde… + Eksporterer bilde %s. + Speilvend H + Speilvend V + Angre + Annuler angre + Fargevelger + Gjennomsiktig + Hvit + Grå + Svart + Lyseblå + Blå + Lilla + Orkide + Rosa + Rød Orange - Gold - Yellow - Olive - Green - Aquamarin - Pipettable color + Gull + Gul + Oliven + Grønn + Akvamarin + Pipettefarge How can I make Simple Gallery the default device gallery? @@ -291,8 +293,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. - How can I fast-forward videos? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 68e3e162f..ed0704c7b 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -31,6 +31,7 @@ Fix Date Taken value Fixing… Dates fixed successfully + No Date Taken values have been found Share a resized version Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Path Invalid image path Image editing failed + Image editing cancelled File edited successfully Edit image with: No image editor found @@ -291,8 +293,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. - How can I fast-forward videos? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 922dd0b3f..cb41c176c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -31,6 +31,7 @@ Datum opname corrigeren Corrigeren… Datums zijn gecorrigeerd + Geen opnamedatums gevonden Verkleinde versie delen Het lijkt erop dat dit een upgrade is vanaf de oude gratis versie. Deze oude versie, met de knop \"Upgraden naar Pro\" bovenaan de instellingen, kan nu gedeïnstalleerd worden.\n\nDe items in de prullenbak zullen dan wel worden verwijderd, favorieten en instellingen zullen ook opnieuw moeten worden geconfigureerd. Zoeken in alle zichtbare mappen @@ -82,6 +83,7 @@ Pad Ongeldig pad naar afbeelding Fout bij bewerken van afbeelding + Afbeelding bewerken is geannuleerd Wijzigingen zijn opgeslagen Afbeelding bewerken met: Geen app gevonden voor fotobewerking @@ -292,7 +294,7 @@ Hoe kan ik een map bovenaan vastzetten? Druk lang op het map en kies vervolgens de punaise in het actiemenu. Als er meerdere mappen zijn vastgezet, zullen deze worden weergeven op basis van de standaardsortering. Hoe kan ik terug- of vooruitspoelen in video’s? - Sleep horizontaal over de videospeler, of klik bij de zoekbalk op de cijfers die de huidige voortgang of de lengte weergeven. Hierbij zal de video respectievelijk terug- of vooruitspringen. + Dubbelklik op de zijkant van het scherm, of tik op de cijfers die de voortgang of de lengte van de video weergeven om resp. terug of vooruit te springen. Als de instelling om video\'s in een apart scherm te openen is ingeschakeld, dan kunnen ook horizontale veeggebaren worden gebruikt. Wat is het verschil tussen het verbergen en het uitsluiten van mappen? Met \"Uitsluiten\" wordt het tonen van de map alleen binnen deze app voorkomen, terwijl \"Verbergen\" de map ook zal verbergen voor andere galerij-apps. Met \"Verbergen\" wordt een bestand genaamd \".nomedia\" in de te verbergen map aangemaakt (het verwijderen van dit bestand uit de map maakt het verbergen ongedaan). Waarom zie ik mappen met stickers of covers van muziekalbums? @@ -367,6 +369,9 @@ Kijk ook eens naar de hele collectie apps van Simple Tools: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 62cbd7aad..ce7dfc8ab 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -31,9 +31,10 @@ Napraw datę utworzenia Naprawiam… Daty zostały naprawione + Nie znaleziono wartości dat utworzenia Udostępnij zmienioną wersję - Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! - Switch to file search across all visible folders + Hej,\n\nwygląda na to że zaktualizowałeś ze starszej, darmowej wersji aplikacji. Możesz ją teraz odinstalować przyciskiej \'Upgrade to Pro\' w ustawieniach.\n\nZostaną jedynie usunięte elementy z Kosza, odznaczone Ulubione i konieczne będzie zresetowanie ustawień aplikacji.\n\nDziękujemy! + Przełącz na przeszukiwanie plików we wszystkich widocznych folderach Filtruj multimedia @@ -42,7 +43,7 @@ GIFy Obrazy RAW Obrazy SVG - Portraits + Portrety Nie znaleziono multimediów zgodnych z zastosowanymi filtrami. Zmień filtry @@ -65,7 +66,7 @@ Zarządzaj dołączonymi folderami Dodaj folder Jeśli masz jakieś foldery z multimediami, ale aplikacja ich nie wykryła, możesz je dodać ręcznie tutaj. - No media files have been found. You can solve it by adding the folders containing media files manually. + Nie znaleziono plików z multimediami. Możesz to naprawić poprzez dodanie folderów ręcznie. Zmień rozmiar @@ -82,7 +83,8 @@ Ścieżka Nieprawidłowa ścieżka Edycja obrazu nie powiodła się - File edited successfully + Anulowano edycję obrazu + Plik wyedytowany Edytuj obraz w: Nie znalazłem edytora zdjęć Nieznana lokalizacja pliku @@ -118,10 +120,10 @@ Losowa kolejność Odwrotna kolejność Zapętlaj - Animation - None - Fade - Slide + Animacja + Brak + Przenikanie + Przesuwanie Pokaz slajdów zakończony Nie znalazłem multimediów do pokazu slajdów @@ -136,11 +138,11 @@ Nie grupuj plików Folderu Daty ostatniej modyfikacji - Last modified (daily) - Last modified (monthly) + Daty ostatniej modyfikacji (dniami) + Daty ostatniej modyfikacji (miesiącami) Daty utworzenia - Date taken (daily) - Date taken (monthly) + Data utworzenia (dniami) + Data utworzenia (miesiącami) Typu Rozszerzenia Uwaga: grupowanie i sortowanie to dwa niezależne pola @@ -189,7 +191,7 @@ Szybkość Kompromis Unikaj pokazywania niewłaściwych plików - Show image file types + Pokazuj rozszerzenia zdjęć Miniatury @@ -203,85 +205,85 @@ Widoczność plików - Custom - Reset - Square - Transform - Filter - None - Adjust - Shadows - Exposure - Highlights - Brightness - Contrast - Saturation - Clarity + Własne + Resetuj + Kwadrat + Transformacja + Filtr + Brak + Dopasuj + Cienie + Ekspozycja + Światła + Jasność + Kontrast + Nasycenie + Klarowniść Gamma - Blacks - Whites - Temperature - Sharpness - Reset + Czerń + Biel + Temperatura + Ostrość + Resetuj Focus - None - Radial - Linear - Mirrored - Gaussian - Text - Text Options - Text Color - Font - Add - Edit - Straighten - Font - Color - BG Color - Alignment - To Front - Delete - Your text - Brush - Color - Size - Hardness - To Front - Delete - Brush Color - Editor - Close Editor? - Do you really want to discard the image? - Yes - No - Cancel - Accept - Save - Exporting image… - Exporting image %s. - Flip H - Flip V - Undo - Redo - Color Picker - Transparent - White - Gray - Black - Light blue - Blue - Purple - Orchid - Pink - Red - Orange - Gold - Yellow - Olive - Green - Aquamarin - Pipettable color + Brak + Radialny + Linearny + Lustrzany + Gaussa + Tekst + Opcje tekstu + Kolor tekstu + Czcionka + Dodaj + Edytuj + Wyprostuj + Czcionka + Kolor + Kolor tła + Wyrównanie + Do przodu + Usuń + Twój tekst + Pędzel + Kolor + Rozmiar + Twardość + Do przodu + Usuń + Kolor pędzla + Edytor + Zamknąć edytor? + Odrzucić zmiany w obrazie? + Tak + Nie + Anuluj + Zaakceptuj + Zapisz + Eksport obrazu… + Wyeksportowano obraz %s. + Odbij w poziomie + Odbij w pionie + Cofnij + Ponów + Wybieracz kolorów + Przezroczysty + Biały + Szary + Czarny + Jasnoniebieski + Niebieski + Fioletowy + Orchidea + Różowy + Czerwony + Pomarańczowy + Złoty + Żółty + Oliwkowy + Zielony + Akwamaryna + Kolor pipety Jak mogę ustawić tą aplikację jako domyślną aplikację galerii? @@ -291,7 +293,7 @@ Jak sprawić, aby album(y) zawsze pojawiał(y) się na górze? Przytrzymaj album(y) i wybierz ikonę przypięcia w pasku akcji. Jak mogę przwijać filmy? - Na dwa sposoby: albo przeciągając poziomo palcem po filmie, albo klikając obecny (przewinięcie do tyłu) lub całkowity czas trwania (do przodu). + Możesz to osiągnąć dotykając dwa razu z boku ekranu, lub dotykając aktualnej lub makysmalnej długości tekstu przy pasku wyszukiwania. Jeśli włączysz w ustawieniach otwieranie video na nowym ekranie, możesz też używać gestów poziomych. Jaka jest różnica między ukryciem, a wykluczeniem folderu? Wykluczenie działa tylko w obrębie niniejszej aplikacji (wszędzie indziej pliki są normalnie widoczne), ukrywanie - w obrębie całego systemu (nie widać ich nigdzie), dodawany jest wtedy do folderu pusty plik \'.nomedia\', który możesz usunąć w dowolnym menedżerze plików. Dlaczego pokazują mi się foldery z okładkami do piosenek i tym podobne rzeczy? @@ -310,8 +312,8 @@ Obecne rozwiązanie służące wyświetlaniu obrazów działa jak powinno w większości w przypadków. Jeśli jednak tak nie jest, pomocna może okazać się opcja \'Pokazuj obrazy w najwyższej możliwej jakości\' w sekcji \'Duże powiększanie obrazów\'. Mam ukryte pliki i / lub foldery. Jak mogę zobaczyć? Możesz to zrobić albo wybierając opcję \'Tymczasowo pokaż ukryte multimedia\' w menu na ekranie głównym, lub \'Pokazuj ukryte elementy\' w ustawieniach. Foldery są ukrywane poprzez dodanie do nich pustego, ukrytego pliku \'.nomedia\'. Usunąć go możesz dowolnym menedżerem plików. - Why does the app take up so much space? - App cache can take up to 250MB, it ensures quicker image loading. If the app is taking up even more space, it is most likely caused by you having items in the Recycle Bin. Those files count to the app size. You can clear the Recycle bin by opening it and deleting all files, or from the app settings. Every file in the Bin is deleted automatically after 30 days. + Dlaczego aplikacja zajmuje tak dużo miejsca? + Pamięć podręczna aplikacji zajmuje do 250MB, zapewniając szybsze ładowanie obrazów. Aplikacja może zajmować więcej miejsca przez elementy w Koszu, które doliczane są do rozmiaru aplikacji. Wyczyść Kosz przez otwarcie go i usunięcie wszystkich elementów, lub z poziomu ustawień aplikacji. Każdy plik w Koszu jest też automatycznie usuwany po 30 dniach. @@ -365,6 +367,9 @@ Sprawdź cały zestaw naszych aplikacji: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Odwiedź nasz profil na Facebooku... https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f76355c3e..0be9a127e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -5,15 +5,15 @@ Editar Abrir câmera (oculto) - (excluído) + (ignorado) Fixar pasta Desafixar pasta Fixar no topo - Mostrar conteúdo de todas as pastas + Exibir conteúdo de todas as pastas Todas as pastas Alternar para a visualização de pastas Outra pasta - Mostrar no mapa + Exibir no mapa Localização desconhecida Aumentar número de colunas Reduzir número de colunas @@ -31,8 +31,9 @@ Corrigir data da foto Corrigindo… Datas corrigidas com sucesso + No Date Taken values have been found Compartilhar uma versão redimensionada - Olá,\n\nparece que você atualizou o antigo aplicativo gratuito. Agora você poderá desinstalar a velha versão que tem o botão de atualizar para a versão Pro no topo das Configurações.\n\nVocê terá os itens da Lixeira excluídos, itens favoritos desmarcados e também terá que redefinir as configurações do seu aplicativo.\n\nObrigado! + Olá,\n\nparece que você está atualizando do antigo aplicativo gratuito. Agora você já pode desinstalar a versão antiga, que tem o botão de atualizar para a versão Pro no topo da pagina de Configurações.\n\nVocê terá os itens da Lixeira excluídos, itens favoritos desmarcados e também terá que redefinir as configurações do seu aplicativo.\n\nObrigado! Alternar para a pesquisa de arquivos em todas as pastas visíveis @@ -47,25 +48,25 @@ Alterar filtros - Esta opção oculta a pasta com a adição de um arquivo \".nomedia\" dentro dela, o que também ocultará todas as subpastas que estejam dentro da mesma. Você poderá voltar a exibir estas pastas com a opção \"Mostrar pastas ocultas\". Continuar? + Esta opção oculta a pasta ao adicionar um arquivo \".nomedia\" dentro dela, o que também ocultará todas as suas subpastas. Você poderá voltar a exibir estas pastas com a opção \"Exibir pastas ocultas\". Continuar? Ignorar Pastas ignoradas Gerenciar pastas ignoradas - Esta ação deixará de exibir as pastas selecionadas apenas dentro deste aplicativo. Você pode gerenciar as pastas ignoradas nas Configurações do aplicativo. + Esta ação deixará de exibir as pastas selecionadas apenas dentro deste aplicativo. Você pode gerenciar as pastas ignoradas nas configurações do aplicativo. Ignorar a pasta raiz ao invés desta? - Ignorar uma pasta apenas deixa de exibi-la nesta galeria. Ela continuará visível para outros aplicativos.\n\nSe você quiser ocultar a pasta para todos os aplicativos, utilize a função ocultar. + Ignorar uma pasta apenas deixa de exibi-la nesta galeria. Ela continuará visível para outros aplicativos.\n\nSe você quiser ocultar a pasta para todos os aplicativos, utilize a função Ocultar. Remover todas Remover todas as pastas da lista de pastas ignoradas? Esta ação não exclui as pastas. Pastas ocultas Gerenciar pastas ocultas - Parece que você não tem nenhuma pasta ocultada por um arquivo \".nomedia\". + Parece que você não tem nenhuma pasta oculta por um arquivo \".nomedia\". - Pastas incluídas - Gerenciar pastas incluídas + Pastas inclusas + Gerenciar pastas inclusas Adicionar pasta - Se você possuir pastas com dados multimídia não reconhecidos pelo aplicativo, aqui você pode adicioná-las manualmente. - Nenhum arquivo de mídia foi encontrado. Como alternativa você pode tentar incluir manualmente as pastas com arquivos de mídia. + Se você possuir pastas contendo mídia, mas que não foram reconhecidas pelo aplicativo, aqui você pode adicioná-las manualmente. + Nenhum arquivo de mídia foi encontrado. Você pode resolver isso incluindo manualmente as pastas com arquivos de mídia. Redimensionar @@ -82,10 +83,11 @@ Caminho Caminho inválido Falha na edição da imagem + Image editing cancelled Arquivo editado com sucesso Editar imagem com: - Editor não encontrado - Localização desconhecida + Nenhum editor de imagem encontrado + Localização de arquivo desconhecida Não foi possível substituir o arquivo original Girar para a esquerda Girar para a direita @@ -101,7 +103,7 @@ Definir como papel de parede Falha ao definir como papel de parede Definir papel de parede com: - Definindo como papel de parede + Definindo como papel de parede… Papel de parede definido com sucesso Retrato Paisagem @@ -116,7 +118,7 @@ Incluir vídeos Incluir GIFs Ordem aleatória - Retroceder + Ordem inversa Apresentação em ciclo Animação Nenhuma @@ -151,8 +153,8 @@ Reproduzir vídeos automaticamente - Lembrar da última posição de reprodução de vídeo - Mostrar/ocultar nome do arquivo + Lembrar posição da última reprodução de vídeo + Exibir/ocultar nome do arquivo Reproduzir vídeos em ciclo Animar GIFs nas miniaturas Maximizar o brilho ao visualizar mídia em tela cheia @@ -162,48 +164,48 @@ Padrão do sistema Sensor do aparelho Proporção da mídia - Fundo de tela e barra de status preta quando em visualização de tela cheia + Fundo preto quando mídia estiver em tela cheia Rolar miniaturas horizontalmente Esconder interface do sistema quando em tela cheia Apagar pastas vazias após excluir o seu conteúdo - Permitir controle do brilho com gestos na vertical - Permitir controle do volume e brilho com gestos na vertical - Mostrar quantidade de arquivos em cada pasta na tela inicial + Habilitar controle do brilho com gestos na vertical + Habilitar controle de volume e brilho com gestos na vertical + Exibir quantidade de arquivos em cada pasta na tela inicial Exibir detalhes adicionais quando em tela cheia Gerenciar detalhes adicionais - Permitir zoom com um dedo quando em exibição de tela cheia - Tocar na lateral da tela navega para a próxima imagem ou vídeo - Permitir zoom aprofundado para imagens - Ocultar detalhes adicionais quando a barra de status estiver oculta - Mostrar alguns botões de ação na parte inferior da tela - Mostrar a Lixeira na tela inicial + Habilitar zoom com um dedo em exibição de tela cheia + Habilitar a troca de mídia tocando nas laterais da tela + Habilitar zoom aprofundado para imagens + Ocultar detalhes adicionais quando a barra de status estiver escondida + Exibir alguns botões de ação na parte inferior da tela + Exibir a Lixeira na tela inicial Zoom aprofundado para imagens - Mostrar imagens na maior qualidade possível - Mostrar a Lixeira como o último item na tela inicial - Gesto para baixo sai da exibição em tela cheia - Dois toques duplos fazem zoom 1:1 + Exibir imagens na maior qualidade possível + Exibir a Lixeira como o último item na tela inicial + Habilitar fechar a exibição em tela cheia com um gesto para baixo + Habilitar zoom 1:1 com dois toques duplos Sempre abrir vídeos em uma tela separada com novos gestos horizontais - Mostrar o notch, se existente - Permitir rotação de imagens com gestos + Exibir o notch, se existente + Habilitar rotação de imagens com gestos Prioridade de carregamento de arquivos Velocidade Meio termo Evitar a exibição de arquivos inválidos - Mostrar tipos de arquivo de imagem + Exibir tipos de arquivo de imagem Miniaturas Mídia em tela cheia Detalhes adicionais - Botões de ação + Barra inferior - Gerenciar botões de ação - Favoritar/Desfavoritar - Exibir/Ocultar arquivo + Gerenciar botões visíveis + Favoritar/desfavoritar + Exibir/ocultar arquivo - Personalizadar + Personalizar Redefinir Quadrado Modificar @@ -284,43 +286,45 @@ Cor pipetável - O que devo fazer para que a Simple Galeria seja o aplicativo de galeria padrão do meu aparelho? - Primeiro, você deve encontrar o aplicativo padrão atual nas configurações do seu aparelho, e apertar o botão que diz "Limpar Padrões". - Na próxima vez que você abrir uma imagem ou vídeo, você deverá ver um seletor do aplicativo, no qual você terá a oportunidade de selecionar a Simple Galeria como o app padrão. - Eu protegi o app com senha, mas me esqueci da senha. O que posso fazer? - Você pode resolver isto de duas formas. A primeira é reinstalar o aplicativo. A segunda é ir nas configurações do seu dispositivo e selecionar a opção "Restaurar preferências do app". - Como posso fazer para que uma pasta sempre apareça no topo da lista? - Faça um toque longo na pasta em questão, e depois toque no ícone de alfinete na parte superior da tela para fixar a pasta ao topo. Se você fixar múltiplas pastas, elas serão ordenadas de acordo como seu critério de ordenação padrão. - Como faço para avançar rapidamente um vídeo (fast-forward)? - Você pode fazer um gesto horizontal como dedo, ou tocar nos números de tempo atual ou tempo total do vídeo, que se encontram próximos à barra de posicionamento. + Como posso fazer do Simple Galeria a galeria padrão do dispositivo? + Primeiro, você deve encontrar o aplicativo padrão atual nas configurações do seu dispositivo, procurar um botão que diga algo como "Abrir por padrão", clicar nele e selecionar \"Limpar padrão\" + Na próxima vez que você abrir uma imagem ou vídeo, você deverá ver um seletor do aplicativo, no qual você terá a oportunidade de selecionar a Simple Galeria como o app padrão. + Eu protegi o app com senha, mas a esqueci. O que posso fazer? + Você pode resolver isto de duas formas. Você pode reinstalar o aplicativo ou ir nas configurações do seu dispositivo e selecionar a opção "Limpar armazenamento". Isto irá redefinir todas as suas configurações, não removerá nenhum arquivo de mídia. + O que posso fazer para que uma pasta sempre apareça no topo da lista? + Faça um toque longo na pasta em questão, e depois toque no ícone de alfinete na parte superior da tela, isto irá fixá-la no topo. Você também pode fixar várias pastas; os itens fixados serão classificados pelo método de ordenação padrão. + Como faço para avançar rapidamente um vídeo (fast forward)? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Qual é a diferença entre ocultar e ignorar uma pasta? - O opção de ignorar deixa de exibir a pasta apenas na Simple Galeria, enquanto a opção de ocultar afeta todo o sistema, e também irá deixar de exibir a pasta em outros apps de galeria. A função de ocultar cria um arquivo vazio chamado \".nomedia\" na raiz da pasta em questão. Caso você queira fazer a pasta voltar a ser exibida, você pode excluir o arquivo \".nomedia\" usando o gerenciador de arquivos. + Ignorar deixa de exibir a pasta apenas no Simple Galeria, enquanto Ocultar afeta todo o sistema e pode ocultar pastas de outras galerias também. A função ocultar funciona adicionando um arquivo vazio chamado \".nomedia\" na pasta em questão, arquivo este você também pode excluir com um gerenciador de arquivos, se quiser. Porque pastas com capas de CD de música ou figurinhas aparecem na lista? - Você pode pedir para a Simple Galeria ignorar estas pastas, adicionando a pasta raiz onde você guarda as suas músicas à lista de pastas ignoradas. Uma maneira de fazer isso é fazer um toque longo em uma destas pastas, e selecionar a opção Ignorar e, em seguida, seleciona a pasta pai. + Pode acontecer de que algumas pastas incomuns apareçam. Você pode utlizar a opção Ignorar nestas pastas, adicionando-as a lista de pastas ignoradas. Uma maneira de fazer isso é realizar um toque longo em uma destas pastas, selecionar a opção Ignorar e, em seguida, selecionar a pasta pai. Uma das minhas pastas não aparece, ou nem todos os seus itens são exibidos. O que posso fazer? Isso pode ocorrer por diversos motivos, mas resolver o problema é fácil. Entre em Configurações --> Gerenciar pastas incluídas, toque no botão \"+\", e selecione a pasta em questão. Como posso fazer para exibir apenas certas pastas? - Adicionar uma pasta à lista de Pastas Incluídas não remove outras pastas da exibição. O que você pode fazer é ir em Configurações -> Gerenciar pastas ignoradas, excluir a pasta raiz \"/\", e finalmente incluir somente as pastas desejadas através de Configurações -> Gerenciar pastas incluídas. + Adicionar uma pasta à lista de Pastas Incluídas não remove outras pastas da exibição. O que você pode fazer é ir em Configurações -> Gerenciar pastas ignoradas, excluir a pasta raiz \"/\", e finalmente incluir somente as pastas desejadas através de Configurações -> Gerenciar pastas incluídas. + Isso tornará apenas as pastas selecionadas visíveis, já que ignorar e incluir são funçoes recursivas e, se uma pasta for ignorada e incluída ao mesmo tempo, ela será exibida. Posso recortar imagens usando este app? Sim, você pode recortar imagens no editor, arrastando os cantos da imagem. Você pode entrar no editor fazendo um toque longo na imagem e selecionando Editar, ou selecionando Editar a partir da visualização de tela cheia. É possível exibir os meus arquivos de mídia em subgrupos ao invés de em uma única grande lista? - Você pode usar a opção \"Agrupar por\" para agrupar os seus arquivos de mídia por data, formato ou outros critérios. Se a opção \"Mostrar conteúdo de todas as pastas\" estiver ativada, você também poderá agrupar por subpasta. + Você pode usar a opção \"Agrupar por\" para agrupar os seus arquivos de mídia por data, formato ou outros critérios. Se a opção \"Exibir conteúdo de todas as pastas\" estiver ativada, você também poderá agrupar por subpasta. A ordenação por Data da Foto não funciona corretamente. O que posso fazer? Isto pode ter ocorrer caso as suas fotos tenham sido copiadas de outro local. Para resolver o problema, você pode selecionar a função \"Corrigir data da foto\" no menu deste aplicativo. Algumas imagens exibem artefatos de exibição, como bandas de cor. Como posso melhorar a qualidade da exibição? - O nosso método atual para a exibição de imagens funciona bem na grande maioria dos casos, mas caso você queira uma qualidade ainda melhor, ative a opção \"Mostrar imagens na maior qualidade possível\" na seção \"Zoom aprofundado para imagens\" das configurações deste aplicativo. + O nosso método atual para a exibição de imagens funciona bem na grande maioria dos casos, mas caso você queira uma qualidade ainda melhor, ative a opção \"Exibir imagens na maior qualidade possível\" na seção \"Zoom aprofundado para imagens\" das configurações deste aplicativo. Eu ocultei um arquivo/pasta. Como posso desfazer isso? - Você pode pressionar no item do menu \"Mostrar temporariamente itens ocultos\", localizado na tela principal. Você também pode alterar para \"Mostrar itens ocultos\" nas configurações do aplicativo e ver os itens escondidos. Se você quiser reexibir, basta pressionar e selecionar \"Mostrar\". As pastas estão ocultas, adicionando um arquivo oculto \".nomedia\" dentro delas e você pode excluir o arquivo com qualquer gerenciador de arquivos também. - Porque este app gasta tanto espaço? - O cache deste app, que garante que as imagens sejam carregadas mais rapidamente, pode gastar até 250 MB. Se o app estiver gastando mais espaço que isso, pode ser por que você tem muitos arquivos na sua Lixeira. Arquivos na Lixeira são removidos permanentemente após 30 dias, mas se sua Lixeira estiver usando muito espaço apesar disso você pode esvaziá-la manualmente. Para fazer isso, você pode abrir a Lixeira e excluir os arquivos dentro dela, ou você pode fazer o mesmo na tela de configurações deste app. + Você pode pressionar o item de menu \"Exibir ocultos temporariamente\" na tela principal, ou ativar \"Exibir itens ocultos\" nas configurações do aplicativo para ver o item oculto. Se você quiser reexibir-lo, basta pressionar e selecionar \"Exibir\". As pastas são ocultas adicionando um arquivo oculto \".nomedia\" dentro delas, arquivo este que você também pode excluir com um gerenciador de arquivos, se quiser. + Porque este app ocupa tanto espaço? + O cache deste app, que garante que as imagens sejam carregadas mais rapidamente, pode ocupar até 250MB. Se o app estiver ocupando mais espaço que isso, pode ser por que você tem muitos arquivos na sua Lixeira. Arquivos na Lixeira são removidos permanentemente após 30 dias, mas se mesmo assim sua Lixeira estiver ocupando muito espaço, você pode esvaziá-la manualmente. Para fazer isso, você pode abrir a Lixeira e excluir os arquivos dentro dela, ou você pode fazer o mesmo na tela de Configurações deste app. Simple Galeria Pro - Gerenciador de Imagens - Browse your memories without any interruptions with this photo and video gallery + Navegue por suas memórias sem distrações com esta galeria de fotos e vídeos A Simple Galeria Pro é uma galeria de imagens e vídeos altamente customizável. Organize e edite suas fotos e vídeos, recupere arquivos movidos para a lixeira, proteja e oculte seus arquivos, e visualize arquivos em uma grande variedade de formatos, incluindo RAW, SVG, e muito mais. + Este app não inclui anúncios ou permissões desnecessárias e também não acessa a internet. Sua privacidade está protegida. ------------------------------------------------- @@ -364,6 +368,9 @@ Dê uma olhada nos nossos outros aplicativos Simple: https://www.simplemobiletools.com + Site dedicado do Simple Galeria Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools @@ -372,7 +379,7 @@ diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 7e387b5c0..674a4617d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -31,6 +31,7 @@ Corrigir data de obtenção A corrigir… Dados corrigidos com sucesso + Não foram encontrados dados para a data de obtenção da fotografia Partilhar foto redimensionada Olá,\n\nparece que você utilizou a opção de atualização existente na versão antiga. Agora já pode desinstalar essa versão antiga.\n\nApenas perderá os itens existentes na reciclagem e os favoritos não assinalados mas também terá que repor as predefinições da aplicação.\n\nObrigado! Trocar para pesquisa de ficheiros em todas as pastas visíveis @@ -82,7 +83,8 @@ Caminho Caminho inválido Falha na edição da imagem - File edited successfully + Edição de imagem cancelada + Imagem editada com sucesso Editar imagem com: Editor não encontrado Localização desconhecida @@ -240,48 +242,48 @@ Cor Cor de fundo Alinhamento - To Front + Para a frente Apagar O seu texto Pincel Cor Tamanho Espessura - para a frente + Para a frente Apagar Cor do pincel Editor - Close Editor? - Do you really want to discard the image? - Yes - No - Cancel - Accept - Save - Exporting image… - Exporting image %s. - Flip H - Flip V - Undo - Redo - Color Picker - Transparent - White - Gray - Black - Light blue - Blue - Purple - Orchid - Pink - Red - Orange - Gold - Yellow - Olive - Green - Aquamarin - Pipettable color + Fechar editor? + Tem a certeza de que deseja descartar as alterações? + Sim + Não + Cancelar + Aceitar + Guardar + A exportar imagem… + A exportar imagem %s. + Inversão horizontal + Inversão vertical + Desfazer + Refazer + Seletor de cores + Transparente + Branco + Cinzento + Preto + Azul claro + Azul + Púrpura + Orquídea + Cor de rosa + Vermelho + Cor de laranja + Dourado + Amarelo + Oliva + Verde + Aquamarino + Pipeta de cores How can I make Simple Gallery the default device gallery? @@ -291,8 +293,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. - How can I fast-forward videos? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? @@ -319,7 +321,7 @@ Simple Gallery Pro - Editor e gestor de fotos - Browse your memories without any interruptions with this photo and video gallery + Explore as suas memórias sem interrupções com esta aplicação Simple Gallery Pro é uma aplicação local para gerir fotos e vídeos. Pode organizar e editar as suas fotos, recuperar ficheiros através da reciclagem, proteger e ocultar ficheiros e ver imagens e vídeos disponíveis em vários formatos tais como RAW, SVG e muito mais. @@ -367,6 +369,9 @@ Consulte todas as aplicações Simple Tools aqui: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 66cd4eeff..e870e1d94 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -31,6 +31,7 @@ Исправить дату Исправление… Даты исправлены + Дата съёмки не найдена Поделиться изменённой версией Привет,\n\nпохоже, что вы обновились со старого бесплатного приложения. Теперь вы можете удалить старую версию, которая содержит кнопку \"Обновить до Pro\" в верхней части настроек приложения.\n\nБудет очищена корзина, сняты отметки избранного, а также вам придётся сбросить настройки приложения.\n\nСпасибо! Переключиться на поиск файлов по всем видимым папкам @@ -82,6 +83,7 @@ Путь Недопустимый путь изображения Редактирование изображения не выполнено + Редактирование изображения отменено Файл успешно отредактирован Редактировать изображение в: Не найдено ни одного редактора изображений @@ -292,7 +294,7 @@ Как я могу сделать альбом всегда отображающимся сверху? Вы можете длительным нажатием на желаемый альбом открыть меню действий в нём выбрать пункт \"Закрепить\". Можно закрепить несколько альбомов (папок); прикреплённые элементы будут отсортированы по методу сортировки по умолчанию. Как ускорить перемотку видео? - Вы можете либо перемещать пальцем по горизонтали над видеопроигрывателем, либо нажать на цифры текущего положения или максимальной длительности видео рядом с панелью поиска, что приведёт к перемещению позиции воспроизведения назад или вперёд. + Можно дважды нажать на кромку экрана или нажать на цифры текущего положения или максимальной длительности видео рядом с панелью поиска. Если в настройках приложения включено воспроизведение видео на отдельном экране, то также можно использовать горизонтальные жесты. В чём разница между скрытием и исключением папки? Исключение запрещает отображение папки только в Simple Gallery, в то время как скрытие работает системно и скрывает папку из других галерей. Это достигается путём создания пустого файла \".nomedia\" в данной папке, который впоследствии можно удалить любым файловым менеджером. Почему отображаются папки с музыкальными обложками? @@ -367,6 +369,9 @@ Ознакомьтесь с полным набором инструментов серии Simple здесь: https://www.simplemobiletools.com + Сайт приложения Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 565448a00..48acd5540 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -30,7 +30,8 @@ Použiť predvolenú orientáciu Opraviť dátum vytvorenia Opravuje sa… - Dátumy boli úspešne opravené + Dátumy vytvorenia boli úspešne opravené + Nenašli sa žiadne dátumy vytvorenia Zdieľať verziu so zmenenou veľkosťou Zdravím,\n\nvyzerá to tak, že ste zo starej bezplatnej apky prešlie na novú, platenú. Starú apku, ktorá má na vrchu nastavení tlačidlo \'Stiahnuť Pro verziu\', môžete už odinštalovať.\n\nStratíte tým iba súbory v odpadkovom koši, obľúbené položky budú odznačené a tiež si budete musieť opäť nastaviť položky v nastaveniach aplikácie.\n\nVďaka! Prepnúť na vyhľadávanie súborov vo všetkých viditeľných priečinkoch @@ -82,6 +83,7 @@ Cesta Neplatná cesta Úprava súboru zlyhala + Úprava súboru bola zrušená Súbor bol úspešne upravený Upraviť súbor s: Nebol nájdený žiadny editor @@ -182,7 +184,7 @@ Zobraziť odpadkový kôš ako poslednú položku na hlavnej obrazovke Povoliť zatváranie celoobrazovkového režimu potiahnutím prsta dole Povoliť 1:1 priblíženie dvojnásobným dvojklikom - Vždy otvárať videá na vlastnej obrazovke s novými vodorovnými gestami + Vždy otvárať videá na novej obrazovke s novými vodorovnými gestami Zobraziť výrez obrazovky, ak je dostupný Povoliť otáčanie obrázkov gestami Priorita pri načítavaní súborov @@ -291,8 +293,8 @@ Viete to vyriešǐť 2 spôsobmi. Môžete apku buď preinštalovať, alebo ju nájsť v nastaveniach zariadenia a zvoliť \"Vymazať údaje\". Vymaže to iba nastavenia, nie súbory. Ako môžem dosiahnuť, aby bol daný album stále zobrazený prvý? Môžete označiť daný priečinok dlhým podržaním a zvoliť tlačidlo s obrázkom pripinačky, to ho pripne na vrch. Môžete pripnúť aj viacero priečinkov, budú zoradené podľa zvoleného radenia. - Ako viem posunúť video vpred? - Môžete to dosiahnuť vodorovným potiahnutím prsta cez video prehrávač, alebo kliknúť na texty súčasnej, alebo maximálnej dĺžky videa, ktoré sú vedľa indikátora súčasného progresu. To posunie video buď vpred, alebo vzad. + Ako viem posunúť video rýchlo vpred? + Viete to dosiahnuť dvojitým kliknutím na boky obrazovky, alebo kliknutím na texty súčasnej, alebo maximálnej dĺžky videa, ktoré sú vedľa indikátora súčasného progresu. Ak v nastaveniach apky zapnete možnosť spúšťania videí na novej obrazovke, budete môcť použiť aj vodorovné gestá. Aký je rozdiel medzi Skrytím a Vylúčením priečinka? Kým vylúčenie predíde zobrazeniu priečinka iba vrámci Jednoduchej Galérie, skrytie ho ukryje vrámci celého systému, teda to ovplyvní aj ostatné galérie. Skrytie funguje pomocou vytvorenia prázdneho \".nomedia\" súboru v danom priečinku, ktorý viete vymazať aj nejakým správcom súborov. Prečo sa mi zobrazujú priečinky s obalmi hudobných albumov, alebo nálepkami? @@ -367,6 +369,9 @@ Pozrite si celú sadu aplikácií na: https://www.simplemobiletools.com + Vlastná stránka Jednoduchej Galérie Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 58c3230db..05d0d4ef8 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -31,6 +31,7 @@ Popravi datum posnetka Popravljam… Datumi uspešno popravljeni + No Date Taken values have been found Deli spremenjeno verzijo Živjo,\n\nkot kaže, ste nadgradili staro brezplačno aplikacijo. Sedaj lahko odstranite staro verzijo, ki ima gumb \'Nadgradi na Pro verzijo\' na vrhu nastavitev.\n\nIzbrisani bodo le elementi v košu, priljubljeni elementi bodo odznačeni, poleg tega pa bo potrebno še ponastaviti nastavitve aplikacije.\n\nHvala! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Pot Napačna pot Urejanje slike ni uspelo + Image editing cancelled File edited successfully Uredi sliko z: Ne najdem urejevalnika slik @@ -292,7 +294,7 @@ Kako nastaviti, da se določen album vedno prikaže na vrhu? Z dolgim pritiskom na album se vam prikaže meni, v katerem je na voljo bucika, s katero pripnete album na željeno mesto. Na ta način lahko pripnete več albumov, ki bodo razvrščeni v skladu s privzetim načinom razvrščanja. Ali lahko hitro predvajam videoposnetke? - To lahko storite tako, da s prstom vodoravno potegnete čez predvajalnik ali kliknete na izpis trenutnega oz. skupnega trajanja, kar bo videoposnetek premaknilo naprej ali nazaj. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Kakšna je razlika med skrivanjem in izključevanjem mape? Izključevanje mape jo skrije le v Simple galeriji, medtem ko jo skrivanje skrije tudi v ostalih aplikacijah oz. galerijah. Deluje tako, da kreira prazno \".nomedia\" datoteko v izbrani mapi, katero lahko odstranite tudi s katerimkoli urejevalnikom datotek. Zakaj se v galeriji prikažejo datoteke z naslovnicami glasbenih map ali nalepk? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 0a5ab8092..a300177ac 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -31,6 +31,7 @@ Поправи вредност за датум креирања Исправљам… Датуми успешно исправљени + No Date Taken values have been found Подели верзију са промењеним димензијама Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Стаза Неисправна стаза слике Измена слике неуспешна + Image editing cancelled File edited successfully Измени слику са: Није пронађен едитор слика @@ -292,7 +294,7 @@ Како да подесим да се неки албум увек појављује на врху? Дуго притисните на жељени албум и изаберите Закачи икону у менију за акције, то ће га поставити на врх. Можете да закачите више фасцикли истовремено, с тим што ће бити сортирани према подразумевајућем методу за сортирање. Како да премотавам видео снимке? - Можете да вучете прст хоризонтално преко видео плејера, или да кликнете на тренутно или максимално поред траке за премотавање. То ће премотати видео назад или напред. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Која је разлика између скривања и изузимања фасцикле? Изузимање спречава приказивање фасцикле само у Једноставној галерији, док се скривање односи на цео систем и скрива фасциклу од свих других галерија. Он функционише тако што прави празан \".nomedia\" фајл у задатој фасцикли, који затим можете да уклоните са било којим фајл менаџером. Зашто се фасцикле са сликама музичких извођача или налепницама приказују? @@ -367,6 +369,9 @@ Погледајте цео пакет Simple Tools овде: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Фејсбук: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a0cf7883a..11ba26fbb 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -31,6 +31,7 @@ Korrigera fotodatum Korrigerar… Datumen har korrigerats + No Date Taken values have been found Dela en version med ändrad storlek Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Växla till filsökning i alla synliga mappar @@ -82,6 +83,7 @@ Sökväg Ogiltig bildsökväg Bilden kunde inte redigeras + Image editing cancelled File edited successfully Redigera bilden med: Ingen bildredigerare hittades @@ -291,8 +293,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. - How can I fast-forward videos? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? @@ -367,6 +369,9 @@ Check out the full suite of Simple Tools here: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml index 1f8450696..529b78d53 100644 --- a/app/src/main/res/values-sw600dp/dimens.xml +++ b/app/src/main/res/values-sw600dp/dimens.xml @@ -5,6 +5,5 @@ 30dp 38dp 70dp - 100dp 80dp diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f04d9abc6..db6ea750f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -31,6 +31,7 @@ Çekilen tarih değerini düzelt Düzeltiliyor… Tarihler başarıyla düzeltildi + Çekilen Tarih bulunamadı Yeniden boyutlandırılmış sürümü paylaş Merhaba,\n\neski ücretsiz uygulamadan yükseltmiş gibisiniz. Artık uygulama ayarlarının en üst kısmında \'Pro\'ya Yükselt\' düğmesi olan eski sürümü kaldırabilirsiniz.\n\nYalnızca Geri Dönüşüm Kutusu öğelerinin silinmesi, sık kullanılanların işaretlerinin kaldırılması ve uygulama ayarlarınızı sıfırlamanız gerekir.\n\nTeşekkürler! Tüm görünür klasörler arasında dosya aramaya geç @@ -82,6 +83,7 @@ Yol Geçersiz resim yolu Resim düzenleme başarısız + Image editing cancelled Dosya başarıyla düzenlendi Resmi şununla düzenle: Resim düzenleyici bulunamadı @@ -120,8 +122,8 @@ Slayt gösterisini tekrarla Animasyon Hiçbiri - Fade - Slide + Karart + Kaydır Slayt gösterisi sona erdi Slayt gösterisi için medya bulunamadı @@ -292,7 +294,7 @@ Bir albümün her zaman en üstte görünmesini nasıl sağlayabilirim? İstediğiniz albüme uzunca basabilir ve eylem menüsündeki Sabitle simgesini seçebilirsiniz. Birden çok klasörü de sabitleyebilirsiniz, sabitlenmiş öğeler varsayılan sıralama yöntemine göre sıralanır. Videoları nasıl hızlıca ileri sarabilirim? - Parmağınızı video oynatıcı üzerinde yatay olarak sürükleyebilir veya videoyu ileri veya geri hareket ettirecek arama çubuğunun yanındaki geçerli veya maksimum süre metinlerine tıklayabilirsiniz. + Ekranın yan tarafına iki kez dokunarak veya arama çubuğunun yanındaki geçerli veya maksimum süre metinlerine dokunarak bunu yapabilirsiniz. Videoları uygulama ayarlarından ayrı bir ekranda açmayı etkinleştirirseniz yatay hareketleri de kullanabilirsiniz. Klasörün gizlenmesi ve hariç tutulması arasındaki fark nedir? Hariç tut, klasörü yalnızca Basit Galeri\'de görüntülemeyi engellerken, Gizle sistem genelinde çalışır ve klasörü diğer galerilerden de gizler. Verilen klasörde boş bir \".nomedia\" dosyası oluşturarak çalışır, daha sonra herhangi bir dosya yöneticisi ile kaldırabilirsiniz. Neden albüm resimlerini içeren klasörler görünüyor? @@ -367,6 +369,9 @@ Tüm Basit Araçlar paketini buradan inceleyin: https://www.simplemobiletools.com + Basit Galeri Pro\'nun bağımsız web sitesi: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b30d57e3f..857801d58 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -31,6 +31,7 @@ Виправити дату зйомки Виправлення… Дати успішно виправлені + No Date Taken values have been found Поділитися зображенням іншого розміру Агов,\n\nздається, ви оновились зі старого безкоштовного додатка. Тепер ви можете видалити стару версію, у якій є кнопка \"Перейти на Pro\" вгорі налаштувань додатка.\n\nВи втратите лише елементи з Кошика, позначки улюблених елементів, а також потрібно буде скинути ваші налаштування додатка.\n\nДякую! Перейти до пошуку файла в усіх видимих теках @@ -82,6 +83,7 @@ Шлях Неприпустимий шлях до зображення Не вдалося редагувати зображення + Image editing cancelled File edited successfully Редагувати зображення за допомогою: Не знайдено редакторів зображень @@ -292,7 +294,7 @@ Як зробити альбом завжди доступним у верхній частині? Ви можете виконати довге натискання на бажаному альбомі і вибрати піктограму \"Закріпити\" у меню дій, що закріпить його вгорі. Ви також можете закріпити декілька тек; закріплені елементи будуть відсортовані за методом сортування за-замовчуванням. Як я можу швидко прокручувати відео? - Ви можете або провести пальцем горизонтально під час відтворення відео, або натиснути на текст поточної або максимальної тривалості відео біля прогрес-бару, що прокрутить відео або назад, або вперед. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. В чому полягає різниця між приховуванням та виключенням теки? \"Виключити\" запобігає відображенню теки тільки в додатку Simple Gallery, в той час як \"Приховати\" працює на системному рівні і приховує теку і в інших галереях також. Це здійснюється шляхом створення порожнього файлу \".nomedia\" в заданій теці, який може бути видалений пізніше будь-яким файловим менеджером. Чому відображаються теки з музичними обкладинками або стікерами? @@ -367,6 +369,9 @@ Перегляньте повний набір додатків Simple Tools тут: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index f35990c78..9fc56dcaa 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -31,6 +31,7 @@ Sửa giá trị ngày chụp Đang sửa… Sửa ngày thành công + No Date Taken values have been found Chia sẻ phiên bản đã thay đổi kích thước Xin chào, có vẻ như bạn đã nâng cấp từ ứng dụng miễn phí cũ. Giờ đây, bạn có thể gỡ cài đặt phiên bản cũ có nút \'Nâng cấp lên Pro\' ở đầu Cài đặt ứng dụng. \n\nBạn sẽ chỉ xóa các mục Thùng rác, các mục yêu thích không được đánh dấu và bạn cũng sẽ phải đặt lại cài đặt ứng dụng của bạn.\n\nCảm ơn! Chuyển sang tìm kiếm tệp trên tất cả các thư mục hiển thị @@ -82,6 +83,7 @@ Đường dẫn Đường dẫn hình ảnh không hợp lệ Thất bại + Image editing cancelled Tập tin được chỉnh sửa thành công Chỉnh sửa hình ảnh với: Không tìm thấy trình chỉnh sửa hình ảnh @@ -292,7 +294,7 @@ Làm thế nào tôi có thể làm cho một album luôn xuất hiện ở đầu? Bạn có thể nhấn và giữ album mong muốn và chọn biểu tượng Ghim ở menu hành động, nó sẽ ghim nó lên trên cùng. Bạn cũng có thể ghim nhiều thư mục, các mục được ghim sẽ được sắp xếp theo phương pháp sắp xếp mặc định. Làm cách nào tôi có tua video nhanh? - Bạn có thể kéo ngón tay của mình theo chiều ngang trên trình phát video hoặc nhấp vào văn bản thời lượng hiện tại hoặc tối đa gần thanh tìm kiếm. Điều đó sẽ di chuyển video hoặc lùi hoặc tiến. + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. Sự khác biệt giữa ẩn và loại trừ một thư mục là gì? Loại trừ ngăn chỉ hiển thị thư mục trong Thư viện đơn giản, trong khi Ẩn hoạt động theo hệ thống và nó cũng ẩn thư mục khỏi các phòng trưng bày khác. Nó hoạt động bằng cách tạo một tệp \".nomedia\" trong thư mục đã cho, sau đó bạn cũng có thể xóa bằng bất kỳ trình quản lý tệp nào. Tại sao hiển thị các thư mục với ảnh bìa hoặc nhãn dán? diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d2c68ffe9..edc71fd10 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -31,6 +31,7 @@ 修复拍摄日期 正在修复… 日期修复成功 + No Date Taken values have been found 调整尺寸并分享 嘿,\n\n你似乎已经从旧的免费版应用升级。你现在可以卸载旧版本,在该版本的应用设置顶部有一个“升级到专业版”按钮。\n\n此操作会删除回收站项目,取消标记收藏项目,并重置应用设置。\n\n谢谢! 切换文件搜索范围为所有可见的文件夹 @@ -82,6 +83,7 @@ 路径 无效的图片路径 图片编辑失败 + Image editing cancelled File edited successfully 编辑方式: 没有找到图片编辑器 @@ -291,7 +293,7 @@ 如何让某个相册始终显示在最上面? 你可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。你也可以固定多个文件夹,固定项目将按照默认排序方法排序。 如何快进/快退视频? - 只需在视频播放器上左右滑动,或点击底栏进度条两侧的时间文本,即可前进或后退视频。 + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. 文件夹的隐藏和排除有什么区别? 排除功能只是防止其在简约图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,你可以使用任何文件管理器删除它。 为什么会出现音乐艺术家封面或贴纸文件夹? @@ -365,6 +367,9 @@ 查看简约系列的所有应用: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 037f78856..665112cfb 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -31,6 +31,7 @@ 修復拍照日期數值 修復中… 日期修復成功 + No Date Taken values have been found 分享調整大小的版本 嘿\n\n你似乎從舊版免費應用程式升級了。現在你能解除安裝舊版了,在應用程式設定的頂端有個\'升級至專業版\'按鈕。\n\n將只有回收桶項目會被刪除,我的最愛項目會被解除標記,以及也會重置你的應用程式設定。\n\n感謝! Switch to file search across all visible folders @@ -82,6 +83,7 @@ 路徑 無效的圖片路徑 圖片編輯失敗 + Image editing cancelled File edited successfully 編輯圖片: 找不到圖片編輯器 @@ -292,7 +294,7 @@ 我如何讓某個相冊總是出現在頂端? 你可以長按想要的相冊,然後在操作選單中選擇[圖釘]圖示,就會釘選於頂端。你也能釘選多個資料夾,釘選的項目會依預設的排序方法來排序。 我如何快轉影片? - 你可以在影片播放器上水平滑動你的手指,或者點擊進度條附近的當前或總時長文字。這會使影片快轉或倒轉。 + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. 隱藏和排除資料夾,兩者有什麼不同? [排除]只在簡易相簿中避免顯示出來;而[隱藏]則作用於整個系統,資料夾也會被其他相簿隱藏。這是藉由在指定資料夾內建立一個\".nomedia\"空白檔案來進行隱藏,你之後也能用任何檔案管理器移除。 為什麼有些音樂專輯封面或貼圖的資料夾會出現? @@ -367,6 +369,9 @@ 於此查看簡易工具系列全套: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f28bde093..a4d7239bd 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -31,6 +31,7 @@ 修復拍攝日期數值 修復中… 日期修復成功 + 未發現拍攝日期數值 分享調整大小的版本 嘿\n\n你似乎從舊版免費應用程式升級了。現在你能解除安裝舊版了,在應用程式設定的頂端有個\'升級至專業版\'按鈕。\n\n將只有回收桶項目會被刪除,我的最愛項目會被解除標記,以及也會重置你的應用程式設定。\n\n感謝! 檔案搜尋目標切換成全部的可見資料夾 @@ -82,6 +83,7 @@ 路徑 無效的圖片路徑 圖片編輯失敗 + 圖片編輯取消 檔案編輯成功 編輯圖片: 找不到圖片編輯器 @@ -292,7 +294,7 @@ 我如何讓某個相冊總是出現在頂端? 你可以長按想要的相冊,然後在操作選單中選擇[圖釘]圖示,就會釘選於頂端。你也能釘選多個資料夾,釘選的項目會依預設的排序方法來排序。 我如何快轉影片? - 你可以在影片播放器上水平滑動你的手指,或者點擊進度條附近的當前或總時長文字。這會使影片快轉或倒轉。 + 你可以雙擊畫面邊緣,或點擊進度條附近的當前或總時長文字。 如果你在應用程式設定中啟用在獨立畫面打開影片,也能使用水平手勢。 隱藏和排除資料夾,兩者有什麼不同? [排除]只在簡易相簿中避免顯示出來;而[隱藏]則作用於整個系統,資料夾也會被其他相簿隱藏。這是藉由在指定資料夾內建立一個\".nomedia\"空白檔案來進行隱藏,你之後也能用任何檔案管理器移除。 為什麼有些音樂專輯封面或貼圖的資料夾會出現? @@ -367,6 +369,9 @@ 於此查看簡易工具系列全套: https://www.simplemobiletools.com + Standalone website of Simple Gallery Pro: + https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e8fec8163..eb0f6cdf6 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -9,12 +9,14 @@ 70dp 60dp 60dp - 50dp 72dp 64dp 128dp 164dp 48dp + 76dp + 90dp + 98dp 180dp 48dp 86dp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 720719ad5..124e67897 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -6,6 +6,7 @@ com.simplemobiletools.gallery.pro + Allow fast forwarding videos by double clicking on screen sides Fully replaced the photo editor with a powerful third party library (for resizing images use Menu -> Resize from the fullscreen view, until it gets added in the editor) Allow customizing the bottom navigation bar color\n diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e8c6d123..920cea2e4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,6 +31,7 @@ Fix Date Taken value Fixing… Dates fixed successfully + No Date Taken values have been found Share a resized version Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! Switch to file search across all visible folders @@ -82,6 +83,7 @@ Path Invalid image path Image editing failed + Image editing cancelled File edited successfully Edit image with: No image editor found @@ -291,8 +293,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actions menu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. - How can I fast-forward videos? - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. + How can I fast forward videos? + You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/proprietary/AndroidManifest.xml b/app/src/proprietary/AndroidManifest.xml new file mode 100644 index 000000000..3e08b8072 --- /dev/null +++ b/app/src/proprietary/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/pesdk_license b/app/src/proprietary/assets/pesdk_license similarity index 100% rename from app/src/main/assets/pesdk_license rename to app/src/proprietary/assets/pesdk_license diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt b/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt similarity index 56% rename from app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt rename to app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt index 62215b769..285cf0022 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt +++ b/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt @@ -1,8 +1,11 @@ package com.simplemobiletools.gallery.pro.activities +import android.annotation.TargetApi import android.app.Activity import android.content.Intent +import android.media.ExifInterface import android.net.Uri +import android.os.Build import android.os.Bundle import android.provider.MediaStore import androidx.core.util.Pair @@ -11,18 +14,21 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.CONFLICT_OVERWRITE import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.REAL_FILE_PATH +import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.commons.interfaces.CopyMoveListener import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog import com.simplemobiletools.gallery.pro.extensions.config import com.simplemobiletools.gallery.pro.extensions.fixDateTaken +import ly.img.android.pesdk.PhotoEditorSettingsList import ly.img.android.pesdk.assets.filter.basic.FilterPackBasic import ly.img.android.pesdk.assets.font.basic.FontPackBasic import ly.img.android.pesdk.backend.model.config.CropAspectAsset import ly.img.android.pesdk.backend.model.state.BrushSettings -import ly.img.android.pesdk.backend.model.state.EditorLoadSettings -import ly.img.android.pesdk.backend.model.state.EditorSaveSettings +import ly.img.android.pesdk.backend.model.state.LoadSettings +import ly.img.android.pesdk.backend.model.state.PhotoEditorSaveSettings +import ly.img.android.pesdk.backend.model.state.SaveSettings import ly.img.android.pesdk.backend.model.state.manager.SettingsList import ly.img.android.pesdk.ui.activity.PhotoEditorBuilder import ly.img.android.pesdk.ui.model.state.* @@ -30,8 +36,7 @@ import ly.img.android.pesdk.ui.panels.item.CropAspectItem import ly.img.android.pesdk.ui.panels.item.ToggleAspectItem import ly.img.android.pesdk.ui.panels.item.ToolItem import java.io.File -import java.util.* -import kotlin.collections.LinkedHashMap +import java.io.InputStream import kotlin.collections.set class NewEditActivity : SimpleActivity() { @@ -40,8 +45,9 @@ class NewEditActivity : SimpleActivity() { private val RESULT_IMAGE_PATH = "RESULT_IMAGE_PATH" private var sourceFileLastModified = 0L private var destinationFilePath = "" - private var imagePathFromEditor = "" // delete the file stored at the internal app storage (the editor saves it there) in case moving to the selected location fails + private var cacheImagePathFromEditor = "" // delete the file stored at the internal app cache storage (the editor saves it there) in case moving to the selected location fails private var sourceImageUri: Uri? = null + private var oldExif: ExifInterface? = null private lateinit var uri: Uri private lateinit var saveUri: Uri @@ -102,7 +108,7 @@ class NewEditActivity : SimpleActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { if (requestCode == PESDK_EDIT_IMAGE) { val extras = resultData?.extras - imagePathFromEditor = extras?.getString(RESULT_IMAGE_PATH, "") ?: "" + cacheImagePathFromEditor = extras?.getString(RESULT_IMAGE_PATH, "") ?: "" val settings = extras?.getParcelable(SETTINGS_LIST) if (settings != null) { @@ -112,11 +118,11 @@ class NewEditActivity : SimpleActivity() { config.editorBrushSize = brush.brushSize } - if (resultCode != Activity.RESULT_OK || sourceImageUri == null || sourceImageUri.toString().isEmpty() || imagePathFromEditor.isEmpty() || sourceImageUri.toString() == imagePathFromEditor) { - toast(R.string.image_editing_failed) + if (resultCode != Activity.RESULT_OK || sourceImageUri == null || sourceImageUri.toString().isEmpty() || cacheImagePathFromEditor.isEmpty() || sourceImageUri.toString() == cacheImagePathFromEditor) { + toast(R.string.image_editing_cancelled) finish() } else { - // the image is stored at the internal app storage first, for example /data/user/0/com.simplemobiletools.gallery.pro/files/editor/IMG_20191207_183023.jpg + // the image is stored at the internal app storage first, for example /data/user/0/com.simplemobiletools.gallery.pro/cache/editor/IMG_20191207_183023.jpg // first we rename it to the desired name, then move val sourceString = Uri.decode(sourceImageUri.toString())?.toString() ?: "" val source = if (sourceString.isEmpty() || sourceString.startsWith("content")) { @@ -125,6 +131,11 @@ class NewEditActivity : SimpleActivity() { sourceString.substringAfter("file://") } + if (source == cacheImagePathFromEditor) { + finish() + return + } + SaveAsDialog(this, source, true, cancelCallback = { toast(R.string.image_editing_failed) finish() @@ -132,9 +143,10 @@ class NewEditActivity : SimpleActivity() { destinationFilePath = it handleSAFDialog(destinationFilePath) { if (it) { + storeOldExif(source) sourceFileLastModified = File(source).lastModified() - val newFile = File("${imagePathFromEditor.getParentPath()}/${destinationFilePath.getFilenameFromPath()}") - File(imagePathFromEditor).renameTo(newFile) + val newFile = File("${cacheImagePathFromEditor.getParentPath()}/${destinationFilePath.getFilenameFromPath()}") + File(cacheImagePathFromEditor).renameTo(newFile) val sourceFile = FileDirItem(newFile.absolutePath, newFile.name) val conflictResolutions = LinkedHashMap() @@ -144,7 +156,7 @@ class NewEditActivity : SimpleActivity() { CopyMoveTask(this, false, true, conflictResolutions, editCopyMoveListener, true).execute(pair) } else { toast(R.string.image_editing_failed) - File(imagePathFromEditor).delete() + File(cacheImagePathFromEditor).delete() finish() } } @@ -154,8 +166,30 @@ class NewEditActivity : SimpleActivity() { super.onActivityResult(requestCode, resultCode, resultData) } + @TargetApi(Build.VERSION_CODES.N) + private fun storeOldExif(sourcePath: String) { + var inputStream: InputStream? = null + try { + if (isNougatPlus()) { + inputStream = contentResolver.openInputStream(Uri.fromFile(File(sourcePath))) + oldExif = ExifInterface(inputStream!!) + } + } catch (ignored: Exception) { + } finally { + inputStream?.close() + } + } + private val editCopyMoveListener = object : CopyMoveListener { override fun copySucceeded(copyOnly: Boolean, copiedAll: Boolean, destinationPath: String) { + try { + if (isNougatPlus()) { + val newExif = ExifInterface(destinationFilePath) + oldExif?.copyTo(newExif, false) + } + } catch (ignored: Exception) { + } + if (config.keepLastModified) { // add 1 s to the last modified time to properly update the thumbnail updateLastModified(destinationFilePath, sourceFileLastModified + 1000) @@ -173,7 +207,7 @@ class NewEditActivity : SimpleActivity() { override fun copyFailed() { toast(R.string.unknown_error_occurred) - File(imagePathFromEditor).delete() + File(cacheImagePathFromEditor).delete() finish() } } @@ -181,75 +215,82 @@ class NewEditActivity : SimpleActivity() { private fun openEditor(inputImage: Uri) { sourceImageUri = inputImage val filename = inputImage.toString().getFilenameFromPath() + val settingsList = createPesdkSettingsList(filename) - settingsList.getSettingsModel(EditorLoadSettings::class.java).imageSource = sourceImageUri + settingsList.configure { + it.source = inputImage + } + + settingsList[LoadSettings::class].source = inputImage PhotoEditorBuilder(this) .setSettingsList(settingsList) .startActivityForResult(this, PESDK_EDIT_IMAGE) } - private fun createPesdkSettingsList(filename: String): SettingsList { - val settingsList = SettingsList() - settingsList.config.getAssetMap(CropAspectAsset::class.java).apply { - add(CropAspectAsset("my_crop_1_2", 1, 2, false)) - add(CropAspectAsset("my_crop_2_1", 2, 1, false)) - add(CropAspectAsset("my_crop_19_9", 19, 9, false)) - add(CropAspectAsset("my_crop_9_19", 9, 19, false)) - add(CropAspectAsset("my_crop_5_4", 5, 4, false)) - add(CropAspectAsset("my_crop_4_5", 4, 5, false)) - add(CropAspectAsset("my_crop_37_18", 37, 18, false)) - add(CropAspectAsset("my_crop_18_37", 18, 37, false)) - add(CropAspectAsset("my_crop_16_10", 16, 10, false)) - add(CropAspectAsset("my_crop_10_16", 10, 16, false)) + private fun createPesdkSettingsList(filename: String): PhotoEditorSettingsList { + val settingsList = PhotoEditorSettingsList().apply { + configure { + it.setFilterList(FilterPackBasic.getFilterPack()) + } + + configure { + it.setFontList(FontPackBasic.getFontPack()) + } + + config.getAssetMap(CropAspectAsset::class.java).apply { + add(CropAspectAsset("my_crop_1_2", 1, 2, false)) + add(CropAspectAsset("my_crop_2_1", 2, 1, false)) + add(CropAspectAsset("my_crop_19_9", 19, 9, false)) + add(CropAspectAsset("my_crop_9_19", 9, 19, false)) + add(CropAspectAsset("my_crop_5_4", 5, 4, false)) + add(CropAspectAsset("my_crop_4_5", 4, 5, false)) + add(CropAspectAsset("my_crop_37_18", 37, 18, false)) + add(CropAspectAsset("my_crop_18_37", 18, 37, false)) + add(CropAspectAsset("my_crop_16_10", 16, 10, false)) + add(CropAspectAsset("my_crop_10_16", 10, 16, false)) + } + + getSettingsModel(UiConfigAspect::class.java).aspectList.apply { + add(ToggleAspectItem(CropAspectItem("my_crop_2_1"), CropAspectItem("my_crop_1_2"))) + add(ToggleAspectItem(CropAspectItem("my_crop_19_9"), CropAspectItem("my_crop_9_19"))) + add(ToggleAspectItem(CropAspectItem("my_crop_5_4"), CropAspectItem("my_crop_4_5"))) + add(ToggleAspectItem(CropAspectItem("my_crop_37_18"), CropAspectItem("my_crop_18_37"))) + add(ToggleAspectItem(CropAspectItem("my_crop_16_10"), CropAspectItem("my_crop_10_16"))) + } + + getSettingsModel(BrushSettings::class.java).apply { + brushColor = applicationContext.config.editorBrushColor + brushHardness = applicationContext.config.editorBrushHardness + brushSize = applicationContext.config.editorBrushSize + } + + // do not use Text Design, it takes up too much space + val tools = getSettingsModel(UiConfigMainMenu::class.java).toolList + val newTools = tools.filterNot { + it.name!!.isEmpty() + }.toMutableList() as ArrayList + + // move Focus at the end, as it is the least used + // on some devices it is not obvious that the toolbar can be scrolled horizontally, so move the best ones at the beginning to make them visible + val focus = newTools.firstOrNull { it.name == getString(R.string.pesdk_focus_title_name) } + if (focus != null) { + newTools.remove(focus) + newTools.add(focus) + } + + getSettingsModel(UiConfigMainMenu::class.java).setToolList(newTools) + + getSettingsModel(UiConfigTheme::class.java).theme = R.style.Imgly_Theme_NoFullscreen + + configure { + it.exportFormat = SaveSettings.FORMAT.AUTO + it.setOutputFilePath("$cacheDir/editor/$filename") + it.savePolicy = SaveSettings.SavePolicy.RETURN_SOURCE_OR_CREATE_OUTPUT_IF_NECESSARY + } } - settingsList.getSettingsModel(UiConfigAspect::class.java).aspectList.apply { - add(ToggleAspectItem(CropAspectItem("my_crop_2_1"), CropAspectItem("my_crop_1_2"))) - add(ToggleAspectItem(CropAspectItem("my_crop_19_9"), CropAspectItem("my_crop_9_19"))) - add(ToggleAspectItem(CropAspectItem("my_crop_5_4"), CropAspectItem("my_crop_4_5"))) - add(ToggleAspectItem(CropAspectItem("my_crop_37_18"), CropAspectItem("my_crop_18_37"))) - add(ToggleAspectItem(CropAspectItem("my_crop_16_10"), CropAspectItem("my_crop_10_16"))) - } - - settingsList.getSettingsModel(UiConfigFilter::class.java).setFilterList( - FilterPackBasic.getFilterPack() - ) - - settingsList.getSettingsModel(UiConfigText::class.java).setFontList( - FontPackBasic.getFontPack() - ) - - settingsList.getSettingsModel(BrushSettings::class.java).apply { - brushColor = config.editorBrushColor - brushHardness = config.editorBrushHardness - brushSize = config.editorBrushSize - } - - // do not use Text Design, it takes up too much space - val tools = settingsList.getSettingsModel(UiConfigMainMenu::class.java).toolList - val newTools = tools.filterNot { - it.name!!.isEmpty() - }.toMutableList() as ArrayList - - // move Focus to the end, as it is the least used - // on some devices it is not obvious that the toolbar can be scrolled horizontally, so move the best ones to the start to make them visible - val focus = newTools.firstOrNull { it.name == getString(R.string.pesdk_focus_title_name) } - if (focus != null) { - newTools.remove(focus) - newTools.add(focus) - } - - settingsList.getSettingsModel(UiConfigMainMenu::class.java).setToolList(newTools) - - settingsList.getSettingsModel(UiConfigTheme::class.java).theme = R.style.Imgly_Theme_NoFullscreen - - settingsList.getSettingsModel(EditorSaveSettings::class.java) - .setExportFormat(EditorSaveSettings.FORMAT.AUTO) - .setOutputFilePath("$filesDir/editor/$filename") - .savePolicy = EditorSaveSettings.SavePolicy.RETURN_SOURCE_OR_CREATE_OUTPUT_IF_NECESSARY - return settingsList } } diff --git a/build.gradle b/build.gradle index f16279588..07065f11c 100644 --- a/build.gradle +++ b/build.gradle @@ -2,17 +2,22 @@ buildscript { ext.kotlin_version = '1.3.61' + ext.is_proprietary = gradle.startParameter.taskNames.any { task -> task.contains("Proprietary") } repositories { google() jcenter() - maven { url 'https://artifactory.img.ly/artifactory/imgly' } + if (is_proprietary) { + maven { url 'https://artifactory.img.ly/artifactory/imgly' } + } } dependencies { classpath 'com.android.tools.build:gradle:3.5.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'ly.img.android.pesdk:plugin:6.6.4' + if (is_proprietary) { + classpath 'ly.img.android.pesdk:plugin:7.1.10' + } // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/fastlane/metadata/android/en-US/changelogs/290.txt b/fastlane/metadata/android/en-US/changelogs/290.txt new file mode 100644 index 000000000..cc5309fac --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/290.txt @@ -0,0 +1,2 @@ + * Improved the performance of the initial screen loading + * Fixed some editor related glitches diff --git a/fastlane/metadata/android/en-US/changelogs/291.txt b/fastlane/metadata/android/en-US/changelogs/291.txt new file mode 100644 index 000000000..22d3aad0c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/291.txt @@ -0,0 +1 @@ + * Fixed some sorting and thumbnail related issues diff --git a/fastlane/metadata/android/en-US/changelogs/292.txt b/fastlane/metadata/android/en-US/changelogs/292.txt new file mode 100644 index 000000000..73e1c803b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/292.txt @@ -0,0 +1,2 @@ + * Fixed image disappearing at using the Editor + * Properly copy over EXIF values after editing an image diff --git a/fastlane/metadata/android/en-US/changelogs/293.txt b/fastlane/metadata/android/en-US/changelogs/293.txt new file mode 100644 index 000000000..9077f804d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/293.txt @@ -0,0 +1 @@ + * Fixed some folder sorting related glitches diff --git a/fastlane/metadata/android/en-US/changelogs/294.txt b/fastlane/metadata/android/en-US/changelogs/294.txt new file mode 100644 index 000000000..a594eb2da --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/294.txt @@ -0,0 +1,2 @@ + * Fixed some sorting related glitches + * Keep the old last modified value at file editing diff --git a/fastlane/metadata/android/en-US/changelogs/295.txt b/fastlane/metadata/android/en-US/changelogs/295.txt new file mode 100644 index 000000000..ddb8f1e40 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/295.txt @@ -0,0 +1,4 @@ + * Allow fast forwarding videos by double clicking on screen sides + * Fixed an issue with the editor producing low quality outputs in some cases + * Improve some error messages, make them clearer + * Many translation and stability improvements diff --git a/fastlane/metadata/android/en-US/changelogs/296.txt b/fastlane/metadata/android/en-US/changelogs/296.txt new file mode 100644 index 000000000..ddb8f1e40 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/296.txt @@ -0,0 +1,4 @@ + * Allow fast forwarding videos by double clicking on screen sides + * Fixed an issue with the editor producing low quality outputs in some cases + * Improve some error messages, make them clearer + * Many translation and stability improvements diff --git a/fastlane/metadata/android/en-US/changelogs/297.txt b/fastlane/metadata/android/en-US/changelogs/297.txt new file mode 100644 index 000000000..9d1bd6c05 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/297.txt @@ -0,0 +1,3 @@ + * Properly handle videos at slideshows + * Fixed some gestures during video playback + * Fixed a glitch with videos randomly restarting in some cases diff --git a/fastlane/metadata/android/en-US/changelogs/298.txt b/fastlane/metadata/android/en-US/changelogs/298.txt new file mode 100644 index 000000000..1438c598c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/298.txt @@ -0,0 +1,4 @@ + * Properly handle videos at slideshows + * Fixed some gestures during video playback + * Fixed a glitch with videos randomly restarting in some cases + * Avoid showing the "No Date Takens found" error in some cases diff --git a/fastlane/metadata/android/en-US/changelogs/299.txt b/fastlane/metadata/android/en-US/changelogs/299.txt new file mode 100644 index 000000000..aaacdfa46 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/299.txt @@ -0,0 +1,4 @@ + * Fixed some hiding, excluding and including related glitches + * Flipped Pin and Properties icons at the top menu for better user experience + * Avoid showing Portrait image folders at the main folders screen + * Reverted back to the old image editor in the FOSS app version diff --git a/fastlane/metadata/android/en-US/images/circle.png b/fastlane/metadata/android/en-US/images/circle.png new file mode 100644 index 000000000..13a06c9c9 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/circle.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg index a5b7eb57f..cfb80ee08 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg differ diff --git a/fastlane/metadata/android/en-US/images/raw_screenshots/app_4.jpg b/fastlane/metadata/android/en-US/images/raw_screenshots/app_4.jpg new file mode 100644 index 000000000..f0ca013a5 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/raw_screenshots/app_4.jpg differ diff --git a/fastlane/metadata/android/en-US/images/raw_screenshots/gallery.xcf b/fastlane/metadata/android/en-US/images/raw_screenshots/gallery.xcf index f0ef488c7..fa8fe2605 100644 Binary files a/fastlane/metadata/android/en-US/images/raw_screenshots/gallery.xcf and b/fastlane/metadata/android/en-US/images/raw_screenshots/gallery.xcf differ diff --git a/fastlane/metadata/android/pt-rBR/full_description.txt b/fastlane/metadata/android/pt-rBR/full_description.txt index d82469b02..748daf8c9 100644 --- a/fastlane/metadata/android/pt-rBR/full_description.txt +++ b/fastlane/metadata/android/pt-rBR/full_description.txt @@ -42,6 +42,9 @@ Usando um PIN, padrão, ou sua impressão digital, você pode proteger ou oculta Dê uma olhada nos nossos outros aplicativos Simple: https://www.simplemobiletools.com +Site dedicado do Simple Galeria Pro: +https://www.simplemobiletools.com/gallery + Facebook: https://www.facebook.com/simplemobiletools diff --git a/fastlane/metadata/android/pt-rPT/short_description.txt b/fastlane/metadata/android/pt-rPT/short_description.txt index 3ebb2c472..a63966b5b 100644 --- a/fastlane/metadata/android/pt-rPT/short_description.txt +++ b/fastlane/metadata/android/pt-rPT/short_description.txt @@ -1 +1 @@ -Explore as suas memórias sem interrupções. +Explore as suas memórias sem interrupções com esta aplicação