mirror of
https://github.com/FossifyOrg/Gallery.git
synced 2024-11-26 22:47:59 +01:00
commit
4bb301f341
69 changed files with 1297 additions and 226 deletions
23
.editorconfig
Normal file
23
.editorconfig
Normal file
|
@ -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
|
25
CHANGELOG.md
25
CHANGELOG.md
|
@ -1,6 +1,31 @@
|
|||
Changelog
|
||||
==========
|
||||
|
||||
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)*
|
||||
----------------------------
|
||||
|
||||
|
|
|
@ -17,10 +17,10 @@ android {
|
|||
applicationId "com.simplemobiletools.gallery.pro"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 28
|
||||
versionCode 294
|
||||
versionName "6.12.5"
|
||||
versionCode 298
|
||||
versionName "6.13.3"
|
||||
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,7 +78,7 @@ android {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'com.simplemobiletools:commons:5.22.10'
|
||||
implementation 'com.simplemobiletools:commons:5.22.18'
|
||||
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'
|
||||
|
@ -79,6 +88,7 @@ dependencies {
|
|||
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:512f929d82'
|
||||
|
@ -92,28 +102,30 @@ dependencies {
|
|||
}
|
||||
|
||||
// Apply the PESDKPlugin
|
||||
apply plugin: 'ly.img.android.sdk'
|
||||
if (is_proprietary) {
|
||||
apply plugin: 'ly.img.android.sdk'
|
||||
|
||||
imglyConfig {
|
||||
pesdk {
|
||||
enabled true
|
||||
licencePath 'pesdk_license'
|
||||
}
|
||||
imglyConfig {
|
||||
pesdk {
|
||||
enabled true
|
||||
licencePath 'pesdk_license'
|
||||
}
|
||||
|
||||
supportLibVersion "28.0.0"
|
||||
supportLibVersion "28.0.0"
|
||||
|
||||
modules {
|
||||
include 'ui:core'
|
||||
include 'ui:text'
|
||||
include 'ui:focus'
|
||||
include 'ui:brush'
|
||||
include 'ui:filter'
|
||||
include 'ui:transform'
|
||||
include 'ui:adjustment'
|
||||
modules {
|
||||
include 'ui:core'
|
||||
include 'ui:text'
|
||||
include 'ui:focus'
|
||||
include 'ui:brush'
|
||||
include 'ui:filter'
|
||||
include 'ui:transform'
|
||||
include 'ui:adjustment'
|
||||
|
||||
include 'backend:serializer'
|
||||
include 'backend:serializer'
|
||||
|
||||
include 'assets:font-basic'
|
||||
include 'assets:filter-basic'
|
||||
include 'assets:font-basic'
|
||||
include 'assets:filter-basic'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -201,20 +201,18 @@
|
|||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".activities.NewEditActivity"
|
||||
android:name=".activities.EditActivity"
|
||||
android:label="@string/editor">
|
||||
<intent-filter>
|
||||
|
||||
<intent-filter
|
||||
android:name="foss-editor">
|
||||
|
||||
<action android:name="android.intent.action.EDIT"/>
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
|
||||
<data android:mimeType="image/*"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".activities.EditActivity"
|
||||
android:label="@string/editor">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="com.android.camera.action.CROP"/>
|
||||
|
|
|
@ -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<Float, Float>? = 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<Bitmap> {
|
||||
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean) = false
|
||||
|
||||
override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target<Bitmap>?, 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<Bitmap> {
|
||||
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
|
||||
showErrorToast(e.toString())
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap>?, 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<String, Boolean> {
|
||||
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) {
|
||||
|
|
|
@ -1155,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) {
|
||||
|
@ -1315,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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -359,4 +359,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
|
|||
override fun goToNextItem() {}
|
||||
|
||||
override fun launchViewVideoIntent(path: String) {}
|
||||
|
||||
override fun isSlideShowActive() = false
|
||||
}
|
||||
|
|
|
@ -159,8 +159,8 @@ 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
|
||||
|
@ -496,13 +496,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
})
|
||||
}
|
||||
|
||||
private fun skip(forward: Boolean) {
|
||||
if (mExoPlayer != null) {
|
||||
doSkip(forward)
|
||||
}
|
||||
}
|
||||
|
||||
private fun doSkip(forward: Boolean) {
|
||||
if (mExoPlayer == null) {
|
||||
return
|
||||
}
|
||||
|
||||
val curr = mExoPlayer!!.currentPosition
|
||||
val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
|
||||
val roundProgress = Math.round(newProgress / 1000f)
|
||||
|
|
|
@ -1104,7 +1104,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
|
||||
private fun gotMedia(thumbnailItems: ArrayList<ThumbnailItem>) {
|
||||
val media = thumbnailItems.asSequence().filter { it is Medium && !mIgnoredPaths.contains(it.path) }.map { it as Medium }.toMutableList() as ArrayList<Medium>
|
||||
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()
|
||||
|
|
|
@ -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<FilterItem>, val itemClick: (Int) -> Unit) : RecyclerView.Adapter<FiltersAdapter.ViewHolder>() {
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -454,7 +451,10 @@ fun Activity.fixDateTaken(paths: ArrayList<String>, showToasts: Boolean, hasResc
|
|||
}
|
||||
|
||||
if (!didUpdateFile) {
|
||||
toast(R.string.no_date_takens_found)
|
||||
if (showToasts) {
|
||||
toast(R.string.no_date_takens_found)
|
||||
}
|
||||
|
||||
runOnUiThread {
|
||||
callback?.invoke()
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, 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<String>, 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)) {
|
||||
|
|
|
@ -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)
|
||||
|
@ -140,21 +140,18 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
})
|
||||
|
||||
if (mConfig.allowDownGesture) {
|
||||
video_preview.setOnTouchListener { view, event ->
|
||||
video_preview.setOnTouchListener { view, event ->
|
||||
handleEvent(event)
|
||||
false
|
||||
}
|
||||
|
||||
video_surface_frame.setOnTouchListener { view, event ->
|
||||
if (video_surface_frame.controller.state.zoom == 1f) {
|
||||
handleEvent(event)
|
||||
false
|
||||
}
|
||||
|
||||
video_surface_frame.setOnTouchListener { view, event ->
|
||||
if (video_surface_frame.controller.state.zoom == 1f) {
|
||||
handleEvent(event)
|
||||
}
|
||||
|
||||
gestureDetector.onTouchEvent(event)
|
||||
false
|
||||
}
|
||||
|
||||
gestureDetector.onTouchEvent(event)
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -350,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
|
||||
}
|
||||
|
||||
|
@ -546,6 +543,10 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
|
||||
private fun doSkip(forward: Boolean) {
|
||||
if (mExoPlayer == null) {
|
||||
return
|
||||
}
|
||||
|
||||
val curr = mExoPlayer!!.currentPosition
|
||||
val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
|
||||
val roundProgress = Math.round(newProgress / 1000f)
|
||||
|
@ -721,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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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<FilterItem>(10)
|
||||
private var processedThumbnails = ArrayList<FilterItem>(10)
|
||||
|
||||
fun addThumb(filterItem: FilterItem) {
|
||||
filterThumbnails.add(filterItem)
|
||||
}
|
||||
|
||||
fun processThumbs(): ArrayList<FilterItem> {
|
||||
for (filterItem in filterThumbnails) {
|
||||
filterItem.bitmap = filterItem.filter.processFilter(Bitmap.createBitmap(filterItem.bitmap))
|
||||
processedThumbnails.add(filterItem)
|
||||
}
|
||||
return processedThumbnails
|
||||
}
|
||||
|
||||
fun clearThumbs() {
|
||||
filterThumbnails = ArrayList()
|
||||
processedThumbnails = ArrayList()
|
||||
}
|
||||
}
|
|
@ -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)
|
9
app/src/main/res/drawable/ic_aspect_ratio_vector.xml
Normal file
9
app/src/main/res/drawable/ic_aspect_ratio_vector.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M19,12h-2v3h-3v2h5v-5zM7,9h3L10,7L5,7v5h2L7,9zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.99h18v14.02z"/>
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_crop_rotate_vector.xml
Normal file
9
app/src/main/res/drawable/ic_crop_rotate_vector.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M7.47,21.49C4.2,19.93 1.86,16.76 1.5,13L0,13c0.51,6.16 5.66,11 11.95,11 0.23,0 0.44,-0.02 0.66,-0.03L8.8,20.15l-1.33,1.34zM12.05,0c-0.23,0 -0.44,0.02 -0.66,0.04l3.81,3.81 1.33,-1.33C19.8,4.07 22.14,7.24 22.5,11L24,11c-0.51,-6.16 -5.66,-11 -11.95,-11zM16,14h2L18,8c0,-1.11 -0.9,-2 -2,-2h-6v2h6v6zM8,16L8,4L6,4v2L4,6v2h2v8c0,1.1 0.89,2 2,2h8v2h2v-2h2v-2L8,16z"/>
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_draw_vector.xml
Normal file
9
app/src/main/res/drawable/ic_draw_vector.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M4.59,6.89c0.7,-0.71 1.4,-1.35 1.71,-1.22 0.5,0.2 0,1.03 -0.3,1.52 -0.25,0.42 -2.86,3.89 -2.86,6.31 0,1.28 0.48,2.34 1.34,2.98 0.75,0.56 1.74,0.73 2.64,0.46 1.07,-0.31 1.95,-1.4 3.06,-2.77 1.21,-1.49 2.83,-3.44 4.08,-3.44 1.63,0 1.65,1.01 1.76,1.79 -3.78,0.64 -5.38,3.67 -5.38,5.37 0,1.7 1.44,3.09 3.21,3.09 1.63,0 4.29,-1.33 4.69,-6.1L21,14.88v-2.5h-2.47c-0.15,-1.65 -1.09,-4.2 -4.03,-4.2 -2.25,0 -4.18,1.91 -4.94,2.84 -0.58,0.73 -2.06,2.48 -2.29,2.72 -0.25,0.3 -0.68,0.84 -1.11,0.84 -0.45,0 -0.72,-0.83 -0.36,-1.92 0.35,-1.09 1.4,-2.86 1.85,-3.52 0.78,-1.14 1.3,-1.92 1.3,-3.28C8.95,3.69 7.31,3 6.44,3 5.12,3 3.97,4 3.72,4.25c-0.36,0.36 -0.66,0.66 -0.88,0.93l1.75,1.71zM13.88,18.55c-0.31,0 -0.74,-0.26 -0.74,-0.72 0,-0.6 0.73,-2.2 2.87,-2.76 -0.3,2.69 -1.43,3.48 -2.13,3.48z"/>
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_photo_filter_vector.xml
Normal file
9
app/src/main/res/drawable/ic_photo_filter_vector.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M19.02,10v9L5,19L5,5h9L14,3L5.02,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-9h-2zM17,10l0.94,-2.06L20,7l-2.06,-0.94L17,4l-0.94,2.06L14,7l2.06,0.94zM13.25,10.75L12,8l-1.25,2.75L8,12l2.75,1.25L12,16l1.25,-2.75L16,12z"/>
|
||||
</vector>
|
|
@ -1,38 +1,77 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/activity_edit_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/default_image_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_above="@+id/bottom_editor_crop_rotate_actions"
|
||||
android:layout_marginBottom="@dimen/bottom_filters_height_with_margin"/>
|
||||
|
||||
<com.theartofdev.edmodo.cropper.CropImageView
|
||||
android:id="@+id/crop_image_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginBottom="@dimen/bottom_actions_height_bigger"
|
||||
android:visibility="gone"
|
||||
app:cropBackgroundColor="@color/crop_image_view_background"
|
||||
app:cropInitialCropWindowPaddingRatio="0" />
|
||||
app:cropInitialCropWindowPaddingRatio="0"/>
|
||||
|
||||
<com.simplemobiletools.gallery.pro.views.EditorDrawCanvas
|
||||
android:id="@+id/editor_draw_canvas"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_marginBottom="@dimen/bottom_actions_height_double"
|
||||
android:background="@android:color/transparent"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/bottom_editor_actions_background"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/bottom_editor_actions_shadow_height"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:background="@drawable/gradient_background" />
|
||||
android:background="@drawable/gradient_background"/>
|
||||
|
||||
<include
|
||||
android:id="@+id/bottom_editor_primary_actions"
|
||||
layout="@layout/bottom_editor_primary_actions"/>
|
||||
|
||||
<include
|
||||
android:id="@+id/bottom_aspect_ratios"
|
||||
layout="@layout/bottom_actions_aspect_ratio"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_above="@+id/bottom_editor_crop_rotate_actions" />
|
||||
android:layout_above="@+id/bottom_editor_crop_rotate_actions"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<include
|
||||
android:id="@+id/bottom_editor_filter_actions"
|
||||
layout="@layout/bottom_editor_actions_filter"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_above="@+id/bottom_editor_primary_actions"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<include
|
||||
android:id="@+id/bottom_editor_crop_rotate_actions"
|
||||
layout="@layout/bottom_editor_crop_rotate_actions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_marginBottom="@dimen/medium_margin" />
|
||||
android:layout_above="@+id/bottom_editor_primary_actions"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<include
|
||||
android:id="@+id/bottom_editor_draw_actions"
|
||||
layout="@layout/bottom_editor_draw_actions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_above="@+id/bottom_editor_primary_actions"
|
||||
android:visibility="gone"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
|
19
app/src/main/res/layout/bottom_editor_actions_filter.xml
Normal file
19
app/src/main/res/layout/bottom_editor_actions_filter.xml
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/bottom_actions_filter_wrapper"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/bottom_filters_height"
|
||||
android:paddingTop="@dimen/medium_margin">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||
android:id="@+id/bottom_actions_filter_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/bottom_filters_height"
|
||||
android:background="@color/crop_image_view_background"
|
||||
android:orientation="horizontal"
|
||||
android:overScrollMode="never"
|
||||
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
|
||||
|
||||
</RelativeLayout>
|
|
@ -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"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_resize"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/resize"
|
||||
android:padding="@dimen/normal_margin"
|
||||
android:src="@drawable/ic_minimize"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/bottom_aspect_ratio"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/bottom_rotate"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_aspect_ratio"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/free_aspect_ratio"
|
||||
android:padding="@dimen/normal_margin"
|
||||
android:src="@drawable/ic_aspect_ratio_vector"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/bottom_flip_horizontally"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/bottom_resize"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_flip_horizontally"
|
||||
|
@ -32,8 +60,8 @@
|
|||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/bottom_flip_vertically"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/bottom_rotate"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_flip_vertically"
|
||||
|
@ -47,6 +75,6 @@
|
|||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/bottom_flip_horizontally"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
61
app/src/main/res/layout/bottom_editor_draw_actions.xml
Normal file
61
app/src/main/res/layout/bottom_editor_draw_actions.xml
Normal file
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/bottom_editor_draw_actions_wrapper"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/bottom_actions_height"
|
||||
android:layout_alignParentBottom="true">
|
||||
|
||||
<com.simplemobiletools.commons.views.MySeekBar
|
||||
android:id="@+id/bottom_draw_width"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginLeft="@dimen/activity_margin"
|
||||
android:layout_marginRight="@dimen/activity_margin"
|
||||
android:max="100"
|
||||
android:progress="50"
|
||||
app:layout_constraintBottom_toBottomOf="@id/bottom_draw_color"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toLeftOf="@+id/bottom_draw_color"
|
||||
app:layout_constraintTop_toTopOf="@+id/bottom_draw_color"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_draw_color_clickable"
|
||||
android:layout_width="@dimen/bottom_editor_color_picker_size"
|
||||
android:layout_height="@dimen/bottom_editor_color_picker_size"
|
||||
android:layout_marginEnd="@dimen/small_margin"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/change_color"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintRight_toLeftOf="@+id/bottom_draw_undo"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_draw_color"
|
||||
android:layout_width="@dimen/bottom_editor_color_picker_size"
|
||||
android:layout_height="@dimen/bottom_editor_color_picker_size"
|
||||
android:layout_marginEnd="@dimen/small_margin"
|
||||
android:clickable="false"
|
||||
android:contentDescription="@null"
|
||||
android:padding="@dimen/small_margin"
|
||||
android:src="@drawable/circle_background"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintRight_toLeftOf="@+id/bottom_draw_undo"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_draw_undo"
|
||||
android:layout_width="@dimen/bottom_editor_color_picker_size"
|
||||
android:layout_height="@dimen/bottom_editor_color_picker_size"
|
||||
android:layout_marginEnd="@dimen/normal_margin"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:clickable="false"
|
||||
android:contentDescription="@string/undo"
|
||||
android:padding="@dimen/medium_margin"
|
||||
android:src="@drawable/ic_undo_vector"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
47
app/src/main/res/layout/bottom_editor_primary_actions.xml
Normal file
47
app/src/main/res/layout/bottom_editor_primary_actions.xml
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/bottom_editor_primary_actions_wrapper"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/bottom_actions_height"
|
||||
android:layout_alignParentBottom="true">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_primary_filter"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/filter"
|
||||
android:padding="@dimen/normal_margin"
|
||||
android:src="@drawable/ic_photo_filter_vector"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/bottom_primary_crop_rotate"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_primary_crop_rotate"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:padding="@dimen/normal_margin"
|
||||
android:src="@drawable/ic_crop_rotate_vector"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/bottom_primary_draw"
|
||||
app:layout_constraintStart_toEndOf="@+id/bottom_primary_filter"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bottom_primary_draw"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:padding="@dimen/normal_margin"
|
||||
android:src="@drawable/ic_draw_vector"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/bottom_primary_crop_rotate"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
29
app/src/main/res/layout/editor_filter_item.xml
Normal file
29
app/src/main/res/layout/editor_filter_item.xml
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/editor_filter_item_holder"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/editor_filter_item_thumbnail"
|
||||
android:layout_width="@dimen/bottom_filters_thumbnail_size"
|
||||
android:layout_height="@dimen/bottom_filters_thumbnail_size"
|
||||
android:layout_above="@+id/editor_filter_item_label"
|
||||
android:background="@drawable/stroke_background"
|
||||
android:contentDescription="@null"
|
||||
android:padding="1dp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/editor_filter_item_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:gravity="center_horizontal"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/smaller_text_size"
|
||||
tools:text="Filter"/>
|
||||
|
||||
</RelativeLayout>
|
|
@ -6,6 +6,11 @@
|
|||
android:icon="@drawable/ic_check_vector"
|
||||
android:title="@string/save_as"
|
||||
app:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/edit"
|
||||
android:icon="@drawable/ic_edit_vector"
|
||||
android:title="@string/edit_with"
|
||||
app:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/share"
|
||||
android:icon="@drawable/ic_share_vector"
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<string name="fix_date_taken">Fixar la data de presa</string>
|
||||
<string name="fixing">Fixant…</string>
|
||||
<string name="dates_fixed_successfully">Data fixada correctament</string>
|
||||
<string name="no_date_takens_found">No Date Taken values have been found</string>
|
||||
<string name="no_date_takens_found">No s\’han trobat valors presos per data</string>
|
||||
<string name="share_resized">Comparteix una versió redimensionada</string>
|
||||
<string name="upgraded_from_free">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!</string>
|
||||
<string name="switch_to_file_search">Canvia a la cerca de fitxers a totes les carpetes visibles</string>
|
||||
|
@ -83,7 +83,7 @@
|
|||
<string name="path">Ruta</string>
|
||||
<string name="invalid_image_path">Ruta de imatge no vàlida</string>
|
||||
<string name="image_editing_failed">Ha fallat la edició de la imatge</string>
|
||||
<string name="image_editing_cancelled">Image editing cancelled</string>
|
||||
<string name="image_editing_cancelled">S\'ha cancel·lat l\'edició de la imatge</string>
|
||||
<string name="file_edited_successfully">Fitxer editar satisfactoriament</string>
|
||||
<string name="edit_image_with">Editar imatge utilitzant:</string>
|
||||
<string name="no_editor_found">No s’ha trobat cap editor d’imatges</string>
|
||||
|
@ -369,6 +369,9 @@
|
|||
<b>Consulteu el conjunt complet d’eines senzilles aquí: </b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Lloc web de Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Prohlédněte si celou sadu Jednoduchých aplikací na:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Se hele suiten af Simple Tools her:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -368,6 +368,9 @@
|
|||
<b>Schau dir die vollständige Serie der Schlichten Apps hier an:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -367,9 +367,12 @@
|
|||
<b>ΠΡΟΣΤΑΣΙΑ ΚΑΙ ΑΠΟΚΡΥΨΗ ΑΡΧΕΙΩΝ ΦΩΤΟ ΚΑΙ ΒΙΝΤΕΟ</b>
|
||||
Χρησιμοποιώντας κωδικό, μοτίβο ή τον σαρωτή δακτυλικών αποτυπωμάτων της συσκευής σας, μπορείτε να προστατεύσετε και να αποκρύψετε φωτογραφίες, βίντεο ή ολόκληρα άλμπουμ. Μπορείτε να προστατεύσετε την ίδια την εφαρμογή ή να κλειδώσετε συγκεκριμένες λειτουργίες της. Για παράδειγμα, δεν μπορείτε να διαγράψετε ένα αρχείο χωρίς χρήση των δακτυλικών αποτυπωμάτων, συμβάλλοντας στην προστασία των αρχείων σας από τυχαία διαγραφή.
|
||||
|
||||
<b>Δείτε την πλήρη σειρά των Simple Tools εδώ:</b>
|
||||
<b>Δείτε την πλήρη σειρά των Απλών Εργαλείων εδώ:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Αποκλειστική ιστοσελίδα της Απλή Συλλογή Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<string name="fix_date_taken">Fijar fecha de toma</string>
|
||||
<string name="fixing">Fijando…</string>
|
||||
<string name="dates_fixed_successfully">Fecha fijada correctamente</string>
|
||||
<string name="no_date_takens_found">No Date Taken values have been found</string>
|
||||
<string name="no_date_takens_found">No se han encontrado valores de fechas tomadas</string>
|
||||
<string name="share_resized">Comparte una versión redimensionada</string>
|
||||
<string name="upgraded_from_free">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!</string>
|
||||
<string name="switch_to_file_search">Cambiar a la búsqueda de archivos en todas las carpetas visibles</string>
|
||||
|
@ -83,7 +83,7 @@
|
|||
<string name="path">Ruta</string>
|
||||
<string name="invalid_image_path">Ruta de imagen no válida</string>
|
||||
<string name="image_editing_failed">Falló la edición de imagen</string>
|
||||
<string name="image_editing_cancelled">Image editing cancelled</string>
|
||||
<string name="image_editing_cancelled">Edición de imagen cancelada</string>
|
||||
<string name="file_edited_successfully">Fichero editado satisfactoriamente</string>
|
||||
<string name="edit_image_with">Editar imagen usando:</string>
|
||||
<string name="no_editor_found">No se encontró editor de imágenes</string>
|
||||
|
@ -369,6 +369,9 @@
|
|||
<b>Mira la suite completa de Simple Tools aquí:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Sitio web de Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<string name="fix_date_taken">Corriger les dates de prise de vue</string>
|
||||
<string name="fixing">Correction en cours…</string>
|
||||
<string name="dates_fixed_successfully">Dates corrigées</string>
|
||||
<string name="no_date_takens_found">No Date Taken values have been found</string>
|
||||
<string name="no_date_takens_found">Aucune date de prise de vue trouvée</string>
|
||||
<string name="share_resized">Partager une version redimensionnée</string>
|
||||
<string name="upgraded_from_free">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 !</string>
|
||||
<string name="switch_to_file_search">Basculer vers la recherche de fichiers</string>
|
||||
|
@ -83,7 +83,7 @@
|
|||
<string name="path">Emplacement</string>
|
||||
<string name="invalid_image_path">Emplacement invalide</string>
|
||||
<string name="image_editing_failed">L\'édition de l\'image a échoué</string>
|
||||
<string name="image_editing_cancelled">Image editing cancelled</string>
|
||||
<string name="image_editing_cancelled">L\'édition de l\'image a été annulé</string>
|
||||
<string name="file_edited_successfully">L\'image a été éditée avec succès</string>
|
||||
<string name="edit_image_with">Modifier l\'image avec:</string>
|
||||
<string name="no_editor_found">Aucun éditeur d\'image trouvé</string>
|
||||
|
@ -367,6 +367,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Lihat semua aplikasi Simple Tools di sini:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Lihat semua aplikasi Simple Tools di sini:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Controlla le altre applicazioni qui:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Kijk ook eens naar de hele collectie apps van Simple Tools:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -31,10 +31,10 @@
|
|||
<string name="fix_date_taken">Napraw datę utworzenia</string>
|
||||
<string name="fixing">Naprawiam…</string>
|
||||
<string name="dates_fixed_successfully">Daty zostały naprawione</string>
|
||||
<string name="no_date_takens_found">No Date Taken values have been found</string>
|
||||
<string name="no_date_takens_found">Nie znaleziono wartości dat utworzenia</string>
|
||||
<string name="share_resized">Udostępnij zmienioną wersję</string>
|
||||
<string name="upgraded_from_free">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!</string>
|
||||
<string name="switch_to_file_search">Switch to file search across all visible folders</string>
|
||||
<string name="upgraded_from_free">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!</string>
|
||||
<string name="switch_to_file_search">Przełącz na przeszukiwanie plików we wszystkich widocznych folderach</string>
|
||||
|
||||
<!-- Filter -->
|
||||
<string name="filter_media">Filtruj multimedia</string>
|
||||
|
@ -43,7 +43,7 @@
|
|||
<string name="gifs">GIFy</string>
|
||||
<string name="raw_images">Obrazy RAW</string>
|
||||
<string name="svgs">Obrazy SVG</string>
|
||||
<string name="portraits">Portraits</string>
|
||||
<string name="portraits">Portrety</string>
|
||||
<string name="no_media_with_filters">Nie znaleziono multimediów zgodnych z zastosowanymi filtrami.</string>
|
||||
<string name="change_filters_underlined"><u>Zmień filtry</u></string>
|
||||
|
||||
|
@ -66,7 +66,7 @@
|
|||
<string name="manage_included_folders">Zarządzaj dołączonymi folderami</string>
|
||||
<string name="add_folder">Dodaj folder</string>
|
||||
<string name="included_activity_placeholder">Jeśli masz jakieś foldery z multimediami, ale aplikacja ich nie wykryła, możesz je dodać ręcznie tutaj.</string>
|
||||
<string name="no_media_add_included">No media files have been found. You can solve it by adding the folders containing media files manually.</string>
|
||||
<string name="no_media_add_included">Nie znaleziono plików z multimediami. Możesz to naprawić poprzez dodanie folderów ręcznie.</string>
|
||||
|
||||
<!-- Resizing -->
|
||||
<string name="resize">Zmień rozmiar</string>
|
||||
|
@ -83,8 +83,8 @@
|
|||
<string name="path">Ścieżka</string>
|
||||
<string name="invalid_image_path">Nieprawidłowa ścieżka</string>
|
||||
<string name="image_editing_failed">Edycja obrazu nie powiodła się</string>
|
||||
<string name="image_editing_cancelled">Image editing cancelled</string>
|
||||
<string name="file_edited_successfully">File edited successfully</string>
|
||||
<string name="image_editing_cancelled">Anulowano edycję obrazu</string>
|
||||
<string name="file_edited_successfully">Plik wyedytowany</string>
|
||||
<string name="edit_image_with">Edytuj obraz w:</string>
|
||||
<string name="no_editor_found">Nie znalazłem edytora zdjęć</string>
|
||||
<string name="unknown_file_location">Nieznana lokalizacja pliku</string>
|
||||
|
@ -120,10 +120,10 @@
|
|||
<string name="random_order">Losowa kolejność</string>
|
||||
<string name="move_backwards">Odwrotna kolejność</string>
|
||||
<string name="loop_slideshow">Zapętlaj</string>
|
||||
<string name="animation">Animation</string>
|
||||
<string name="no_animation">None</string>
|
||||
<string name="fade">Fade</string>
|
||||
<string name="slide">Slide</string>
|
||||
<string name="animation">Animacja</string>
|
||||
<string name="no_animation">Brak</string>
|
||||
<string name="fade">Przenikanie</string>
|
||||
<string name="slide">Przesuwanie</string>
|
||||
<string name="slideshow_ended">Pokaz slajdów zakończony</string>
|
||||
<string name="no_media_for_slideshow">Nie znalazłem multimediów do pokazu slajdów</string>
|
||||
|
||||
|
@ -138,11 +138,11 @@
|
|||
<string name="do_not_group_files">Nie grupuj plików</string>
|
||||
<string name="by_folder">Folderu</string>
|
||||
<string name="by_last_modified">Daty ostatniej modyfikacji</string>
|
||||
<string name="by_last_modified_daily">Last modified (daily)</string>
|
||||
<string name="by_last_modified_monthly">Last modified (monthly)</string>
|
||||
<string name="by_last_modified_daily">Daty ostatniej modyfikacji (dniami)</string>
|
||||
<string name="by_last_modified_monthly">Daty ostatniej modyfikacji (miesiącami)</string>
|
||||
<string name="by_date_taken">Daty utworzenia</string>
|
||||
<string name="by_date_taken_daily">Date taken (daily)</string>
|
||||
<string name="by_date_taken_monthly">Date taken (monthly)</string>
|
||||
<string name="by_date_taken_daily">Data utworzenia (dniami)</string>
|
||||
<string name="by_date_taken_monthly">Data utworzenia (miesiącami)</string>
|
||||
<string name="by_file_type">Typu</string>
|
||||
<string name="by_extension">Rozszerzenia</string>
|
||||
<string name="grouping_and_sorting">Uwaga: grupowanie i sortowanie to dwa niezależne pola</string>
|
||||
|
@ -205,85 +205,85 @@
|
|||
<string name="toggle_file_visibility">Widoczność plików</string>
|
||||
|
||||
<!-- New editor strings -->
|
||||
<string name="pesdk_transform_button_freeCrop">Custom</string>
|
||||
<string name="pesdk_transform_button_resetCrop">Reset</string>
|
||||
<string name="pesdk_transform_button_squareCrop">Square</string>
|
||||
<string name="pesdk_transform_title_name">Transform</string>
|
||||
<string name="pesdk_filter_title_name">Filter</string>
|
||||
<string name="pesdk_filter_asset_none">None</string>
|
||||
<string name="pesdk_adjustments_title_name">Adjust</string>
|
||||
<string name="pesdk_adjustments_button_shadowTool">Shadows</string>
|
||||
<string name="pesdk_adjustments_button_exposureTool">Exposure</string>
|
||||
<string name="pesdk_adjustments_button_highlightTool">Highlights</string>
|
||||
<string name="pesdk_adjustments_button_brightnessTool">Brightness</string>
|
||||
<string name="pesdk_adjustments_button_contrastTool">Contrast</string>
|
||||
<string name="pesdk_adjustments_button_saturationTool">Saturation</string>
|
||||
<string name="pesdk_adjustments_button_clarityTool">Clarity</string>
|
||||
<string name="pesdk_transform_button_freeCrop">Własne</string>
|
||||
<string name="pesdk_transform_button_resetCrop">Resetuj</string>
|
||||
<string name="pesdk_transform_button_squareCrop">Kwadrat</string>
|
||||
<string name="pesdk_transform_title_name">Transformacja</string>
|
||||
<string name="pesdk_filter_title_name">Filtr</string>
|
||||
<string name="pesdk_filter_asset_none">Brak</string>
|
||||
<string name="pesdk_adjustments_title_name">Dopasuj</string>
|
||||
<string name="pesdk_adjustments_button_shadowTool">Cienie</string>
|
||||
<string name="pesdk_adjustments_button_exposureTool">Ekspozycja</string>
|
||||
<string name="pesdk_adjustments_button_highlightTool">Światła</string>
|
||||
<string name="pesdk_adjustments_button_brightnessTool">Jasność</string>
|
||||
<string name="pesdk_adjustments_button_contrastTool">Kontrast</string>
|
||||
<string name="pesdk_adjustments_button_saturationTool">Nasycenie</string>
|
||||
<string name="pesdk_adjustments_button_clarityTool">Klarowniść</string>
|
||||
<string name="pesdk_adjustments_button_gammaTool">Gamma</string>
|
||||
<string name="pesdk_adjustments_button_blacksTool">Blacks</string>
|
||||
<string name="pesdk_adjustments_button_whitesTool">Whites</string>
|
||||
<string name="pesdk_adjustments_button_temperatureTool">Temperature</string>
|
||||
<string name="pesdk_adjustments_button_sharpnessTool">Sharpness</string>
|
||||
<string name="pesdk_adjustments_button_reset">Reset</string>
|
||||
<string name="pesdk_adjustments_button_blacksTool">Czerń</string>
|
||||
<string name="pesdk_adjustments_button_whitesTool">Biel</string>
|
||||
<string name="pesdk_adjustments_button_temperatureTool">Temperatura</string>
|
||||
<string name="pesdk_adjustments_button_sharpnessTool">Ostrość</string>
|
||||
<string name="pesdk_adjustments_button_reset">Resetuj</string>
|
||||
<string name="pesdk_focus_title_name">Focus</string>
|
||||
<string name="pesdk_focus_title_disabled">None</string>
|
||||
<string name="pesdk_focus_button_radial">Radial</string>
|
||||
<string name="pesdk_focus_button_linear">Linear</string>
|
||||
<string name="pesdk_focus_button_mirrored">Mirrored</string>
|
||||
<string name="pesdk_focus_button_gaussian">Gaussian</string>
|
||||
<string name="pesdk_text_title_name">Text</string>
|
||||
<string name="pesdk_text_title_options">Text Options</string>
|
||||
<string name="pesdk_text_title_textColor">Text Color</string>
|
||||
<string name="pesdk_text_title_font">Font</string>
|
||||
<string name="pesdk_text_button_add">Add</string>
|
||||
<string name="pesdk_text_button_edit">Edit</string>
|
||||
<string name="pesdk_text_button_straighten">Straighten</string>
|
||||
<string name="pesdk_text_button_font">Font</string>
|
||||
<string name="pesdk_text_button_color">Color</string>
|
||||
<string name="pesdk_text_button_backgroundColor">BG Color</string>
|
||||
<string name="pesdk_text_button_alignment">Alignment</string>
|
||||
<string name="pesdk_text_button_bringToFront">To Front</string>
|
||||
<string name="pesdk_text_button_delete">Delete</string>
|
||||
<string name="pesdk_text_text_editTextPlaceholder">Your text</string>
|
||||
<string name="pesdk_brush_title_name">Brush</string>
|
||||
<string name="pesdk_brush_button_color">Color</string>
|
||||
<string name="pesdk_brush_button_size">Size</string>
|
||||
<string name="pesdk_brush_button_hardness">Hardness</string>
|
||||
<string name="pesdk_brush_button_bringToFront">To Front</string>
|
||||
<string name="pesdk_brush_button_delete">Delete</string>
|
||||
<string name="pesdk_brush_title_brushColor">Brush Color</string>
|
||||
<string name="pesdk_editor_title_name">Editor</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">Close Editor?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">Do you really want to discard the image?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Yes</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">No</string>
|
||||
<string name="pesdk_editor_cancel">Cancel</string>
|
||||
<string name="pesdk_editor_accept">Accept</string>
|
||||
<string name="pesdk_editor_save">Save</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">Exporting image…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">Exporting image %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Flip H</string>
|
||||
<string name="pesdk_common_button_flipV">Flip V</string>
|
||||
<string name="pesdk_common_button_undo">Undo</string>
|
||||
<string name="pesdk_common_button_redo">Redo</string>
|
||||
<string name="pesdk_common_title_colorPicker">Color Picker</string>
|
||||
<string name="pesdk_common_title_transparentColor">Transparent</string>
|
||||
<string name="pesdk_common_title_whiteColor">White</string>
|
||||
<string name="pesdk_common_title_grayColor">Gray</string>
|
||||
<string name="pesdk_common_title_blackColor">Black</string>
|
||||
<string name="pesdk_common_title_lightBlueColor">Light blue</string>
|
||||
<string name="pesdk_common_title_blueColor">Blue</string>
|
||||
<string name="pesdk_common_title_purpleColor">Purple</string>
|
||||
<string name="pesdk_common_title_orchidColor">Orchid</string>
|
||||
<string name="pesdk_common_title_pinkColor">Pink</string>
|
||||
<string name="pesdk_common_title_redColor">Red</string>
|
||||
<string name="pesdk_common_title_orangeColor">Orange</string>
|
||||
<string name="pesdk_common_title_goldColor">Gold</string>
|
||||
<string name="pesdk_common_title_yellowColor">Yellow</string>
|
||||
<string name="pesdk_common_title_oliveColor">Olive</string>
|
||||
<string name="pesdk_common_title_greenColor">Green</string>
|
||||
<string name="pesdk_common_title_aquamarinColor">Aquamarin</string>
|
||||
<string name="pesdk_common_title_pipettableColor">Pipettable color</string>
|
||||
<string name="pesdk_focus_title_disabled">Brak</string>
|
||||
<string name="pesdk_focus_button_radial">Radialny</string>
|
||||
<string name="pesdk_focus_button_linear">Linearny</string>
|
||||
<string name="pesdk_focus_button_mirrored">Lustrzany</string>
|
||||
<string name="pesdk_focus_button_gaussian">Gaussa</string>
|
||||
<string name="pesdk_text_title_name">Tekst</string>
|
||||
<string name="pesdk_text_title_options">Opcje tekstu</string>
|
||||
<string name="pesdk_text_title_textColor">Kolor tekstu</string>
|
||||
<string name="pesdk_text_title_font">Czcionka</string>
|
||||
<string name="pesdk_text_button_add">Dodaj</string>
|
||||
<string name="pesdk_text_button_edit">Edytuj</string>
|
||||
<string name="pesdk_text_button_straighten">Wyprostuj</string>
|
||||
<string name="pesdk_text_button_font">Czcionka</string>
|
||||
<string name="pesdk_text_button_color">Kolor</string>
|
||||
<string name="pesdk_text_button_backgroundColor">Kolor tła</string>
|
||||
<string name="pesdk_text_button_alignment">Wyrównanie</string>
|
||||
<string name="pesdk_text_button_bringToFront">Do przodu</string>
|
||||
<string name="pesdk_text_button_delete">Usuń</string>
|
||||
<string name="pesdk_text_text_editTextPlaceholder">Twój tekst</string>
|
||||
<string name="pesdk_brush_title_name">Pędzel</string>
|
||||
<string name="pesdk_brush_button_color">Kolor</string>
|
||||
<string name="pesdk_brush_button_size">Rozmiar</string>
|
||||
<string name="pesdk_brush_button_hardness">Twardość</string>
|
||||
<string name="pesdk_brush_button_bringToFront">Do przodu</string>
|
||||
<string name="pesdk_brush_button_delete">Usuń</string>
|
||||
<string name="pesdk_brush_title_brushColor">Kolor pędzla</string>
|
||||
<string name="pesdk_editor_title_name">Edytor</string>
|
||||
<string name="pesdk_editor_title_closeEditorAlert">Zamknąć edytor?</string>
|
||||
<string name="pesdk_editor_text_closeEditorAlert">Odrzucić zmiany w obrazie?</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertConfirmation">Tak</string>
|
||||
<string name="pesdk_editor_button_closeEditorAlertCancelation">Nie</string>
|
||||
<string name="pesdk_editor_cancel">Anuluj</string>
|
||||
<string name="pesdk_editor_accept">Zaakceptuj</string>
|
||||
<string name="pesdk_editor_save">Zapisz</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">Eksport obrazu…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">Wyeksportowano obraz %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Odbij w poziomie</string>
|
||||
<string name="pesdk_common_button_flipV">Odbij w pionie</string>
|
||||
<string name="pesdk_common_button_undo">Cofnij</string>
|
||||
<string name="pesdk_common_button_redo">Ponów</string>
|
||||
<string name="pesdk_common_title_colorPicker">Wybieracz kolorów</string>
|
||||
<string name="pesdk_common_title_transparentColor">Przezroczysty</string>
|
||||
<string name="pesdk_common_title_whiteColor">Biały</string>
|
||||
<string name="pesdk_common_title_grayColor">Szary</string>
|
||||
<string name="pesdk_common_title_blackColor">Czarny</string>
|
||||
<string name="pesdk_common_title_lightBlueColor">Jasnoniebieski</string>
|
||||
<string name="pesdk_common_title_blueColor">Niebieski</string>
|
||||
<string name="pesdk_common_title_purpleColor">Fioletowy</string>
|
||||
<string name="pesdk_common_title_orchidColor">Orchidea</string>
|
||||
<string name="pesdk_common_title_pinkColor">Różowy</string>
|
||||
<string name="pesdk_common_title_redColor">Czerwony</string>
|
||||
<string name="pesdk_common_title_orangeColor">Pomarańczowy</string>
|
||||
<string name="pesdk_common_title_goldColor">Złoty</string>
|
||||
<string name="pesdk_common_title_yellowColor">Żółty</string>
|
||||
<string name="pesdk_common_title_oliveColor">Oliwkowy</string>
|
||||
<string name="pesdk_common_title_greenColor">Zielony</string>
|
||||
<string name="pesdk_common_title_aquamarinColor">Akwamaryna</string>
|
||||
<string name="pesdk_common_title_pipettableColor">Kolor pipety</string>
|
||||
|
||||
<!-- FAQ -->
|
||||
<string name="faq_1_title">Jak mogę ustawić tą aplikację jako domyślną aplikację galerii?</string>
|
||||
|
@ -293,7 +293,7 @@
|
|||
<string name="faq_3_title">Jak sprawić, aby album(y) zawsze pojawiał(y) się na górze?</string>
|
||||
<string name="faq_3_text">Przytrzymaj album(y) i wybierz ikonę przypięcia w pasku akcji.</string>
|
||||
<string name="faq_4_title">Jak mogę przwijać filmy?</string>
|
||||
<string name="faq_4_text">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.</string>
|
||||
<string name="faq_4_text">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.</string>
|
||||
<string name="faq_5_title">Jaka jest różnica między ukryciem, a wykluczeniem folderu?</string>
|
||||
<string name="faq_5_text">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.</string>
|
||||
<string name="faq_6_title">Dlaczego pokazują mi się foldery z okładkami do piosenek i tym podobne rzeczy?</string>
|
||||
|
@ -312,8 +312,8 @@
|
|||
<string name="faq_13_text">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\'.</string>
|
||||
<string name="faq_14_title">Mam ukryte pliki i / lub foldery. Jak mogę zobaczyć?</string>
|
||||
<string name="faq_14_text">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.</string>
|
||||
<string name="faq_15_title">Why does the app take up so much space?</string>
|
||||
<string name="faq_15_text">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.</string>
|
||||
<string name="faq_15_title">Dlaczego aplikacja zajmuje tak dużo miejsca?</string>
|
||||
<string name="faq_15_text">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.</string>
|
||||
|
||||
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
|
@ -367,6 +367,9 @@
|
|||
<b>Sprawdź cały zestaw naszych aplikacji:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Odwiedź nasz profil na Facebooku...</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<string name="fix_date_taken">Corrigir data de obtenção</string>
|
||||
<string name="fixing">A corrigir…</string>
|
||||
<string name="dates_fixed_successfully">Dados corrigidos com sucesso</string>
|
||||
<string name="no_date_takens_found">No Date Taken values have been found</string>
|
||||
<string name="no_date_takens_found">Não foram encontrados dados para a data de obtenção da fotografia</string>
|
||||
<string name="share_resized">Partilhar foto redimensionada</string>
|
||||
<string name="upgraded_from_free">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!</string>
|
||||
<string name="switch_to_file_search">Trocar para pesquisa de ficheiros em todas as pastas visíveis</string>
|
||||
|
@ -83,8 +83,8 @@
|
|||
<string name="path">Caminho</string>
|
||||
<string name="invalid_image_path">Caminho inválido</string>
|
||||
<string name="image_editing_failed">Falha na edição da imagem</string>
|
||||
<string name="image_editing_cancelled">Image editing cancelled</string>
|
||||
<string name="file_edited_successfully">File edited successfully</string>
|
||||
<string name="image_editing_cancelled">Edição de imagem cancelada</string>
|
||||
<string name="file_edited_successfully">Imagem editada com sucesso</string>
|
||||
<string name="edit_image_with">Editar imagem com:</string>
|
||||
<string name="no_editor_found">Editor não encontrado</string>
|
||||
<string name="unknown_file_location">Localização desconhecida</string>
|
||||
|
@ -242,14 +242,14 @@
|
|||
<string name="pesdk_text_button_color">Cor</string>
|
||||
<string name="pesdk_text_button_backgroundColor">Cor de fundo</string>
|
||||
<string name="pesdk_text_button_alignment">Alinhamento</string>
|
||||
<string name="pesdk_text_button_bringToFront">To Front</string>
|
||||
<string name="pesdk_text_button_bringToFront">Para a frente</string>
|
||||
<string name="pesdk_text_button_delete">Apagar</string>
|
||||
<string name="pesdk_text_text_editTextPlaceholder">O seu texto</string>
|
||||
<string name="pesdk_brush_title_name">Pincel</string>
|
||||
<string name="pesdk_brush_button_color">Cor</string>
|
||||
<string name="pesdk_brush_button_size">Tamanho</string>
|
||||
<string name="pesdk_brush_button_hardness">Espessura</string>
|
||||
<string name="pesdk_brush_button_bringToFront">para a frente</string>
|
||||
<string name="pesdk_brush_button_bringToFront">Para a frente</string>
|
||||
<string name="pesdk_brush_button_delete">Apagar</string>
|
||||
<string name="pesdk_brush_title_brushColor">Cor do pincel</string>
|
||||
<string name="pesdk_editor_title_name">Editor</string>
|
||||
|
@ -261,7 +261,7 @@
|
|||
<string name="pesdk_editor_accept">Aceitar</string>
|
||||
<string name="pesdk_editor_save">Guardar</string>
|
||||
<string name="pesdk_editor_text_exportProgressUnknown">A exportar imagem…</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">A exportar a imagem %s.</string>
|
||||
<string name="pesdk_editor_text_exportProgress" formatted="false">A exportar imagem %s.</string>
|
||||
<string name="pesdk_common_button_flipH">Inversão horizontal</string>
|
||||
<string name="pesdk_common_button_flipV">Inversão vertical</string>
|
||||
<string name="pesdk_common_button_undo">Desfazer</string>
|
||||
|
@ -369,6 +369,9 @@
|
|||
<b>Consulte todas as aplicações Simple Tools aqui:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Ознакомьтесь с полным набором инструментов серии Simple здесь:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Pozrite si celú sadu aplikácií na:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Vlastná stránka Jednoduchej Galérie Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Погледајте цео пакет Simple Tools овде:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Фејсбук:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<string name="fix_date_taken">Çekilen tarih değerini düzelt</string>
|
||||
<string name="fixing">Düzeltiliyor…</string>
|
||||
<string name="dates_fixed_successfully">Tarihler başarıyla düzeltildi</string>
|
||||
<string name="no_date_takens_found">No Date Taken values have been found</string>
|
||||
<string name="no_date_takens_found">Çekilen Tarih bulunamadı</string>
|
||||
<string name="share_resized">Yeniden boyutlandırılmış sürümü paylaş</string>
|
||||
<string name="upgraded_from_free">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!</string>
|
||||
<string name="switch_to_file_search">Tüm görünür klasörler arasında dosya aramaya geç</string>
|
||||
|
@ -122,8 +122,8 @@
|
|||
<string name="loop_slideshow">Slayt gösterisini tekrarla</string>
|
||||
<string name="animation">Animasyon</string>
|
||||
<string name="no_animation">Hiçbiri</string>
|
||||
<string name="fade">Fade</string>
|
||||
<string name="slide">Slide</string>
|
||||
<string name="fade">Karart</string>
|
||||
<string name="slide">Kaydır</string>
|
||||
<string name="slideshow_ended">Slayt gösterisi sona erdi</string>
|
||||
<string name="no_media_for_slideshow">Slayt gösterisi için medya bulunamadı</string>
|
||||
|
||||
|
@ -294,7 +294,7 @@
|
|||
<string name="faq_3_title">Bir albümün her zaman en üstte görünmesini nasıl sağlayabilirim?</string>
|
||||
<string name="faq_3_text">İ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.</string>
|
||||
<string name="faq_4_title">Videoları nasıl hızlıca ileri sarabilirim?</string>
|
||||
<string name="faq_4_text">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.</string>
|
||||
<string name="faq_4_text">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.</string>
|
||||
<string name="faq_5_title">Klasörün gizlenmesi ve hariç tutulması arasındaki fark nedir?</string>
|
||||
<string name="faq_5_text">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.</string>
|
||||
<string name="faq_6_title">Neden albüm resimlerini içeren klasörler görünüyor?</string>
|
||||
|
@ -369,6 +369,9 @@
|
|||
<b>Tüm Basit Araçlar paketini buradan inceleyin:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Basit Galeri Pro'nun bağımsız web sitesi:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>Перегляньте повний набір додатків Simple Tools тут:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -367,6 +367,9 @@
|
|||
<b>查看简约系列的所有应用:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>於此查看簡易工具系列全套:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -369,6 +369,9 @@
|
|||
<b>於此查看簡易工具系列全套:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple Gallery Pro:</b>
|
||||
https://www.simplemobiletools.com/gallery
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@
|
|||
<dimen name="bottom_actions_height_double">128dp</dimen>
|
||||
<dimen name="bottom_actions_height_bigger">164dp</dimen>
|
||||
<dimen name="bottom_editor_color_picker_size">48dp</dimen>
|
||||
<dimen name="bottom_filters_thumbnail_size">76dp</dimen>
|
||||
<dimen name="bottom_filters_height">90dp</dimen>
|
||||
<dimen name="bottom_filters_height_with_margin">98dp</dimen>
|
||||
<dimen name="bottom_editor_actions_shadow_height">180dp</dimen>
|
||||
<dimen name="portrait_photos_stripe_height">48dp</dimen>
|
||||
<dimen name="default_status_action_height">86dp</dimen>
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<string name="package_name">com.simplemobiletools.gallery.pro</string>
|
||||
|
||||
<!-- Release notes -->
|
||||
<string name="release_295">Allow fast forwarding videos by double clicking on screen sides</string>
|
||||
<string name="release_277">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)</string>
|
||||
<string name="release_258">
|
||||
Allow customizing the bottom navigation bar color\n
|
||||
|
|
39
app/src/proprietary/AndroidManifest.xml
Normal file
39
app/src/proprietary/AndroidManifest.xml
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.simplemobiletools.gallery.pro"
|
||||
android:installLocation="auto">
|
||||
|
||||
<application
|
||||
android:name=".App">
|
||||
|
||||
<activity
|
||||
android:name=".activities.EditActivity">
|
||||
|
||||
<intent-filter
|
||||
android:name="foss-editor"
|
||||
tools:node="remove">
|
||||
|
||||
<action android:name="android.intent.action.EDIT"/>
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
|
||||
<data android:mimeType="image/*"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".activities.NewEditActivity"
|
||||
android:label="@string/editor">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.EDIT"/>
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
|
||||
<data android:mimeType="image/*"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
|
@ -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:7.0.10'
|
||||
if (is_proprietary) {
|
||||
classpath 'ly.img.android.pesdk:plugin:7.1.9'
|
||||
}
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
4
fastlane/metadata/android/en-US/changelogs/295.txt
Normal file
4
fastlane/metadata/android/en-US/changelogs/295.txt
Normal file
|
@ -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
|
4
fastlane/metadata/android/en-US/changelogs/296.txt
Normal file
4
fastlane/metadata/android/en-US/changelogs/296.txt
Normal file
|
@ -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
|
3
fastlane/metadata/android/en-US/changelogs/297.txt
Normal file
3
fastlane/metadata/android/en-US/changelogs/297.txt
Normal file
|
@ -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
|
4
fastlane/metadata/android/en-US/changelogs/298.txt
Normal file
4
fastlane/metadata/android/en-US/changelogs/298.txt
Normal file
|
@ -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
|
Loading…
Reference in a new issue