Merge pull request #68 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2020-04-15 18:06:02 +03:00 committed by GitHub
commit d967795842
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
83 changed files with 672 additions and 791 deletions

View file

@ -1,6 +1,28 @@
Changelog
==========
Version 6.14.1 *(2020-04-14)*
----------------------------
* Fixed some SD card file related glitches
* Improved some third party intent handling
* Added some translation and stability improvements
Version 6.14.0 *(2020-03-19)*
----------------------------
* Properly delete playing videos
* Removed the Manage Hidden Folders settings button on Android 10+, it no longer works
* Added many changes under the hood in preparation for handling Scoped Storage soon
* Do not require the Storage permission at some third party intents
Version 6.13.4 *(2020-03-08)*
----------------------------
* Fixed some hiding, excluding and including related glitches
* Flipped Pin and Properties icons at the top menu for better user experience
* Avoid showing Portrait image folders at the main folders screen
Version 6.13.3 *(2020-03-01)*
----------------------------

View file

@ -1,6 +1,6 @@
# Simple Gallery
<img alt="Logo" src="app/src/main/res/mipmap-xxxhdpi/ic_launcher.png" width="80" />
<img alt="Logo" src="fastlane/metadata/android/en-US/images/icon.png" width="120" />
Simple Gallery Pro is a highly customizable lightweight gallery loved by millions of people for its great user experience. Organize and edit your photos, recover deleted files with the recycle bin, protect & hide files and easily view a huge variety of different photo and video formats including RAW, SVG, GIF, panoramic and much more.

View file

@ -10,15 +10,15 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.simplemobiletools.gallery.pro"
minSdkVersion 21
targetSdkVersion 28
versionCode 298
versionName "6.13.3"
targetSdkVersion 29
versionCode 301
versionName "6.14.1"
multiDexEnabled true
setProperty("archivesBaseName", "gallery-$versionCode")
vectorDrawables.useSupportLibrary = true
@ -78,12 +78,12 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:5.22.18'
implementation 'com.simplemobiletools:commons:5.25.16'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6'
implementation 'com.google.vr:sdk-panowidget:1.180.0'
implementation 'com.google.vr:sdk-videowidget:1.180.0'
@ -92,13 +92,13 @@ dependencies {
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.caverock:androidsvg-aar:1.3'
implementation 'com.github.tibbi:gestureviews:512f929d82'
implementation 'com.github.tibbi:subsampling-scale-image-view:d404e74e39'
implementation 'com.github.tibbi:subsampling-scale-image-view:381878c078'
kapt 'com.github.bumptech.glide:compiler:4.10.0'
kapt 'androidx.room:room-compiler:2.2.2'
implementation 'androidx.room:room-runtime:2.2.2'
annotationProcessor 'androidx.room:room-compiler:2.2.2'
kapt 'androidx.room:room-compiler:2.2.5'
implementation 'androidx.room:room-runtime:2.2.5'
annotationProcessor 'androidx.room:room-compiler:2.2.5'
}
// Apply the PESDKPlugin

View file

@ -27,6 +27,7 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_launcher_name"
android:roundIcon="@mipmap/ic_launcher"
android:requestLegacyExternalStorage="true"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:label">

View file

@ -11,6 +11,7 @@ import android.media.ExifInterface
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.provider.MediaStore
import android.view.Menu
import android.view.MenuItem
@ -27,7 +28,6 @@ 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
import com.simplemobiletools.commons.helpers.REAL_FILE_PATH
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isNougatPlus
@ -75,8 +75,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
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 uri: Uri? = null
private var resizeWidth = 0
private var resizeHeight = 0
private var drawColor = 0
@ -90,6 +90,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private var wasDrawCanvasPositioned = false
private var oldExif: ExifInterface? = null
private var filterInitialBitmap: Bitmap? = null
private var originalUri: Uri? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -99,14 +100,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
return
}
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
initEditActivity()
} else {
toast(R.string.no_storage_permissions)
finish()
}
}
}
override fun onResume() {
@ -146,7 +140,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
uri = intent.data!!
if (uri.scheme != "file" && uri.scheme != "content") {
originalUri = uri
if (uri!!.scheme != "file" && uri!!.scheme != "content") {
toast(R.string.unknown_file_location)
finish()
return
@ -160,14 +155,14 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
else -> Uri.fromFile(File(realPath))
}
} else {
(getRealPathFromURI(uri))?.apply {
(getRealPathFromURI(uri!!))?.apply {
uri = Uri.fromFile(File(this))
}
}
saveUri = when {
intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true -> intent.extras!!.get(MediaStore.EXTRA_OUTPUT) as Uri
else -> uri
else -> uri!!
}
isCropIntent = intent.extras?.get(CROP) == "true"
@ -209,7 +204,15 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
.load(uri)
.apply(options)
.listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean) = false
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
if (uri != originalUri) {
uri = originalUri
Handler().post {
loadDefaultImageView()
}
}
return false
}
override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
val currentFilter = getFiltersAdapter()?.getCurrentFilter()
@ -304,7 +307,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
var inputStream: InputStream? = null
try {
if (isNougatPlus()) {
inputStream = contentResolver.openInputStream(uri)
inputStream = contentResolver.openInputStream(uri!!)
oldExif = ExifInterface(inputStream!!)
}
} catch (e: Exception) {

View file

@ -9,6 +9,8 @@ import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.provider.MediaStore
import android.provider.MediaStore.Images
import android.provider.MediaStore.Video
import android.view.Menu
import android.view.MenuItem
import android.view.ViewGroup
@ -736,24 +738,24 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun isGetContentIntent(intent: Intent) = intent.action == Intent.ACTION_GET_CONTENT && intent.type != null
private fun isGetImageContentIntent(intent: Intent) = isGetContentIntent(intent) &&
(intent.type!!.startsWith("image/") || intent.type == MediaStore.Images.Media.CONTENT_TYPE)
(intent.type!!.startsWith("image/") || intent.type == Images.Media.CONTENT_TYPE)
private fun isGetVideoContentIntent(intent: Intent) = isGetContentIntent(intent) &&
(intent.type!!.startsWith("video/") || intent.type == MediaStore.Video.Media.CONTENT_TYPE)
(intent.type!!.startsWith("video/") || intent.type == Video.Media.CONTENT_TYPE)
private fun isGetAnyContentIntent(intent: Intent) = isGetContentIntent(intent) && intent.type == "*/*"
private fun isSetWallpaperIntent(intent: Intent?) = intent?.action == Intent.ACTION_SET_WALLPAPER
private fun hasImageContentData(intent: Intent) = (intent.data == MediaStore.Images.Media.EXTERNAL_CONTENT_URI ||
intent.data == MediaStore.Images.Media.INTERNAL_CONTENT_URI)
private fun hasImageContentData(intent: Intent) = (intent.data == Images.Media.EXTERNAL_CONTENT_URI ||
intent.data == Images.Media.INTERNAL_CONTENT_URI)
private fun hasVideoContentData(intent: Intent) = (intent.data == MediaStore.Video.Media.EXTERNAL_CONTENT_URI ||
intent.data == MediaStore.Video.Media.INTERNAL_CONTENT_URI)
private fun hasVideoContentData(intent: Intent) = (intent.data == Video.Media.EXTERNAL_CONTENT_URI ||
intent.data == Video.Media.INTERNAL_CONTENT_URI)
private fun isImageType(intent: Intent) = (intent.type?.startsWith("image/") == true || intent.type == MediaStore.Images.Media.CONTENT_TYPE)
private fun isImageType(intent: Intent) = (intent.type?.startsWith("image/") == true || intent.type == Images.Media.CONTENT_TYPE)
private fun isVideoType(intent: Intent) = (intent.type?.startsWith("video/") == true || intent.type == MediaStore.Video.Media.CONTENT_TYPE)
private fun isVideoType(intent: Intent) = (intent.type?.startsWith("video/") == true || intent.type == Video.Media.CONTENT_TYPE)
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (resultCode == Activity.RESULT_OK) {
@ -901,7 +903,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
return
}
val sorting = config.getFileSorting(directory.path)
val sorting = config.getFolderSorting(directory.path)
val grouping = config.getFolderGrouping(directory.path)
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
sorting and SORT_BY_DATE_TAKEN != 0 ||
@ -987,7 +989,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
return
}
val sorting = config.getFileSorting(folder)
val sorting = config.getFolderSorting(folder)
val grouping = config.getFolderGrouping(folder)
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
sorting and SORT_BY_DATE_TAKEN != 0 ||

View file

@ -159,7 +159,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
media_empty_text_label.setTextColor(config.textColor)
media_empty_text.setTextColor(getAdjustedPrimaryColor())
if (mMedia.isEmpty() || config.getFileSorting(mPath) and SORT_BY_RANDOM == 0) {
if (mMedia.isEmpty() || config.getFolderSorting(mPath) and SORT_BY_RANDOM == 0) {
tryLoadGallery()
}
}
@ -413,7 +413,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
media_horizontal_fastscroller.isHorizontal = true
media_horizontal_fastscroller.beVisibleIf(allowHorizontalScroll)
val sorting = config.getFileSorting(if (mShowAll) SHOW_ALL else mPath)
val sorting = config.getFolderSorting(if (mShowAll) SHOW_ALL else mPath)
if (allowHorizontalScroll) {
media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid, media_refresh_layout) {
@ -437,7 +437,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun checkLastMediaChanged() {
if (isDestroyed || config.getFileSorting(mPath) and SORT_BY_RANDOM != 0) {
if (isDestroyed || config.getFolderSorting(mPath) and SORT_BY_RANDOM != 0) {
return
}

View file

@ -4,17 +4,14 @@ import android.content.res.Configuration
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.view.Window
import android.widget.RelativeLayout
import com.google.vr.sdk.widgets.pano.VrPanoramaEventListener
import com.google.vr.sdk.widgets.pano.VrPanoramaView
import com.simplemobiletools.commons.extensions.beVisible
import com.simplemobiletools.commons.extensions.onGlobalLayout
import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.*
@ -48,14 +45,7 @@ open class PanoramaPhotoActivity : SimpleActivity() {
explore.setImageResource(if (isExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
}
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
checkIntent()
} else {
toast(R.string.no_storage_permissions)
finish()
}
}
}
override fun onResume() {
@ -144,7 +134,12 @@ open class PanoramaPhotoActivity : SimpleActivity() {
for (i in 0..10) {
try {
bitmap = BitmapFactory.decodeFile(path, options)
bitmap = if (path.startsWith("content://")) {
val inputStream = contentResolver.openInputStream(Uri.parse(path))
BitmapFactory.decodeStream(inputStream)
} else {
BitmapFactory.decodeFile(path, options)
}
break
} catch (e: OutOfMemoryError) {
options.inSampleSize *= 2

View file

@ -13,7 +13,6 @@ import android.widget.SeekBar
import com.google.vr.sdk.widgets.video.VrVideoEventListener
import com.google.vr.sdk.widgets.video.VrVideoView
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.MIN_SKIP_LENGTH
@ -44,14 +43,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
supportActionBar?.hide()
checkNotchSupport()
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
checkIntent()
} else {
toast(R.string.no_storage_permissions)
finish()
}
}
}
override fun onResume() {
@ -99,9 +91,14 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList
try {
val options = VrVideoView.Options()
options.inputType = VrVideoView.Options.TYPE_MONO
val uri = if (path.startsWith("content://")) {
Uri.parse(path)
} else {
Uri.fromFile(File(path))
}
vr_video_view.apply {
loadVideo(Uri.fromFile(File(path)), options)
loadVideo(uri, options)
pauseVideo()
setFlingingEnabled(true)

View file

@ -150,9 +150,10 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
showSystemUI(true)
val bundle = Bundle()
val file = File(mUri.toString())
val intentType = intent.type ?: ""
val type = when {
filename.isVideoFast() -> TYPE_VIDEOS
filename.isGif() -> TYPE_GIFS
filename.isVideoFast() || intentType.startsWith("video/") -> TYPE_VIDEOS
filename.isGif() || intentType.equals("image/gif", true) -> TYPE_GIFS
filename.isRawFast() -> TYPE_RAWS
filename.isSvg() -> TYPE_SVGS
file.isPortrait() -> TYPE_PORTRAITS

View file

@ -212,7 +212,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
media_horizontal_fastscroller.isHorizontal = true
media_horizontal_fastscroller.beVisibleIf(allowHorizontalScroll)
val sorting = config.getFileSorting(SHOW_ALL)
val sorting = config.getFolderSorting(SHOW_ALL)
if (allowHorizontalScroll) {
media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid) {

View file

@ -1,5 +1,6 @@
package com.simplemobiletools.gallery.pro.activities
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
@ -18,9 +19,11 @@ import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.AlbumCover
import kotlinx.android.synthetic.main.activity_settings.*
import java.io.File
import java.io.InputStream
import java.util.*
class SettingsActivity : SimpleActivity() {
private val PICK_IMPORT_SOURCE_INTENT = 1
private var mRecycleBinContentSize = 0L
override fun onCreate(savedInstanceState: Bundle?) {
@ -94,6 +97,14 @@ class SettingsActivity : SimpleActivity() {
return super.onCreateOptionsMenu(menu)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
val inputStream = contentResolver.openInputStream(resultData.data!!)
parseFile(inputStream)
}
}
private fun setupSectionColors() {
val adjustedPrimaryColor = getAdjustedPrimaryColor()
arrayListOf(visibility_label, videos_label, thumbnails_label, scrolling_label, fullscreen_media_label, security_label,
@ -159,6 +170,7 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupManageHiddenFolders() {
settings_manage_hidden_folders_holder.beVisibleIf(!isQPlus())
settings_manage_hidden_folders_holder.setOnClickListener {
handleHiddenFolderPasswordProtection {
startActivity(Intent(this, HiddenFoldersActivity::class.java))
@ -700,20 +712,32 @@ class SettingsActivity : SimpleActivity() {
private fun setupImportSettings() {
settings_import_holder.setOnClickListener {
if (isQPlus()) {
Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "text/plain"
startActivityForResult(this, PICK_IMPORT_SOURCE_INTENT)
}
} else {
handlePermission(PERMISSION_READ_STORAGE) {
if (it) {
FilePickerDialog(this) {
ensureBackgroundThread {
try {
parseFile(it)
} catch (e: Exception) {
showErrorToast(e)
parseFile(File(it).inputStream())
}
}
}
}
}
}
}
private fun parseFile(path: String) {
val inputStream = File(path).inputStream()
private fun parseFile(inputStream: InputStream?) {
if (inputStream == null) {
toast(R.string.unknown_error_occurred)
return
}
var importedItems = 0
val configValues = LinkedHashMap<String, Any>()
inputStream.bufferedReader().use {

View file

@ -3,7 +3,8 @@ package com.simplemobiletools.gallery.pro.activities
import android.annotation.SuppressLint
import android.database.ContentObserver
import android.net.Uri
import android.provider.MediaStore
import android.provider.MediaStore.Images
import android.provider.MediaStore.Video
import android.view.WindowManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.FilePickerDialog
@ -70,8 +71,8 @@ open class SimpleActivity : BaseSimpleActivity() {
protected fun registerFileUpdateListener() {
try {
contentResolver.registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, observer)
contentResolver.registerContentObserver(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, observer)
contentResolver.registerContentObserver(Images.Media.EXTERNAL_CONTENT_URI, true, observer)
contentResolver.registerContentObserver(Video.Media.EXTERNAL_CONTENT_URI, true, observer)
} catch (ignored: Exception) {
}
}

View file

@ -24,7 +24,6 @@ import com.google.android.exoplayer2.upstream.DataSource
import com.google.android.exoplayer2.upstream.DataSpec
import com.google.android.exoplayer2.video.VideoListener
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.*
@ -63,15 +62,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
setContentView(R.layout.activity_video_player)
setupOrientation()
checkNotchSupport()
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
initPlayer()
} else {
toast(R.string.no_storage_permissions)
finish()
}
}
}
override fun onResume() {

View file

@ -20,7 +20,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.provider.MediaStore
import android.provider.MediaStore.Images
import android.text.Html
import android.view.Menu
import android.view.MenuItem
@ -261,10 +261,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (uri != null) {
var cursor: Cursor? = null
try {
val proj = arrayOf(MediaStore.Images.Media.DATA)
val proj = arrayOf(Images.Media.DATA)
cursor = contentResolver.query(uri, proj, null, null, null)
if (cursor?.moveToFirst() == true) {
mPath = cursor.getStringValue(MediaStore.Images.Media.DATA)
mPath = cursor.getStringValue(Images.Media.DATA)
}
} finally {
cursor?.close()
@ -1033,7 +1033,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
mIgnoredPaths.add(fileDirItem.path)
val media = mMediaFiles.filter { !mIgnoredPaths.contains(it.path) } as ArrayList<ThumbnailItem>
runOnUiThread {
gotMedia(media)
gotMedia(media, true)
}
movePathsInRecycleBin(arrayListOf(path)) {
@ -1055,7 +1055,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
mIgnoredPaths.add(fileDirItem.path)
val media = mMediaFiles.filter { !mIgnoredPaths.contains(it.path) } as ArrayList<ThumbnailItem>
runOnUiThread {
gotMedia(media)
gotMedia(media, true)
}
tryDeleteFileDirItem(fileDirItem, false, true) {
@ -1095,16 +1095,20 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun refreshViewPager() {
if (config.getFileSorting(mDirectory) and SORT_BY_RANDOM == 0) {
if (config.getFolderSorting(mDirectory) and SORT_BY_RANDOM == 0) {
GetMediaAsynctask(applicationContext, mDirectory, false, false, mShowAll) {
gotMedia(it)
}.execute()
}
}
private fun gotMedia(thumbnailItems: ArrayList<ThumbnailItem>) {
private fun gotMedia(thumbnailItems: ArrayList<ThumbnailItem>, ignorePlayingVideos: Boolean = false) {
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 || (getCurrentFragment() as? VideoFragment)?.mIsPlaying == true) {
if (isDirEmpty(media) || media.hashCode() == mPrevHashcode) {
return
}
if (!ignorePlayingVideos && (getCurrentFragment() as? VideoFragment)?.mIsPlaying == true) {
return
}

View file

@ -20,7 +20,7 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage
override fun doInBackground(vararg params: Void): ArrayList<ThumbnailItem> {
val pathToUse = if (showAll) SHOW_ALL else mPath
val folderGrouping = context.config.getFolderGrouping(pathToUse)
val fileSorting = context.config.getFileSorting(pathToUse)
val fileSorting = context.config.getFolderSorting(pathToUse)
val getProperDateTaken = fileSorting and SORT_BY_DATE_TAKEN != 0 ||
folderGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
folderGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
@ -40,7 +40,7 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage
media.addAll(newMedia)
}
mediaFetcher.sortMedia(media, context.config.getFileSorting(SHOW_ALL))
mediaFetcher.sortMedia(media, context.config.getFolderSorting(SHOW_ALL))
media
} else {
mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)

View file

@ -22,7 +22,7 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti
private var view: View
init {
currSorting = if (isDirectorySorting) config.directorySorting else config.getFileSorting(pathToUse)
currSorting = if (isDirectorySorting) config.directorySorting else config.getFolderSorting(pathToUse)
view = activity.layoutInflater.inflate(R.layout.dialog_change_sorting, null).apply {
use_for_this_folder_divider.beVisibleIf(showFolderCheckbox || (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
@ -97,9 +97,9 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti
config.directorySorting = sorting
} else {
if (view.sorting_dialog_use_for_this_folder.isChecked) {
config.saveFileSorting(pathToUse, sorting)
config.saveCustomSorting(pathToUse, sorting)
} else {
config.removeFileSorting(pathToUse)
config.removeCustomSorting(pathToUse)
config.sorting = sorting
}
}

View file

@ -73,7 +73,7 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
}
val scrollHorizontally = activity.config.scrollHorizontally && isGridViewType
val sorting = activity.config.getFileSorting(if (path.isEmpty()) SHOW_ALL else path)
val sorting = activity.config.getFolderSorting(if (path.isEmpty()) SHOW_ALL else path)
view.apply {
media_grid.adapter = adapter

View file

@ -13,6 +13,7 @@ import android.media.ExifInterface
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import android.provider.MediaStore.Images
import android.util.DisplayMetrics
import android.view.View
import androidx.appcompat.app.AppCompatActivity
@ -428,10 +429,10 @@ fun Activity.fixDateTaken(paths: ArrayList<String>, showToasts: Boolean, hasResc
val uri = getFileUri(path)
ContentProviderOperation.newUpdate(uri).apply {
val selection = "${MediaStore.Images.Media.DATA} = ?"
val selection = "${Images.Media.DATA} = ?"
val selectionArgs = arrayOf(path)
withSelection(selection, selectionArgs)
withValue(MediaStore.Images.Media.DATE_TAKEN, timestamp)
withValue(Images.Media.DATE_TAKEN, timestamp)
operations.add(build())
}

View file

@ -4,13 +4,11 @@ import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.database.Cursor
import android.graphics.Point
import android.graphics.drawable.PictureDrawable
import android.media.AudioManager
import android.provider.MediaStore
import android.view.WindowManager
import android.provider.MediaStore.Files
import android.provider.MediaStore.Images
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.Priority
@ -39,63 +37,7 @@ import java.util.LinkedHashSet
import kotlin.Comparator
import kotlin.collections.ArrayList
val Context.portrait get() = resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT
val Context.audioManager get() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val Context.windowManager: WindowManager get() = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val Context.navigationBarRight: Boolean get() = usableScreenSize.x < realScreenSize.x
val Context.navigationBarBottom: Boolean get() = usableScreenSize.y < realScreenSize.y
val Context.navigationBarHeight: Int get() = if (navigationBarBottom) navigationBarSize.y else 0
val Context.navigationBarWidth: Int get() = if (navigationBarRight) navigationBarSize.x else 0
internal val Context.navigationBarSize: Point
get() = when {
navigationBarRight -> Point(newNavigationBarHeight, usableScreenSize.y)
navigationBarBottom -> Point(usableScreenSize.x, newNavigationBarHeight)
else -> Point()
}
internal val Context.newNavigationBarHeight: Int
get() {
var navigationBarHeight = 0
val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android")
if (resourceId > 0) {
navigationBarHeight = resources.getDimensionPixelSize(resourceId)
}
return navigationBarHeight
}
internal val Context.statusBarHeight: Int
get() {
var statusBarHeight = 0
val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
if (resourceId > 0) {
statusBarHeight = resources.getDimensionPixelSize(resourceId)
}
return statusBarHeight
}
internal val Context.actionBarHeight: Int
get() {
val styledAttributes = theme.obtainStyledAttributes(intArrayOf(android.R.attr.actionBarSize))
val actionBarHeight = styledAttributes.getDimension(0, 0f)
styledAttributes.recycle()
return actionBarHeight.toInt()
}
val Context.usableScreenSize: Point
get() {
val size = Point()
windowManager.defaultDisplay.getSize(size)
return size
}
val Context.realScreenSize: Point
get() {
val size = Point()
windowManager.defaultDisplay.getRealSize(size)
return size
}
fun Context.getHumanizedFilename(path: String): String {
val humanized = humanizePath(path)
@ -362,11 +304,11 @@ fun Context.getNoMediaFolders(callback: (folders: ArrayList<String>) -> Unit) {
ensureBackgroundThread {
val folders = ArrayList<String>()
val uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(MediaStore.Files.FileColumns.DATA)
val selection = "${MediaStore.Files.FileColumns.MEDIA_TYPE} = ? AND ${MediaStore.Files.FileColumns.TITLE} LIKE ?"
val selectionArgs = arrayOf(MediaStore.Files.FileColumns.MEDIA_TYPE_NONE.toString(), "%$NOMEDIA%")
val sortOrder = "${MediaStore.Files.FileColumns.DATE_MODIFIED} DESC"
val uri = Files.getContentUri("external")
val projection = arrayOf(Files.FileColumns.DATA)
val selection = "${Files.FileColumns.MEDIA_TYPE} = ? AND ${Files.FileColumns.TITLE} LIKE ?"
val selectionArgs = arrayOf(Files.FileColumns.MEDIA_TYPE_NONE.toString(), "%$NOMEDIA%")
val sortOrder = "${Files.FileColumns.DATE_MODIFIED} DESC"
val OTGPath = config.OTGPath
var cursor: Cursor? = null
@ -374,7 +316,7 @@ fun Context.getNoMediaFolders(callback: (folders: ArrayList<String>) -> Unit) {
cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
if (cursor?.moveToFirst() == true) {
do {
val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA) ?: continue
val path = cursor.getStringValue(Files.FileColumns.DATA) ?: continue
val noMediaFile = File(path)
if (getDoesFilePathExist(noMediaFile.absolutePath, OTGPath) && noMediaFile.name == NOMEDIA) {
folders.add("${noMediaFile.parent}/")
@ -658,7 +600,7 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
}) as ArrayList<Medium>
val pathToUse = if (path.isEmpty()) SHOW_ALL else path
mediaFetcher.sortMedia(media, config.getFileSorting(pathToUse))
mediaFetcher.sortMedia(media, config.getFolderSorting(pathToUse))
val grouped = mediaFetcher.groupMedia(media, pathToUse)
callback(grouped.clone() as ArrayList<ThumbnailItem>)
val OTGPath = config.OTGPath
@ -924,7 +866,7 @@ fun Context.updateDirectoryPath(path: String) {
val albumCovers = config.parseAlbumCovers()
val includedFolders = config.includedFolders
val sorting = config.getFileSorting(path)
val sorting = config.getFolderSorting(path)
val grouping = config.getFolderGrouping(path)
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
sorting and SORT_BY_DATE_TAKEN != 0 ||
@ -945,11 +887,11 @@ fun Context.updateDirectoryPath(path: String) {
fun Context.getFileDateTaken(path: String): Long {
val projection = arrayOf(
MediaStore.Images.Media.DATE_TAKEN
Images.Media.DATE_TAKEN
)
val uri = MediaStore.Files.getContentUri("external")
val selection = "${MediaStore.Images.Media.DATA} = ?"
val uri = Files.getContentUri("external")
val selection = "${Images.Media.DATA} = ?"
val selectionArgs = arrayOf(path)
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
@ -957,7 +899,7 @@ fun Context.getFileDateTaken(path: String): Long {
if (cursor.moveToFirst()) {
do {
try {
return cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN)
return cursor.getLongValue(Images.Media.DATE_TAKEN)
} catch (ignored: Exception) {
}
} while (cursor.moveToNext())

View file

@ -7,9 +7,9 @@ import com.simplemobiletools.commons.helpers.NOMEDIA
import java.io.File
import java.io.IOException
fun String.isThisOrParentIncluded(includedPaths: MutableSet<String>) = includedPaths.any { startsWith(it, true) }
fun String.isThisOrParentIncluded(includedPaths: MutableSet<String>) = includedPaths.any { equals(it, true) } || includedPaths.any { "$this/".startsWith("$it/", true) }
fun String.isThisOrParentExcluded(excludedPaths: MutableSet<String>) = excludedPaths.any { startsWith(it, true) }
fun String.isThisOrParentExcluded(excludedPaths: MutableSet<String>) = excludedPaths.any { equals(it, true) } || excludedPaths.any { "$this/".startsWith("$it/", true) }
fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean): Boolean {
if (isEmpty()) {

View file

@ -77,6 +77,7 @@ class PhotoFragment : ViewPagerFragment() {
private var mIsPanorama = false
private var mIsSubsamplingVisible = false // checking view.visibility is unreliable, use an extra variable for it
private var mCurrentPortraitPhotoPath = ""
private var mOriginalPath = ""
private var mImageOrientation = -1
private var mLoadZoomableViewHandler = Handler()
private var mScreenWidth = 0
@ -99,6 +100,7 @@ class PhotoFragment : ViewPagerFragment() {
}
mMedium = arguments!!.getSerializable(MEDIUM) as Medium
mOriginalPath = mMedium.path
mView.apply {
subsampling_view.setOnClickListener { photoClicked() }
@ -158,24 +160,23 @@ class PhotoFragment : ViewPagerFragment() {
}
if (mMedium.path.startsWith("content://") && !mMedium.path.startsWith("content://mms/")) {
val originalPath = mMedium.path
mMedium.path = context!!.getRealPathFromURI(Uri.parse(originalPath)) ?: mMedium.path
mMedium.path = context!!.getRealPathFromURI(Uri.parse(mOriginalPath)) ?: mMedium.path
if (mMedium.path.isEmpty()) {
var out: FileOutputStream? = null
try {
var inputStream = context!!.contentResolver.openInputStream(Uri.parse(originalPath))
var inputStream = context!!.contentResolver.openInputStream(Uri.parse(mOriginalPath))
val exif = ExifInterface()
exif.readExif(inputStream, ExifInterface.Options.OPTION_ALL)
val tag = exif.getTag(ExifInterface.TAG_ORIENTATION)
val orientation = tag?.getValueAsInt(-1) ?: -1
inputStream = context!!.contentResolver.openInputStream(Uri.parse(originalPath))
inputStream = context!!.contentResolver.openInputStream(Uri.parse(mOriginalPath))
val original = BitmapFactory.decodeStream(inputStream)
val rotated = rotateViaMatrix(original, orientation)
exif.setTagValue(ExifInterface.TAG_ORIENTATION, 1)
exif.removeCompressedThumbnail()
val file = File(context!!.externalCacheDir, Uri.parse(originalPath).lastPathSegment)
val file = File(context!!.externalCacheDir, Uri.parse(mOriginalPath).lastPathSegment)
out = FileOutputStream(file)
rotated.compress(Bitmap.CompressFormat.JPEG, 100, out)
mMedium.path = file.absolutePath
@ -398,6 +399,10 @@ class PhotoFragment : ViewPagerFragment() {
options.diskCacheStrategy(DiskCacheStrategy.NONE)
}
if (context == null) {
return
}
Glide.with(context!!)
.load(getFilePathToShow())
.apply(options)
@ -444,7 +449,13 @@ class PhotoFragment : ViewPagerFragment() {
}
}
override fun onError(e: Exception?) {}
override fun onError(e: Exception?) {
if (mMedium.path != mOriginalPath) {
mMedium.path = mOriginalPath
loadImage()
checkIfPanorama()
}
}
})
} catch (ignored: Exception) {
}

View file

@ -2,6 +2,8 @@ package com.simplemobiletools.gallery.pro.fragments
import android.media.ExifInterface
import android.provider.MediaStore
import android.provider.MediaStore.Files
import android.provider.MediaStore.Images
import android.view.MotionEvent
import androidx.fragment.app.Fragment
import com.simplemobiletools.commons.extensions.*
@ -91,14 +93,14 @@ abstract class ViewPagerFragment : Fragment() {
fun getPathToLoad(medium: Medium) = if (context?.isPathOnOTG(medium.path) == true) medium.path.getOTGPublicPath(context!!) else medium.path
private fun getFileLastModified(file: File): String {
val projection = arrayOf(MediaStore.Images.Media.DATE_MODIFIED)
val uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(Images.Media.DATE_MODIFIED)
val uri = Files.getContentUri("external")
val selection = "${MediaStore.MediaColumns.DATA} = ?"
val selectionArgs = arrayOf(file.absolutePath)
val cursor = context!!.contentResolver.query(uri, projection, selection, selectionArgs, null)
cursor?.use {
return if (cursor.moveToFirst()) {
val dateModified = cursor.getLongValue(MediaStore.Images.Media.DATE_MODIFIED) * 1000L
val dateModified = cursor.getLongValue(Images.Media.DATE_MODIFIED) * 1000L
dateModified.formatDate(context!!)
} else {
file.lastModified().formatDate(context!!)

View file

@ -21,22 +21,6 @@ class Config(context: Context) : BaseConfig(context) {
get(): Int = prefs.getInt(DIRECTORY_SORT_ORDER, SORT_BY_DATE_MODIFIED or SORT_DESCENDING)
set(order) = prefs.edit().putInt(DIRECTORY_SORT_ORDER, order).apply()
fun saveFileSorting(path: String, value: Int) {
if (path.isEmpty()) {
sorting = value
} else {
prefs.edit().putInt(SORT_FOLDER_PREFIX + path.toLowerCase(), value).apply()
}
}
fun getFileSorting(path: String) = prefs.getInt(SORT_FOLDER_PREFIX + path.toLowerCase(), sorting)
fun removeFileSorting(path: String) {
prefs.edit().remove(SORT_FOLDER_PREFIX + path.toLowerCase()).apply()
}
fun hasCustomSorting(path: String) = prefs.contains(SORT_FOLDER_PREFIX + path.toLowerCase())
fun saveFolderGrouping(path: String, value: Int) {
if (path.isEmpty()) {
groupBy = value

View file

@ -4,7 +4,6 @@ import com.simplemobiletools.commons.helpers.MONTH_SECONDS
// shared preferences
const val DIRECTORY_SORT_ORDER = "directory_sort_order"
const val SORT_FOLDER_PREFIX = "sort_folder_"
const val GROUP_FOLDER_PREFIX = "group_folder_"
const val VIEW_TYPE_PREFIX = "view_type_folder_"
const val SHOW_HIDDEN_MEDIA = "show_hidden_media"

View file

@ -5,7 +5,8 @@ import android.database.Cursor
import android.net.Uri
import android.os.Environment
import android.provider.BaseColumns
import android.provider.MediaStore
import android.provider.MediaStore.Files
import android.provider.MediaStore.Images
import android.text.format.DateFormat
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
@ -38,7 +39,7 @@ class MediaFetcher(val context: Context) {
curMedia.addAll(newMedia)
}
sortMedia(curMedia, context.config.getFileSorting(curPath))
sortMedia(curMedia, context.config.getFolderSorting(curPath))
return curMedia
}
@ -54,9 +55,9 @@ class MediaFetcher(val context: Context) {
).filter { context.getDoesFilePathExist(it, OTGPath) })
val filterMedia = context.config.filterMedia
val uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(MediaStore.Images.Media.DATA)
val selection = "${getSelectionQuery(filterMedia)} ${MediaStore.Images.ImageColumns.BUCKET_ID} IS NOT NULL) GROUP BY (${MediaStore.Images.ImageColumns.BUCKET_ID}"
val uri = Files.getContentUri("external")
val projection = arrayOf(Images.Media.DATA)
val selection = getSelectionQuery(filterMedia)
val selectionArgs = getSelectionArgsQuery(filterMedia).toTypedArray()
val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
folders.addAll(parseCursor(cursor!!))
@ -72,8 +73,8 @@ class MediaFetcher(val context: Context) {
}
private fun getLatestFileFolders(): LinkedHashSet<String> {
val uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(MediaStore.Images.ImageColumns.DATA)
val uri = Files.getContentUri("external")
val projection = arrayOf(Images.ImageColumns.DATA)
val parents = LinkedHashSet<String>()
val sorting = "${BaseColumns._ID} DESC LIMIT 50"
var cursor: Cursor? = null
@ -81,7 +82,7 @@ class MediaFetcher(val context: Context) {
cursor = context.contentResolver.query(uri, projection, null, null, sorting)
if (cursor?.moveToFirst() == true) {
do {
val path = cursor.getStringValue(MediaStore.Images.ImageColumns.DATA) ?: continue
val path = cursor.getStringValue(Images.ImageColumns.DATA) ?: continue
parents.add(path.getParentPath())
} while (cursor.moveToNext())
}
@ -96,41 +97,38 @@ class MediaFetcher(val context: Context) {
private fun getSelectionQuery(filterMedia: Int): String {
val query = StringBuilder()
query.append("(")
if (filterMedia and TYPE_IMAGES != 0) {
photoExtensions.forEach {
query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
query.append("${Images.Media.DATA} LIKE ? OR ")
}
}
if (filterMedia and TYPE_PORTRAITS != 0) {
query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
query.append("${Images.Media.DATA} LIKE ? OR ")
query.append("${Images.Media.DATA} LIKE ? OR ")
}
if (filterMedia and TYPE_VIDEOS != 0) {
videoExtensions.forEach {
query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
query.append("${Images.Media.DATA} LIKE ? OR ")
}
}
if (filterMedia and TYPE_GIFS != 0) {
query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
query.append("${Images.Media.DATA} LIKE ? OR ")
}
if (filterMedia and TYPE_RAWS != 0) {
rawExtensions.forEach {
query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
query.append("${Images.Media.DATA} LIKE ? OR ")
}
}
if (filterMedia and TYPE_SVGS != 0) {
query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
query.append("${Images.Media.DATA} LIKE ? OR ")
}
var selectionQuery = query.toString().trim().removeSuffix("OR")
selectionQuery += ") AND "
return selectionQuery
return query.toString().trim().removeSuffix("OR")
}
private fun getSelectionArgsQuery(filterMedia: Int): ArrayList<String> {
@ -174,12 +172,12 @@ class MediaFetcher(val context: Context) {
val config = context.config
val includedFolders = config.includedFolders
val OTGPath = config.OTGPath
var foldersToScan = config.everShownFolders.filter { it == FAVORITES || it == RECYCLE_BIN || context.getDoesFilePathExist(it, OTGPath) }.toMutableList() as ArrayList
var foldersToScan = config.everShownFolders.filter { it == FAVORITES || it == RECYCLE_BIN || context.getDoesFilePathExist(it, OTGPath) }.toHashSet()
cursor.use {
if (cursor.moveToFirst()) {
do {
val path = cursor.getStringValue(MediaStore.Images.Media.DATA)
val path = cursor.getStringValue(Images.Media.DATA)
val parentPath = File(path).parent ?: continue
if (!includedFolders.contains(parentPath) && !foldersToIgnore.contains(parentPath)) {
foldersToScan.add(parentPath)
@ -194,11 +192,11 @@ class MediaFetcher(val context: Context) {
val showHidden = config.shouldShowHidden
val excludedFolders = config.excludedFolders
foldersToScan = foldersToScan.filter { it.shouldFolderBeVisible(excludedFolders, includedFolders, showHidden) } as ArrayList<String>
foldersToScan = foldersToScan.filter { it.shouldFolderBeVisible(excludedFolders, includedFolders, showHidden) }.toHashSet()
return foldersToScan.distinctBy { it.getDistinctPath() }.toMutableSet() as LinkedHashSet<String>
}
private fun addFolder(curFolders: ArrayList<String>, folder: String) {
private fun addFolder(curFolders: HashSet<String>, folder: String) {
curFolders.add(folder)
val files = File(folder).listFiles() ?: return
for (file in files) {
@ -398,12 +396,12 @@ class MediaFetcher(val context: Context) {
val dateTakens = HashMap<String, Long>()
if (folder != FAVORITES) {
val projection = arrayOf(
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_TAKEN
Images.Media.DISPLAY_NAME,
Images.Media.DATE_TAKEN
)
val uri = MediaStore.Files.getContentUri("external")
val selection = "${MediaStore.Images.Media.DATA} LIKE ? AND ${MediaStore.Images.Media.DATA} NOT LIKE ?"
val uri = Files.getContentUri("external")
val selection = "${Images.Media.DATA} LIKE ? AND ${Images.Media.DATA} NOT LIKE ?"
val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
@ -411,9 +409,9 @@ class MediaFetcher(val context: Context) {
if (cursor.moveToFirst()) {
do {
try {
val dateTaken = cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN)
val dateTaken = cursor.getLongValue(Images.Media.DATE_TAKEN)
if (dateTaken != 0L) {
val name = cursor.getStringValue(MediaStore.Images.Media.DISPLAY_NAME)
val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
dateTakens["$folder/$name"] = dateTaken
}
} catch (e: Exception) {

View file

@ -2,6 +2,7 @@ package com.simplemobiletools.gallery.pro.jobs
import android.annotation.TargetApi
import android.app.job.JobInfo
import android.app.job.JobInfo.TriggerContentUri
import android.app.job.JobParameters
import android.app.job.JobScheduler
import android.app.job.JobService
@ -12,6 +13,8 @@ import android.net.Uri
import android.os.Build
import android.os.Handler
import android.provider.MediaStore
import android.provider.MediaStore.Images
import android.provider.MediaStore.Video
import com.simplemobiletools.commons.extensions.getParentPath
import com.simplemobiletools.commons.extensions.getStringValue
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
@ -24,8 +27,8 @@ class NewPhotoFetcher : JobService() {
companion object {
const val PHOTO_VIDEO_CONTENT_JOB = 1
private val MEDIA_URI = Uri.parse("content://${MediaStore.AUTHORITY}/")
private val PHOTO_PATH_SEGMENTS = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.pathSegments
private val VIDEO_PATH_SEGMENTS = MediaStore.Video.Media.EXTERNAL_CONTENT_URI.pathSegments
private val PHOTO_PATH_SEGMENTS = Images.Media.EXTERNAL_CONTENT_URI.pathSegments
private val VIDEO_PATH_SEGMENTS = Video.Media.EXTERNAL_CONTENT_URI.pathSegments
}
private val mHandler = Handler()
@ -38,15 +41,15 @@ class NewPhotoFetcher : JobService() {
fun scheduleJob(context: Context) {
val componentName = ComponentName(context, NewPhotoFetcher::class.java)
val photoUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
val photoUri = Images.Media.EXTERNAL_CONTENT_URI
val videoUri = Video.Media.EXTERNAL_CONTENT_URI
JobInfo.Builder(PHOTO_VIDEO_CONTENT_JOB, componentName).apply {
addTriggerContentUri(JobInfo.TriggerContentUri(photoUri, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
addTriggerContentUri(JobInfo.TriggerContentUri(videoUri, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
addTriggerContentUri(JobInfo.TriggerContentUri(MEDIA_URI, 0))
addTriggerContentUri(TriggerContentUri(photoUri, TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
addTriggerContentUri(TriggerContentUri(videoUri, TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
addTriggerContentUri(TriggerContentUri(MEDIA_URI, 0))
try {
context.getSystemService(JobScheduler::class.java).schedule(build())
context.getSystemService(JobScheduler::class.java)?.schedule(build())
} catch (ignored: Exception) {
}
}
@ -54,7 +57,7 @@ class NewPhotoFetcher : JobService() {
fun isScheduled(context: Context): Boolean {
val jobScheduler = context.getSystemService(JobScheduler::class.java)
val jobs = jobScheduler.allPendingJobs ?: return false
val jobs = jobScheduler.allPendingJobs
return jobs.any { it.id == PHOTO_VIDEO_CONTENT_JOB }
}
@ -77,17 +80,17 @@ class NewPhotoFetcher : JobService() {
if (selection.isNotEmpty()) {
selection.append(" OR ")
}
selection.append("${MediaStore.Images.ImageColumns._ID} = '$id'")
selection.append("${Images.ImageColumns._ID} = '$id'")
}
var cursor: Cursor? = null
try {
val projection = arrayOf(MediaStore.Images.ImageColumns.DATA)
val uris = arrayListOf(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
val projection = arrayOf(Images.ImageColumns.DATA)
val uris = arrayListOf(Images.Media.EXTERNAL_CONTENT_URI, Video.Media.EXTERNAL_CONTENT_URI)
uris.forEach {
cursor = contentResolver.query(it, projection, selection.toString(), null, null)
while (cursor!!.moveToNext()) {
val path = cursor!!.getStringValue(MediaStore.Images.ImageColumns.DATA)
val path = cursor!!.getStringValue(Images.ImageColumns.DATA)
affectedFolderPaths.add(path.getParentPath())
addPathToDB(path)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -6,6 +6,11 @@
android:icon="@drawable/ic_delete_vector"
android:title="@string/delete"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_properties"
android:icon="@drawable/ic_info"
android:title="@string/properties"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_pin"
android:icon="@drawable/ic_pin"
@ -16,11 +21,6 @@
android:icon="@drawable/ic_unpin"
android:title="@string/unpin_folder"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_properties"
android:icon="@drawable/ic_info"
android:title="@string/properties"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_rename"
android:icon="@drawable/ic_rename_new"

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">تقليل عدد الأعمدة</string>
<string name="change_cover_image">تغيير صورة الغلاف</string>
<string name="select_photo">تحديد صورة</string>
<string name="use_default">إستخدام كإفتراضي</string>
<string name="volume">الصوت</string>
<string name="brightness">السبوع</string>
<string name="lock_orientation">قفل الاتجاه</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">تعديل</string>
<string name="save">حفظ</string>
<string name="rotate">تدوير</string>
<string name="path">المسار</string>
<string name="invalid_image_path">مسار الصورة غير صحيح</string>
<string name="image_editing_failed">فشل تعديل الصورة</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Reduce column count</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<string name="lock_orientation">Lock orientation</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Save</string>
<string name="rotate">Rotate</string>
<string name="path">Path</string>
<string name="invalid_image_path">Invalid image path</string>
<string name="image_editing_failed">Image editing failed</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Reduir el número de columnes</string>
<string name="change_cover_image">Canviar imatge de portada</string>
<string name="select_photo">Sel·leccionar imatge</string>
<string name="use_default">Us per defecte</string>
<string name="volume">Volum</string>
<string name="brightness">Brillantor</string>
<string name="lock_orientation">Bloquejar orientació</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Guardar</string>
<string name="rotate">Rotar</string>
<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">S\'ha cancel·lat l\'edició de la imatge</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Snížit počet sloupců</string>
<string name="change_cover_image">Změnit obal alba</string>
<string name="select_photo">Vybrat fotografii</string>
<string name="use_default">Použít výchozí</string>
<string name="volume">Hlasitost</string>
<string name="brightness">Jas</string>
<string name="lock_orientation">Uzamknout orientaci</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Uložit</string>
<string name="rotate">Otočit</string>
<string name="path">Cesta</string>
<string name="invalid_image_path">Neplatná cesta</string>
<string name="image_editing_failed">Úprava souboru selhala</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Færre kolonner</string>
<string name="change_cover_image">Skift cover-billede</string>
<string name="select_photo">Vælg billede</string>
<string name="use_default">Brug standard</string>
<string name="volume">Lydstyrke</string>
<string name="brightness">Lysstyrke</string>
<string name="lock_orientation">Lås orientering</string>
@ -31,7 +30,7 @@
<string name="fix_date_taken">Fiks eksponeringsdato</string>
<string name="fixing">Fikser…</string>
<string name="dates_fixed_successfully">Datoer fikset med succes</string>
<string name="no_date_takens_found">No Date Taken values have been found</string>
<string name="no_date_takens_found">Ingen eksponeringsdatoer er fundet</string>
<string name="share_resized">Del en skaleret version</string>
<string name="upgraded_from_free">Hej\n\nDet ser ud til at du har opgraderet fra den gamle, gratis app. Du kan afinstallere den gamle version, som har en \"Opgrader til Pro\"-knap i toppen af appens indstillinger.\n\nDu vil blot få papirkurvens elementer slettet, favoritter vil blive umarkeret og du vil også skulle genopsætte din apps indstillinger.\n\nTak!</string>
<string name="switch_to_file_search">Skift til filsøgning på tværs af synlige mapper</string>
@ -78,13 +77,11 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Gem</string>
<string name="rotate">Roter</string>
<string name="path">Sti</string>
<string name="invalid_image_path">Ugyldig sti til billede</string>
<string name="image_editing_failed">Redigering af billede mislykkedes</string>
<string name="image_editing_cancelled">Image editing cancelled</string>
<string name="file_edited_successfully">File edited successfully</string>
<string name="image_editing_cancelled">Billede redigering annulleret</string>
<string name="file_edited_successfully">Fil redigeret med succes</string>
<string name="edit_image_with">Rediger billede med:</string>
<string name="no_editor_found">Der blev ikke fundet en editor til billedbehandling</string>
<string name="unknown_file_location">Ukendt filplacering</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Kacheln vergrößern</string>
<string name="change_cover_image">Coverbild ändern</string>
<string name="select_photo">Auswählen</string>
<string name="use_default">Standard</string>
<string name="volume">Lautstärke</string>
<string name="brightness">Helligkeit</string>
<string name="lock_orientation">Bildausrichtung sperren</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Speichern</string>
<string name="rotate">Drehen</string>
<string name="path">Pfad</string>
<string name="invalid_image_path">Ungültiger Dateipfad</string>
<string name="image_editing_failed">Bildbearbeitung fehlgeschlagen</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Μείωση αριθμού στηλών</string>
<string name="change_cover_image">Αλλαγή εξώφυλλου φακέλου</string>
<string name="select_photo">Επιλογή φωτογραφίας</string>
<string name="use_default">Χρήση προεπιλεγμένης</string>
<string name="volume">Ένταση</string>
<string name="brightness">Φωτεινότητα</string>
<string name="lock_orientation">Κλείδωμα προσανατολισμού</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Επεξεργαστής</string>
<string name="save">Αποθήκευση</string>
<string name="rotate">Περιστροφή</string>
<string name="path">Διαδρομή</string>
<string name="invalid_image_path">Μη έγκυρη διαδρομή εικόνας</string>
<string name="image_editing_failed">Η επεξεργασία εικόνας απέτυχε</string>
<string name="image_editing_cancelled">Η επεξεργασία εικόνας ακυρώθηκε</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Reducir el número de columnas</string>
<string name="change_cover_image">Cambiar imagen de portada</string>
<string name="select_photo">Seleccionar imagen</string>
<string name="use_default">Uso por defecto</string>
<string name="volume">Volumen</string>
<string name="brightness">Brillo</string>
<string name="lock_orientation">Bloquear orientación</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Guardar</string>
<string name="rotate">Rotar</string>
<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">Edición de imagen cancelada</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Vähennä sarakkeita</string>
<string name="change_cover_image">Vaihda kansikuva</string>
<string name="select_photo">Valitse kuva</string>
<string name="use_default">Käytä oletuksia</string>
<string name="volume">Äänenvoimakkuus</string>
<string name="brightness">Kirkkaus</string>
<string name="lock_orientation">Lukitse näytönkierto</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editori</string>
<string name="save">Tallenna</string>
<string name="rotate">Käännä</string>
<string name="path">Polku</string>
<string name="invalid_image_path">Kuvan polkua ei ole</string>
<string name="image_editing_failed">Kuvan muokkaus epäonnistui</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Supprimer une colonne</string>
<string name="change_cover_image">Changer l\'image du dossier</string>
<string name="select_photo">Choisir une image</string>
<string name="use_default">Image par défaut</string>
<string name="volume">Volume</string>
<string name="brightness">Luminosité</string>
<string name="lock_orientation">Verrouiller la rotation</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Éditeur</string>
<string name="save">Sauvegarder</string>
<string name="rotate">Pivoter</string>
<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">L\'édition de l\'image a été annulé</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Reduza o número de columnas</string>
<string name="change_cover_image">Cambiar a imaxe de portada</string>
<string name="select_photo">Escolla foto</string>
<string name="use_default">Usar valor por omisión</string>
<string name="volume">Volume</string>
<string name="brightness">Brillo</string>
<string name="lock_orientation">Fixar orientación</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Gardar</string>
<string name="rotate">Rotar</string>
<string name="path">Ruta</string>
<string name="invalid_image_path">Ruta a imaxe non válida</string>
<string name="image_editing_failed">Fallo na edición da imaxe</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Smanji broj stupaca</string>
<string name="change_cover_image">Promjeni naslovnu sliku</string>
<string name="select_photo">Odaberi sliku</string>
<string name="use_default">Koristi zadano</string>
<string name="volume">Glasnoća</string>
<string name="brightness">Svjetlina</string>
<string name="lock_orientation">Zaključaj orijentaciju slike</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Uređivač</string>
<string name="save">Spremi</string>
<string name="rotate">Rotiraj</string>
<string name="path">Putanja</string>
<string name="invalid_image_path">Neispravna putanja slike</string>
<string name="image_editing_failed">Uređivanje slika nije uspjelo</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Csökkentse az oszlopok számát</string>
<string name="change_cover_image">Borítókép változtatása</string>
<string name="select_photo">Válasszon fotót</string>
<string name="use_default">Alapértelmezett használata</string>
<string name="volume">Hangerő</string>
<string name="brightness">Fényerő</string>
<string name="lock_orientation">Tájolás zárolása</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Szerkesztő</string>
<string name="save">Mentés</string>
<string name="rotate">Forgatás</string>
<string name="path">Elérési útvonal</string>
<string name="invalid_image_path">Érvénytelen kép elérési útvonal</string>
<string name="image_editing_failed">Sikertelen kép szerkesztés</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Kurangi jumlah kolom</string>
<string name="change_cover_image">Ubah gambar kover</string>
<string name="select_photo">Pilih foto</string>
<string name="use_default">Gunakan default</string>
<string name="volume">Volume</string>
<string name="brightness">Kecerahan</string>
<string name="lock_orientation">Kunci orientasi</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Penyunting</string>
<string name="save">Simpan</string>
<string name="rotate">Rotasi</string>
<string name="path">Jalur</string>
<string name="invalid_image_path">Jalur gambar tidak valid</string>
<string name="image_editing_failed">Gagal menyunting gambar</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Kurangi jumlah kolom</string>
<string name="change_cover_image">Ubah gambar kover</string>
<string name="select_photo">Pilih foto</string>
<string name="use_default">Gunakan default</string>
<string name="volume">Volume</string>
<string name="brightness">Kecerahan</string>
<string name="lock_orientation">Kunci orientasi</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Penyunting</string>
<string name="save">Simpan</string>
<string name="rotate">Rotasi</string>
<string name="path">Jalur</string>
<string name="invalid_image_path">Jalur gambar tidak valid</string>
<string name="image_editing_failed">Gagal menyunting gambar</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Riduci numero colonne</string>
<string name="change_cover_image">Cambia immagine copertina</string>
<string name="select_photo">Seleziona foto</string>
<string name="use_default">Usa predefinita</string>
<string name="volume">Volume</string>
<string name="brightness">Luminosità</string>
<string name="lock_orientation">Blocca orientamento</string>
@ -31,7 +30,7 @@
<string name="fix_date_taken">Correggi valore Data acquisizione</string>
<string name="fixing">Correzione in corso…</string>
<string name="dates_fixed_successfully">Date aggiornate correttamente</string>
<string name="no_date_takens_found">No Date Taken values have been found</string>
<string name="no_date_takens_found">Nessun valore trovato per data creazione</string>
<string name="share_resized">Condividi una versione ridimensionata</string>
<string name="upgraded_from_free">Hey,\n\nhai aggiornato dalla vecchia versione gratuita. Puoi disinstallare le vecchia versione, che ha un pulsante \'Aggiorna a Pro\' in alto nelle impostazioni.\n\nNon potrai recuperare gli elementi dal cestino, gli elementi marcati come preferiti e dovrai anche reimpostare le impostazioni dell\'app.\n\nGrazie!</string>
<string name="switch_to_file_search">Passa alla ricerca file su tutte le cartelle visibili</string>
@ -78,13 +77,11 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Salva</string>
<string name="rotate">Ruota</string>
<string name="path">Percorso</string>
<string name="invalid_image_path">Percorso dell\'immagine non valido</string>
<string name="image_editing_failed">Modifica dell\'immagine fallita</string>
<string name="image_editing_cancelled">Image editing cancelled</string>
<string name="file_edited_successfully">File edited successfully</string>
<string name="image_editing_cancelled">Modifica immagine annullata</string>
<string name="file_edited_successfully">File modificato correttamente</string>
<string name="edit_image_with">Modifica immagine con:</string>
<string name="no_editor_found">Editor delle immagini non trovato</string>
<string name="unknown_file_location">Posizione del file sconosciuta</string>
@ -294,7 +291,7 @@
<string name="faq_3_title">Come posso fare apparire un album sempre in cima?</string>
<string name="faq_3_text">Si può toccare a lungo l\'album desiderato e selezionare l\'icona puntina nel menù azioni, ciò lo fisserà in cima. Si possono anche fissare varie cartelle, gli elementi fissati saranno ordinati dal metodo di ordinamento predefinito.</string>
<string name="faq_4_title">Come avanzo velocemente nei video?</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">Puoi farlo con un doppio tocco del lato dello schermo o toccando i testi di durata attuale o massima vicino alla barra. Se attivi l\'apertura di video su uno schermo separato nelle impostazioni, puoi anche usare i gesti orizzontali.</string>
<string name="faq_5_title">Che differenza c\'è tra nascondere ed escludere una cartella?</string>
<string name="faq_5_text">Escludere impedisce la visualizzazione della cartella solo in Semplice Galleria, mentre nascondere ha effetto in tutto il sistema e nasconde la cartella anche alle altre gallerie. Funziona creando un file vuoto \".nomedia\" nella cartella in questione, si possono anche rimuovere successivamente con qualsiasi gestore dei file.</string>
<string name="faq_6_title">Perchè vengono mostrate cartelle con copertine o adesivi di musica?</string>
@ -321,7 +318,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Semplice Galleria Pro - gestore di foto &amp; editor</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Browse your memories without any interruptions with this photo and video gallery</string>
<string name="app_short_description">Sfoglia le tue memorie senza interruzioni con questa galleria di foto e video</string>
<string name="app_long_description">
Semplice Galleria Pro è una galleria offline altamente personalizzabile. Organizza, modifica le tue foto, recupera file con il cestino, progetti e nascondi file e visualizza una grande varietà di formati foto e video, inclusi RAW, SVG e molti altri.
@ -369,7 +366,7 @@
<b>Controlla le altre applicazioni qui:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Gallery Pro:</b>
<b>Sito internet di Semplice Galleria Pro:</b>
https://www.simplemobiletools.com/gallery
<b>Facebook:</b>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">列数を減らす</string>
<string name="change_cover_image">カバー画像を変更</string>
<string name="select_photo">写真を選択</string>
<string name="use_default">デフォルトに戻す</string>
<string name="volume">音量</string>
<string name="brightness">明るさ</string>
<string name="lock_orientation">画面の向きを固定する</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">画像編集</string>
<string name="save">保存</string>
<string name="rotate">回転</string>
<string name="path">パス</string>
<string name="invalid_image_path">無効な画像パス</string>
<string name="image_editing_failed">画像の編集に失敗しました</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">섬네일크기 확대</string>
<string name="change_cover_image">커버 사진 변경</string>
<string name="select_photo">사진 선택</string>
<string name="use_default">기본값 사용</string>
<string name="volume">볼륨</string>
<string name="brightness">밝기</string>
<string name="lock_orientation">화면 회전 잠금</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">편집</string>
<string name="save">저장</string>
<string name="rotate">회전</string>
<string name="path">경로</string>
<string name="invalid_image_path">유효하지 않은 사진 경로</string>
<string name="image_editing_failed">사진 편집 실패</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Sumažinti stulpelių skaičių</string>
<string name="change_cover_image">Pakeisti viršelio atvaizdą</string>
<string name="select_photo">Pasirinkti nuotrauką</string>
<string name="use_default">Naudoti numatytąjį</string>
<string name="volume">Garsas</string>
<string name="brightness">Ryškumas</string>
<string name="lock_orientation">Užrakinti orientaciją</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Redaktorius</string>
<string name="save">Saugoti</string>
<string name="rotate">Sukti</string>
<string name="path">Kelias</string>
<string name="invalid_image_path">Netinkamas atvaizdo kelias</string>
<string name="image_editing_failed">Atvaizdo redagavimas nepavyko</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Reduser antall kolonner</string>
<string name="change_cover_image">Endre omslagsbilde</string>
<string name="select_photo">Velg foto</string>
<string name="use_default">Bruk standard</string>
<string name="volume">Volum</string>
<string name="brightness">Lysstyrke</string>
<string name="lock_orientation">Lås skjermorientering</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Redigering</string>
<string name="save">Lagre</string>
<string name="rotate">Roter</string>
<string name="path">Bane</string>
<string name="invalid_image_path">Ugyldig bildebane</string>
<string name="image_editing_failed">Bilderedigering feilet</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">कोलम सङ्खा घटाउनुहोस</string>
<string name="change_cover_image">कभर तस्बिर परिवर्तन गर्नुहोस</string>
<string name="select_photo">फोटो चयन गर्नुहोस</string>
<string name="use_default">डिफल्ट प्रयोग गर्नुहोस</string>
<string name="volume">भोलुम</string>
<string name="brightness">उज्यालोपन</string>
<string name="lock_orientation">Lock orientation</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">सम्पादक</string>
<string name="save">बचत</string>
<string name="rotate">घुमाउने</string>
<string name="path">Path</string>
<string name="invalid_image_path">Invalid image path</string>
<string name="image_editing_failed">Image editing failed</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Minder kolommen</string>
<string name="change_cover_image">Afbeelding omslag wijzigen</string>
<string name="select_photo">Foto selecteren</string>
<string name="use_default">Standaard gebruiken</string>
<string name="volume">Volume</string>
<string name="brightness">Helderheid</string>
<string name="lock_orientation">Schermoriëntatie vergrendelen</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Bewerken</string>
<string name="save">Opslaan</string>
<string name="rotate">Draaien</string>
<string name="path">Pad</string>
<string name="invalid_image_path">Ongeldig pad naar afbeelding</string>
<string name="image_editing_failed">Fout bij bewerken van afbeelding</string>
<string name="image_editing_cancelled">Afbeelding bewerken is geannuleerd</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Zmniejsz liczbę kolumn</string>
<string name="change_cover_image">Zmień okładkę</string>
<string name="select_photo">Wybierz obraz</string>
<string name="use_default">Użyj domyślnej</string>
<string name="volume">Głośność</string>
<string name="brightness">Jasność</string>
<string name="lock_orientation">Zablokuj orientację ekranu</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Edycja</string>
<string name="save">Zapisz</string>
<string name="rotate">Obróć</string>
<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">Anulowano edycję obrazu</string>
@ -191,7 +188,7 @@
<string name="speed">Szybkość</string>
<string name="compromise">Kompromis</string>
<string name="avoid_showing_invalid_files">Unikaj pokazywania niewłaściwych plików</string>
<string name="show_image_file_types">Show image file types</string>
<string name="show_image_file_types">Pokazuj rozszerzenia zdjęć</string>
<!-- Setting sections -->
<string name="thumbnails">Miniatury</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Reduzir número de colunas</string>
<string name="change_cover_image">Trocar imagem de capa</string>
<string name="select_photo">Selecionar foto</string>
<string name="use_default">Usar padrão</string>
<string name="volume">Volume</string>
<string name="brightness">Brilho</string>
<string name="lock_orientation">Travar orientação</string>
@ -31,7 +30,7 @@
<string name="fix_date_taken">Corrigir data da foto</string>
<string name="fixing">Corrigindo…</string>
<string name="dates_fixed_successfully">Datas corrigidas com sucesso</string>
<string name="no_date_takens_found">No Date Taken values have been found</string>
<string name="no_date_takens_found">Nenhum valor de data foi encontrado</string>
<string name="share_resized">Compartilhar uma versão redimensionada</string>
<string name="upgraded_from_free">Olá,\n\nparece que você está atualizando do antigo aplicativo gratuito. Agora você já pode desinstalar a versão antiga, que tem o botão de atualizar para a versão Pro no topo da pagina de Configurações.\n\nVocê terá os itens da Lixeira excluídos, itens favoritos desmarcados e também terá que redefinir as configurações do seu aplicativo.\n\nObrigado!</string>
<string name="switch_to_file_search">Alternar para a pesquisa de arquivos em todas as pastas visíveis</string>
@ -78,12 +77,10 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Salvar</string>
<string name="rotate">Girar</string>
<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="image_editing_cancelled">Edição de imagem cancelada</string>
<string name="file_edited_successfully">Arquivo editado com sucesso</string>
<string name="edit_image_with">Editar imagem com:</string>
<string name="no_editor_found">Nenhum editor de imagem encontrado</string>
@ -294,7 +291,7 @@
<string name="faq_3_title">O que posso fazer para que uma pasta sempre apareça no topo da lista?</string>
<string name="faq_3_text">Faça um toque longo na pasta em questão, e depois toque no ícone de alfinete na parte superior da tela, isto irá fixá-la no topo. Você também pode fixar várias pastas; os itens fixados serão classificados pelo método de ordenação padrão.</string>
<string name="faq_4_title">Como faço para avançar rapidamente um vídeo (fast forward)?</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">Você pode fazer isso tocando duas vezes na lateral da tela ou tocando nos textos atuais ou de duração máxima próximos à barra de busca. Se você ativar a abertura de vídeos em uma tela separada nas configurações do aplicativo, também poderá usar gestos horizontais.</string>
<string name="faq_5_title">Qual é a diferença entre ocultar e ignorar uma pasta?</string>
<string name="faq_5_text">Ignorar deixa de exibir a pasta apenas no Simple Galeria, enquanto Ocultar afeta todo o sistema e pode ocultar pastas de outras galerias também. A função ocultar funciona adicionando um arquivo vazio chamado \".nomedia\" na pasta em questão, arquivo este você também pode excluir com um gerenciador de arquivos, se quiser.</string>
<string name="faq_6_title">Porque pastas com capas de CD de música ou figurinhas aparecem na lista?</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Diminuir número de colunas</string>
<string name="change_cover_image">Alterar imagem de capa</string>
<string name="select_photo">Selecionar foto</string>
<string name="use_default">Predefinição</string>
<string name="volume">Volume</string>
<string name="brightness">Brilho</string>
<string name="lock_orientation">Bloquear orientação</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Guardar</string>
<string name="rotate">Rodar</string>
<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">Edição de imagem cancelada</string>
@ -369,7 +366,7 @@
<b>Consulte todas as aplicações Simple Tools aqui:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Gallery Pro:</b>
<b>Sítio web de Simple Gallery Pro:</b>
https://www.simplemobiletools.com/gallery
<b>Facebook:</b>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Убрать столбец</string>
<string name="change_cover_image">Изменить обложку</string>
<string name="select_photo">Выбрать изображение</string>
<string name="use_default">Использовать по умолчанию</string>
<string name="volume">Громкость</string>
<string name="brightness">Яркость</string>
<string name="lock_orientation">Заблокировать ориентацию</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Редактор</string>
<string name="save">Сохранить</string>
<string name="rotate">Поворот</string>
<string name="path">Путь</string>
<string name="invalid_image_path">Недопустимый путь изображения</string>
<string name="image_editing_failed">Редактирование изображения не выполнено</string>
<string name="image_editing_cancelled">Редактирование изображения отменено</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Znížiť počet stĺpcov</string>
<string name="change_cover_image">Zmeniť obal albumu</string>
<string name="select_photo">Zvoliť foto</string>
<string name="use_default">Použiť predvolený</string>
<string name="volume">Hlasitosť</string>
<string name="brightness">Jas</string>
<string name="lock_orientation">Uzamknúť otočenie obrazovky</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Uložiť</string>
<string name="rotate">Otočiť</string>
<string name="path">Cesta</string>
<string name="invalid_image_path">Neplatná cesta</string>
<string name="image_editing_failed">Úprava súboru zlyhala</string>
<string name="image_editing_cancelled">Úprava súboru bola zrušená</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Zmanjšaj število stolpcev</string>
<string name="change_cover_image">Spremeni naslovno fotografijo</string>
<string name="select_photo">Izberi fotografijo</string>
<string name="use_default">Uporabi privzeto</string>
<string name="volume">Glasnost</string>
<string name="brightness">Svetlost</string>
<string name="lock_orientation">Zakleni usmerjenost</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Urejevalnik</string>
<string name="save">Shrani</string>
<string name="rotate">Zavrti</string>
<string name="path">Pot</string>
<string name="invalid_image_path">Napačna pot</string>
<string name="image_editing_failed">Urejanje slike ni uspelo</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Смањи број колона</string>
<string name="change_cover_image">Промени насловну слику</string>
<string name="select_photo">Изабери фотографију</string>
<string name="use_default">Користи подразумевано</string>
<string name="volume">Јачина звука</string>
<string name="brightness">Осветљење</string>
<string name="lock_orientation">Закључај оријентацију</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Едитор</string>
<string name="save">Сачувај</string>
<string name="rotate">Ротирај</string>
<string name="path">Стаза</string>
<string name="invalid_image_path">Неисправна стаза слике</string>
<string name="image_editing_failed">Измена слике неуспешна</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Minska antalet kolumner</string>
<string name="change_cover_image">Byt omslagsbild</string>
<string name="select_photo">Välj foto</string>
<string name="use_default">Använd standard</string>
<string name="volume">Volym</string>
<string name="brightness">Ljusstyrka</string>
<string name="lock_orientation">Aktivera rotationslås</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Redigerare</string>
<string name="save">Spara</string>
<string name="rotate">Rotera</string>
<string name="path">Sökväg</string>
<string name="invalid_image_path">Ogiltig bildsökväg</string>
<string name="image_editing_failed">Bilden kunde inte redigeras</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Sütun sayısını azalt</string>
<string name="change_cover_image">Kapak resmini değiştir</string>
<string name="select_photo">Fotoğraf seç</string>
<string name="use_default">Varsayılanı kullan</string>
<string name="volume">Ses</string>
<string name="brightness">Parlaklık</string>
<string name="lock_orientation">Yönü kilitle</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Düzenleyici</string>
<string name="save">Kaydet</string>
<string name="rotate">Döndür</string>
<string name="path">Yol</string>
<string name="invalid_image_path">Geçersiz resim yolu</string>
<string name="image_editing_failed">Resim düzenleme başarısız</string>
<string name="image_editing_cancelled">Image editing cancelled</string>
@ -369,7 +366,7 @@
<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>
<b>Basit Galeri Pro\'nun bağımsız web sitesi:</b>
https://www.simplemobiletools.com/gallery
<b>Facebook:</b>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Зменшити кількість колонок</string>
<string name="change_cover_image">Змінити обкладинку</string>
<string name="select_photo">Вибрати фото</string>
<string name="use_default">Використовувати за-замовчуванням</string>
<string name="volume">Об\'єм</string>
<string name="brightness">Яскравість</string>
<string name="lock_orientation">Закріпити орієнтацію</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Редактор</string>
<string name="save">Зберегти</string>
<string name="rotate">Обернути</string>
<string name="path">Шлях</string>
<string name="invalid_image_path">Неприпустимий шлях до зображення</string>
<string name="image_editing_failed">Не вдалося редагувати зображення</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Giảm số lượng cột</string>
<string name="change_cover_image">Thay đổi ảnh bìa</string>
<string name="select_photo">Chọn ảnh</string>
<string name="use_default">Sử dụng mặc định</string>
<string name="volume">Âm lượng</string>
<string name="brightness">Độ sáng</string>
<string name="lock_orientation">Khóa xoay màn hình</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Trình biên tập</string>
<string name="save">Lưu</string>
<string name="rotate">Xoay</string>
<string name="path">Đường dẫn</string>
<string name="invalid_image_path">Đường dẫn hình ảnh không hợp lệ</string>
<string name="image_editing_failed">Thất bại</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">显示更少项目</string>
<string name="change_cover_image">更换封面图片</string>
<string name="select_photo">选择图片</string>
<string name="use_default">使用默认</string>
<string name="volume">音量</string>
<string name="brightness">亮度</string>
<string name="lock_orientation">锁定屏幕方向</string>
@ -31,7 +30,7 @@
<string name="fix_date_taken">修复拍摄日期</string>
<string name="fixing">正在修复…</string>
<string name="dates_fixed_successfully">日期修复成功</string>
<string name="no_date_takens_found">No Date Taken values have been found</string>
<string name="no_date_takens_found">没有找到拍摄日期</string>
<string name="share_resized">调整尺寸并分享</string>
<string name="upgraded_from_free">嘿,\n\n你似乎已经从旧的免费版应用升级。你现在可以卸载旧版本在该版本的应用设置顶部有一个“升级到专业版”按钮。\n\n此操作会删除回收站项目取消标记收藏项目并重置应用设置。\n\n谢谢</string>
<string name="switch_to_file_search">切换文件搜索范围为所有可见的文件夹</string>
@ -42,8 +41,8 @@
<string name="videos">视频</string>
<string name="gifs">GIF</string>
<string name="raw_images">RAW 图片</string>
<string name="svgs">SVG</string>
<string name="portraits">Portraits</string>
<string name="svgs">SVG 矢量图</string>
<string name="portraits">人像</string>
<string name="no_media_with_filters">没有媒体文件匹配选定的筛选条件。</string>
<string name="change_filters_underlined"><u>更改筛选条件</u></string>
@ -78,13 +77,11 @@
<!-- Editor -->
<string name="editor">编辑器</string>
<string name="save">保存</string>
<string name="rotate">旋转</string>
<string name="path">路径</string>
<string name="invalid_image_path">无效的图片路径</string>
<string name="image_editing_failed">图片编辑失败</string>
<string name="image_editing_cancelled">Image editing cancelled</string>
<string name="file_edited_successfully">File edited successfully</string>
<string name="image_editing_cancelled">取消图片编辑</string>
<string name="file_edited_successfully">文件编辑成功</string>
<string name="edit_image_with">编辑方式:</string>
<string name="no_editor_found">没有找到图片编辑器</string>
<string name="unknown_file_location">未知文件位置</string>
@ -205,85 +202,85 @@
<string name="toggle_file_visibility">隐藏文件</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_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_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_transform_button_freeCrop">自定义</string>
<string name="pesdk_transform_button_resetCrop">重置</string>
<string name="pesdk_transform_button_squareCrop">正方形</string>
<string name="pesdk_transform_title_name">裁剪旋转</string>
<string name="pesdk_filter_title_name">滤镜</string>
<string name="pesdk_filter_asset_none"></string>
<string name="pesdk_adjustments_title_name">调整</string>
<string name="pesdk_adjustments_button_shadowTool">阴影</string>
<string name="pesdk_adjustments_button_exposureTool">曝光</string>
<string name="pesdk_adjustments_button_highlightTool">高光</string>
<string name="pesdk_adjustments_button_brightnessTool">亮度</string>
<string name="pesdk_adjustments_button_contrastTool">对比度</string>
<string name="pesdk_adjustments_button_saturationTool">饱和度</string>
<string name="pesdk_adjustments_button_clarityTool">清晰度</string>
<string name="pesdk_adjustments_button_gammaTool">伽马</string>
<string name="pesdk_adjustments_button_blacksTool">黑色</string>
<string name="pesdk_adjustments_button_whitesTool">白色</string>
<string name="pesdk_adjustments_button_temperatureTool">色温</string>
<string name="pesdk_adjustments_button_sharpnessTool">锐化</string>
<string name="pesdk_adjustments_button_reset">重置</string>
<string name="pesdk_focus_title_name">对焦</string>
<string name="pesdk_focus_title_disabled"></string>
<string name="pesdk_focus_button_radial">放射</string>
<string name="pesdk_focus_button_linear">线性</string>
<string name="pesdk_focus_button_mirrored">镜像</string>
<string name="pesdk_focus_button_gaussian">高斯</string>
<string name="pesdk_text_title_name">文字</string>
<string name="pesdk_text_title_options">文字选项</string>
<string name="pesdk_text_title_textColor">文字颜色</string>
<string name="pesdk_text_title_font">字体</string>
<string name="pesdk_text_button_add">添加</string>
<string name="pesdk_text_button_edit">编辑</string>
<string name="pesdk_text_button_straighten">拉伸</string>
<string name="pesdk_text_button_font">字体</string>
<string name="pesdk_text_button_color">颜色</string>
<string name="pesdk_text_button_backgroundColor">背景颜色</string>
<string name="pesdk_text_button_alignment">对齐</string>
<string name="pesdk_text_button_bringToFront">移到最上层</string>
<string name="pesdk_text_button_delete">删除</string>
<string name="pesdk_text_text_editTextPlaceholder">你的文字</string>
<string name="pesdk_brush_title_name">笔刷</string>
<string name="pesdk_brush_button_color">颜色</string>
<string name="pesdk_brush_button_size">尺寸</string>
<string name="pesdk_brush_button_hardness">硬度</string>
<string name="pesdk_brush_button_bringToFront">移到最上层</string>
<string name="pesdk_brush_button_delete">删除</string>
<string name="pesdk_brush_title_brushColor">笔刷颜色</string>
<string name="pesdk_editor_title_name">编辑器</string>
<string name="pesdk_editor_title_closeEditorAlert">关闭编辑器?</string>
<string name="pesdk_editor_text_closeEditorAlert">您确定要放弃编辑吗?</string>
<string name="pesdk_editor_button_closeEditorAlertConfirmation"></string>
<string name="pesdk_editor_button_closeEditorAlertCancelation"></string>
<string name="pesdk_editor_cancel">取消</string>
<string name="pesdk_editor_accept">接受</string>
<string name="pesdk_editor_save">保存</string>
<string name="pesdk_editor_text_exportProgressUnknown">图片导出中</string>
<string name="pesdk_editor_text_exportProgress" formatted="false">图片%s导出中。</string>
<string name="pesdk_common_button_flipH">水平翻转</string>
<string name="pesdk_common_button_flipV">垂直翻转</string>
<string name="pesdk_common_button_undo">复原</string>
<string name="pesdk_common_button_redo">取消复原</string>
<string name="pesdk_common_title_colorPicker">选色器</string>
<string name="pesdk_common_title_transparentColor">透明</string>
<string name="pesdk_common_title_whiteColor">白色</string>
<string name="pesdk_common_title_grayColor">灰色</string>
<string name="pesdk_common_title_blackColor">黑色</string>
<string name="pesdk_common_title_lightBlueColor">浅蓝</string>
<string name="pesdk_common_title_blueColor">蓝色</string>
<string name="pesdk_common_title_purpleColor">紫色</string>
<string name="pesdk_common_title_orchidColor">淡紫</string>
<string name="pesdk_common_title_pinkColor">粉红</string>
<string name="pesdk_common_title_redColor">红色</string>
<string name="pesdk_common_title_orangeColor">橘色</string>
<string name="pesdk_common_title_goldColor">金色</string>
<string name="pesdk_common_title_yellowColor">黄色</string>
<string name="pesdk_common_title_oliveColor">橄榄绿</string>
<string name="pesdk_common_title_greenColor">绿色</string>
<string name="pesdk_common_title_aquamarinColor">碧绿</string>
<string name="pesdk_common_title_pipettableColor">取色器</string>
<!-- FAQ -->
<string name="faq_1_title">如何把简约图库设置为设备的默认图库?</string>
@ -293,7 +290,7 @@
<string name="faq_3_title">如何让某个相册始终显示在最上面?</string>
<string name="faq_3_text">你可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。你也可以固定多个文件夹,固定项目将按照默认排序方法排序。</string>
<string name="faq_4_title">如何快进/快退视频?</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">您可以双击屏幕边缘或点击搜索栏附近的当前或总时长的文字。 如果您在应用设置中启用了在独立页面播放视频,则也可以使用水平手势。</string>
<string name="faq_5_title">文件夹的隐藏和排除有什么区别?</string>
<string name="faq_5_text">排除功能只是防止其在简约图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件你可以使用任何文件管理器删除它。</string>
<string name="faq_6_title">为什么会出现音乐艺术家封面或贴纸文件夹?</string>
@ -319,7 +316,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">简约图库 Pro - 图片管理 &amp; 编辑</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Browse your memories without any interruptions with this photo and video gallery</string>
<string name="app_short_description">使用此照片和视频库来毫无阻碍地浏览您的回忆</string>
<string name="app_long_description">
简约图库 Pro 是一个高度可定制的图库。管理并编辑你的照片从回收站中恢复已删除的照片保护并隐藏文件查看RAWSVG等等多种照片和视频格式。
@ -367,7 +364,7 @@
<b>查看简约系列的所有应用:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Gallery Pro:</b>
<b>简约图库 Pro的独立网站</b>
https://www.simplemobiletools.com/gallery
<b>Facebook:</b>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">減少欄數</string>
<string name="change_cover_image">更換封面圖片</string>
<string name="select_photo">選擇相片</string>
<string name="use_default">使用預設</string>
<string name="volume">音量</string>
<string name="brightness">亮度</string>
<string name="lock_orientation">鎖定方向</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">編輯器</string>
<string name="save">儲存</string>
<string name="rotate">旋轉</string>
<string name="path">路徑</string>
<string name="invalid_image_path">無效的圖片路徑</string>
<string name="image_editing_failed">圖片編輯失敗</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">減少欄數</string>
<string name="change_cover_image">更換封面圖片</string>
<string name="select_photo">選擇相片</string>
<string name="use_default">使用預設</string>
<string name="volume">音量</string>
<string name="brightness">亮度</string>
<string name="lock_orientation">鎖定方向</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">編輯器</string>
<string name="save">儲存</string>
<string name="rotate">旋轉</string>
<string name="path">路徑</string>
<string name="invalid_image_path">無效的圖片路徑</string>
<string name="image_editing_failed">圖片編輯失敗</string>
<string name="image_editing_cancelled">圖片編輯取消</string>
@ -189,7 +186,7 @@
<string name="allow_rotating_gestures">允許用手勢來旋轉圖片</string>
<string name="file_loading_priority">檔案讀取優先權</string>
<string name="speed">速度</string>
<string name="compromise">折衷</string>
<string name="compromise">妥協</string>
<string name="avoid_showing_invalid_files">避免顯示無效的檔案</string>
<string name="show_image_file_types">顯示圖片檔案類型</string>
@ -369,7 +366,7 @@
<b>於此查看簡易工具系列全套:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Gallery Pro:</b>
<b>簡易相簿 Pro的獨立網站:</b>
https://www.simplemobiletools.com/gallery
<b>Facebook:</b>

View file

@ -19,7 +19,6 @@
<string name="reduce_column_count">Reduce column count</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<string name="lock_orientation">Lock orientation</string>
@ -78,9 +77,7 @@
<!-- Editor -->
<string name="editor">Editor</string>
<string name="save">Save</string>
<string name="rotate">Rotate</string>
<string name="path">Path</string>
<string name="invalid_image_path">Invalid image path</string>
<string name="image_editing_failed">Image editing failed</string>
<string name="image_editing_cancelled">Image editing cancelled</string>

View file

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.3.61'
ext.kotlin_version = '1.3.71'
ext.is_proprietary = gradle.startParameter.taskNames.any { task -> task.contains("Proprietary") }
repositories {
@ -13,10 +13,10 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.android.tools.build:gradle:3.6.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
if (is_proprietary) {
classpath 'ly.img.android.pesdk:plugin:7.1.9'
classpath 'ly.img.android.pesdk:plugin:7.1.12'
}
// NOTE: Do not place your application dependencies here; they belong

View file

@ -0,0 +1,4 @@
* Fixed some hiding, excluding and including related glitches
* Flipped Pin and Properties icons at the top menu for better user experience
* Avoid showing Portrait image folders at the main folders screen
* Reverted back to the old image editor in the FOSS app version

View file

@ -0,0 +1,4 @@
* Properly delete playing videos
* Removed the Manage Hidden Folders settings button on Android 10+, it no longer works
* Added many changes under the hood in preparation for handling Scoped Storage soon
* Do not require the Storage permission at some third party intents

View file

@ -0,0 +1,3 @@
* Fixed some SD card file related glitches
* Improved some third party intent handling
* Added some translation and stability improvements

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,6 +1,6 @@
#Tue Aug 27 10:46:16 CEST 2019
#Thu Mar 19 12:33:01 CET 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip