Merge pull request #31 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2018-06-20 15:43:11 +03:00 committed by GitHub
commit 4a13787baa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
75 changed files with 662 additions and 249 deletions

View file

@ -1,6 +1,17 @@
Changelog Changelog
========== ==========
Version 4.2.0 *(2018-06-18)*
----------------------------
* Move some actions at the fullscreen view to the bottom of the screen
* Allow filtering out RAW images separately
* Add a warning if the user tries deleting a folder
* Properly reset the temporary Skip Delete Confirmation dialog
* Show a Pause button over video if not in fullscreen mode
* Fix some glitches around inserting pin/pattern/fingerprint
* Many other stability and ux improvements
Version 4.1.1 *(2018-05-26)* Version 4.1.1 *(2018-05-26)*
---------------------------- ----------------------------

View file

@ -11,8 +11,8 @@ android {
applicationId "com.simplemobiletools.gallery" applicationId "com.simplemobiletools.gallery"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 27 targetSdkVersion 27
versionCode 179 versionCode 180
versionName "4.1.1" versionName "4.2.0"
multiDexEnabled true multiDexEnabled true
setProperty("archivesBaseName", "gallery") setProperty("archivesBaseName", "gallery")
} }
@ -47,12 +47,13 @@ ext {
} }
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:4.1.4' implementation 'com.simplemobiletools:commons:4.2.8'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0'
implementation 'com.android.support:multidex:1.0.3' implementation 'com.android.support:multidex:1.0.3'
implementation 'it.sephiroth.android.exif:library:1.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.12' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.12'
implementation 'com.github.chrisbanes:PhotoView:2.1.3' implementation 'com.github.chrisbanes:PhotoView:2.1.3'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
kapt "android.arch.persistence.room:compiler:1.1.0" kapt "android.arch.persistence.room:compiler:1.1.0"
implementation "android.arch.persistence.room:runtime:1.1.0" implementation "android.arch.persistence.room:runtime:1.1.0"

View file

@ -20,6 +20,8 @@
android:name=".activities.SplashActivity" android:name=".activities.SplashActivity"
android:theme="@style/SplashTheme"> android:theme="@style/SplashTheme">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </activity>

View file

@ -37,6 +37,7 @@ import com.simplemobiletools.gallery.models.Directory
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import java.io.* import java.io.*
import java.util.*
class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
private val PICK_MEDIA = 2 private val PICK_MEDIA = 2
@ -55,6 +56,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
private var mIsGettingDirs = false private var mIsGettingDirs = false
private var mLoadedInitialPhotos = false private var mLoadedInitialPhotos = false
private var mIsPasswordProtectionPending = false private var mIsPasswordProtectionPending = false
private var mWasProtectionHandled = false
private var mLatestMediaId = 0L private var mLatestMediaId = 0L
private var mLatestMediaDateId = 0L private var mLatestMediaDateId = 0L
private var mLastMediaHandler = Handler() private var mLastMediaHandler = Handler()
@ -74,6 +76,8 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
appLaunched(BuildConfig.APPLICATION_ID) appLaunched(BuildConfig.APPLICATION_ID)
config.temporarilyShowHidden = false
config.tempSkipDeleteConfirmation = false
mIsPickImageIntent = isPickImageIntent(intent) mIsPickImageIntent = isPickImageIntent(intent)
mIsPickVideoIntent = isPickVideoIntent(intent) mIsPickVideoIntent = isPickVideoIntent(intent)
mIsGetImageContentIntent = isGetImageContentIntent(intent) mIsGetImageContentIntent = isGetImageContentIntent(intent)
@ -152,8 +156,9 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
directories_empty_text_label.setTextColor(config.textColor) directories_empty_text_label.setTextColor(config.textColor)
directories_empty_text.setTextColor(getAdjustedPrimaryColor()) directories_empty_text.setTextColor(getAdjustedPrimaryColor())
if (mIsPasswordProtectionPending) { if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
handleAppPasswordProtection { handleAppPasswordProtection {
mWasProtectionHandled = it
if (it) { if (it) {
mIsPasswordProtectionPending = false mIsPasswordProtectionPending = false
tryLoadGallery() tryLoadGallery()
@ -176,9 +181,10 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
override fun onStop() { override fun onStop() {
super.onStop() super.onStop()
if (config.temporarilyShowHidden) { if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
mTempShowHiddenHandler.postDelayed({ mTempShowHiddenHandler.postDelayed({
config.temporarilyShowHidden = false config.temporarilyShowHidden = false
config.tempSkipDeleteConfirmation = false
}, SHOW_TEMP_HIDDEN_DURATION) }, SHOW_TEMP_HIDDEN_DURATION)
} else { } else {
mTempShowHiddenHandler.removeCallbacksAndMessages(null) mTempShowHiddenHandler.removeCallbacksAndMessages(null)
@ -228,6 +234,16 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
return true return true
} }
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(WAS_PROTECTION_HANDLED, mWasProtectionHandled)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
mWasProtectionHandled = savedInstanceState.getBoolean(WAS_PROTECTION_HANDLED, false)
}
private fun getRecyclerAdapter() = directories_grid.adapter as? DirectoryAdapter private fun getRecyclerAdapter() = directories_grid.adapter as? DirectoryAdapter
private fun storeStateVariables() { private fun storeStateVariables() {
@ -593,42 +609,46 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
val mediumDao = galleryDB.MediumDao() val mediumDao = galleryDB.MediumDao()
val directoryDao = galleryDB.DirectoryDao() val directoryDao = galleryDB.DirectoryDao()
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
val favoritePaths = getFavoritePaths()
for (directory in dirs) { try {
val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken) for (directory in dirs) {
val newDir = if (curMedia.isEmpty()) { val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths)
directory val newDir = if (curMedia.isEmpty()) {
} else { directory
createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending) } else {
} createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending)
}
// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed // we are looping through the already displayed folders looking for changes, do not do anything if nothing changed
if (directory == newDir) { if (directory == newDir) {
continue continue
} }
directory.apply { directory.apply {
tmb = newDir.tmb tmb = newDir.tmb
name = newDir.name name = newDir.name
mediaCnt = newDir.mediaCnt mediaCnt = newDir.mediaCnt
modified = newDir.modified modified = newDir.modified
taken = newDir.taken taken = newDir.taken
this@apply.size = newDir.size this@apply.size = newDir.size
types = newDir.types types = newDir.types
} }
showSortedDirs(dirs) showSortedDirs(dirs)
// update directories and media files in the local db, delete invalid items // update directories and media files in the local db, delete invalid items
updateDBDirectory(directory) updateDBDirectory(directory)
mediumDao.insertAll(curMedia) mediumDao.insertAll(curMedia)
getCachedMedia(directory.path, getVideosOnly, getImagesOnly) { getCachedMedia(directory.path, getVideosOnly, getImagesOnly) {
it.forEach { it.forEach {
if (!curMedia.contains(it)) { if (!curMedia.contains(it)) {
mediumDao.deleteMediumPath(it.path) mediumDao.deleteMediumPath(it.path)
}
} }
} }
} }
} catch (ignored: ConcurrentModificationException) {
} }
val foldersToScan = mediaFetcher.getFoldersToScan() val foldersToScan = mediaFetcher.getFoldersToScan()
@ -638,7 +658,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
// check the remaining folders which were not cached at all yet // check the remaining folders which were not cached at all yet
for (folder in foldersToScan) { for (folder in foldersToScan) {
val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken) val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths)
if (newMedia.isEmpty()) { if (newMedia.isEmpty()) {
continue continue
} }
@ -875,6 +895,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
add(Release(163, R.string.release_163)) add(Release(163, R.string.release_163))
add(Release(177, R.string.release_177)) add(Release(177, R.string.release_177))
add(Release(178, R.string.release_178)) add(Release(178, R.string.release_178))
add(Release(180, R.string.release_180))
checkWhatsNew(this, BuildConfig.VERSION_CODE) checkWhatsNew(this, BuildConfig.VERSION_CODE)
} }
} }

View file

@ -162,9 +162,10 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
super.onStop() super.onStop()
mSearchMenuItem?.collapseActionView() mSearchMenuItem?.collapseActionView()
if (config.temporarilyShowHidden) { if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
mTempShowHiddenHandler.postDelayed({ mTempShowHiddenHandler.postDelayed({
config.temporarilyShowHidden = false config.temporarilyShowHidden = false
config.tempSkipDeleteConfirmation = false
}, SHOW_TEMP_HIDDEN_DURATION) }, SHOW_TEMP_HIDDEN_DURATION)
} else { } else {
mTempShowHiddenHandler.removeCallbacksAndMessages(null) mTempShowHiddenHandler.removeCallbacksAndMessages(null)

View file

@ -1,6 +1,7 @@
package com.simplemobiletools.gallery.activities package com.simplemobiletools.gallery.activities
import android.content.Intent import android.content.Intent
import android.content.res.Configuration
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.net.Uri import android.net.Uri
@ -20,6 +21,7 @@ import com.simplemobiletools.gallery.fragments.VideoFragment
import com.simplemobiletools.gallery.fragments.ViewPagerFragment import com.simplemobiletools.gallery.fragments.ViewPagerFragment
import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.helpers.*
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
import kotlinx.android.synthetic.main.bottom_actions.*
import kotlinx.android.synthetic.main.fragment_holder.* import kotlinx.android.synthetic.main.fragment_holder.*
import java.io.File import java.io.File
@ -46,6 +48,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
finish() finish()
} }
} }
initBottomActions()
} }
override fun onResume() { override fun onResume() {
@ -87,10 +91,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
val type = when { val type = when {
file.isImageFast() -> TYPE_IMAGES file.isImageFast() -> TYPE_IMAGES
file.isVideoFast() -> TYPE_VIDEOS file.isVideoFast() -> TYPE_VIDEOS
else -> TYPE_GIFS file.isGif() -> TYPE_GIFS
else -> TYPE_RAWS
} }
mMedium = Medium(null, getFilenameFromUri(mUri!!), mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type) mMedium = Medium(null, getFilenameFromUri(mUri!!), mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type, false)
supportActionBar?.title = mMedium!!.name supportActionBar?.title = mMedium!!.name
bundle.putSerializable(MEDIUM, mMedium) bundle.putSerializable(MEDIUM, mMedium)
@ -98,7 +103,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
mFragment = if (mIsVideo) VideoFragment() else PhotoFragment() mFragment = if (mIsVideo) VideoFragment() else PhotoFragment()
mFragment!!.listener = this mFragment!!.listener = this
mFragment!!.arguments = bundle mFragment!!.arguments = bundle
supportFragmentManager.beginTransaction().replace(R.id.fragment_holder, mFragment).commit() supportFragmentManager.beginTransaction().replace(R.id.fragment_placeholder, mFragment).commit()
} }
if (config.blackBackground) { if (config.blackBackground) {
@ -111,6 +116,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
} }
} }
override fun onConfigurationChanged(newConfig: Configuration?) {
super.onConfigurationChanged(newConfig)
initBottomActionsLayout()
}
private fun sendViewPagerIntent(path: String) { private fun sendViewPagerIntent(path: String) {
Intent(this, ViewPagerActivity::class.java).apply { Intent(this, ViewPagerActivity::class.java).apply {
putExtra(IS_VIEW_INTENT, true) putExtra(IS_VIEW_INTENT, true)
@ -125,15 +135,16 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
menu.apply { menu.apply {
findItem(R.id.menu_set_as).isVisible = mMedium?.isImage() == true findItem(R.id.menu_set_as).isVisible = mMedium?.isImage() == true
findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" && !config.bottomActions
findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file"
findItem(R.id.menu_share).isVisible = !config.bottomActions
} }
return true return true
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (mMedium == null) { if (mMedium == null || mUri == null) {
return true return true
} }
@ -152,6 +163,33 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
PropertiesDialog(this, mUri!!.path) PropertiesDialog(this, mUri!!.path)
} }
private fun initBottomActions() {
initBottomActionsLayout()
initBottomActionButtons()
}
private fun initBottomActionsLayout() {
bottom_actions.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight
if (config.bottomActions) {
bottom_actions.beVisible()
} else {
bottom_actions.beGone()
}
}
private fun initBottomActionButtons() {
bottom_favorite.beGone()
bottom_delete.beGone()
bottom_edit.setOnClickListener {
openEditor(mUri!!.toString())
}
bottom_share.setOnClickListener {
sharePath(mUri!!.toString())
}
}
override fun fragmentClicked() { override fun fragmentClicked() {
mIsFullScreen = !mIsFullScreen mIsFullScreen = !mIsFullScreen
if (mIsFullScreen) { if (mIsFullScreen) {
@ -159,6 +197,10 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
} else { } else {
showSystemUI() showSystemUI()
} }
if (!bottom_actions.isGone()) {
bottom_actions.animate().alpha(if (mIsFullScreen) 0f else 1f).start()
}
} }
override fun videoEnded() = false override fun videoEnded() = false

View file

@ -51,12 +51,12 @@ class SettingsActivity : SimpleActivity() {
setupScrollHorizontally() setupScrollHorizontally()
setupScreenRotation() setupScreenRotation()
setupHideSystemUI() setupHideSystemUI()
setupReplaceShare()
setupPasswordProtection() setupPasswordProtection()
setupAppPasswordProtection() setupAppPasswordProtection()
setupDeleteEmptyFolders() setupDeleteEmptyFolders()
setupAllowPhotoGestures() setupAllowPhotoGestures()
setupAllowVideoGestures() setupAllowVideoGestures()
setupBottomActions()
setupShowMediaCount() setupShowMediaCount()
setupKeepLastModified() setupKeepLastModified()
setupShowInfoBubble() setupShowInfoBubble()
@ -219,14 +219,6 @@ class SettingsActivity : SimpleActivity() {
} }
} }
private fun setupReplaceShare() {
settings_replace_share.isChecked = config.replaceShare
settings_replace_share_holder.setOnClickListener {
settings_replace_share.toggle()
config.replaceShare = settings_replace_share.isChecked
}
}
private fun setupPasswordProtection() { private fun setupPasswordProtection() {
settings_password_protection.isChecked = config.isPasswordProtectionOn settings_password_protection.isChecked = config.isPasswordProtectionOn
settings_password_protection_holder.setOnClickListener { settings_password_protection_holder.setOnClickListener {
@ -295,6 +287,14 @@ class SettingsActivity : SimpleActivity() {
} }
} }
private fun setupBottomActions() {
settings_bottom_actions.isChecked = config.bottomActions
settings_bottom_actions_holder.setOnClickListener {
settings_bottom_actions.toggle()
config.bottomActions = settings_bottom_actions.isChecked
}
}
private fun setupShowMediaCount() { private fun setupShowMediaCount() {
settings_show_media_count.isChecked = config.showMediaCount settings_show_media_count.isChecked = config.showMediaCount
settings_show_media_count_holder.setOnClickListener { settings_show_media_count_holder.setOnClickListener {

View file

@ -45,6 +45,7 @@ import com.simplemobiletools.gallery.fragments.ViewPagerFragment
import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.helpers.*
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
import kotlinx.android.synthetic.main.activity_medium.* import kotlinx.android.synthetic.main.activity_medium.*
import kotlinx.android.synthetic.main.bottom_actions.*
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.InputStream import java.io.InputStream
@ -69,7 +70,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mIsOrientationLocked = false private var mIsOrientationLocked = false
private var mStoredReplaceZoomableImages = false private var mStoredReplaceZoomableImages = false
private var mStoredBottomActions = true
private var mMediaFiles = ArrayList<Medium>() private var mMediaFiles = ArrayList<Medium>()
private var mFavoritePaths = ArrayList<String>()
companion object { companion object {
var screenWidth = 0 var screenWidth = 0
@ -80,7 +83,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_medium) setContentView(R.layout.activity_medium)
setTranslucentNavigation()
mMediaFiles = MediaActivity.mMedia.clone() as ArrayList<Medium> mMediaFiles = MediaActivity.mMedia.clone() as ArrayList<Medium>
handlePermission(PERMISSION_WRITE_STORAGE) { handlePermission(PERMISSION_WRITE_STORAGE) {
@ -93,8 +95,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} }
storeStateVariables() storeStateVariables()
initBottomActions()
initFavorites()
} }
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (!hasPermission(PERMISSION_WRITE_STORAGE)) { if (!hasPermission(PERMISSION_WRITE_STORAGE)) {
@ -102,11 +107,23 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return return
} }
if (config.bottomActions) {
if (isLollipopPlus()) {
window.navigationBarColor = Color.TRANSPARENT
}
} else {
setTranslucentNavigation()
}
if (mStoredReplaceZoomableImages != config.replaceZoomableImages) { if (mStoredReplaceZoomableImages != config.replaceZoomableImages) {
mPrevHashcode = 0 mPrevHashcode = 0
refreshViewPager() refreshViewPager()
} }
if (mStoredBottomActions != config.bottomActions) {
initBottomActions()
}
supportActionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.actionbar_gradient_background)) supportActionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.actionbar_gradient_background))
if (config.maxBrightness) { if (config.maxBrightness) {
@ -232,10 +249,24 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
view_pager.adapter?.let { view_pager.adapter?.let {
(it as MyPagerAdapter).toggleFullscreen(mIsFullScreen) (it as MyPagerAdapter).toggleFullscreen(mIsFullScreen)
checkSystemUI() checkSystemUI()
if (!bottom_actions.isGone()) {
bottom_actions.animate().alpha(if (mIsFullScreen) 0f else 1f).start()
}
} }
} }
} }
private fun initBottomActions() {
initBottomActionsLayout()
initBottomActionButtons()
}
private fun initFavorites() {
Thread {
mFavoritePaths = getFavoritePaths()
}.start()
}
private fun setupRotation() { private fun setupRotation() {
if (mIsOrientationLocked) { if (mIsOrientationLocked) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
@ -251,14 +282,18 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_viewpager, menu) menuInflater.inflate(R.menu.menu_viewpager, menu)
val currentMedium = getCurrentMedium() ?: return true val currentMedium = getCurrentMedium() ?: return true
currentMedium.isFavorite = mFavoritePaths.contains(currentMedium.path)
menu.apply { menu.apply {
findItem(R.id.menu_share_1).isVisible = !config.replaceShare findItem(R.id.menu_delete).isVisible = !config.bottomActions
findItem(R.id.menu_share_2).isVisible = config.replaceShare findItem(R.id.menu_share).isVisible = !config.bottomActions
findItem(R.id.menu_edit).isVisible = !config.bottomActions
findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() findItem(R.id.menu_rotate).isVisible = currentMedium.isImage()
findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0 findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0
findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.') findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.')
findItem(R.id.menu_unhide).isVisible = currentMedium.name.startsWith('.') findItem(R.id.menu_unhide).isVisible = currentMedium.name.startsWith('.')
findItem(R.id.menu_add_to_favorites).isVisible = !currentMedium.isFavorite && !config.bottomActions
findItem(R.id.menu_remove_from_favorites).isVisible = currentMedium.isFavorite && !config.bottomActions
findItem(R.id.menu_lock_orientation).isVisible = mRotationDegrees == 0 findItem(R.id.menu_lock_orientation).isVisible = mRotationDegrees == 0
findItem(R.id.menu_lock_orientation).title = getString(if (mIsOrientationLocked) R.string.unlock_orientation else R.string.lock_orientation) findItem(R.id.menu_lock_orientation).title = getString(if (mIsOrientationLocked) R.string.unlock_orientation else R.string.lock_orientation)
findItem(R.id.menu_rotate).setShowAsAction( findItem(R.id.menu_rotate).setShowAsAction(
@ -269,6 +304,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}) })
} }
if (config.bottomActions) {
updateFavoriteIcon(currentMedium)
}
return true return true
} }
@ -284,8 +322,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
R.id.menu_open_with -> openPath(getCurrentPath(), true) R.id.menu_open_with -> openPath(getCurrentPath(), true)
R.id.menu_hide -> toggleFileVisibility(true) R.id.menu_hide -> toggleFileVisibility(true)
R.id.menu_unhide -> toggleFileVisibility(false) R.id.menu_unhide -> toggleFileVisibility(false)
R.id.menu_share_1 -> shareMedium(getCurrentMedium()!!) R.id.menu_share -> shareMedium(getCurrentMedium()!!)
R.id.menu_share_2 -> shareMedium(getCurrentMedium()!!)
R.id.menu_delete -> checkDeleteConfirmation() R.id.menu_delete -> checkDeleteConfirmation()
R.id.menu_rename -> renameFile() R.id.menu_rename -> renameFile()
R.id.menu_edit -> openEditor(getCurrentPath()) R.id.menu_edit -> openEditor(getCurrentPath())
@ -293,6 +330,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
R.id.menu_show_on_map -> showOnMap() R.id.menu_show_on_map -> showOnMap()
R.id.menu_rotate_right -> rotateImage(90) R.id.menu_rotate_right -> rotateImage(90)
R.id.menu_rotate_left -> rotateImage(270) R.id.menu_rotate_left -> rotateImage(270)
R.id.menu_add_to_favorites -> toggleFavorite()
R.id.menu_remove_from_favorites -> toggleFavorite()
R.id.menu_rotate_one_eighty -> rotateImage(180) R.id.menu_rotate_one_eighty -> rotateImage(180)
R.id.menu_lock_orientation -> toggleLockOrientation() R.id.menu_lock_orientation -> toggleLockOrientation()
R.id.menu_save_as -> saveImageAs() R.id.menu_save_as -> saveImageAs()
@ -305,6 +344,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun storeStateVariables() { private fun storeStateVariables() {
config.apply { config.apply {
mStoredReplaceZoomableImages = replaceZoomableImages mStoredReplaceZoomableImages = replaceZoomableImages
mStoredBottomActions = bottomActions
} }
} }
@ -711,6 +751,52 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return (floatD + floatM / 60 + floatS / 3600).toFloat() return (floatD + floatM / 60 + floatS / 3600).toFloat()
} }
private fun initBottomActionsLayout() {
bottom_actions.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight
if (config.bottomActions) {
bottom_actions.beVisible()
} else {
bottom_actions.beGone()
}
}
private fun initBottomActionButtons() {
bottom_favorite.setOnClickListener {
toggleFavorite()
}
bottom_edit.setOnClickListener {
openEditor(getCurrentPath())
}
bottom_share.setOnClickListener {
shareMedium(getCurrentMedium()!!)
}
bottom_delete.setOnClickListener {
checkDeleteConfirmation()
}
}
private fun updateFavoriteIcon(medium: Medium) {
val icon = if (medium.isFavorite) R.drawable.ic_star_on else R.drawable.ic_star_off
bottom_favorite.setImageResource(icon)
}
private fun toggleFavorite() {
val medium = getCurrentMedium() ?: return
medium.isFavorite = !medium.isFavorite
Thread {
galleryDB.MediumDao().updateFavorite(medium.path, medium.isFavorite)
if (medium.isFavorite) {
mFavoritePaths.add(medium.path)
} else {
mFavoritePaths.remove(medium.path)
}
invalidateOptionsMenu()
}.start()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (requestCode == REQUEST_EDIT_IMAGE) { if (requestCode == REQUEST_EDIT_IMAGE) {
if (resultCode == Activity.RESULT_OK && resultData != null) { if (resultCode == Activity.RESULT_OK && resultData != null) {
@ -776,6 +862,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun onConfigurationChanged(newConfig: Configuration?) { override fun onConfigurationChanged(newConfig: Configuration?) {
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
measureScreen() measureScreen()
initBottomActionsLayout()
} }
private fun measureScreen() { private fun measureScreen() {
@ -920,7 +1007,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
mPos = position mPos = position
updateActionbarTitle() updateActionbarTitle()
mRotationDegrees = 0 mRotationDegrees = 0
supportInvalidateOptionsMenu() invalidateOptionsMenu()
scheduleSwipe() scheduleSwipe()
} }
} }

View file

@ -47,12 +47,12 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
override fun getActionMenuId() = R.menu.cab_directories override fun getActionMenuId() = R.menu.cab_directories
override fun prepareItemSelection(view: View) { override fun prepareItemSelection(viewHolder: ViewHolder) {
view.dir_check?.background?.applyColorFilter(primaryColor) viewHolder.itemView.dir_check?.background?.applyColorFilter(primaryColor)
} }
override fun markItemSelection(select: Boolean, view: View?) { override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
view?.dir_check?.beVisibleIf(select) viewHolder?.itemView?.dir_check?.beVisibleIf(select)
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@ -234,17 +234,23 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
activity.runOnUiThread { activity.runOnUiThread {
affectedPositions.sortedDescending().forEach { affectedPositions.sortedDescending().forEach {
notifyItemRemoved(it) notifyItemRemoved(it)
itemViews.put(it, null)
} }
val newItems = SparseArray<View>() val newViewHolders = SparseArray<ViewHolder>()
(0 until itemViews.size()) val cnt = viewHolders.size()
.filter { itemViews[it] != null } for (i in 0..cnt) {
.forEachIndexed { curIndex, i -> newItems.put(curIndex, itemViews[i]) } if (affectedPositions.contains(i)) {
continue
}
val view = viewHolders.get(i, null)
val newIndex = i - selectedPositions.count { it <= i }
newViewHolders.put(newIndex, view)
}
viewHolders = newViewHolders
currentDirectoriesHash = newDirs.hashCode() currentDirectoriesHash = newDirs.hashCode()
itemViews = newItems
dirs = newDirs dirs = newDirs
finishActMode() finishActMode()
fastScroller?.measureRecyclerView() fastScroller?.measureRecyclerView()
listener?.updateDirectories(newDirs) listener?.updateDirectories(newDirs)
@ -290,7 +296,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
} else { } else {
File(path).listFiles()?.filter { File(path).listFiles()?.filter {
!activity.getIsPathDirectory(it.absolutePath) && it.isImageVideoGif() && (showHidden || !it.name.startsWith('.')) !activity.getIsPathDirectory(it.absolutePath) && it.isImageVideoGif() && (showHidden || !it.name.startsWith('.'))
}?.mapTo(paths, { it.absolutePath }) }?.mapTo(paths) { it.absolutePath }
} }
} }
@ -317,8 +323,11 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
if (config.skipDeleteConfirmation) { if (config.skipDeleteConfirmation) {
deleteFiles() deleteFiles()
} else { } else {
val items = resources.getQuantityString(R.plurals.delete_items, selectedPositions.size, selectedPositions.size) val itemsCnt = selectedPositions.size
val question = String.format(resources.getString(R.string.deletion_confirmation), items) val items = resources.getQuantityString(R.plurals.delete_items, itemsCnt, itemsCnt)
var question = String.format(resources.getString(R.string.deletion_confirmation), items)
val warning = resources.getQuantityString(R.plurals.delete_warning, itemsCnt, itemsCnt)
question += "\n\n$warning"
ConfirmationDialog(activity, question) { ConfirmationDialog(activity, question) {
deleteFiles() deleteFiles()
} }
@ -435,7 +444,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
val thumbnailType = when { val thumbnailType = when {
directory.tmb.isImageFast() -> TYPE_IMAGES directory.tmb.isImageFast() -> TYPE_IMAGES
directory.tmb.isVideoFast() -> TYPE_VIDEOS directory.tmb.isVideoFast() -> TYPE_VIDEOS
else -> TYPE_GIFS directory.tmb.isGif() -> TYPE_GIFS
else -> TYPE_RAWS
} }
activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails) activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails)

View file

@ -25,10 +25,10 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList<
override fun prepareActionMode(menu: Menu) {} override fun prepareActionMode(menu: Menu) {}
override fun prepareItemSelection(view: View) {} override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markItemSelection(select: Boolean, view: View?) { override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
view?.manage_folder_holder?.isSelected = select viewHolder?.itemView?.manage_folder_holder?.isSelected = select
} }
override fun actionItemPressed(id: Int) { override fun actionItemPressed(id: Int) {

View file

@ -27,10 +27,10 @@ class ManageHiddenFoldersAdapter(activity: BaseSimpleActivity, var folders: Arra
override fun prepareActionMode(menu: Menu) {} override fun prepareActionMode(menu: Menu) {}
override fun prepareItemSelection(view: View) {} override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markItemSelection(select: Boolean, view: View?) { override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
view?.manage_folder_holder?.isSelected = select viewHolder?.itemView?.manage_folder_holder?.isSelected = select
} }
override fun actionItemPressed(id: Int) { override fun actionItemPressed(id: Int) {

View file

@ -49,12 +49,12 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Medium>,
override fun getActionMenuId() = R.menu.cab_media override fun getActionMenuId() = R.menu.cab_media
override fun prepareItemSelection(view: View) { override fun prepareItemSelection(viewHolder: ViewHolder) {
view.medium_check?.background?.applyColorFilter(primaryColor) viewHolder.itemView?.medium_check?.background?.applyColorFilter(primaryColor)
} }
override fun markItemSelection(select: Boolean, view: View?) { override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
view?.medium_check?.beVisibleIf(select) viewHolder?.itemView?.medium_check?.beVisibleIf(select)
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

View file

@ -3,8 +3,8 @@ package com.simplemobiletools.gallery.asynctasks
import android.content.Context import android.content.Context
import android.os.AsyncTask import android.os.AsyncTask
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_TAKEN import com.simplemobiletools.commons.helpers.SORT_BY_DATE_TAKEN
import com.simplemobiletools.commons.models.FileDirItem.Companion.sorting
import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.extensions.getFavoritePaths
import com.simplemobiletools.gallery.helpers.MediaFetcher import com.simplemobiletools.gallery.helpers.MediaFetcher
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
import java.util.* import java.util.*
@ -15,19 +15,20 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage
private val mediaFetcher = MediaFetcher(context) private val mediaFetcher = MediaFetcher(context)
override fun doInBackground(vararg params: Void): ArrayList<Medium> { override fun doInBackground(vararg params: Void): ArrayList<Medium> {
val getProperDateTaken = sorting and SORT_BY_DATE_TAKEN != 0 val getProperDateTaken = context.config.getFileSorting(mPath) and SORT_BY_DATE_TAKEN != 0
val favoritePaths = context.getFavoritePaths()
return if (showAll) { return if (showAll) {
val foldersToScan = mediaFetcher.getFoldersToScan() val foldersToScan = mediaFetcher.getFoldersToScan()
val media = ArrayList<Medium>() val media = ArrayList<Medium>()
foldersToScan.forEach { foldersToScan.forEach {
val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken) val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, favoritePaths)
media.addAll(newMedia) media.addAll(newMedia)
} }
MediaFetcher(context).sortMedia(media, context.config.getFileSorting("")) MediaFetcher(context).sortMedia(media, context.config.getFileSorting(""))
media media
} else { } else {
mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken) mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, favoritePaths)
} }
} }

View file

@ -9,7 +9,7 @@ import com.simplemobiletools.gallery.interfaces.MediumDao
import com.simplemobiletools.gallery.models.Directory import com.simplemobiletools.gallery.models.Directory
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
@Database(entities = [(Directory::class), (Medium::class)], version = 2) @Database(entities = [(Directory::class), (Medium::class)], version = 3)
abstract class GalleryDatabase : RoomDatabase() { abstract class GalleryDatabase : RoomDatabase() {
abstract fun DirectoryDao(): DirectoryDao abstract fun DirectoryDao(): DirectoryDao

View file

@ -7,6 +7,7 @@ import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.helpers.TYPE_GIFS import com.simplemobiletools.gallery.helpers.TYPE_GIFS
import com.simplemobiletools.gallery.helpers.TYPE_IMAGES import com.simplemobiletools.gallery.helpers.TYPE_IMAGES
import com.simplemobiletools.gallery.helpers.TYPE_RAWS
import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS
import kotlinx.android.synthetic.main.dialog_filter_media.view.* import kotlinx.android.synthetic.main.dialog_filter_media.view.*
@ -19,10 +20,11 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result:
filter_media_images.isChecked = filterMedia and TYPE_IMAGES != 0 filter_media_images.isChecked = filterMedia and TYPE_IMAGES != 0
filter_media_videos.isChecked = filterMedia and TYPE_VIDEOS != 0 filter_media_videos.isChecked = filterMedia and TYPE_VIDEOS != 0
filter_media_gifs.isChecked = filterMedia and TYPE_GIFS != 0 filter_media_gifs.isChecked = filterMedia and TYPE_GIFS != 0
filter_media_raws.isChecked = filterMedia and TYPE_RAWS != 0
} }
AlertDialog.Builder(activity) AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.create().apply { .create().apply {
activity.setupDialogStuff(view, this, R.string.filter_media) activity.setupDialogStuff(view, this, R.string.filter_media)
@ -37,6 +39,8 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result:
result += TYPE_VIDEOS result += TYPE_VIDEOS
if (view.filter_media_gifs.isChecked) if (view.filter_media_gifs.isChecked)
result += TYPE_GIFS result += TYPE_GIFS
if (view.filter_media_raws.isChecked)
result += TYPE_RAWS
activity.config.filterMedia = result activity.config.filterMedia = result
callback(result) callback(result)

View file

@ -2,6 +2,7 @@ package com.simplemobiletools.gallery.extensions
import com.simplemobiletools.gallery.helpers.TYPE_GIFS import com.simplemobiletools.gallery.helpers.TYPE_GIFS
import com.simplemobiletools.gallery.helpers.TYPE_IMAGES import com.simplemobiletools.gallery.helpers.TYPE_IMAGES
import com.simplemobiletools.gallery.helpers.TYPE_RAWS
import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
@ -19,5 +20,9 @@ fun ArrayList<Medium>.getDirMediaTypes(): Int {
types += TYPE_GIFS types += TYPE_GIFS
} }
if (any { it.isRaw() }) {
types += TYPE_RAWS
}
return types return types
} }

View file

@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.database.Cursor import android.database.Cursor
import android.database.sqlite.SQLiteException
import android.graphics.Point import android.graphics.Point
import android.media.AudioManager import android.media.AudioManager
import android.os.Build import android.os.Build
@ -203,7 +204,7 @@ fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders:
fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean) { fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean) {
target.isHorizontalScrolling = horizontalScroll target.isHorizontalScrolling = horizontalScroll
if (type == TYPE_IMAGES || type == TYPE_VIDEOS) { if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS) {
if (type == TYPE_IMAGES && path.isPng()) { if (type == TYPE_IMAGES && path.isPng()) {
loadPng(path, target, cropThumbnails) loadPng(path, target, cropThumbnails)
} else { } else {
@ -276,7 +277,11 @@ fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boo
fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList<Directory>) -> Unit) { fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList<Directory>) -> Unit) {
Thread { Thread {
val directoryDao = galleryDB.DirectoryDao() val directoryDao = galleryDB.DirectoryDao()
val directories = directoryDao.getAll() as ArrayList<Directory> val directories = try {
directoryDao.getAll() as ArrayList<Directory>
} catch (e: SQLiteException) {
ArrayList<Directory>()
}
val shouldShowHidden = config.shouldShowHidden val shouldShowHidden = config.shouldShowHidden
val excludedPaths = config.excludedFolders val excludedPaths = config.excludedFolders
val includedPaths = config.includedFolders val includedPaths = config.includedFolders
@ -289,7 +294,8 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
else -> filteredDirectories.filter { else -> filteredDirectories.filter {
(filterMedia and TYPE_IMAGES != 0 && it.types and TYPE_IMAGES != 0) || (filterMedia and TYPE_IMAGES != 0 && it.types and TYPE_IMAGES != 0) ||
(filterMedia and TYPE_VIDEOS != 0 && it.types and TYPE_VIDEOS != 0) || (filterMedia and TYPE_VIDEOS != 0 && it.types and TYPE_VIDEOS != 0) ||
(filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0) (filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0) ||
(filterMedia and TYPE_RAWS != 0 && it.types and TYPE_RAWS != 0)
} }
}) as ArrayList<Directory> }) as ArrayList<Directory>
@ -316,8 +322,11 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
var media = ArrayList<Medium>() var media = ArrayList<Medium>()
val shouldShowHidden = config.shouldShowHidden val shouldShowHidden = config.shouldShowHidden
foldersToScan.forEach { foldersToScan.forEach {
val currMedia = mediumDao.getMediaFromPath(it) try {
media.addAll(currMedia) val currMedia = mediumDao.getMediaFromPath(it)
media.addAll(currMedia)
} catch (ignored: IllegalStateException) {
}
} }
if (!shouldShowHidden) { if (!shouldShowHidden) {
@ -331,7 +340,8 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
else -> media.filter { else -> media.filter {
(filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES) || (filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES) ||
(filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS) || (filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS) ||
(filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS) (filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS) ||
(filterMedia and TYPE_RAWS != 0 && it.type == TYPE_RAWS)
} }
}) as ArrayList<Medium> }) as ArrayList<Medium>
@ -364,3 +374,5 @@ fun Context.updateDBDirectory(directory: Directory) {
fun Context.getOTGFolderChildren(path: String) = getDocumentFile(path)?.listFiles() fun Context.getOTGFolderChildren(path: String) = getDocumentFile(path)?.listFiles()
fun Context.getOTGFolderChildrenNames(path: String) = getOTGFolderChildren(path)?.map { it.name }?.toList() fun Context.getOTGFolderChildrenNames(path: String) = getOTGFolderChildren(path)?.map { it.name }?.toList()
fun Context.getFavoritePaths() = galleryDB.MediumDao().getFavoritePaths() as ArrayList<String>

View file

@ -3,6 +3,7 @@ package com.simplemobiletools.gallery.extensions
import com.bumptech.glide.signature.ObjectKey import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.helpers.OTG_PATH import com.simplemobiletools.commons.helpers.OTG_PATH
import java.io.File import java.io.File
import java.io.IOException
fun String.getFileSignature(): ObjectKey { fun String.getFileSignature(): ObjectKey {
val file = File(this) val file = File(this)
@ -35,4 +36,10 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPath
} }
// recognize /sdcard/DCIM as the same folder as /storage/emulated/0/DCIM // recognize /sdcard/DCIM as the same folder as /storage/emulated/0/DCIM
fun String.getDistinctPath() = if (startsWith(OTG_PATH)) toLowerCase() else File(this).canonicalPath.toLowerCase() fun String.getDistinctPath(): String {
return try {
if (startsWith(OTG_PATH)) toLowerCase() else File(this).canonicalPath.toLowerCase()
} catch (e: IOException) {
toLowerCase()
}
}

View file

@ -116,7 +116,7 @@ class PhotoFragment : ViewPagerFragment() {
isFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN isFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
loadImage() loadImage()
checkExtendedDetails() initExtendedDetails()
wasInit = true wasInit = true
return view return view
@ -130,7 +130,7 @@ class PhotoFragment : ViewPagerFragment() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (wasInit && (context!!.config.showExtendedDetails != storedShowExtendedDetails || context!!.config.extendedDetails != storedExtendedDetails)) { if (wasInit && (context!!.config.showExtendedDetails != storedShowExtendedDetails || context!!.config.extendedDetails != storedExtendedDetails)) {
checkExtendedDetails() initExtendedDetails()
} }
val allowPhotoGestures = context!!.config.allowPhotoGestures val allowPhotoGestures = context!!.config.allowPhotoGestures
@ -287,7 +287,7 @@ class PhotoFragment : ViewPagerFragment() {
} }
private fun addZoomableView() { private fun addZoomableView() {
if (!context!!.config.replaceZoomableImages && medium.isImage() && isFragmentVisible && view.subsampling_view.isGone() && !medium.isDng()) { if (!context!!.config.replaceZoomableImages && medium.isImage() && isFragmentVisible && view.subsampling_view.isGone()) {
ViewPagerActivity.wasDecodedByGlide = false ViewPagerActivity.wasDecodedByGlide = false
view.subsampling_view.apply { view.subsampling_view.apply {
maxScale = 10f maxScale = 10f
@ -376,16 +376,19 @@ class PhotoFragment : ViewPagerFragment() {
loadBitmap(degrees) loadBitmap(degrees)
} }
private fun checkExtendedDetails() { private fun initExtendedDetails() {
if (context!!.config.showExtendedDetails) { if (context!!.config.showExtendedDetails) {
view.photo_details.apply { view.photo_details.apply {
beInvisible() // make it invisible so we can measure it, but not show yet
text = getMediumExtendedDetails(medium) text = getMediumExtendedDetails(medium)
setTextColor(context.config.textColor)
beVisibleIf(text.isNotEmpty())
alpha = if (!context!!.config.hideExtendedDetails || !isFullscreen) 1f else 0f
onGlobalLayout { onGlobalLayout {
if (height != 0 && isAdded) { if (isAdded) {
y = getExtendedDetailsY(height) val realY = getExtendedDetailsY(height)
if (realY > 0) {
y = realY
beVisibleIf(text.isNotEmpty())
alpha = if (!context!!.config.hideExtendedDetails || !isFullscreen) 1f else 0f
}
} }
} }
} }
@ -405,7 +408,7 @@ class PhotoFragment : ViewPagerFragment() {
override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
loadImage() loadImage()
checkExtendedDetails() initExtendedDetails()
} }
private fun photoClicked() { private fun photoClicked() {
@ -415,7 +418,7 @@ class PhotoFragment : ViewPagerFragment() {
override fun fullscreenToggled(isFullscreen: Boolean) { override fun fullscreenToggled(isFullscreen: Boolean) {
this.isFullscreen = isFullscreen this.isFullscreen = isFullscreen
view.photo_details.apply { view.photo_details.apply {
if (storedShowExtendedDetails) { if (storedShowExtendedDetails && isVisible()) {
animate().y(getExtendedDetailsY(height)) animate().y(getExtendedDetailsY(height))
if (storedHideExtendedDetails) { if (storedHideExtendedDetails) {
@ -428,6 +431,7 @@ class PhotoFragment : ViewPagerFragment() {
private fun getExtendedDetailsY(height: Int): Float { private fun getExtendedDetailsY(height: Int): Float {
val smallMargin = resources.getDimension(R.dimen.small_margin) val smallMargin = resources.getDimension(R.dimen.small_margin)
val fullscreenOffset = context!!.navigationBarHeight.toFloat() - smallMargin val fullscreenOffset = context!!.navigationBarHeight.toFloat() - smallMargin
return context!!.usableScreenSize.y - height + if (isFullscreen) fullscreenOffset else -(if (context!!.navigationBarHeight == 0) smallMargin else 0f) val actionsHeight = if (context!!.config.bottomActions && !isFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f
return context!!.usableScreenSize.y - height - actionsHeight + if (isFullscreen) fullscreenOffset else -smallMargin
} }
} }

View file

@ -53,6 +53,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
private var mStoredShowExtendedDetails = false private var mStoredShowExtendedDetails = false
private var mStoredHideExtendedDetails = false private var mStoredHideExtendedDetails = false
private var mStoredBottomActions = true
private var mStoredExtendedDetails = 0 private var mStoredExtendedDetails = 0
private lateinit var brightnessSideScroll: MediaSideScroll private lateinit var brightnessSideScroll: MediaSideScroll
@ -76,6 +77,8 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
} }
mIsFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN mIsFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
mView!!.video_play_outline.alpha = if (mIsFullscreen) 0f else 1f
setupPlayer() setupPlayer()
if (savedInstanceState != null) { if (savedInstanceState != null) {
mCurrTime = savedInstanceState.getInt(PROGRESS) mCurrTime = savedInstanceState.getInt(PROGRESS)
@ -118,6 +121,11 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
if (context!!.config.showExtendedDetails != mStoredShowExtendedDetails || context!!.config.extendedDetails != mStoredExtendedDetails) { if (context!!.config.showExtendedDetails != mStoredShowExtendedDetails || context!!.config.extendedDetails != mStoredExtendedDetails) {
checkExtendedDetails() checkExtendedDetails()
} }
if (context!!.config.bottomActions != mStoredBottomActions) {
initTimeHolder()
}
storeStateVariables() storeStateVariables()
} }
@ -139,6 +147,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
mStoredShowExtendedDetails = showExtendedDetails mStoredShowExtendedDetails = showExtendedDetails
mStoredHideExtendedDetails = hideExtendedDetails mStoredHideExtendedDetails = hideExtendedDetails
mStoredExtendedDetails = extendedDetails mStoredExtendedDetails = extendedDetails
mStoredBottomActions = bottomActions
} }
} }
@ -199,9 +208,14 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
right += context!!.navigationBarWidth right += context!!.navigationBarWidth
bottom += context!!.navigationBarHeight bottom += context!!.navigationBarHeight
} }
mTimeHolder!!.setPadding(left, top, right, bottom)
} }
if (context!!.config.bottomActions) {
bottom += resources.getDimension(R.dimen.bottom_actions_height).toInt()
}
mTimeHolder!!.setPadding(left, top, right, bottom)
mCurrTimeView = mView!!.video_curr_time mCurrTimeView = mView!!.video_curr_time
mSeekBar = mView!!.video_seekbar mSeekBar = mView!!.video_seekbar
mSeekBar!!.setOnSeekBarChangeListener(this) mSeekBar!!.setOnSeekBarChangeListener(this)
@ -302,7 +316,8 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
} else { } else {
mPlayOnPrepare = true mPlayOnPrepare = true
} }
mView!!.video_play_outline.setImageDrawable(null)
mView!!.video_play_outline.setImageDrawable(resources.getDrawable(R.drawable.img_pause_outline_big))
activity!!.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) activity!!.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} }
@ -462,13 +477,16 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
private fun checkExtendedDetails() { private fun checkExtendedDetails() {
if (context!!.config.showExtendedDetails) { if (context!!.config.showExtendedDetails) {
mView!!.video_details.apply { mView!!.video_details.apply {
beInvisible() // make it invisible so we can measure it, but not show yet
text = getMediumExtendedDetails(medium) text = getMediumExtendedDetails(medium)
setTextColor(context.config.textColor)
beVisibleIf(text.isNotEmpty())
alpha = if (!context!!.config.hideExtendedDetails || !mIsFullscreen) 1f else 0f
onGlobalLayout { onGlobalLayout {
if (height != 0 && isAdded) { if (isAdded) {
y = getExtendedDetailsY(height) val realY = getExtendedDetailsY(height)
if (realY > 0) {
y = realY
beVisibleIf(text.isNotEmpty())
alpha = if (!context!!.config.hideExtendedDetails || !mIsFullscreen) 1f else 0f
}
} }
} }
} }
@ -522,7 +540,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
mIsFullscreen = isFullscreen mIsFullscreen = isFullscreen
checkFullscreen() checkFullscreen()
mView!!.video_details.apply { mView!!.video_details.apply {
if (mStoredShowExtendedDetails) { if (mStoredShowExtendedDetails && isVisible()) {
animate().y(getExtendedDetailsY(height)) animate().y(getExtendedDetailsY(height))
if (mStoredHideExtendedDetails) { if (mStoredHideExtendedDetails) {
@ -530,12 +548,14 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
} }
} }
} }
mView!!.video_play_outline.animate().alpha(if (isFullscreen) 0f else 1f).start()
} }
private fun getExtendedDetailsY(height: Int): Float { private fun getExtendedDetailsY(height: Int): Float {
val smallMargin = resources.getDimension(R.dimen.small_margin) val smallMargin = resources.getDimension(R.dimen.small_margin)
val timeHolderHeight = mTimeHolder!!.height - context!!.navigationBarHeight.toFloat() val timeHolderHeight = mTimeHolder!!.height - context!!.navigationBarHeight.toFloat()
val fullscreenOffset = context!!.navigationBarHeight.toFloat() - smallMargin val fullscreenOffset = context!!.navigationBarHeight.toFloat() - smallMargin
return context!!.usableScreenSize.y - height + if (mIsFullscreen) fullscreenOffset else -(timeHolderHeight + if (context!!.navigationBarHeight == 0) smallMargin else 0f) return context!!.usableScreenSize.y - height + if (mIsFullscreen) fullscreenOffset else -(timeHolderHeight + smallMargin)
} }
} }

View file

@ -151,7 +151,7 @@ class Config(context: Context) : BaseConfig(context) {
set(darkBackground) = prefs.edit().putBoolean(DARK_BACKGROUND, darkBackground).apply() set(darkBackground) = prefs.edit().putBoolean(DARK_BACKGROUND, darkBackground).apply()
var filterMedia: Int var filterMedia: Int
get() = prefs.getInt(FILTER_MEDIA, TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS) get() = prefs.getInt(FILTER_MEDIA, TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS)
set(filterMedia) = prefs.edit().putInt(FILTER_MEDIA, filterMedia).apply() set(filterMedia) = prefs.edit().putInt(FILTER_MEDIA, filterMedia).apply()
var dirColumnCnt: Int var dirColumnCnt: Int
@ -227,10 +227,6 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(HIDE_SYSTEM_UI, false) get() = prefs.getBoolean(HIDE_SYSTEM_UI, false)
set(hideSystemUI) = prefs.edit().putBoolean(HIDE_SYSTEM_UI, hideSystemUI).apply() set(hideSystemUI) = prefs.edit().putBoolean(HIDE_SYSTEM_UI, hideSystemUI).apply()
var replaceShare: Boolean
get() = prefs.getBoolean(REPLACE_SHARE_WITH_ROTATE, false)
set(replaceShare) = prefs.edit().putBoolean(REPLACE_SHARE_WITH_ROTATE, replaceShare).apply()
var deleteEmptyFolders: Boolean var deleteEmptyFolders: Boolean
get() = prefs.getBoolean(DELETE_EMPTY_FOLDERS, false) get() = prefs.getBoolean(DELETE_EMPTY_FOLDERS, false)
set(deleteEmptyFolders) = prefs.edit().putBoolean(DELETE_EMPTY_FOLDERS, deleteEmptyFolders).apply() set(deleteEmptyFolders) = prefs.edit().putBoolean(DELETE_EMPTY_FOLDERS, deleteEmptyFolders).apply()
@ -243,6 +239,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(ALLOW_VIDEO_GESTURES, true) get() = prefs.getBoolean(ALLOW_VIDEO_GESTURES, true)
set(allowVideoGestures) = prefs.edit().putBoolean(ALLOW_VIDEO_GESTURES, allowVideoGestures).apply() set(allowVideoGestures) = prefs.edit().putBoolean(ALLOW_VIDEO_GESTURES, allowVideoGestures).apply()
var bottomActions: Boolean
get() = prefs.getBoolean(BOTTOM_ACTIONS, true)
set(bottomActions) = prefs.edit().putBoolean(BOTTOM_ACTIONS, bottomActions).apply()
var showMediaCount: Boolean var showMediaCount: Boolean
get() = prefs.getBoolean(SHOW_MEDIA_COUNT, true) get() = prefs.getBoolean(SHOW_MEDIA_COUNT, true)
set(showMediaCount) = prefs.edit().putBoolean(SHOW_MEDIA_COUNT, showMediaCount).apply() set(showMediaCount) = prefs.edit().putBoolean(SHOW_MEDIA_COUNT, showMediaCount).apply()

View file

@ -30,7 +30,6 @@ const val EXCLUDED_FOLDERS = "excluded_folders"
const val INCLUDED_FOLDERS = "included_folders" const val INCLUDED_FOLDERS = "included_folders"
const val ALBUM_COVERS = "album_covers" const val ALBUM_COVERS = "album_covers"
const val HIDE_SYSTEM_UI = "hide_system_ui" const val HIDE_SYSTEM_UI = "hide_system_ui"
const val REPLACE_SHARE_WITH_ROTATE = "replace_share_with_rotate"
const val DELETE_EMPTY_FOLDERS = "delete_empty_folders" const val DELETE_EMPTY_FOLDERS = "delete_empty_folders"
const val ALLOW_PHOTO_GESTURES = "allow_photo_gestures" const val ALLOW_PHOTO_GESTURES = "allow_photo_gestures"
const val ALLOW_VIDEO_GESTURES = "allow_video_gestures" const val ALLOW_VIDEO_GESTURES = "allow_video_gestures"
@ -49,6 +48,7 @@ const val WAS_NEW_APP_SHOWN = "was_new_app_shown_clock"
const val LAST_FILEPICKER_PATH = "last_filepicker_path" const val LAST_FILEPICKER_PATH = "last_filepicker_path"
const val WAS_OTG_HANDLED = "was_otg_handled" const val WAS_OTG_HANDLED = "was_otg_handled"
const val TEMP_SKIP_DELETE_CONFIRMATION = "temp_skip_delete_confirmation" const val TEMP_SKIP_DELETE_CONFIRMATION = "temp_skip_delete_confirmation"
const val BOTTOM_ACTIONS = "bottom_actions"
// slideshow // slideshow
const val SLIDESHOW_INTERVAL = "slideshow_interval" const val SLIDESHOW_INTERVAL = "slideshow_interval"
@ -63,8 +63,9 @@ const val SLIDESHOW_DEFAULT_INTERVAL = 5
const val SLIDESHOW_SCROLL_DURATION = 500L const val SLIDESHOW_SCROLL_DURATION = 500L
const val NOMEDIA = ".nomedia" const val NOMEDIA = ".nomedia"
const val FAVORITES = "favorites"
const val MAX_COLUMN_COUNT = 20 const val MAX_COLUMN_COUNT = 20
const val SHOW_TEMP_HIDDEN_DURATION = 600000L const val SHOW_TEMP_HIDDEN_DURATION = 300000L
const val CLICK_MAX_DURATION = 150 const val CLICK_MAX_DURATION = 150
const val DRAG_THRESHOLD = 8 const val DRAG_THRESHOLD = 8
@ -104,6 +105,7 @@ const val EXT_ALBUM = 1024
const val TYPE_IMAGES = 1 const val TYPE_IMAGES = 1
const val TYPE_VIDEOS = 2 const val TYPE_VIDEOS = 2
const val TYPE_GIFS = 4 const val TYPE_GIFS = 4
const val TYPE_RAWS = 8
const val LOCAITON_INTERNAL = 1 const val LOCAITON_INTERNAL = 1
const val LOCATION_SD = 2 const val LOCATION_SD = 2

View file

@ -16,7 +16,7 @@ import java.io.File
class MediaFetcher(val context: Context) { class MediaFetcher(val context: Context) {
var shouldStop = false var shouldStop = false
fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean): ArrayList<Medium> { fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, favoritePaths: ArrayList<String>): ArrayList<Medium> {
val filterMedia = context.config.filterMedia val filterMedia = context.config.filterMedia
if (filterMedia == 0) { if (filterMedia == 0) {
return ArrayList() return ArrayList()
@ -24,10 +24,10 @@ class MediaFetcher(val context: Context) {
val curMedia = ArrayList<Medium>() val curMedia = ArrayList<Medium>()
if (curPath.startsWith(OTG_PATH)) { if (curPath.startsWith(OTG_PATH)) {
val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia) val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia, favoritePaths)
curMedia.addAll(newMedia) curMedia.addAll(newMedia)
} else { } else {
val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken) val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, favoritePaths)
curMedia.addAll(newMedia) curMedia.addAll(newMedia)
} }
@ -67,7 +67,13 @@ class MediaFetcher(val context: Context) {
} }
if (filterMedia and TYPE_GIFS != 0) { if (filterMedia and TYPE_GIFS != 0) {
query.append("${MediaStore.Images.Media.DATA} LIKE ?") query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
}
if (filterMedia and TYPE_RAWS != 0) {
rawExtensions.forEach {
query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ")
}
} }
var selectionQuery = query.toString().trim().removeSuffix("OR") var selectionQuery = query.toString().trim().removeSuffix("OR")
@ -93,10 +99,17 @@ class MediaFetcher(val context: Context) {
args.add("%.gif") args.add("%.gif")
} }
if (filterMedia and TYPE_RAWS != 0) {
rawExtensions.forEach {
args.add("%$it")
}
}
return args return args
} }
private fun parseCursor(cursor: Cursor): ArrayList<String> { private fun parseCursor(cursor: Cursor): ArrayList<String> {
val foldersToIgnore = arrayListOf("/storage/emulated/legacy")
val config = context.config val config = context.config
val includedFolders = config.includedFolders val includedFolders = config.includedFolders
var foldersToScan = ArrayList<String>() var foldersToScan = ArrayList<String>()
@ -106,7 +119,7 @@ class MediaFetcher(val context: Context) {
do { do {
val path = cursor.getStringValue(MediaStore.Images.Media.DATA).trim() val path = cursor.getStringValue(MediaStore.Images.Media.DATA).trim()
val parentPath = File(path).parent?.trimEnd('/') ?: continue val parentPath = File(path).parent?.trimEnd('/') ?: continue
if (!includedFolders.contains(parentPath)) { if (!includedFolders.contains(parentPath) && !foldersToIgnore.contains(parentPath.toLowerCase())) {
foldersToScan.add(parentPath) foldersToScan.add(parentPath)
} }
} while (cursor.moveToNext()) } while (cursor.moveToNext())
@ -143,7 +156,8 @@ class MediaFetcher(val context: Context) {
} }
} }
private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean): ArrayList<Medium> { private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean,
favoritePaths: ArrayList<String>): ArrayList<Medium> {
val media = ArrayList<Medium>() val media = ArrayList<Medium>()
val files = File(folder).listFiles() ?: return media val files = File(folder).listFiles() ?: return media
val doExtraCheck = context.config.doExtraCheck val doExtraCheck = context.config.doExtraCheck
@ -159,8 +173,9 @@ class MediaFetcher(val context: Context) {
val isImage = filename.isImageFast() val isImage = filename.isImageFast()
val isVideo = if (isImage) false else filename.isVideoFast() val isVideo = if (isImage) false else filename.isVideoFast()
val isGif = if (isImage || isVideo) false else filename.isGif() val isGif = if (isImage || isVideo) false else filename.isGif()
val isRaw = if (isImage || isVideo || isGif) false else filename.isRawFast()
if (!isImage && !isVideo && !isGif) if (!isImage && !isVideo && !isGif && !isRaw)
continue continue
if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0)) if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0))
@ -172,6 +187,9 @@ class MediaFetcher(val context: Context) {
if (isGif && filterMedia and TYPE_GIFS == 0) if (isGif && filterMedia and TYPE_GIFS == 0)
continue continue
if (isRaw && filterMedia and TYPE_RAWS == 0)
continue
if (!showHidden && filename.startsWith('.')) if (!showHidden && filename.startsWith('.'))
continue continue
@ -189,16 +207,19 @@ class MediaFetcher(val context: Context) {
val type = when { val type = when {
isImage -> TYPE_IMAGES isImage -> TYPE_IMAGES
isVideo -> TYPE_VIDEOS isVideo -> TYPE_VIDEOS
else -> TYPE_GIFS isGif -> TYPE_GIFS
else -> TYPE_RAWS
} }
val medium = Medium(null, filename, file.absolutePath, folder, lastModified, dateTaken, size, type) val path = file.absolutePath
val isFavorite = favoritePaths.contains(path)
val medium = Medium(null, filename, path, folder, lastModified, dateTaken, size, type, isFavorite)
media.add(medium) media.add(medium)
} }
return media return media
} }
private fun getMediaOnOTG(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int): ArrayList<Medium> { private fun getMediaOnOTG(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList<String>): ArrayList<Medium> {
val media = ArrayList<Medium>() val media = ArrayList<Medium>()
val files = context.getDocumentFile(folder)?.listFiles() ?: return media val files = context.getDocumentFile(folder)?.listFiles() ?: return media
val doExtraCheck = context.config.doExtraCheck val doExtraCheck = context.config.doExtraCheck
@ -213,8 +234,9 @@ class MediaFetcher(val context: Context) {
val isImage = filename.isImageFast() val isImage = filename.isImageFast()
val isVideo = if (isImage) false else filename.isVideoFast() val isVideo = if (isImage) false else filename.isVideoFast()
val isGif = if (isImage || isVideo) false else filename.isGif() val isGif = if (isImage || isVideo) false else filename.isGif()
val isRaw = if (isImage || isVideo || isGif) false else filename.isRawFast()
if (!isImage && !isVideo && !isGif) if (!isImage && !isVideo && !isGif || !isRaw)
continue continue
if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0)) if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0))
@ -226,6 +248,9 @@ class MediaFetcher(val context: Context) {
if (isGif && filterMedia and TYPE_GIFS == 0) if (isGif && filterMedia and TYPE_GIFS == 0)
continue continue
if (isRaw && filterMedia and TYPE_RAWS == 0)
continue
if (!showHidden && filename.startsWith('.')) if (!showHidden && filename.startsWith('.'))
continue continue
@ -239,11 +264,13 @@ class MediaFetcher(val context: Context) {
val type = when { val type = when {
isImage -> TYPE_IMAGES isImage -> TYPE_IMAGES
isVideo -> TYPE_VIDEOS isVideo -> TYPE_VIDEOS
else -> TYPE_GIFS isGif -> TYPE_GIFS
else -> TYPE_RAWS
} }
val path = Uri.decode(file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", OTG_PATH)) val path = Uri.decode(file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", OTG_PATH))
val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type) val isFavorite = favoritePaths.contains(path)
val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type, isFavorite)
media.add(medium) media.add(medium)
} }
@ -262,7 +289,7 @@ class MediaFetcher(val context: Context) {
val dateTakens = HashMap<String, Long>() val dateTakens = HashMap<String, Long>()
val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
cursor.use { cursor?.use {
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
try { try {

View file

@ -8,9 +8,12 @@ import com.simplemobiletools.gallery.models.Medium
@Dao @Dao
interface MediumDao { interface MediumDao {
@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type FROM media WHERE parent_path = :path") @Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, is_favorite FROM media WHERE parent_path = :path")
fun getMediaFromPath(path: String): List<Medium> fun getMediaFromPath(path: String): List<Medium>
@Query("SELECT full_path FROM media WHERE is_favorite = 1")
fun getFavoritePaths(): List<String>
@Insert(onConflict = REPLACE) @Insert(onConflict = REPLACE)
fun insert(medium: Medium) fun insert(medium: Medium)
@ -22,4 +25,7 @@ interface MediumDao {
@Query("UPDATE OR REPLACE media SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath") @Query("UPDATE OR REPLACE media SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath")
fun updateMedium(oldPath: String, newParentPath: String, newFilename: String, newFullPath: String) fun updateMedium(oldPath: String, newParentPath: String, newFilename: String, newFullPath: String)
@Query("UPDATE media SET is_favorite = :isFavorite WHERE full_path = :path")
fun updateFavorite(path: String, isFavorite: Boolean)
} }

View file

@ -6,13 +6,13 @@ import android.arch.persistence.room.Index
import android.arch.persistence.room.PrimaryKey import android.arch.persistence.room.PrimaryKey
import com.simplemobiletools.commons.extensions.formatDate import com.simplemobiletools.commons.extensions.formatDate
import com.simplemobiletools.commons.extensions.formatSize import com.simplemobiletools.commons.extensions.formatSize
import com.simplemobiletools.commons.extensions.isDng
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_BY_NAME import com.simplemobiletools.commons.helpers.SORT_BY_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_PATH import com.simplemobiletools.commons.helpers.SORT_BY_PATH
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import com.simplemobiletools.gallery.helpers.TYPE_GIFS import com.simplemobiletools.gallery.helpers.TYPE_GIFS
import com.simplemobiletools.gallery.helpers.TYPE_IMAGES import com.simplemobiletools.gallery.helpers.TYPE_IMAGES
import com.simplemobiletools.gallery.helpers.TYPE_RAWS
import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS
import java.io.Serializable import java.io.Serializable
@ -25,7 +25,8 @@ data class Medium(
@ColumnInfo(name = "last_modified") val modified: Long, @ColumnInfo(name = "last_modified") val modified: Long,
@ColumnInfo(name = "date_taken") var taken: Long, @ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "size") val size: Long, @ColumnInfo(name = "size") val size: Long,
@ColumnInfo(name = "type") val type: Int) : Serializable { @ColumnInfo(name = "type") val type: Int,
@ColumnInfo(name = "is_favorite") var isFavorite: Boolean) : Serializable {
companion object { companion object {
private const val serialVersionUID = -6553149366975455L private const val serialVersionUID = -6553149366975455L
@ -37,7 +38,7 @@ data class Medium(
fun isVideo() = type == TYPE_VIDEOS fun isVideo() = type == TYPE_VIDEOS
fun isDng() = path.isDng() fun isRaw() = type == TYPE_RAWS
fun getBubbleText(sorting: Int) = when { fun getBubbleText(sorting: Int) = when {
sorting and SORT_BY_NAME != 0 -> name sorting and SORT_BY_NAME != 0 -> name

View file

@ -3,14 +3,12 @@ package com.simplemobiletools.gallery.receivers
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import com.simplemobiletools.commons.extensions.getFilenameFromPath import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.getParentPath
import com.simplemobiletools.commons.extensions.isImageFast
import com.simplemobiletools.commons.extensions.isVideoFast
import com.simplemobiletools.commons.helpers.REFRESH_PATH import com.simplemobiletools.commons.helpers.REFRESH_PATH
import com.simplemobiletools.gallery.extensions.galleryDB import com.simplemobiletools.gallery.extensions.galleryDB
import com.simplemobiletools.gallery.helpers.TYPE_GIFS import com.simplemobiletools.gallery.helpers.TYPE_GIFS
import com.simplemobiletools.gallery.helpers.TYPE_IMAGES import com.simplemobiletools.gallery.helpers.TYPE_IMAGES
import com.simplemobiletools.gallery.helpers.TYPE_RAWS
import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
import java.io.File import java.io.File
@ -21,7 +19,7 @@ class RefreshMediaReceiver : BroadcastReceiver() {
Thread { Thread {
val medium = Medium(null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(), val medium = Medium(null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(),
File(path).length(), getFileType(path)) File(path).length(), getFileType(path), false)
context.galleryDB.MediumDao().insert(medium) context.galleryDB.MediumDao().insert(medium)
}.start() }.start()
} }
@ -29,6 +27,7 @@ class RefreshMediaReceiver : BroadcastReceiver() {
private fun getFileType(path: String) = when { private fun getFileType(path: String) = when {
path.isImageFast() -> TYPE_IMAGES path.isImageFast() -> TYPE_IMAGES
path.isVideoFast() -> TYPE_VIDEOS path.isVideoFast() -> TYPE_VIDEOS
else -> TYPE_GIFS path.isGif() -> TYPE_GIFS
else -> TYPE_RAWS
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 6 KiB

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="90"
android:endColor="@android:color/transparent"
android:startColor="@color/circle_black_background"/>
</shape>

View file

@ -10,4 +10,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent"/>
<include
android:id="@+id/bottom_actions"
layout="@layout/bottom_actions"/>
</RelativeLayout> </RelativeLayout>

View file

@ -557,29 +557,6 @@
</RelativeLayout> </RelativeLayout>
<RelativeLayout
android:id="@+id/settings_replace_share_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_replace_share"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:text="@string/replace_share_with_rotate"/>
</RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/settings_one_finger_zoom_holder" android:id="@+id/settings_one_finger_zoom_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -672,6 +649,29 @@
</RelativeLayout> </RelativeLayout>
<RelativeLayout
android:id="@+id/settings_bottom_actions_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_bottom_actions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_at_bottom"/>
</RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/settings_screen_rotation_holder" android:id="@+id/settings_screen_rotation_holder"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_actions_wrapper"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_actions_height"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient_background_lighter"
android:paddingTop="@dimen/medium_margin">
<ImageView
android:id="@+id/bottom_favorite"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_star_off"
app:layout_constraintEnd_toStartOf="@+id/bottom_edit"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
<ImageView
android:id="@+id/bottom_edit"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_edit"
app:layout_constraintEnd_toStartOf="@+id/bottom_share"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_favorite"/>
<ImageView
android:id="@+id/bottom_share"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_share"
app:layout_constraintEnd_toStartOf="@+id/bottom_delete"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_edit"/>
<ImageView
android:id="@+id/bottom_delete"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_delete"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/bottom_share"/>
</android.support.constraint.ConstraintLayout>

View file

@ -33,4 +33,12 @@
android:paddingTop="@dimen/activity_margin" android:paddingTop="@dimen/activity_margin"
android:text="@string/gifs"/> android:text="@string/gifs"/>
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/filter_media_raws"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:text="@string/raw_images"/>
</LinearLayout> </LinearLayout>

View file

@ -1,6 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_holder" android:id="@+id/fragment_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragment_placeholder"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<include
android:id="@+id/bottom_actions"
layout="@layout/bottom_actions"/>
</RelativeLayout>

View file

@ -18,7 +18,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:visibility="gone"/> android:visibility="gone"/>
<com.simplemobiletools.commons.views.MyTextView <TextView
android:id="@+id/photo_details" android:id="@+id/photo_details"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -27,6 +27,7 @@
android:layout_marginRight="@dimen/small_margin" android:layout_marginRight="@dimen/small_margin"
android:background="@color/gradient_grey_start" android:background="@color/gradient_grey_start"
android:padding="@dimen/small_margin" android:padding="@dimen/small_margin"
android:textColor="@color/theme_dark_text_color"
android:textSize="@dimen/smaller_text_size" android:textSize="@dimen/smaller_text_size"
android:visibility="gone" android:visibility="gone"
tools:text="My image\nAnother line"/> tools:text="My image\nAnother line"/>

View file

@ -43,7 +43,7 @@
android:layout_height="@dimen/play_outline_size_big" android:layout_height="@dimen/play_outline_size_big"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:background="@android:color/transparent" android:background="@android:color/transparent"
android:padding="@dimen/activity_margin" android:padding="@dimen/big_margin"
android:src="@drawable/img_play_outline_big"/> android:src="@drawable/img_play_outline_big"/>
<TextView <TextView
@ -63,7 +63,7 @@
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:textSize="@dimen/extra_big_text_size"/> android:textSize="@dimen/extra_big_text_size"/>
<com.simplemobiletools.commons.views.MyTextView <TextView
android:id="@+id/video_details" android:id="@+id/video_details"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -72,6 +72,7 @@
android:layout_marginRight="@dimen/small_margin" android:layout_marginRight="@dimen/small_margin"
android:background="@color/gradient_grey_start" android:background="@color/gradient_grey_start"
android:padding="@dimen/small_margin" android:padding="@dimen/small_margin"
android:textColor="@color/theme_dark_text_color"
android:textSize="@dimen/smaller_text_size" android:textSize="@dimen/smaller_text_size"
android:visibility="gone" android:visibility="gone"
tools:text="My video\nAnother line"/> tools:text="My video\nAnother line"/>

View file

@ -13,7 +13,7 @@
android:title="@string/delete" android:title="@string/delete"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/menu_share_1" android:id="@+id/menu_share"
android:icon="@drawable/ic_share" android:icon="@drawable/ic_share"
android:title="@string/share" android:title="@string/share"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
@ -35,10 +35,14 @@
</menu> </menu>
</item> </item>
<item <item
android:id="@+id/menu_share_2" android:id="@+id/menu_add_to_favorites"
android:icon="@drawable/ic_share" android:icon="@drawable/ic_star_off"
android:title="@string/share" android:title="@string/add_to_favorites"
android:visible="false" app:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_remove_from_favorites"
android:icon="@drawable/ic_star_on"
android:title="@string/remove_from_favorites"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/menu_lock_orientation" android:id="@+id/menu_lock_orientation"

View file

@ -30,6 +30,7 @@
<string name="images">الصور</string> <string name="images">الصور</string>
<string name="videos">الفديوهات</string> <string name="videos">الفديوهات</string>
<string name="gifs">الصور المتحركة</string> <string name="gifs">الصور المتحركة</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">لم يتم العثور على ملفات وسائط مع الفلاتر المحددة</string> <string name="no_media_with_filters">لم يتم العثور على ملفات وسائط مع الفلاتر المحددة</string>
<string name="change_filters_underlined"><u >تغيير الفلاتر</u></string> <string name="change_filters_underlined"><u >تغيير الفلاتر</u></string>
@ -151,6 +152,7 @@
<string name="replace_zoomable_images">استبدل الصور التي يمكن تكبيرها بعمق باستخدام صور ذات جودة أفضل</string> <string name="replace_zoomable_images">استبدل الصور التي يمكن تكبيرها بعمق باستخدام صور ذات جودة أفضل</string>
<string name="hide_extended_details">إخفاء التفاصيل الموسعة عند إخفاء شريط الحالة</string> <string name="hide_extended_details">إخفاء التفاصيل الموسعة عند إخفاء شريط الحالة</string>
<string name="do_extra_check">قم بإجراء فحص إضافي لتجنب إظهار الملفات التالفة</string> <string name="do_extra_check">قم بإجراء فحص إضافي لتجنب إظهار الملفات التالفة</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">المصغرات</string> <string name="thumbnails">المصغرات</string>

View file

@ -30,6 +30,7 @@
<string name="images">Imatges</string> <string name="images">Imatges</string>
<string name="videos">Vídeos</string> <string name="videos">Vídeos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">No s\'han tronat arxius amb els filtres seleccionats.</string> <string name="no_media_with_filters">No s\'han tronat arxius amb els filtres seleccionats.</string>
<string name="change_filters_underlined"><u>Canviar filtres</u></string> <string name="change_filters_underlined"><u>Canviar filtres</u></string>
@ -110,16 +111,16 @@
<string name="change_view_type">Canviar el tipus de vista</string> <string name="change_view_type">Canviar el tipus de vista</string>
<string name="grid">Reixeta</string> <string name="grid">Reixeta</string>
<string name="list">Llista</string> <string name="list">Llista</string>
<string name="group_direct_subfolders">Group direct subfolders</string> <string name="group_direct_subfolders">Agrupar carpetes directes</string>
<!-- Grouping at media thumbnails --> <!-- Grouping at media thumbnails -->
<string name="group_by">Group by</string> <string name="group_by">Agrupar per</string>
<string name="do_not_group_files">Do not group files</string> <string name="do_not_group_files">No agrupar fitxers</string>
<string name="by_folder">Folder</string> <string name="by_folder">Carpeta</string>
<string name="by_last_modified">Last modified</string> <string name="by_last_modified">Darrer modificat</string>
<string name="by_date_taken">Date taken</string> <string name="by_date_taken">Data de presa</string>
<string name="by_file_type">File type</string> <string name="by_file_type">Tipus de fitxer</string>
<string name="by_extension">Extension</string> <string name="by_extension">Extensió</string>
<!-- Settings --> <!-- Settings -->
<string name="autoplay_videos">Reproduir vídeos automàticament</string> <string name="autoplay_videos">Reproduir vídeos automàticament</string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Substituïr imatges ampliades per les de millor quialitat</string> <string name="replace_zoomable_images">Substituïr imatges ampliades per les de millor quialitat</string>
<string name="hide_extended_details">Amaga els detalls estesos quan la barra d\'estat està amagada</string> <string name="hide_extended_details">Amaga els detalls estesos quan la barra d\'estat està amagada</string>
<string name="do_extra_check">Fer una verificació addicional per evitar que es mostrin fitxers no vàlids</string> <string name="do_extra_check">Fer una verificació addicional per evitar que es mostrin fitxers no vàlids</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Miniatures</string> <string name="thumbnails">Miniatures</string>

View file

@ -30,6 +30,7 @@
<string name="images">Images</string> <string name="images">Images</string>
<string name="videos">Videos</string> <string name="videos">Videos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">No media files have been found with the selected filters.</string> <string name="no_media_with_filters">No media files have been found with the selected filters.</string>
<string name="change_filters_underlined"><u>Change filters</u></string> <string name="change_filters_underlined"><u>Change filters</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string> <string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string>
<string name="hide_extended_details">Hide extended details when status bar is hidden</string> <string name="hide_extended_details">Hide extended details when status bar is hidden</string>
<string name="do_extra_check">Do an extra check to avoid showing invalid files</string> <string name="do_extra_check">Do an extra check to avoid showing invalid files</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Thumbnails</string> <string name="thumbnails">Thumbnails</string>

View file

@ -30,6 +30,7 @@
<string name="images">Billeder</string> <string name="images">Billeder</string>
<string name="videos">Videoer</string> <string name="videos">Videoer</string>
<string name="gifs">GIF\'er</string> <string name="gifs">GIF\'er</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Der blev ikke fundet nogen filer med det valgte filter.</string> <string name="no_media_with_filters">Der blev ikke fundet nogen filer med det valgte filter.</string>
<string name="change_filters_underlined"><u>Skift filter</u></string> <string name="change_filters_underlined"><u>Skift filter</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Erstat stærkt zoombare billeder med nogle i bedre kvalitet</string> <string name="replace_zoomable_images">Erstat stærkt zoombare billeder med nogle i bedre kvalitet</string>
<string name="hide_extended_details">Skjul udvidede oplysninger når statuslinjen er skjult</string> <string name="hide_extended_details">Skjul udvidede oplysninger når statuslinjen er skjult</string>
<string name="do_extra_check">Tjek en ekstra gang for at undgå visning af ugyldige filer</string> <string name="do_extra_check">Tjek en ekstra gang for at undgå visning af ugyldige filer</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Thumbnails</string> <string name="thumbnails">Thumbnails</string>

View file

@ -5,7 +5,7 @@
<string name="edit">Bearbeiten</string> <string name="edit">Bearbeiten</string>
<string name="open_camera">Kamera öffnen</string> <string name="open_camera">Kamera öffnen</string>
<string name="hidden">(versteckt)</string> <string name="hidden">(versteckt)</string>
<string name="excluded">(excluded)</string> <string name="excluded">(ausgenohmen)</string>
<string name="pin_folder">Ordner anheften</string> <string name="pin_folder">Ordner anheften</string>
<string name="unpin_folder">Ordner loslösen</string> <string name="unpin_folder">Ordner loslösen</string>
<string name="pin_to_the_top">Oben anheften</string> <string name="pin_to_the_top">Oben anheften</string>
@ -30,6 +30,7 @@
<string name="images">Bilder</string> <string name="images">Bilder</string>
<string name="videos">Videos</string> <string name="videos">Videos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Keine Medien für die ausgewählten Filter gefunden</string> <string name="no_media_with_filters">Keine Medien für die ausgewählten Filter gefunden</string>
<string name="change_filters_underlined"><u>Filter ändern</u></string> <string name="change_filters_underlined"><u>Filter ändern</u></string>
@ -110,15 +111,15 @@
<string name="change_view_type">Darstellung ändern</string> <string name="change_view_type">Darstellung ändern</string>
<string name="grid">Gitter</string> <string name="grid">Gitter</string>
<string name="list">Liste</string> <string name="list">Liste</string>
<string name="group_direct_subfolders">Group direct subfolders</string> <string name="group_direct_subfolders">Direkte Unterordner gruppieren</string>
<!-- Grouping at media thumbnails --> <!-- Grouping at media thumbnails -->
<string name="group_by">Group by</string> <string name="group_by">Gruppieren bei</string>
<string name="do_not_group_files">Do not group files</string> <string name="do_not_group_files">Dateien nicht gruppieren</string>
<string name="by_folder">Folder</string> <string name="by_folder">Ordner</string>
<string name="by_last_modified">Last modified</string> <string name="by_last_modified">Zuletzt geändert</string>
<string name="by_date_taken">Date taken</string> <string name="by_date_taken">Erstelldatum</string>
<string name="by_file_type">File type</string> <string name="by_file_type">Dateitype</string>
<string name="by_extension">Extension</string> <string name="by_extension">Extension</string>
<!-- Settings --> <!-- Settings -->
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Stark zoombare Bilder durch Bilder mit hoher Qualität ersetzen</string> <string name="replace_zoomable_images">Stark zoombare Bilder durch Bilder mit hoher Qualität ersetzen</string>
<string name="hide_extended_details">Erweiterte Details nicht anzeigen, wenn die Systemleiste versteckt ist</string> <string name="hide_extended_details">Erweiterte Details nicht anzeigen, wenn die Systemleiste versteckt ist</string>
<string name="do_extra_check">Zusätzliche Überprüfung, um ungültige Dateien nicht anzuzeigen</string> <string name="do_extra_check">Zusätzliche Überprüfung, um ungültige Dateien nicht anzuzeigen</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Thumbnails</string> <string name="thumbnails">Thumbnails</string>

View file

@ -30,6 +30,7 @@
<string name="images">Εικόνες</string> <string name="images">Εικόνες</string>
<string name="videos">Βίντεο</string> <string name="videos">Βίντεο</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Δεν βρέθηκε κανένα αρχείο πολυμέσων με τα επιλεγμένα φίλτρα.</string> <string name="no_media_with_filters">Δεν βρέθηκε κανένα αρχείο πολυμέσων με τα επιλεγμένα φίλτρα.</string>
<string name="change_filters_underlined"><u>Αλλαγή φίλτρων</u></string> <string name="change_filters_underlined"><u>Αλλαγή φίλτρων</u></string>
@ -148,6 +149,7 @@
<string name="replace_zoomable_images">Αντικατάσταση των φωτογραφιών που απαιτούν ζούμ με άλλες καλύτερης ποιότητας</string> <string name="replace_zoomable_images">Αντικατάσταση των φωτογραφιών που απαιτούν ζούμ με άλλες καλύτερης ποιότητας</string>
<string name="hide_extended_details">Απόκρυψη λεπτομερειών όταν η μπάρα κατάστασης είναι κρυμμένη</string> <string name="hide_extended_details">Απόκρυψη λεπτομερειών όταν η μπάρα κατάστασης είναι κρυμμένη</string>
<string name="do_extra_check">Επιπλέον έλεγχος για την αποφυγή εμφάνισης λανθασμένων αρχείων</string> <string name="do_extra_check">Επιπλέον έλεγχος για την αποφυγή εμφάνισης λανθασμένων αρχείων</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Εικονίδια</string> <string name="thumbnails">Εικονίδια</string>

View file

@ -30,6 +30,7 @@
<string name="images">Imágenes</string> <string name="images">Imágenes</string>
<string name="videos">Vídeos</string> <string name="videos">Vídeos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">No se han encontrado ficheros con los filtros seleccionados.</string> <string name="no_media_with_filters">No se han encontrado ficheros con los filtros seleccionados.</string>
<string name="change_filters_underlined"><u>Cambiar filtros</u></string> <string name="change_filters_underlined"><u>Cambiar filtros</u></string>
@ -110,16 +111,16 @@
<string name="change_view_type">Cambiar tipo de vista</string> <string name="change_view_type">Cambiar tipo de vista</string>
<string name="grid">Cuadrícula</string> <string name="grid">Cuadrícula</string>
<string name="list">Lista</string> <string name="list">Lista</string>
<string name="group_direct_subfolders">Group direct subfolders</string> <string name="group_direct_subfolders">Agrupar subcarpetas directas</string>
<!-- Grouping at media thumbnails --> <!-- Grouping at media thumbnails -->
<string name="group_by">Group by</string> <string name="group_by">Agrupar por</string>
<string name="do_not_group_files">Do not group files</string> <string name="do_not_group_files">No agrupar ficheros</string>
<string name="by_folder">Folder</string> <string name="by_folder">Carpeta</string>
<string name="by_last_modified">Last modified</string> <string name="by_last_modified">Último modificado</string>
<string name="by_date_taken">Date taken</string> <string name="by_date_taken">Data de toma</string>
<string name="by_file_type">File type</string> <string name="by_file_type">Tipo de fichero</string>
<string name="by_extension">Extension</string> <string name="by_extension">Extensión</string>
<!-- Settings --> <!-- Settings -->
<string name="autoplay_videos">Reproducir vídeos automáticamente</string> <string name="autoplay_videos">Reproducir vídeos automáticamente</string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Reemplace las imágenes con mucho zoom por otras de mejor calidad</string> <string name="replace_zoomable_images">Reemplace las imágenes con mucho zoom por otras de mejor calidad</string>
<string name="hide_extended_details">Ocultar detalles ampliados cuando la barra de estado está oculta</string> <string name="hide_extended_details">Ocultar detalles ampliados cuando la barra de estado está oculta</string>
<string name="do_extra_check">Hacer una comprobación adicional para evitar mostrar archivos inválidos</string> <string name="do_extra_check">Hacer una comprobación adicional para evitar mostrar archivos inválidos</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Miniaturas</string> <string name="thumbnails">Miniaturas</string>
@ -160,7 +162,7 @@
<string name="faq_2_title">He protegido la aplicación con una contraseña, pero la he olvidado. ¿Que puedo hacer?</string> <string name="faq_2_title">He protegido la aplicación con una contraseña, pero la he olvidado. ¿Que puedo hacer?</string>
<string name="faq_2_text">Puedes resolverlo de 2 maneras. Puede reinstalar la aplicación o encontrar la aplicación en la configuración de su dispositivo y seleccionar \"Borrar datos \". Restablecerá todas sus configuraciones, no eliminará ningún archivo multimedia.</string> <string name="faq_2_text">Puedes resolverlo de 2 maneras. Puede reinstalar la aplicación o encontrar la aplicación en la configuración de su dispositivo y seleccionar \"Borrar datos \". Restablecerá todas sus configuraciones, no eliminará ningún archivo multimedia.</string>
<string name="faq_3_title">¿Cómo puedo hacer que un álbum siempre aparezca en la parte superior?</string> <string name="faq_3_title">¿Cómo puedo hacer que un álbum siempre aparezca en la parte superior?</string>
<string name="faq_3_text">Puede aguantar pulaso el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado.</string> <string name="faq_3_text">Puede aguantar pulsado el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado.</string>
<string name="faq_4_title">¿Cómo puedo avanzar videos?</string> <string name="faq_4_title">¿Cómo puedo avanzar videos?</string>
<string name="faq_4_text">Puede hacer clic en los textos de duración actual o máxima cerca de la barra de búsqueda, que moverán el video hacia atrás o hacia adelante.</string> <string name="faq_4_text">Puede hacer clic en los textos de duración actual o máxima cerca de la barra de búsqueda, que moverán el video hacia atrás o hacia adelante.</string>
<string name="faq_5_title">¿Cuál es la diferencia entre ocultar y excluir una carpeta?</string> <string name="faq_5_title">¿Cuál es la diferencia entre ocultar y excluir una carpeta?</string>

View file

@ -30,6 +30,7 @@
<string name="images">Kuvat</string> <string name="images">Kuvat</string>
<string name="videos">Videot</string> <string name="videos">Videot</string>
<string name="gifs">GIFit</string> <string name="gifs">GIFit</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Mediaa ei löytynyt valituilla suotimilla.</string> <string name="no_media_with_filters">Mediaa ei löytynyt valituilla suotimilla.</string>
<string name="change_filters_underlined"><u>Muuta suotimia</u></string> <string name="change_filters_underlined"><u>Muuta suotimia</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Korvaa syvälle lähennettävät kuvat parempilaatuisella</string> <string name="replace_zoomable_images">Korvaa syvälle lähennettävät kuvat parempilaatuisella</string>
<string name="hide_extended_details">Piilota yksityiskohtaiset tiedot kun tilapalkki on piilotettu</string> <string name="hide_extended_details">Piilota yksityiskohtaiset tiedot kun tilapalkki on piilotettu</string>
<string name="do_extra_check">Tee ylimääräinen tarkistus rikkinäisten tiedostojen varalta</string> <string name="do_extra_check">Tee ylimääräinen tarkistus rikkinäisten tiedostojen varalta</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Esikatselukuvat</string> <string name="thumbnails">Esikatselukuvat</string>

View file

@ -30,6 +30,7 @@
<string name="images">Images</string> <string name="images">Images</string>
<string name="videos">Vidéos</string> <string name="videos">Vidéos</string>
<string name="gifs">GIF</string> <string name="gifs">GIF</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Aucun fichier média trouvé avec les filtres sélectionnés.</string> <string name="no_media_with_filters">Aucun fichier média trouvé avec les filtres sélectionnés.</string>
<string name="change_filters_underlined"><u>Changer les filtres</u></string> <string name="change_filters_underlined"><u>Changer les filtres</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Remplacer les images zoomables profondes par des images de meilleure qualité</string> <string name="replace_zoomable_images">Remplacer les images zoomables profondes par des images de meilleure qualité</string>
<string name="hide_extended_details">Masquer les détails supplémentaires lorsque la barre d\'état est masquée</string> <string name="hide_extended_details">Masquer les détails supplémentaires lorsque la barre d\'état est masquée</string>
<string name="do_extra_check">Faire une vérification supplémentaire pour éviter de montrer des fichiers invalides</string> <string name="do_extra_check">Faire une vérification supplémentaire pour éviter de montrer des fichiers invalides</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Vignettes</string> <string name="thumbnails">Vignettes</string>

View file

@ -5,7 +5,7 @@
<string name="edit">Editar</string> <string name="edit">Editar</string>
<string name="open_camera">Abrir cámara</string> <string name="open_camera">Abrir cámara</string>
<string name="hidden">(oculto)</string> <string name="hidden">(oculto)</string>
<string name="excluded">(excluded)</string> <string name="excluded">(excluído)</string>
<string name="pin_folder">Fixar cartafol</string> <string name="pin_folder">Fixar cartafol</string>
<string name="unpin_folder">Soltar cartafol</string> <string name="unpin_folder">Soltar cartafol</string>
<string name="pin_to_the_top">Fixar arriba</string> <string name="pin_to_the_top">Fixar arriba</string>
@ -30,6 +30,7 @@
<string name="images">Imaxes</string> <string name="images">Imaxes</string>
<string name="videos">Vídeos</string> <string name="videos">Vídeos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Non se atoparon medios dos indicados polo filtro.</string> <string name="no_media_with_filters">Non se atoparon medios dos indicados polo filtro.</string>
<string name="change_filters_underlined"><u>Cambiar filtro</u></string> <string name="change_filters_underlined"><u>Cambiar filtro</u></string>
@ -81,12 +82,12 @@
<string name="edit_with">Editar con</string> <string name="edit_with">Editar con</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Simple Fondo</string> <string name="simple_wallpaper">Fondo de pantalla</string>
<string name="set_as_wallpaper">Establecer como fondo de pantalla</string> <string name="set_as_wallpaper">Establecer como fondo de pantalla</string>
<string name="set_as_wallpaper_failed">Fallou establecer fondo de pantalla</string> <string name="set_as_wallpaper_failed">Fallou establecer fondo de pantalla</string>
<string name="set_as_wallpaper_with">Establecer fondo de pantalla con:</string> <string name="set_as_wallpaper_with">Establecer fondo de pantalla con:</string>
<string name="setting_wallpaper">Establecendo fondo de pantalla&#8230;</string> <string name="setting_wallpaper">Establecendo fondo de pantalla&#8230;</string>
<string name="wallpaper_set_successfully">Fondo de pantalla establecido con éxito</string> <string name="wallpaper_set_successfully">Fondo de pantalla establecido correctamente</string>
<string name="portrait_aspect_ratio">Proporción de Retrato</string> <string name="portrait_aspect_ratio">Proporción de Retrato</string>
<string name="landscape_aspect_ratio">Proporción de Paisaxe</string> <string name="landscape_aspect_ratio">Proporción de Paisaxe</string>
<string name="home_screen">Pantalla de incio</string> <string name="home_screen">Pantalla de incio</string>
@ -110,16 +111,16 @@
<string name="change_view_type">Cambiar o tipo de vista</string> <string name="change_view_type">Cambiar o tipo de vista</string>
<string name="grid">Grella</string> <string name="grid">Grella</string>
<string name="list">Lista</string> <string name="list">Lista</string>
<string name="group_direct_subfolders">Group direct subfolders</string> <string name="group_direct_subfolders">Agrupar subcartafoles directos</string>
<!-- Grouping at media thumbnails --> <!-- Grouping at media thumbnails -->
<string name="group_by">Group by</string> <string name="group_by">Agrupar por</string>
<string name="do_not_group_files">Do not group files</string> <string name="do_not_group_files">Non agrupar ficheiros</string>
<string name="by_folder">Folder</string> <string name="by_folder">Cartafol</string>
<string name="by_last_modified">Last modified</string> <string name="by_last_modified">Último modificado</string>
<string name="by_date_taken">Date taken</string> <string name="by_date_taken">Data de captura</string>
<string name="by_file_type">File type</string> <string name="by_file_type">Tipo de ficheior</string>
<string name="by_extension">Extension</string> <string name="by_extension">Extensión</string>
<!-- Settings --> <!-- Settings -->
<string name="autoplay_videos">Reproducir vídeos automticamente</string> <string name="autoplay_videos">Reproducir vídeos automticamente</string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Substituír imaxes con un gran zoom por por outras con mellor calidade</string> <string name="replace_zoomable_images">Substituír imaxes con un gran zoom por por outras con mellor calidade</string>
<string name="hide_extended_details">Agochar detalles extendidos cando a barra de estado está oculta</string> <string name="hide_extended_details">Agochar detalles extendidos cando a barra de estado está oculta</string>
<string name="do_extra_check">Facer unha comprobación extra para evitar mostrar ficheiros non válidos</string> <string name="do_extra_check">Facer unha comprobación extra para evitar mostrar ficheiros non válidos</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Iconas</string> <string name="thumbnails">Iconas</string>
@ -185,7 +187,7 @@
A Galería tamén se ofrece como aplicación de terceiros para vista previa de imaxes / vídeos, engadir anexos en correos etc. É perfecta para o uso diario. A Galería tamén se ofrece como aplicación de terceiros para vista previa de imaxes / vídeos, engadir anexos en correos etc. É perfecta para o uso diario.
The fingerprint permission is needed for locking either hidden item visibility, or the whole app. O permiso de pegada é preciso para bloquear a visibilidade de elementos ocultos ou o aplicativo completo.
Non contén anuncios nin solicita permisos innecesarios. É de código aberto, con cores personalizadas. Non contén anuncios nin solicita permisos innecesarios. É de código aberto, con cores personalizadas.

View file

@ -30,6 +30,7 @@
<string name="images">Slike</string> <string name="images">Slike</string>
<string name="videos">Video</string> <string name="videos">Video</string>
<string name="gifs">GIF-ovi</string> <string name="gifs">GIF-ovi</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Nije pronađena nijedna datoteka s odabranim filtrom.</string> <string name="no_media_with_filters">Nije pronađena nijedna datoteka s odabranim filtrom.</string>
<string name="change_filters_underlined"><u>Promijeni filter</u></string> <string name="change_filters_underlined"><u>Promijeni filter</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Zamijenite slike s dubokim zumom za one s boljom kvalitetom</string> <string name="replace_zoomable_images">Zamijenite slike s dubokim zumom za one s boljom kvalitetom</string>
<string name="hide_extended_details">Sakrij proširene pojedinosti kada je traka statusa skrivena</string> <string name="hide_extended_details">Sakrij proširene pojedinosti kada je traka statusa skrivena</string>
<string name="do_extra_check">Napravite dodatnu provjeru da biste izbjegli prikazivanje nevažećih datoteka</string> <string name="do_extra_check">Napravite dodatnu provjeru da biste izbjegli prikazivanje nevažećih datoteka</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Sličice</string> <string name="thumbnails">Sličice</string>

View file

@ -30,6 +30,7 @@
<string name="images">Images</string> <string name="images">Images</string>
<string name="videos">Videos</string> <string name="videos">Videos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">No media files have been found with the selected filters.</string> <string name="no_media_with_filters">No media files have been found with the selected filters.</string>
<string name="change_filters_underlined"><u>Change filters</u></string> <string name="change_filters_underlined"><u>Change filters</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string> <string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string>
<string name="hide_extended_details">Hide extended details when status bar is hidden</string> <string name="hide_extended_details">Hide extended details when status bar is hidden</string>
<string name="do_extra_check">Do an extra check to avoid showing invalid files</string> <string name="do_extra_check">Do an extra check to avoid showing invalid files</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Thumbnails</string> <string name="thumbnails">Thumbnails</string>

View file

@ -30,6 +30,7 @@
<string name="images">Immagini</string> <string name="images">Immagini</string>
<string name="videos">Video</string> <string name="videos">Video</string>
<string name="gifs">GIF</string> <string name="gifs">GIF</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Nessun file trovato per il filtro selezionato.</string> <string name="no_media_with_filters">Nessun file trovato per il filtro selezionato.</string>
<string name="change_filters_underlined"><u>Cambia filtro</u></string> <string name="change_filters_underlined"><u>Cambia filtro</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Sostituisci le immagini ingrandibili a fondo con altre di migliore qualità</string> <string name="replace_zoomable_images">Sostituisci le immagini ingrandibili a fondo con altre di migliore qualità</string>
<string name="hide_extended_details">Nascondi i dettagli estesi quando la barra di stato è nascosta</string> <string name="hide_extended_details">Nascondi i dettagli estesi quando la barra di stato è nascosta</string>
<string name="do_extra_check">Fai un controllo ulteriore per evitare di mostrare file non validi</string> <string name="do_extra_check">Fai un controllo ulteriore per evitare di mostrare file non validi</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Miniature</string> <string name="thumbnails">Miniature</string>

View file

@ -30,6 +30,7 @@
<string name="images">画像</string> <string name="images">画像</string>
<string name="videos">ビデオ</string> <string name="videos">ビデオ</string>
<string name="gifs">GIF</string> <string name="gifs">GIF</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">絞り込み条件に該当するメディアがありません。</string> <string name="no_media_with_filters">絞り込み条件に該当するメディアがありません。</string>
<string name="change_filters_underlined"><u>絞り込み条件を変更</u></string> <string name="change_filters_underlined"><u>絞り込み条件を変更</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">ズーム可能な画像をより高画質なものに置き換える</string> <string name="replace_zoomable_images">ズーム可能な画像をより高画質なものに置き換える</string>
<string name="hide_extended_details">ステータスバーが非表示の時は詳細を表示しない</string> <string name="hide_extended_details">ステータスバーが非表示の時は詳細を表示しない</string>
<string name="do_extra_check">無効なファイルを表示しないための調査を行います</string> <string name="do_extra_check">無効なファイルを表示しないための調査を行います</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">サムネイル</string> <string name="thumbnails">サムネイル</string>

View file

@ -30,6 +30,7 @@
<string name="images">이미지</string> <string name="images">이미지</string>
<string name="videos">비디오</string> <string name="videos">비디오</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">설정된 필터와 일치하는 컨텐츠가 존재하지 않습니다.</string> <string name="no_media_with_filters">설정된 필터와 일치하는 컨텐츠가 존재하지 않습니다.</string>
<string name="change_filters_underlined"><u>필터 변경</u></string> <string name="change_filters_underlined"><u>필터 변경</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">확대 축소 가능한 이미지를 더 좋은 품질로 교체</string> <string name="replace_zoomable_images">확대 축소 가능한 이미지를 더 좋은 품질로 교체</string>
<string name="hide_extended_details">상태 표시 줄이 숨겨져있을 때 확장 된 세부 정보 숨김</string> <string name="hide_extended_details">상태 표시 줄이 숨겨져있을 때 확장 된 세부 정보 숨김</string>
<string name="do_extra_check">잘못된 파일 표시를 방지하기 위해 추가 검사 수행</string> <string name="do_extra_check">잘못된 파일 표시를 방지하기 위해 추가 검사 수행</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">섬네일</string> <string name="thumbnails">섬네일</string>

View file

@ -30,6 +30,7 @@
<string name="images">Atvaizdai</string> <string name="images">Atvaizdai</string>
<string name="videos">Vaizdo įrašai</string> <string name="videos">Vaizdo įrašai</string>
<string name="gifs">GIF\'ai</string> <string name="gifs">GIF\'ai</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Su pasirinktais filtrais nerasta medijos bylų.</string> <string name="no_media_with_filters">Su pasirinktais filtrais nerasta medijos bylų.</string>
<string name="change_filters_underlined"><u>Pakeisti filtrus</u></string> <string name="change_filters_underlined"><u>Pakeisti filtrus</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Pakeisti giliai priartinamus atvaizdus su geresnės kokybės atvaizdais</string> <string name="replace_zoomable_images">Pakeisti giliai priartinamus atvaizdus su geresnės kokybės atvaizdais</string>
<string name="hide_extended_details">Slėpti išsamią informaciją, kai būsenos juosta yra paslėpta</string> <string name="hide_extended_details">Slėpti išsamią informaciją, kai būsenos juosta yra paslėpta</string>
<string name="do_extra_check">Atlikti papildomą patikrinimą, kad nebūtų rodomos sugadintos bylos</string> <string name="do_extra_check">Atlikti papildomą patikrinimą, kad nebūtų rodomos sugadintos bylos</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Miniatiūros</string> <string name="thumbnails">Miniatiūros</string>

View file

@ -30,6 +30,7 @@
<string name="images">Bilder</string> <string name="images">Bilder</string>
<string name="videos">Videoer</string> <string name="videos">Videoer</string>
<string name="gifs">GIF-bilder</string> <string name="gifs">GIF-bilder</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Ingen media-filer er funnet med de valgte filtrene.</string> <string name="no_media_with_filters">Ingen media-filer er funnet med de valgte filtrene.</string>
<string name="change_filters_underlined"><u>Endre filtere</u></string> <string name="change_filters_underlined"><u>Endre filtere</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Erstatt dyp-zoombare bilder med bilder av bedre kvalitet</string> <string name="replace_zoomable_images">Erstatt dyp-zoombare bilder med bilder av bedre kvalitet</string>
<string name="hide_extended_details">Skjul utvidede detaljer når statuslinjen er skjult</string> <string name="hide_extended_details">Skjul utvidede detaljer når statuslinjen er skjult</string>
<string name="do_extra_check">Gjør en ekstra sjekk for å unngå visning av ugyldige filer</string> <string name="do_extra_check">Gjør en ekstra sjekk for å unngå visning av ugyldige filer</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Minibilder</string> <string name="thumbnails">Minibilder</string>

View file

@ -30,6 +30,7 @@
<string name="images">Afbeeldingen</string> <string name="images">Afbeeldingen</string>
<string name="videos">Video\'s</string> <string name="videos">Video\'s</string>
<string name="gifs">GIF-bestanden</string> <string name="gifs">GIF-bestanden</string>
<string name="raw_images">RAW-afbeeldingen</string>
<string name="no_media_with_filters">Er zijn geen bestanden gevonden met de huidige filters.</string> <string name="no_media_with_filters">Er zijn geen bestanden gevonden met de huidige filters.</string>
<string name="change_filters_underlined"><u>Filters aanpassen</u></string> <string name="change_filters_underlined"><u>Filters aanpassen</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">In hoge kwaliteit weergeven (ten koste van ver inzoomen)</string> <string name="replace_zoomable_images">In hoge kwaliteit weergeven (ten koste van ver inzoomen)</string>
<string name="hide_extended_details">Uitgebreide informatie niet tonen als de statusbalk is verborgen</string> <string name="hide_extended_details">Uitgebreide informatie niet tonen als de statusbalk is verborgen</string>
<string name="do_extra_check">Ongeldige bestanden verbergen</string> <string name="do_extra_check">Ongeldige bestanden verbergen</string>
<string name="show_at_bottom">Enkele actieknoppen onderaan het scherm tonen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Miniatuurvoorbeelden</string> <string name="thumbnails">Miniatuurvoorbeelden</string>

View file

@ -5,7 +5,7 @@
<string name="edit">Edytuj</string> <string name="edit">Edytuj</string>
<string name="open_camera">Uruchom aplikację aparatu</string> <string name="open_camera">Uruchom aplikację aparatu</string>
<string name="hidden">(ukryty)</string> <string name="hidden">(ukryty)</string>
<string name="excluded">(excluded)</string> <string name="excluded">(wykluczony)</string>
<string name="pin_folder">Przypnij folder</string> <string name="pin_folder">Przypnij folder</string>
<string name="unpin_folder">Wypakuj folder</string> <string name="unpin_folder">Wypakuj folder</string>
   <string name="pin_to_the_top">Przypnij na górze</string>    <string name="pin_to_the_top">Przypnij na górze</string>
@ -30,6 +30,7 @@
<string name="images">Obrazy</string> <string name="images">Obrazy</string>
<string name="videos">Filmy</string> <string name="videos">Filmy</string>
<string name="gifs">GIFy</string> <string name="gifs">GIFy</string>
<string name="raw_images">Obrazy RAW</string>
<string name="no_media_with_filters">Nie znalazłem multimediów z wybranymi filtrami.</string> <string name="no_media_with_filters">Nie znalazłem multimediów z wybranymi filtrami.</string>
<string name="change_filters_underlined"><u>Zmień filtry</u></string> <string name="change_filters_underlined"><u>Zmień filtry</u></string>
@ -110,16 +111,16 @@
   <string name="change_view_type">Zmień typ widoku</string>    <string name="change_view_type">Zmień typ widoku</string>
   <string name="grid">Siatka</string>    <string name="grid">Siatka</string>
   <string name="list">Lista</string>    <string name="list">Lista</string>
<string name="group_direct_subfolders">Group direct subfolders</string> <string name="group_direct_subfolders">Grupuj bezpośrednie podfoldery</string>
<!-- Grouping at media thumbnails --> <!-- Grouping at media thumbnails -->
<string name="group_by">Group by</string> <string name="group_by">Grupuj według</string>
<string name="do_not_group_files">Do not group files</string> <string name="do_not_group_files">Nie grupuj plików</string>
<string name="by_folder">Folder</string> <string name="by_folder">Folderu</string>
<string name="by_last_modified">Last modified</string> <string name="by_last_modified">Daty ostatniej modyfikacji</string>
<string name="by_date_taken">Date taken</string> <string name="by_date_taken">Daty utworzenia</string>
<string name="by_file_type">File type</string> <string name="by_file_type">Typu</string>
<string name="by_extension">Extension</string> <string name="by_extension">Rozszerzenia</string>
<!-- Settings --> <!-- Settings -->
<string name="autoplay_videos">Odtwarzaj filmy automatycznie</string> <string name="autoplay_videos">Odtwarzaj filmy automatycznie</string>
@ -147,6 +148,7 @@
   <string name="replace_zoomable_images">Zamieniaj powiększalne obrazy na te o lepszej jakości</string>    <string name="replace_zoomable_images">Zamieniaj powiększalne obrazy na te o lepszej jakości</string>
   <string name="hide_extended_details">Ukrywaj dodatkowe szczegóły gdy pasek stanu jest ukryty</string>    <string name="hide_extended_details">Ukrywaj dodatkowe szczegóły gdy pasek stanu jest ukryty</string>
   <string name="do_extra_check">Dodatkowe sprawdzenie w celu uniknięcia pokazywania niewłaściwych plików</string>    <string name="do_extra_check">Dodatkowe sprawdzenie w celu uniknięcia pokazywania niewłaściwych plików</string>
<string name="show_at_bottom">Pokazuj niektóre przyciski akcji na dole ekranu</string>
<!-- Setting sections --> <!-- Setting sections -->
   <string name="thumbnails">Miniatury</string>    <string name="thumbnails">Miniatury</string>
@ -165,15 +167,15 @@
   <string name="faq_5_title">Jaka jest różnica pomiędzy ukryciem, a wykluczeniem folderu?</string>    <string name="faq_5_title">Jaka jest różnica pomiędzy ukryciem, a wykluczeniem folderu?</string>
   <string name="faq_5_text">Wykluczenie działa tylko w obrębie niniejszej aplikacji (wszędzie indziej pliki są normalnie widoczne), ukrywanie - w obrębie całego systemu (nie widać ich nigdzie), dodawany jest wtedy do folderu pusty plik \'.nomedia\', który możesz usunąć w dowolnym menedżerze plików.</string>    <string name="faq_5_text">Wykluczenie działa tylko w obrębie niniejszej aplikacji (wszędzie indziej pliki są normalnie widoczne), ukrywanie - w obrębie całego systemu (nie widać ich nigdzie), dodawany jest wtedy do folderu pusty plik \'.nomedia\', który możesz usunąć w dowolnym menedżerze plików.</string>
   <string name="faq_6_title">Dlaczego pokazują mi się foldery z okładkami do piosenek i tym podobne rzeczy?</string>    <string name="faq_6_title">Dlaczego pokazują mi się foldery z okładkami do piosenek i tym podobne rzeczy?</string>
   <string name="faq_6_text">Cóż, zdjęcie to zdjęcie. Aplikacja nie wie, czy to jest akurat okładka od piosenki, czy cokolwiek innego. Aby ukryć niechciane rzeczy, przytrzymaj je i wybierz opcję \'Wyklucz\' z paska akcji.</string> <string name="faq_6_text">Aplikacja niestety nie wie, czy dane zdjęcie jest okładką od piosenki czy czymś innym. Aby ukryć niechciane rzeczy, przytrzymaj je i wybierz opcję \'Wyklucz\' z paska akcji.</string>
   <string name="faq_7_title">Nie pokazuje(-ą) mi się folder(y) ze zdjęciami / filmami. Co mogę zrobić?</string>    <string name="faq_7_title">Nie pokazuje(-ą) mi się folder(y) ze zdjęciami / filmami. Co mogę zrobić?</string>
   <string name="faq_7_text">Wejdź do ustawień aplikacji i w sekcji z dołączonymi folderami dodaj tenże folder do listy.</string>    <string name="faq_7_text">Wejdź do ustawień aplikacji i w sekcji z dołączonymi folderami dodaj tenże folder do listy.</string>
   <string name="faq_8_title">Co jeśli chcę widzieć tylko.wybrane foldery?</string>    <string name="faq_8_title">Co jeśli chcę widzieć tylko.wybrane foldery?</string>
   <string name="faq_8_text">Przejdź do sekcji z wykluczonymi folderami w ustawieniach aplikacji, dodaj tam folder główny (\"/\"), a następnie dodaj pożądane foldery w sekcji z dołączonymi folderami.</string>    <string name="faq_8_text">Przejdź do sekcji z wykluczonymi folderami w ustawieniach aplikacji, dodaj tam folder główny (\"/\"), a następnie dodaj pożądane foldery w sekcji z dołączonymi folderami.</string>
   <string name="faq_9_title">Zdjęcia w widoku pełnoekranowym mają dziwne artefakty. Jak mogę to naprawić?</string>    <string name="faq_9_title">Zdjęcia w widoku pełnoekranowym mają dziwne artefakty. Jak mogę to naprawić?</string>
   <string name="faq_9_text">U ustawieniach aplikacji włącz opcję \'Zamieniaj powiększalne obrazy na te o lepszej jakości\'. Poprawi ona jakość zdjęć, jednak przy bardzo dużych powiększeniach mogą się stać one zbyt rozmazane.</string>    <string name="faq_9_text">U ustawieniach aplikacji włącz opcję \'Zamieniaj powiększalne obrazy na te o lepszej jakości\'. Poprawi ona jakość zdjęć, jednak przy bardzo dużych powiększeniach mogą się stać one zbyt rozmazane.</string>
<string name="faq_10_title">Can I crop images with this app?</string> <string name="faq_10_title">Czy mogę w tej aplikacji przycinać obrazy?</string>
<string name="faq_10_text">Yes, you can crop images in the editor, by dragging the image corners. You can get to the editor either by long pressing an image thumbnail and selecting Edit, or selecting Edit from the fullscreen view.</string> <string name="faq_10_text">Tak, możesz to zrobić w edytorze, przeciągając krawędzie obrazu. Edytor otworzysz przytrzymując miniaturę obrazu i wybierając opcję \'Edytuj\', bądź wybierając tą samą opcję w menu pełnoekranowym.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -30,6 +30,7 @@
<string name="images">Imagens</string> <string name="images">Imagens</string>
<string name="videos">Vídeos</string> <string name="videos">Vídeos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Nenhum arquivo de mídia encontrado a partir dos filtros selecionados.</string> <string name="no_media_with_filters">Nenhum arquivo de mídia encontrado a partir dos filtros selecionados.</string>
<string name="change_filters_underlined"><u>Mudar filtros</u></string> <string name="change_filters_underlined"><u>Mudar filtros</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Substituir imagens aptas a grande quantitade de zoom por imagens de melhor qualidade</string> <string name="replace_zoomable_images">Substituir imagens aptas a grande quantitade de zoom por imagens de melhor qualidade</string>
<string name="hide_extended_details">Ocultar detalhes extendidos quando a barra de status estiver oculta</string> <string name="hide_extended_details">Ocultar detalhes extendidos quando a barra de status estiver oculta</string>
<string name="do_extra_check">Realizar verificação extra para evitar mostrar arquivos inválidos</string> <string name="do_extra_check">Realizar verificação extra para evitar mostrar arquivos inválidos</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Miniaturas</string> <string name="thumbnails">Miniaturas</string>

View file

@ -30,6 +30,7 @@
<string name="images">Imagens</string> <string name="images">Imagens</string>
<string name="videos">Vídeos</string> <string name="videos">Vídeos</string>
<string name="gifs">GIF</string> <string name="gifs">GIF</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Não foram encontrados ficheiros que cumpram os requisitos.</string> <string name="no_media_with_filters">Não foram encontrados ficheiros que cumpram os requisitos.</string>
<string name="change_filters_underlined"><u>Alterar filtros</u></string> <string name="change_filters_underlined"><u>Alterar filtros</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string> <string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string>
<string name="hide_extended_details">Ocultar detalhes extra se a barra de estado estiver oculta</string> <string name="hide_extended_details">Ocultar detalhes extra se a barra de estado estiver oculta</string>
<string name="do_extra_check">Efetuar uma dupla verificação para evitar mostrar os ficheiros inválidos</string> <string name="do_extra_check">Efetuar uma dupla verificação para evitar mostrar os ficheiros inválidos</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Miniaturas</string> <string name="thumbnails">Miniaturas</string>

View file

@ -30,6 +30,7 @@
<string name="images">Изображения</string> <string name="images">Изображения</string>
<string name="videos">Видео</string> <string name="videos">Видео</string>
<string name="gifs">GIF</string> <string name="gifs">GIF</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">При заданных фильтрах медиафайлы не найдены</string> <string name="no_media_with_filters">При заданных фильтрах медиафайлы не найдены</string>
<string name="change_filters_underlined"><u>Изменить фильтры</u></string> <string name="change_filters_underlined"><u>Изменить фильтры</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Заменять масштабируемые изображения высококачественными</string> <string name="replace_zoomable_images">Заменять масштабируемые изображения высококачественными</string>
<string name="hide_extended_details">Не показывать подробности при скрытой строке состояния</string> <string name="hide_extended_details">Не показывать подробности при скрытой строке состояния</string>
<string name="do_extra_check">Делать дополнительную проверку, чтобы избежать показа неподдерживаемых файлов</string> <string name="do_extra_check">Делать дополнительную проверку, чтобы избежать показа неподдерживаемых файлов</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Миниатюры</string> <string name="thumbnails">Миниатюры</string>

View file

@ -30,6 +30,7 @@
<string name="images">Obrázky</string> <string name="images">Obrázky</string>
<string name="videos">Videá</string> <string name="videos">Videá</string>
<string name="gifs">GIFká</string> <string name="gifs">GIFká</string>
<string name="raw_images">RAW obrázky</string>
<string name="no_media_with_filters">So zvolenými filtrami sa nenašli žiadne média súbory.</string> <string name="no_media_with_filters">So zvolenými filtrami sa nenašli žiadne média súbory.</string>
<string name="change_filters_underlined"><u>Zmeniť filtre</u></string> <string name="change_filters_underlined"><u>Zmeniť filtre</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Nahradiť hlboko priblížiteľné obrázky s obrázkami s lepšou kvalitou</string> <string name="replace_zoomable_images">Nahradiť hlboko priblížiteľné obrázky s obrázkami s lepšou kvalitou</string>
<string name="hide_extended_details">Skryť rozšírené vlastnosti ak je skrytá stavová lišta</string> <string name="hide_extended_details">Skryť rozšírené vlastnosti ak je skrytá stavová lišta</string>
<string name="do_extra_check">Predísť zobrazovaniu neplatných súborov dodatočnou kontrolou</string> <string name="do_extra_check">Predísť zobrazovaniu neplatných súborov dodatočnou kontrolou</string>
<string name="show_at_bottom">Zobraziť niektoré akčné tlačidlá na spodku obrazovky</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Náhľady</string> <string name="thumbnails">Náhľady</string>

View file

@ -30,6 +30,7 @@
<string name="images">Bilder</string> <string name="images">Bilder</string>
<string name="videos">Videor</string> <string name="videos">Videor</string>
<string name="gifs">GIF-bilder</string> <string name="gifs">GIF-bilder</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">Inga mediefiler hittades med valda filter.</string> <string name="no_media_with_filters">Inga mediefiler hittades med valda filter.</string>
<string name="change_filters_underlined"><u>Ändra filter</u></string> <string name="change_filters_underlined"><u>Ändra filter</u></string>
@ -81,12 +82,12 @@
<string name="edit_with">Redigera med</string> <string name="edit_with">Redigera med</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Bakgrundsbild</string> <string name="simple_wallpaper">Bakgrund</string>
<string name="set_as_wallpaper">Ange som bakgrundsbild</string> <string name="set_as_wallpaper">Använd som bakgrund</string>
<string name="set_as_wallpaper_failed">Det gick inte att byta bakgrundsbild</string> <string name="set_as_wallpaper_failed">Det gick inte att ställa in bakgrunden</string>
<string name="set_as_wallpaper_with">Ange som bakgrundsbild med:</string> <string name="set_as_wallpaper_with">Ställ in som bakgrund med:</string>
<string name="setting_wallpaper">Inställningar för bakgrundsbild&#8230;</string> <string name="setting_wallpaper">Ställer in bakgrunden&#8230;</string>
<string name="wallpaper_set_successfully">Bakgrundsbilden är ändrad</string> <string name="wallpaper_set_successfully">Bakgrunden har ställts in</string>
<string name="portrait_aspect_ratio">Stående bildförhållande</string> <string name="portrait_aspect_ratio">Stående bildförhållande</string>
<string name="landscape_aspect_ratio">Liggande bildförhållande</string> <string name="landscape_aspect_ratio">Liggande bildförhållande</string>
<string name="home_screen">Startskärm</string> <string name="home_screen">Startskärm</string>
@ -110,16 +111,16 @@
<string name="change_view_type">Ändra vy</string> <string name="change_view_type">Ändra vy</string>
<string name="grid">Rutnät</string> <string name="grid">Rutnät</string>
<string name="list">Lista</string> <string name="list">Lista</string>
<string name="group_direct_subfolders">Group direct subfolders</string> <string name="group_direct_subfolders">Gruppera direkta undermappar</string>
<!-- Grouping at media thumbnails --> <!-- Grouping at media thumbnails -->
<string name="group_by">Group by</string> <string name="group_by">Gruppera efter</string>
<string name="do_not_group_files">Do not group files</string> <string name="do_not_group_files">Gruppera inte filer</string>
<string name="by_folder">Folder</string> <string name="by_folder">Mapp</string>
<string name="by_last_modified">Last modified</string> <string name="by_last_modified">Senast ändrad</string>
<string name="by_date_taken">Date taken</string> <string name="by_date_taken">Fotodatum</string>
<string name="by_file_type">File type</string> <string name="by_file_type">Filtyp</string>
<string name="by_extension">Extension</string> <string name="by_extension">Filnamnstillägg</string>
<!-- Settings --> <!-- Settings -->
<string name="autoplay_videos">Spela upp videor automatiskt</string> <string name="autoplay_videos">Spela upp videor automatiskt</string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Ersätt djupt zoombara bilder med bilder av bättre kvalitet</string> <string name="replace_zoomable_images">Ersätt djupt zoombara bilder med bilder av bättre kvalitet</string>
<string name="hide_extended_details">Dölj utökad information när statusfältet är dolt</string> <string name="hide_extended_details">Dölj utökad information när statusfältet är dolt</string>
<string name="do_extra_check">Gör en extra kontroll för att hindra ogiltiga filer från att visas</string> <string name="do_extra_check">Gör en extra kontroll för att hindra ogiltiga filer från att visas</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Miniatyrer</string> <string name="thumbnails">Miniatyrer</string>

View file

@ -4,6 +4,6 @@
<dimen name="medium_tmb_size">120dp</dimen> <dimen name="medium_tmb_size">120dp</dimen>
<dimen name="sd_card_icon_size">30dp</dimen> <dimen name="sd_card_icon_size">30dp</dimen>
<dimen name="selection_check_size">38dp</dimen> <dimen name="selection_check_size">38dp</dimen>
<dimen name="play_outline_size_big">230dp</dimen> <dimen name="play_outline_size_big">200dp</dimen>
<dimen name="tmb_shadow_height">60dp</dimen> <dimen name="tmb_shadow_height">60dp</dimen>
</resources> </resources>

View file

@ -30,6 +30,7 @@
<string name="images">Images</string> <string name="images">Images</string>
<string name="videos">Videos</string> <string name="videos">Videos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">No media files have been found with the selected filters.</string> <string name="no_media_with_filters">No media files have been found with the selected filters.</string>
<string name="change_filters_underlined"><u>Change filters</u></string> <string name="change_filters_underlined"><u>Change filters</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string> <string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string>
<string name="hide_extended_details">Hide extended details when status bar is hidden</string> <string name="hide_extended_details">Hide extended details when status bar is hidden</string>
<string name="do_extra_check">Do an extra check to avoid showing invalid files</string> <string name="do_extra_check">Do an extra check to avoid showing invalid files</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Thumbnails</string> <string name="thumbnails">Thumbnails</string>

View file

@ -30,6 +30,7 @@
<string name="images">图片</string> <string name="images">图片</string>
<string name="videos">视频</string> <string name="videos">视频</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">所选的过滤器没有找到媒体文件。</string> <string name="no_media_with_filters">所选的过滤器没有找到媒体文件。</string>
<string name="change_filters_underlined"><u>更改过滤器</u></string> <string name="change_filters_underlined"><u>更改过滤器</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">用质量更好的图像替换可深度缩放的图像</string> <string name="replace_zoomable_images">用质量更好的图像替换可深度缩放的图像</string>
<string name="hide_extended_details">当状态栏隐藏时隐藏扩展详情</string> <string name="hide_extended_details">当状态栏隐藏时隐藏扩展详情</string>
<string name="do_extra_check">额外检查以避免显示无效的文件</string> <string name="do_extra_check">额外检查以避免显示无效的文件</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">缩略图</string> <string name="thumbnails">缩略图</string>

View file

@ -30,6 +30,7 @@
<string name="images">圖片</string> <string name="images">圖片</string>
<string name="videos">影片</string> <string name="videos">影片</string>
<string name="gifs">GIF</string> <string name="gifs">GIF</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">選擇的篩選條件未發現媒體檔案。</string> <string name="no_media_with_filters">選擇的篩選條件未發現媒體檔案。</string>
<string name="change_filters_underlined"><u>更改篩選條件</u></string> <string name="change_filters_underlined"><u>更改篩選條件</u></string>
@ -115,11 +116,11 @@
<!-- Grouping at media thumbnails --> <!-- Grouping at media thumbnails -->
<string name="group_by">Group by</string> <string name="group_by">Group by</string>
<string name="do_not_group_files">Do not group files</string> <string name="do_not_group_files">Do not group files</string>
<string name="by_folder">Folder</string> <string name="by_folder">資料夾</string>
<string name="by_last_modified">Last modified</string> <string name="by_last_modified">最後修改</string>
<string name="by_date_taken">Date taken</string> <string name="by_date_taken">拍照日期</string>
<string name="by_file_type">File type</string> <string name="by_file_type">檔案類型</string>
<string name="by_extension">Extension</string> <string name="by_extension">副檔名</string>
<!-- Settings --> <!-- Settings -->
<string name="autoplay_videos">自動播放影片</string> <string name="autoplay_videos">自動播放影片</string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">可深度縮放的圖片用品質更佳的來取代</string> <string name="replace_zoomable_images">可深度縮放的圖片用品質更佳的來取代</string>
<string name="hide_extended_details">狀態欄隱藏時,同時隱藏詳細資訊</string> <string name="hide_extended_details">狀態欄隱藏時,同時隱藏詳細資訊</string>
<string name="do_extra_check">進行額外檢查,避免顯示無效的檔案</string> <string name="do_extra_check">進行額外檢查,避免顯示無效的檔案</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">縮圖</string> <string name="thumbnails">縮圖</string>

View file

@ -5,9 +5,10 @@
<dimen name="sd_card_icon_size">20dp</dimen> <dimen name="sd_card_icon_size">20dp</dimen>
<dimen name="play_outline_icon_size">22dp</dimen> <dimen name="play_outline_icon_size">22dp</dimen>
<dimen name="selection_check_size">26dp</dimen> <dimen name="selection_check_size">26dp</dimen>
<dimen name="play_outline_size_big">150dp</dimen> <dimen name="play_outline_size_big">130dp</dimen>
<dimen name="tmb_shadow_height">60dp</dimen> <dimen name="tmb_shadow_height">60dp</dimen>
<dimen name="media_side_slider_width">60dp</dimen> <dimen name="media_side_slider_width">60dp</dimen>
<dimen name="instant_change_bar_width">30dp</dimen> <dimen name="instant_change_bar_width">30dp</dimen>
<dimen name="list_view_folder_thumbnail_size">72dp</dimen> <dimen name="list_view_folder_thumbnail_size">72dp</dimen>
<dimen name="bottom_actions_height">54dp</dimen>
</resources> </resources>

View file

@ -2,6 +2,7 @@
<resources> <resources>
<!-- Release notes --> <!-- Release notes -->
<string name="release_180">Allow filtering out RAW images separately</string>
<string name="release_178">Added sorting by Date Taken</string> <string name="release_178">Added sorting by Date Taken</string>
<string name="release_177">Allow customizing the app launcher icon color</string> <string name="release_177">Allow customizing the app launcher icon color</string>
<string name="release_163">Added toggles for disabling Pull-to-refresh and permanent Delete dialog confirmation skipping</string> <string name="release_163">Added toggles for disabling Pull-to-refresh and permanent Delete dialog confirmation skipping</string>

View file

@ -30,6 +30,7 @@
<string name="images">Images</string> <string name="images">Images</string>
<string name="videos">Videos</string> <string name="videos">Videos</string>
<string name="gifs">GIFs</string> <string name="gifs">GIFs</string>
<string name="raw_images">RAW images</string>
<string name="no_media_with_filters">No media files have been found with the selected filters.</string> <string name="no_media_with_filters">No media files have been found with the selected filters.</string>
<string name="change_filters_underlined"><u>Change filters</u></string> <string name="change_filters_underlined"><u>Change filters</u></string>
@ -147,6 +148,7 @@
<string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string> <string name="replace_zoomable_images">Replace deep zoomable images with better quality ones</string>
<string name="hide_extended_details">Hide extended details when status bar is hidden</string> <string name="hide_extended_details">Hide extended details when status bar is hidden</string>
<string name="do_extra_check">Do an extra check to avoid showing invalid files</string> <string name="do_extra_check">Do an extra check to avoid showing invalid files</string>
<string name="show_at_bottom">Show some action buttons at the bottom of the screen</string>
<!-- Setting sections --> <!-- Setting sections -->
<string name="thumbnails">Thumbnails</string> <string name="thumbnails">Thumbnails</string>

View file

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.2.41' ext.kotlin_version = '1.2.50'
repositories { repositories {
jcenter() jcenter()
@ -9,7 +9,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.1.2' classpath 'com.android.tools.build:gradle:3.1.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong