11
CHANGELOG.md
|
@ -1,6 +1,17 @@
|
|||
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)*
|
||||
----------------------------
|
||||
|
||||
|
|
|
@ -11,8 +11,8 @@ android {
|
|||
applicationId "com.simplemobiletools.gallery"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 27
|
||||
versionCode 179
|
||||
versionName "4.1.1"
|
||||
versionCode 180
|
||||
versionName "4.2.0"
|
||||
multiDexEnabled true
|
||||
setProperty("archivesBaseName", "gallery")
|
||||
}
|
||||
|
@ -47,12 +47,13 @@ ext {
|
|||
}
|
||||
|
||||
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.android.support:multidex:1.0.3'
|
||||
implementation 'it.sephiroth.android.exif:library:1.0.1'
|
||||
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.12'
|
||||
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"
|
||||
implementation "android.arch.persistence.room:runtime:1.1.0"
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
android:name=".activities.SplashActivity"
|
||||
android:theme="@style/SplashTheme">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
|
|
@ -37,6 +37,7 @@ import com.simplemobiletools.gallery.models.Directory
|
|||
import com.simplemobiletools.gallery.models.Medium
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import java.io.*
|
||||
import java.util.*
|
||||
|
||||
class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
||||
private val PICK_MEDIA = 2
|
||||
|
@ -55,6 +56,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
|||
private var mIsGettingDirs = false
|
||||
private var mLoadedInitialPhotos = false
|
||||
private var mIsPasswordProtectionPending = false
|
||||
private var mWasProtectionHandled = false
|
||||
private var mLatestMediaId = 0L
|
||||
private var mLatestMediaDateId = 0L
|
||||
private var mLastMediaHandler = Handler()
|
||||
|
@ -74,6 +76,8 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
|||
setContentView(R.layout.activity_main)
|
||||
appLaunched(BuildConfig.APPLICATION_ID)
|
||||
|
||||
config.temporarilyShowHidden = false
|
||||
config.tempSkipDeleteConfirmation = false
|
||||
mIsPickImageIntent = isPickImageIntent(intent)
|
||||
mIsPickVideoIntent = isPickVideoIntent(intent)
|
||||
mIsGetImageContentIntent = isGetImageContentIntent(intent)
|
||||
|
@ -152,8 +156,9 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
|||
directories_empty_text_label.setTextColor(config.textColor)
|
||||
directories_empty_text.setTextColor(getAdjustedPrimaryColor())
|
||||
|
||||
if (mIsPasswordProtectionPending) {
|
||||
if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
|
||||
handleAppPasswordProtection {
|
||||
mWasProtectionHandled = it
|
||||
if (it) {
|
||||
mIsPasswordProtectionPending = false
|
||||
tryLoadGallery()
|
||||
|
@ -176,9 +181,10 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
|||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
if (config.temporarilyShowHidden) {
|
||||
if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
|
||||
mTempShowHiddenHandler.postDelayed({
|
||||
config.temporarilyShowHidden = false
|
||||
config.tempSkipDeleteConfirmation = false
|
||||
}, SHOW_TEMP_HIDDEN_DURATION)
|
||||
} else {
|
||||
mTempShowHiddenHandler.removeCallbacksAndMessages(null)
|
||||
|
@ -228,6 +234,16 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
|||
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 storeStateVariables() {
|
||||
|
@ -593,42 +609,46 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
|||
val mediumDao = galleryDB.MediumDao()
|
||||
val directoryDao = galleryDB.DirectoryDao()
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|
||||
val favoritePaths = getFavoritePaths()
|
||||
|
||||
for (directory in dirs) {
|
||||
val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken)
|
||||
val newDir = if (curMedia.isEmpty()) {
|
||||
directory
|
||||
} else {
|
||||
createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending)
|
||||
}
|
||||
try {
|
||||
for (directory in dirs) {
|
||||
val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths)
|
||||
val newDir = if (curMedia.isEmpty()) {
|
||||
directory
|
||||
} 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
|
||||
if (directory == newDir) {
|
||||
continue
|
||||
}
|
||||
// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed
|
||||
if (directory == newDir) {
|
||||
continue
|
||||
}
|
||||
|
||||
directory.apply {
|
||||
tmb = newDir.tmb
|
||||
name = newDir.name
|
||||
mediaCnt = newDir.mediaCnt
|
||||
modified = newDir.modified
|
||||
taken = newDir.taken
|
||||
this@apply.size = newDir.size
|
||||
types = newDir.types
|
||||
}
|
||||
directory.apply {
|
||||
tmb = newDir.tmb
|
||||
name = newDir.name
|
||||
mediaCnt = newDir.mediaCnt
|
||||
modified = newDir.modified
|
||||
taken = newDir.taken
|
||||
this@apply.size = newDir.size
|
||||
types = newDir.types
|
||||
}
|
||||
|
||||
showSortedDirs(dirs)
|
||||
showSortedDirs(dirs)
|
||||
|
||||
// update directories and media files in the local db, delete invalid items
|
||||
updateDBDirectory(directory)
|
||||
mediumDao.insertAll(curMedia)
|
||||
getCachedMedia(directory.path, getVideosOnly, getImagesOnly) {
|
||||
it.forEach {
|
||||
if (!curMedia.contains(it)) {
|
||||
mediumDao.deleteMediumPath(it.path)
|
||||
// update directories and media files in the local db, delete invalid items
|
||||
updateDBDirectory(directory)
|
||||
mediumDao.insertAll(curMedia)
|
||||
getCachedMedia(directory.path, getVideosOnly, getImagesOnly) {
|
||||
it.forEach {
|
||||
if (!curMedia.contains(it)) {
|
||||
mediumDao.deleteMediumPath(it.path)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (ignored: ConcurrentModificationException) {
|
||||
}
|
||||
|
||||
val foldersToScan = mediaFetcher.getFoldersToScan()
|
||||
|
@ -638,7 +658,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
|||
|
||||
// check the remaining folders which were not cached at all yet
|
||||
for (folder in foldersToScan) {
|
||||
val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken)
|
||||
val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths)
|
||||
if (newMedia.isEmpty()) {
|
||||
continue
|
||||
}
|
||||
|
@ -875,6 +895,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
|
|||
add(Release(163, R.string.release_163))
|
||||
add(Release(177, R.string.release_177))
|
||||
add(Release(178, R.string.release_178))
|
||||
add(Release(180, R.string.release_180))
|
||||
checkWhatsNew(this, BuildConfig.VERSION_CODE)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -162,9 +162,10 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
|
|||
super.onStop()
|
||||
mSearchMenuItem?.collapseActionView()
|
||||
|
||||
if (config.temporarilyShowHidden) {
|
||||
if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
|
||||
mTempShowHiddenHandler.postDelayed({
|
||||
config.temporarilyShowHidden = false
|
||||
config.tempSkipDeleteConfirmation = false
|
||||
}, SHOW_TEMP_HIDDEN_DURATION)
|
||||
} else {
|
||||
mTempShowHiddenHandler.removeCallbacksAndMessages(null)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.simplemobiletools.gallery.activities
|
||||
|
||||
import android.content.Intent
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.net.Uri
|
||||
|
@ -20,6 +21,7 @@ import com.simplemobiletools.gallery.fragments.VideoFragment
|
|||
import com.simplemobiletools.gallery.fragments.ViewPagerFragment
|
||||
import com.simplemobiletools.gallery.helpers.*
|
||||
import com.simplemobiletools.gallery.models.Medium
|
||||
import kotlinx.android.synthetic.main.bottom_actions.*
|
||||
import kotlinx.android.synthetic.main.fragment_holder.*
|
||||
import java.io.File
|
||||
|
||||
|
@ -46,6 +48,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
|
|||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
initBottomActions()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
|
@ -87,10 +91,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
|
|||
val type = when {
|
||||
file.isImageFast() -> TYPE_IMAGES
|
||||
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
|
||||
bundle.putSerializable(MEDIUM, mMedium)
|
||||
|
||||
|
@ -98,7 +103,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
|
|||
mFragment = if (mIsVideo) VideoFragment() else PhotoFragment()
|
||||
mFragment!!.listener = this
|
||||
mFragment!!.arguments = bundle
|
||||
supportFragmentManager.beginTransaction().replace(R.id.fragment_holder, mFragment).commit()
|
||||
supportFragmentManager.beginTransaction().replace(R.id.fragment_placeholder, mFragment).commit()
|
||||
}
|
||||
|
||||
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) {
|
||||
Intent(this, ViewPagerActivity::class.java).apply {
|
||||
putExtra(IS_VIEW_INTENT, true)
|
||||
|
@ -125,15 +135,16 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
|
|||
|
||||
menu.apply {
|
||||
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_share).isVisible = !config.bottomActions
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
if (mMedium == null) {
|
||||
if (mMedium == null || mUri == null) {
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -152,6 +163,33 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
|
|||
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() {
|
||||
mIsFullScreen = !mIsFullScreen
|
||||
if (mIsFullScreen) {
|
||||
|
@ -159,6 +197,10 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
|
|||
} else {
|
||||
showSystemUI()
|
||||
}
|
||||
|
||||
if (!bottom_actions.isGone()) {
|
||||
bottom_actions.animate().alpha(if (mIsFullScreen) 0f else 1f).start()
|
||||
}
|
||||
}
|
||||
|
||||
override fun videoEnded() = false
|
||||
|
|
|
@ -51,12 +51,12 @@ class SettingsActivity : SimpleActivity() {
|
|||
setupScrollHorizontally()
|
||||
setupScreenRotation()
|
||||
setupHideSystemUI()
|
||||
setupReplaceShare()
|
||||
setupPasswordProtection()
|
||||
setupAppPasswordProtection()
|
||||
setupDeleteEmptyFolders()
|
||||
setupAllowPhotoGestures()
|
||||
setupAllowVideoGestures()
|
||||
setupBottomActions()
|
||||
setupShowMediaCount()
|
||||
setupKeepLastModified()
|
||||
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() {
|
||||
settings_password_protection.isChecked = config.isPasswordProtectionOn
|
||||
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() {
|
||||
settings_show_media_count.isChecked = config.showMediaCount
|
||||
settings_show_media_count_holder.setOnClickListener {
|
||||
|
|
|
@ -45,6 +45,7 @@ import com.simplemobiletools.gallery.fragments.ViewPagerFragment
|
|||
import com.simplemobiletools.gallery.helpers.*
|
||||
import com.simplemobiletools.gallery.models.Medium
|
||||
import kotlinx.android.synthetic.main.activity_medium.*
|
||||
import kotlinx.android.synthetic.main.bottom_actions.*
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.InputStream
|
||||
|
@ -69,7 +70,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
private var mIsOrientationLocked = false
|
||||
|
||||
private var mStoredReplaceZoomableImages = false
|
||||
private var mStoredBottomActions = true
|
||||
private var mMediaFiles = ArrayList<Medium>()
|
||||
private var mFavoritePaths = ArrayList<String>()
|
||||
|
||||
companion object {
|
||||
var screenWidth = 0
|
||||
|
@ -80,7 +83,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_medium)
|
||||
setTranslucentNavigation()
|
||||
mMediaFiles = MediaActivity.mMedia.clone() as ArrayList<Medium>
|
||||
|
||||
handlePermission(PERMISSION_WRITE_STORAGE) {
|
||||
|
@ -93,8 +95,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
}
|
||||
|
||||
storeStateVariables()
|
||||
initBottomActions()
|
||||
initFavorites()
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (!hasPermission(PERMISSION_WRITE_STORAGE)) {
|
||||
|
@ -102,11 +107,23 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
return
|
||||
}
|
||||
|
||||
if (config.bottomActions) {
|
||||
if (isLollipopPlus()) {
|
||||
window.navigationBarColor = Color.TRANSPARENT
|
||||
}
|
||||
} else {
|
||||
setTranslucentNavigation()
|
||||
}
|
||||
|
||||
if (mStoredReplaceZoomableImages != config.replaceZoomableImages) {
|
||||
mPrevHashcode = 0
|
||||
refreshViewPager()
|
||||
}
|
||||
|
||||
if (mStoredBottomActions != config.bottomActions) {
|
||||
initBottomActions()
|
||||
}
|
||||
|
||||
supportActionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.actionbar_gradient_background))
|
||||
|
||||
if (config.maxBrightness) {
|
||||
|
@ -232,10 +249,24 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
view_pager.adapter?.let {
|
||||
(it as MyPagerAdapter).toggleFullscreen(mIsFullScreen)
|
||||
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() {
|
||||
if (mIsOrientationLocked) {
|
||||
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 {
|
||||
menuInflater.inflate(R.menu.menu_viewpager, menu)
|
||||
val currentMedium = getCurrentMedium() ?: return true
|
||||
currentMedium.isFavorite = mFavoritePaths.contains(currentMedium.path)
|
||||
|
||||
menu.apply {
|
||||
findItem(R.id.menu_share_1).isVisible = !config.replaceShare
|
||||
findItem(R.id.menu_share_2).isVisible = config.replaceShare
|
||||
findItem(R.id.menu_delete).isVisible = !config.bottomActions
|
||||
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_save_as).isVisible = mRotationDegrees != 0
|
||||
findItem(R.id.menu_hide).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).title = getString(if (mIsOrientationLocked) R.string.unlock_orientation else R.string.lock_orientation)
|
||||
findItem(R.id.menu_rotate).setShowAsAction(
|
||||
|
@ -269,6 +304,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
})
|
||||
}
|
||||
|
||||
if (config.bottomActions) {
|
||||
updateFavoriteIcon(currentMedium)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -284,8 +322,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
R.id.menu_open_with -> openPath(getCurrentPath(), true)
|
||||
R.id.menu_hide -> toggleFileVisibility(true)
|
||||
R.id.menu_unhide -> toggleFileVisibility(false)
|
||||
R.id.menu_share_1 -> shareMedium(getCurrentMedium()!!)
|
||||
R.id.menu_share_2 -> shareMedium(getCurrentMedium()!!)
|
||||
R.id.menu_share -> shareMedium(getCurrentMedium()!!)
|
||||
R.id.menu_delete -> checkDeleteConfirmation()
|
||||
R.id.menu_rename -> renameFile()
|
||||
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_rotate_right -> rotateImage(90)
|
||||
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_lock_orientation -> toggleLockOrientation()
|
||||
R.id.menu_save_as -> saveImageAs()
|
||||
|
@ -305,6 +344,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
private fun storeStateVariables() {
|
||||
config.apply {
|
||||
mStoredReplaceZoomableImages = replaceZoomableImages
|
||||
mStoredBottomActions = bottomActions
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -711,6 +751,52 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
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?) {
|
||||
if (requestCode == REQUEST_EDIT_IMAGE) {
|
||||
if (resultCode == Activity.RESULT_OK && resultData != null) {
|
||||
|
@ -776,6 +862,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
override fun onConfigurationChanged(newConfig: Configuration?) {
|
||||
super.onConfigurationChanged(newConfig)
|
||||
measureScreen()
|
||||
initBottomActionsLayout()
|
||||
}
|
||||
|
||||
private fun measureScreen() {
|
||||
|
@ -920,7 +1007,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
mPos = position
|
||||
updateActionbarTitle()
|
||||
mRotationDegrees = 0
|
||||
supportInvalidateOptionsMenu()
|
||||
invalidateOptionsMenu()
|
||||
scheduleSwipe()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,12 +47,12 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
|
|||
|
||||
override fun getActionMenuId() = R.menu.cab_directories
|
||||
|
||||
override fun prepareItemSelection(view: View) {
|
||||
view.dir_check?.background?.applyColorFilter(primaryColor)
|
||||
override fun prepareItemSelection(viewHolder: ViewHolder) {
|
||||
viewHolder.itemView.dir_check?.background?.applyColorFilter(primaryColor)
|
||||
}
|
||||
|
||||
override fun markItemSelection(select: Boolean, view: View?) {
|
||||
view?.dir_check?.beVisibleIf(select)
|
||||
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
|
||||
viewHolder?.itemView?.dir_check?.beVisibleIf(select)
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
|
@ -234,17 +234,23 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
|
|||
activity.runOnUiThread {
|
||||
affectedPositions.sortedDescending().forEach {
|
||||
notifyItemRemoved(it)
|
||||
itemViews.put(it, null)
|
||||
}
|
||||
|
||||
val newItems = SparseArray<View>()
|
||||
(0 until itemViews.size())
|
||||
.filter { itemViews[it] != null }
|
||||
.forEachIndexed { curIndex, i -> newItems.put(curIndex, itemViews[i]) }
|
||||
val newViewHolders = SparseArray<ViewHolder>()
|
||||
val cnt = viewHolders.size()
|
||||
for (i in 0..cnt) {
|
||||
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()
|
||||
itemViews = newItems
|
||||
dirs = newDirs
|
||||
|
||||
finishActMode()
|
||||
fastScroller?.measureRecyclerView()
|
||||
listener?.updateDirectories(newDirs)
|
||||
|
@ -290,7 +296,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
|
|||
} else {
|
||||
File(path).listFiles()?.filter {
|
||||
!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) {
|
||||
deleteFiles()
|
||||
} else {
|
||||
val items = resources.getQuantityString(R.plurals.delete_items, selectedPositions.size, selectedPositions.size)
|
||||
val question = String.format(resources.getString(R.string.deletion_confirmation), items)
|
||||
val itemsCnt = selectedPositions.size
|
||||
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) {
|
||||
deleteFiles()
|
||||
}
|
||||
|
@ -435,7 +444,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
|
|||
val thumbnailType = when {
|
||||
directory.tmb.isImageFast() -> TYPE_IMAGES
|
||||
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)
|
||||
|
|
|
@ -25,10 +25,10 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList<
|
|||
|
||||
override fun prepareActionMode(menu: Menu) {}
|
||||
|
||||
override fun prepareItemSelection(view: View) {}
|
||||
override fun prepareItemSelection(viewHolder: ViewHolder) {}
|
||||
|
||||
override fun markItemSelection(select: Boolean, view: View?) {
|
||||
view?.manage_folder_holder?.isSelected = select
|
||||
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
|
||||
viewHolder?.itemView?.manage_folder_holder?.isSelected = select
|
||||
}
|
||||
|
||||
override fun actionItemPressed(id: Int) {
|
||||
|
|
|
@ -27,10 +27,10 @@ class ManageHiddenFoldersAdapter(activity: BaseSimpleActivity, var folders: Arra
|
|||
|
||||
override fun prepareActionMode(menu: Menu) {}
|
||||
|
||||
override fun prepareItemSelection(view: View) {}
|
||||
override fun prepareItemSelection(viewHolder: ViewHolder) {}
|
||||
|
||||
override fun markItemSelection(select: Boolean, view: View?) {
|
||||
view?.manage_folder_holder?.isSelected = select
|
||||
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
|
||||
viewHolder?.itemView?.manage_folder_holder?.isSelected = select
|
||||
}
|
||||
|
||||
override fun actionItemPressed(id: Int) {
|
||||
|
|
|
@ -49,12 +49,12 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Medium>,
|
|||
|
||||
override fun getActionMenuId() = R.menu.cab_media
|
||||
|
||||
override fun prepareItemSelection(view: View) {
|
||||
view.medium_check?.background?.applyColorFilter(primaryColor)
|
||||
override fun prepareItemSelection(viewHolder: ViewHolder) {
|
||||
viewHolder.itemView?.medium_check?.background?.applyColorFilter(primaryColor)
|
||||
}
|
||||
|
||||
override fun markItemSelection(select: Boolean, view: View?) {
|
||||
view?.medium_check?.beVisibleIf(select)
|
||||
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
|
||||
viewHolder?.itemView?.medium_check?.beVisibleIf(select)
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
|
|
|
@ -3,8 +3,8 @@ package com.simplemobiletools.gallery.asynctasks
|
|||
import android.content.Context
|
||||
import android.os.AsyncTask
|
||||
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.getFavoritePaths
|
||||
import com.simplemobiletools.gallery.helpers.MediaFetcher
|
||||
import com.simplemobiletools.gallery.models.Medium
|
||||
import java.util.*
|
||||
|
@ -15,19 +15,20 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage
|
|||
private val mediaFetcher = MediaFetcher(context)
|
||||
|
||||
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) {
|
||||
val foldersToScan = mediaFetcher.getFoldersToScan()
|
||||
val media = ArrayList<Medium>()
|
||||
foldersToScan.forEach {
|
||||
val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken)
|
||||
val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, favoritePaths)
|
||||
media.addAll(newMedia)
|
||||
}
|
||||
|
||||
MediaFetcher(context).sortMedia(media, context.config.getFileSorting(""))
|
||||
media
|
||||
} else {
|
||||
mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken)
|
||||
mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, favoritePaths)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ import com.simplemobiletools.gallery.interfaces.MediumDao
|
|||
import com.simplemobiletools.gallery.models.Directory
|
||||
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 fun DirectoryDao(): DirectoryDao
|
||||
|
|
|
@ -7,6 +7,7 @@ import com.simplemobiletools.gallery.R
|
|||
import com.simplemobiletools.gallery.extensions.config
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_GIFS
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_IMAGES
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_RAWS
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS
|
||||
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_videos.isChecked = filterMedia and TYPE_VIDEOS != 0
|
||||
filter_media_gifs.isChecked = filterMedia and TYPE_GIFS != 0
|
||||
filter_media_raws.isChecked = filterMedia and TYPE_RAWS != 0
|
||||
}
|
||||
|
||||
AlertDialog.Builder(activity)
|
||||
.setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() })
|
||||
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.create().apply {
|
||||
activity.setupDialogStuff(view, this, R.string.filter_media)
|
||||
|
@ -37,6 +39,8 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result:
|
|||
result += TYPE_VIDEOS
|
||||
if (view.filter_media_gifs.isChecked)
|
||||
result += TYPE_GIFS
|
||||
if (view.filter_media_raws.isChecked)
|
||||
result += TYPE_RAWS
|
||||
|
||||
activity.config.filterMedia = result
|
||||
callback(result)
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simplemobiletools.gallery.extensions
|
|||
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_GIFS
|
||||
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.models.Medium
|
||||
|
||||
|
@ -19,5 +20,9 @@ fun ArrayList<Medium>.getDirMediaTypes(): Int {
|
|||
types += TYPE_GIFS
|
||||
}
|
||||
|
||||
if (any { it.isRaw() }) {
|
||||
types += TYPE_RAWS
|
||||
}
|
||||
|
||||
return types
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import android.content.Context
|
|||
import android.content.Intent
|
||||
import android.content.res.Configuration
|
||||
import android.database.Cursor
|
||||
import android.database.sqlite.SQLiteException
|
||||
import android.graphics.Point
|
||||
import android.media.AudioManager
|
||||
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) {
|
||||
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()) {
|
||||
loadPng(path, target, cropThumbnails)
|
||||
} 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) {
|
||||
Thread {
|
||||
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 excludedPaths = config.excludedFolders
|
||||
val includedPaths = config.includedFolders
|
||||
|
@ -289,7 +294,8 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
|
|||
else -> filteredDirectories.filter {
|
||||
(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_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>
|
||||
|
||||
|
@ -316,8 +322,11 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
|
|||
var media = ArrayList<Medium>()
|
||||
val shouldShowHidden = config.shouldShowHidden
|
||||
foldersToScan.forEach {
|
||||
val currMedia = mediumDao.getMediaFromPath(it)
|
||||
media.addAll(currMedia)
|
||||
try {
|
||||
val currMedia = mediumDao.getMediaFromPath(it)
|
||||
media.addAll(currMedia)
|
||||
} catch (ignored: IllegalStateException) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!shouldShowHidden) {
|
||||
|
@ -331,7 +340,8 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
|
|||
else -> media.filter {
|
||||
(filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES) ||
|
||||
(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>
|
||||
|
||||
|
@ -364,3 +374,5 @@ fun Context.updateDBDirectory(directory: Directory) {
|
|||
fun Context.getOTGFolderChildren(path: String) = getDocumentFile(path)?.listFiles()
|
||||
|
||||
fun Context.getOTGFolderChildrenNames(path: String) = getOTGFolderChildren(path)?.map { it.name }?.toList()
|
||||
|
||||
fun Context.getFavoritePaths() = galleryDB.MediumDao().getFavoritePaths() as ArrayList<String>
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.simplemobiletools.gallery.extensions
|
|||
import com.bumptech.glide.signature.ObjectKey
|
||||
import com.simplemobiletools.commons.helpers.OTG_PATH
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
|
||||
fun String.getFileSignature(): ObjectKey {
|
||||
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
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,7 +116,7 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
|
||||
isFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
loadImage()
|
||||
checkExtendedDetails()
|
||||
initExtendedDetails()
|
||||
wasInit = true
|
||||
|
||||
return view
|
||||
|
@ -130,7 +130,7 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (wasInit && (context!!.config.showExtendedDetails != storedShowExtendedDetails || context!!.config.extendedDetails != storedExtendedDetails)) {
|
||||
checkExtendedDetails()
|
||||
initExtendedDetails()
|
||||
}
|
||||
|
||||
val allowPhotoGestures = context!!.config.allowPhotoGestures
|
||||
|
@ -287,7 +287,7 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
}
|
||||
|
||||
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
|
||||
view.subsampling_view.apply {
|
||||
maxScale = 10f
|
||||
|
@ -376,16 +376,19 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
loadBitmap(degrees)
|
||||
}
|
||||
|
||||
private fun checkExtendedDetails() {
|
||||
private fun initExtendedDetails() {
|
||||
if (context!!.config.showExtendedDetails) {
|
||||
view.photo_details.apply {
|
||||
beInvisible() // make it invisible so we can measure it, but not show yet
|
||||
text = getMediumExtendedDetails(medium)
|
||||
setTextColor(context.config.textColor)
|
||||
beVisibleIf(text.isNotEmpty())
|
||||
alpha = if (!context!!.config.hideExtendedDetails || !isFullscreen) 1f else 0f
|
||||
onGlobalLayout {
|
||||
if (height != 0 && isAdded) {
|
||||
y = getExtendedDetailsY(height)
|
||||
if (isAdded) {
|
||||
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) {
|
||||
super.onConfigurationChanged(newConfig)
|
||||
loadImage()
|
||||
checkExtendedDetails()
|
||||
initExtendedDetails()
|
||||
}
|
||||
|
||||
private fun photoClicked() {
|
||||
|
@ -415,7 +418,7 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
override fun fullscreenToggled(isFullscreen: Boolean) {
|
||||
this.isFullscreen = isFullscreen
|
||||
view.photo_details.apply {
|
||||
if (storedShowExtendedDetails) {
|
||||
if (storedShowExtendedDetails && isVisible()) {
|
||||
animate().y(getExtendedDetailsY(height))
|
||||
|
||||
if (storedHideExtendedDetails) {
|
||||
|
@ -428,6 +431,7 @@ class PhotoFragment : ViewPagerFragment() {
|
|||
private fun getExtendedDetailsY(height: Int): Float {
|
||||
val smallMargin = resources.getDimension(R.dimen.small_margin)
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,6 +53,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
|
|||
|
||||
private var mStoredShowExtendedDetails = false
|
||||
private var mStoredHideExtendedDetails = false
|
||||
private var mStoredBottomActions = true
|
||||
private var mStoredExtendedDetails = 0
|
||||
|
||||
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
|
||||
mView!!.video_play_outline.alpha = if (mIsFullscreen) 0f else 1f
|
||||
|
||||
setupPlayer()
|
||||
if (savedInstanceState != null) {
|
||||
mCurrTime = savedInstanceState.getInt(PROGRESS)
|
||||
|
@ -118,6 +121,11 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
|
|||
if (context!!.config.showExtendedDetails != mStoredShowExtendedDetails || context!!.config.extendedDetails != mStoredExtendedDetails) {
|
||||
checkExtendedDetails()
|
||||
}
|
||||
|
||||
if (context!!.config.bottomActions != mStoredBottomActions) {
|
||||
initTimeHolder()
|
||||
}
|
||||
|
||||
storeStateVariables()
|
||||
}
|
||||
|
||||
|
@ -139,6 +147,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
|
|||
mStoredShowExtendedDetails = showExtendedDetails
|
||||
mStoredHideExtendedDetails = hideExtendedDetails
|
||||
mStoredExtendedDetails = extendedDetails
|
||||
mStoredBottomActions = bottomActions
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -199,9 +208,14 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
|
|||
right += context!!.navigationBarWidth
|
||||
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
|
||||
mSeekBar = mView!!.video_seekbar
|
||||
mSeekBar!!.setOnSeekBarChangeListener(this)
|
||||
|
@ -302,7 +316,8 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
|
|||
} else {
|
||||
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)
|
||||
}
|
||||
|
||||
|
@ -462,13 +477,16 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
|
|||
private fun checkExtendedDetails() {
|
||||
if (context!!.config.showExtendedDetails) {
|
||||
mView!!.video_details.apply {
|
||||
beInvisible() // make it invisible so we can measure it, but not show yet
|
||||
text = getMediumExtendedDetails(medium)
|
||||
setTextColor(context.config.textColor)
|
||||
beVisibleIf(text.isNotEmpty())
|
||||
alpha = if (!context!!.config.hideExtendedDetails || !mIsFullscreen) 1f else 0f
|
||||
onGlobalLayout {
|
||||
if (height != 0 && isAdded) {
|
||||
y = getExtendedDetailsY(height)
|
||||
if (isAdded) {
|
||||
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
|
||||
checkFullscreen()
|
||||
mView!!.video_details.apply {
|
||||
if (mStoredShowExtendedDetails) {
|
||||
if (mStoredShowExtendedDetails && isVisible()) {
|
||||
animate().y(getExtendedDetailsY(height))
|
||||
|
||||
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 {
|
||||
val smallMargin = resources.getDimension(R.dimen.small_margin)
|
||||
val timeHolderHeight = mTimeHolder!!.height - context!!.navigationBarHeight.toFloat()
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -151,7 +151,7 @@ class Config(context: Context) : BaseConfig(context) {
|
|||
set(darkBackground) = prefs.edit().putBoolean(DARK_BACKGROUND, darkBackground).apply()
|
||||
|
||||
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()
|
||||
|
||||
var dirColumnCnt: Int
|
||||
|
@ -227,10 +227,6 @@ class Config(context: Context) : BaseConfig(context) {
|
|||
get() = prefs.getBoolean(HIDE_SYSTEM_UI, false)
|
||||
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
|
||||
get() = prefs.getBoolean(DELETE_EMPTY_FOLDERS, false)
|
||||
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)
|
||||
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
|
||||
get() = prefs.getBoolean(SHOW_MEDIA_COUNT, true)
|
||||
set(showMediaCount) = prefs.edit().putBoolean(SHOW_MEDIA_COUNT, showMediaCount).apply()
|
||||
|
|
|
@ -30,7 +30,6 @@ const val EXCLUDED_FOLDERS = "excluded_folders"
|
|||
const val INCLUDED_FOLDERS = "included_folders"
|
||||
const val ALBUM_COVERS = "album_covers"
|
||||
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 ALLOW_PHOTO_GESTURES = "allow_photo_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 WAS_OTG_HANDLED = "was_otg_handled"
|
||||
const val TEMP_SKIP_DELETE_CONFIRMATION = "temp_skip_delete_confirmation"
|
||||
const val BOTTOM_ACTIONS = "bottom_actions"
|
||||
|
||||
// slideshow
|
||||
const val SLIDESHOW_INTERVAL = "slideshow_interval"
|
||||
|
@ -63,8 +63,9 @@ const val SLIDESHOW_DEFAULT_INTERVAL = 5
|
|||
const val SLIDESHOW_SCROLL_DURATION = 500L
|
||||
|
||||
const val NOMEDIA = ".nomedia"
|
||||
const val FAVORITES = "favorites"
|
||||
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 DRAG_THRESHOLD = 8
|
||||
|
||||
|
@ -104,6 +105,7 @@ const val EXT_ALBUM = 1024
|
|||
const val TYPE_IMAGES = 1
|
||||
const val TYPE_VIDEOS = 2
|
||||
const val TYPE_GIFS = 4
|
||||
const val TYPE_RAWS = 8
|
||||
|
||||
const val LOCAITON_INTERNAL = 1
|
||||
const val LOCATION_SD = 2
|
||||
|
|
|
@ -16,7 +16,7 @@ import java.io.File
|
|||
class MediaFetcher(val context: Context) {
|
||||
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
|
||||
if (filterMedia == 0) {
|
||||
return ArrayList()
|
||||
|
@ -24,10 +24,10 @@ class MediaFetcher(val context: Context) {
|
|||
|
||||
val curMedia = ArrayList<Medium>()
|
||||
if (curPath.startsWith(OTG_PATH)) {
|
||||
val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia)
|
||||
val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia, favoritePaths)
|
||||
curMedia.addAll(newMedia)
|
||||
} else {
|
||||
val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken)
|
||||
val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, favoritePaths)
|
||||
curMedia.addAll(newMedia)
|
||||
}
|
||||
|
||||
|
@ -67,7 +67,13 @@ class MediaFetcher(val context: Context) {
|
|||
}
|
||||
|
||||
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")
|
||||
|
@ -93,10 +99,17 @@ class MediaFetcher(val context: Context) {
|
|||
args.add("%.gif")
|
||||
}
|
||||
|
||||
if (filterMedia and TYPE_RAWS != 0) {
|
||||
rawExtensions.forEach {
|
||||
args.add("%$it")
|
||||
}
|
||||
}
|
||||
|
||||
return args
|
||||
}
|
||||
|
||||
private fun parseCursor(cursor: Cursor): ArrayList<String> {
|
||||
val foldersToIgnore = arrayListOf("/storage/emulated/legacy")
|
||||
val config = context.config
|
||||
val includedFolders = config.includedFolders
|
||||
var foldersToScan = ArrayList<String>()
|
||||
|
@ -106,7 +119,7 @@ class MediaFetcher(val context: Context) {
|
|||
do {
|
||||
val path = cursor.getStringValue(MediaStore.Images.Media.DATA).trim()
|
||||
val parentPath = File(path).parent?.trimEnd('/') ?: continue
|
||||
if (!includedFolders.contains(parentPath)) {
|
||||
if (!includedFolders.contains(parentPath) && !foldersToIgnore.contains(parentPath.toLowerCase())) {
|
||||
foldersToScan.add(parentPath)
|
||||
}
|
||||
} 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 files = File(folder).listFiles() ?: return media
|
||||
val doExtraCheck = context.config.doExtraCheck
|
||||
|
@ -159,8 +173,9 @@ class MediaFetcher(val context: Context) {
|
|||
val isImage = filename.isImageFast()
|
||||
val isVideo = if (isImage) false else filename.isVideoFast()
|
||||
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
|
||||
|
||||
if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0))
|
||||
|
@ -172,6 +187,9 @@ class MediaFetcher(val context: Context) {
|
|||
if (isGif && filterMedia and TYPE_GIFS == 0)
|
||||
continue
|
||||
|
||||
if (isRaw && filterMedia and TYPE_RAWS == 0)
|
||||
continue
|
||||
|
||||
if (!showHidden && filename.startsWith('.'))
|
||||
continue
|
||||
|
||||
|
@ -189,16 +207,19 @@ class MediaFetcher(val context: Context) {
|
|||
val type = when {
|
||||
isImage -> TYPE_IMAGES
|
||||
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)
|
||||
}
|
||||
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 files = context.getDocumentFile(folder)?.listFiles() ?: return media
|
||||
val doExtraCheck = context.config.doExtraCheck
|
||||
|
@ -213,8 +234,9 @@ class MediaFetcher(val context: Context) {
|
|||
val isImage = filename.isImageFast()
|
||||
val isVideo = if (isImage) false else filename.isVideoFast()
|
||||
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
|
||||
|
||||
if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0))
|
||||
|
@ -226,6 +248,9 @@ class MediaFetcher(val context: Context) {
|
|||
if (isGif && filterMedia and TYPE_GIFS == 0)
|
||||
continue
|
||||
|
||||
if (isRaw && filterMedia and TYPE_RAWS == 0)
|
||||
continue
|
||||
|
||||
if (!showHidden && filename.startsWith('.'))
|
||||
continue
|
||||
|
||||
|
@ -239,11 +264,13 @@ class MediaFetcher(val context: Context) {
|
|||
val type = when {
|
||||
isImage -> TYPE_IMAGES
|
||||
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 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)
|
||||
}
|
||||
|
||||
|
@ -262,7 +289,7 @@ class MediaFetcher(val context: Context) {
|
|||
|
||||
val dateTakens = HashMap<String, Long>()
|
||||
val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
|
||||
cursor.use {
|
||||
cursor?.use {
|
||||
if (cursor.moveToFirst()) {
|
||||
do {
|
||||
try {
|
||||
|
|
|
@ -8,9 +8,12 @@ import com.simplemobiletools.gallery.models.Medium
|
|||
|
||||
@Dao
|
||||
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>
|
||||
|
||||
@Query("SELECT full_path FROM media WHERE is_favorite = 1")
|
||||
fun getFavoritePaths(): List<String>
|
||||
|
||||
@Insert(onConflict = REPLACE)
|
||||
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")
|
||||
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)
|
||||
}
|
||||
|
|
|
@ -6,13 +6,13 @@ import android.arch.persistence.room.Index
|
|||
import android.arch.persistence.room.PrimaryKey
|
||||
import com.simplemobiletools.commons.extensions.formatDate
|
||||
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_NAME
|
||||
import com.simplemobiletools.commons.helpers.SORT_BY_PATH
|
||||
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_GIFS
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_IMAGES
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_RAWS
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS
|
||||
import java.io.Serializable
|
||||
|
||||
|
@ -25,7 +25,8 @@ data class Medium(
|
|||
@ColumnInfo(name = "last_modified") val modified: Long,
|
||||
@ColumnInfo(name = "date_taken") var taken: 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 {
|
||||
private const val serialVersionUID = -6553149366975455L
|
||||
|
@ -37,7 +38,7 @@ data class Medium(
|
|||
|
||||
fun isVideo() = type == TYPE_VIDEOS
|
||||
|
||||
fun isDng() = path.isDng()
|
||||
fun isRaw() = type == TYPE_RAWS
|
||||
|
||||
fun getBubbleText(sorting: Int) = when {
|
||||
sorting and SORT_BY_NAME != 0 -> name
|
||||
|
|
|
@ -3,14 +3,12 @@ package com.simplemobiletools.gallery.receivers
|
|||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import com.simplemobiletools.commons.extensions.getFilenameFromPath
|
||||
import com.simplemobiletools.commons.extensions.getParentPath
|
||||
import com.simplemobiletools.commons.extensions.isImageFast
|
||||
import com.simplemobiletools.commons.extensions.isVideoFast
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.REFRESH_PATH
|
||||
import com.simplemobiletools.gallery.extensions.galleryDB
|
||||
import com.simplemobiletools.gallery.helpers.TYPE_GIFS
|
||||
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.models.Medium
|
||||
import java.io.File
|
||||
|
@ -21,7 +19,7 @@ class RefreshMediaReceiver : BroadcastReceiver() {
|
|||
|
||||
Thread {
|
||||
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)
|
||||
}.start()
|
||||
}
|
||||
|
@ -29,6 +27,7 @@ class RefreshMediaReceiver : BroadcastReceiver() {
|
|||
private fun getFileType(path: String) = when {
|
||||
path.isImageFast() -> TYPE_IMAGES
|
||||
path.isVideoFast() -> TYPE_VIDEOS
|
||||
else -> TYPE_GIFS
|
||||
path.isGif() -> TYPE_GIFS
|
||||
else -> TYPE_RAWS
|
||||
}
|
||||
}
|
||||
|
|
BIN
app/src/main/res/drawable-hdpi/img_pause_outline_big.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 5.3 KiB |
BIN
app/src/main/res/drawable-xhdpi/img_pause_outline_big.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.6 KiB |
BIN
app/src/main/res/drawable-xxhdpi/img_pause_outline_big.png
Normal file
After Width: | Height: | Size: 7 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 10 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/img_pause_outline_big.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 6 KiB |
|
@ -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>
|
|
@ -10,4 +10,8 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<include
|
||||
android:id="@+id/bottom_actions"
|
||||
layout="@layout/bottom_actions"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -557,29 +557,6 @@
|
|||
|
||||
</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
|
||||
android:id="@+id/settings_one_finger_zoom_holder"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -672,6 +649,29 @@
|
|||
|
||||
</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
|
||||
android:id="@+id/settings_screen_rotation_holder"
|
||||
android:layout_width="match_parent"
|
||||
|
|
56
app/src/main/res/layout/bottom_actions.xml
Normal 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>
|
|
@ -33,4 +33,12 @@
|
|||
android:paddingTop="@dimen/activity_margin"
|
||||
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>
|
||||
|
|
|
@ -1,6 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/fragment_holder"
|
||||
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>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
<TextView
|
||||
android:id="@+id/photo_details"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -27,6 +27,7 @@
|
|||
android:layout_marginRight="@dimen/small_margin"
|
||||
android:background="@color/gradient_grey_start"
|
||||
android:padding="@dimen/small_margin"
|
||||
android:textColor="@color/theme_dark_text_color"
|
||||
android:textSize="@dimen/smaller_text_size"
|
||||
android:visibility="gone"
|
||||
tools:text="My image\nAnother line"/>
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
android:layout_height="@dimen/play_outline_size_big"
|
||||
android:layout_centerInParent="true"
|
||||
android:background="@android:color/transparent"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:padding="@dimen/big_margin"
|
||||
android:src="@drawable/img_play_outline_big"/>
|
||||
|
||||
<TextView
|
||||
|
@ -63,7 +63,7 @@
|
|||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/extra_big_text_size"/>
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
<TextView
|
||||
android:id="@+id/video_details"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -72,6 +72,7 @@
|
|||
android:layout_marginRight="@dimen/small_margin"
|
||||
android:background="@color/gradient_grey_start"
|
||||
android:padding="@dimen/small_margin"
|
||||
android:textColor="@color/theme_dark_text_color"
|
||||
android:textSize="@dimen/smaller_text_size"
|
||||
android:visibility="gone"
|
||||
tools:text="My video\nAnother line"/>
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
android:title="@string/delete"
|
||||
app:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/menu_share_1"
|
||||
android:id="@+id/menu_share"
|
||||
android:icon="@drawable/ic_share"
|
||||
android:title="@string/share"
|
||||
app:showAsAction="ifRoom"/>
|
||||
|
@ -35,10 +35,14 @@
|
|||
</menu>
|
||||
</item>
|
||||
<item
|
||||
android:id="@+id/menu_share_2"
|
||||
android:icon="@drawable/ic_share"
|
||||
android:title="@string/share"
|
||||
android:visible="false"
|
||||
android:id="@+id/menu_add_to_favorites"
|
||||
android:icon="@drawable/ic_star_off"
|
||||
android:title="@string/add_to_favorites"
|
||||
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"/>
|
||||
<item
|
||||
android:id="@+id/menu_lock_orientation"
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">الصور</string>
|
||||
<string name="videos">الفديوهات</string>
|
||||
<string name="gifs">الصور المتحركة</string>
|
||||
<string name="raw_images">RAW images</string>
|
||||
<string name="no_media_with_filters">لم يتم العثور على ملفات وسائط مع الفلاتر المحددة</string>
|
||||
<string name="change_filters_underlined"><u >تغيير الفلاتر</u></string>
|
||||
|
||||
|
@ -151,6 +152,7 @@
|
|||
<string name="replace_zoomable_images">استبدل الصور التي يمكن تكبيرها بعمق باستخدام صور ذات جودة أفضل</string>
|
||||
<string name="hide_extended_details">إخفاء التفاصيل الموسعة عند إخفاء شريط الحالة</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 -->
|
||||
<string name="thumbnails">المصغرات</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Imatges</string>
|
||||
<string name="videos">Vídeos</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="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="grid">Reixeta</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 -->
|
||||
<string name="group_by">Group by</string>
|
||||
<string name="do_not_group_files">Do not group files</string>
|
||||
<string name="by_folder">Folder</string>
|
||||
<string name="by_last_modified">Last modified</string>
|
||||
<string name="by_date_taken">Date taken</string>
|
||||
<string name="by_file_type">File type</string>
|
||||
<string name="by_extension">Extension</string>
|
||||
<string name="group_by">Agrupar per</string>
|
||||
<string name="do_not_group_files">No agrupar fitxers</string>
|
||||
<string name="by_folder">Carpeta</string>
|
||||
<string name="by_last_modified">Darrer modificat</string>
|
||||
<string name="by_date_taken">Data de presa</string>
|
||||
<string name="by_file_type">Tipus de fitxer</string>
|
||||
<string name="by_extension">Extensió</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Miniatures</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Thumbnails</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Billeder</string>
|
||||
<string name="videos">Videoer</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Thumbnails</string>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<string name="edit">Bearbeiten</string>
|
||||
<string name="open_camera">Kamera öffnen</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="unpin_folder">Ordner loslösen</string>
|
||||
<string name="pin_to_the_top">Oben anheften</string>
|
||||
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Bilder</string>
|
||||
<string name="videos">Videos</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="change_filters_underlined"><u>Filter ändern</u></string>
|
||||
|
||||
|
@ -110,15 +111,15 @@
|
|||
<string name="change_view_type">Darstellung ändern</string>
|
||||
<string name="grid">Gitter</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 -->
|
||||
<string name="group_by">Group by</string>
|
||||
<string name="do_not_group_files">Do not group files</string>
|
||||
<string name="by_folder">Folder</string>
|
||||
<string name="by_last_modified">Last modified</string>
|
||||
<string name="by_date_taken">Date taken</string>
|
||||
<string name="by_file_type">File type</string>
|
||||
<string name="group_by">Gruppieren bei</string>
|
||||
<string name="do_not_group_files">Dateien nicht gruppieren</string>
|
||||
<string name="by_folder">Ordner</string>
|
||||
<string name="by_last_modified">Zuletzt geändert</string>
|
||||
<string name="by_date_taken">Erstelldatum</string>
|
||||
<string name="by_file_type">Dateitype</string>
|
||||
<string name="by_extension">Extension</string>
|
||||
|
||||
<!-- Settings -->
|
||||
|
@ -147,6 +148,7 @@
|
|||
<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="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 -->
|
||||
<string name="thumbnails">Thumbnails</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Εικόνες</string>
|
||||
<string name="videos">Βίντεο</string>
|
||||
<string name="gifs">GIFs</string>
|
||||
<string name="raw_images">RAW images</string>
|
||||
<string name="no_media_with_filters">Δεν βρέθηκε κανένα αρχείο πολυμέσων με τα επιλεγμένα φίλτρα.</string>
|
||||
<string name="change_filters_underlined"><u>Αλλαγή φίλτρων</u></string>
|
||||
|
||||
|
@ -148,6 +149,7 @@
|
|||
<string name="replace_zoomable_images">Αντικατάσταση των φωτογραφιών που απαιτούν ζούμ με άλλες καλύτερης ποιότητας</string>
|
||||
<string name="hide_extended_details">Απόκρυψη λεπτομερειών όταν η μπάρα κατάστασης είναι κρυμμένη</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 -->
|
||||
<string name="thumbnails">Εικονίδια</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Imágenes</string>
|
||||
<string name="videos">Vídeos</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="change_filters_underlined"><u>Cambiar filtros</u></string>
|
||||
|
||||
|
@ -110,16 +111,16 @@
|
|||
<string name="change_view_type">Cambiar tipo de vista</string>
|
||||
<string name="grid">Cuadrícula</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 -->
|
||||
<string name="group_by">Group by</string>
|
||||
<string name="do_not_group_files">Do not group files</string>
|
||||
<string name="by_folder">Folder</string>
|
||||
<string name="by_last_modified">Last modified</string>
|
||||
<string name="by_date_taken">Date taken</string>
|
||||
<string name="by_file_type">File type</string>
|
||||
<string name="by_extension">Extension</string>
|
||||
<string name="group_by">Agrupar por</string>
|
||||
<string name="do_not_group_files">No agrupar ficheros</string>
|
||||
<string name="by_folder">Carpeta</string>
|
||||
<string name="by_last_modified">Último modificado</string>
|
||||
<string name="by_date_taken">Data de toma</string>
|
||||
<string name="by_file_type">Tipo de fichero</string>
|
||||
<string name="by_extension">Extensión</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<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_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_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_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>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Kuvat</string>
|
||||
<string name="videos">Videot</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Esikatselukuvat</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Images</string>
|
||||
<string name="videos">Vidéos</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Vignettes</string>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<string name="edit">Editar</string>
|
||||
<string name="open_camera">Abrir cámara</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="unpin_folder">Soltar cartafol</string>
|
||||
<string name="pin_to_the_top">Fixar arriba</string>
|
||||
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Imaxes</string>
|
||||
<string name="videos">Vídeos</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="change_filters_underlined"><u>Cambiar filtro</u></string>
|
||||
|
||||
|
@ -81,12 +82,12 @@
|
|||
<string name="edit_with">Editar con</string>
|
||||
|
||||
<!-- 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_failed">Fallou establecer fondo de pantalla</string>
|
||||
<string name="set_as_wallpaper_with">Establecer fondo de pantalla con:</string>
|
||||
<string name="setting_wallpaper">Establecendo fondo de pantalla…</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="landscape_aspect_ratio">Proporción de Paisaxe</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="grid">Grella</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 -->
|
||||
<string name="group_by">Group by</string>
|
||||
<string name="do_not_group_files">Do not group files</string>
|
||||
<string name="by_folder">Folder</string>
|
||||
<string name="by_last_modified">Last modified</string>
|
||||
<string name="by_date_taken">Date taken</string>
|
||||
<string name="by_file_type">File type</string>
|
||||
<string name="by_extension">Extension</string>
|
||||
<string name="group_by">Agrupar por</string>
|
||||
<string name="do_not_group_files">Non agrupar ficheiros</string>
|
||||
<string name="by_folder">Cartafol</string>
|
||||
<string name="by_last_modified">Último modificado</string>
|
||||
<string name="by_date_taken">Data de captura</string>
|
||||
<string name="by_file_type">Tipo de ficheior</string>
|
||||
<string name="by_extension">Extensión</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<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.
|
||||
|
||||
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.
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Slike</string>
|
||||
<string name="videos">Video</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Sličice</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Thumbnails</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Immagini</string>
|
||||
<string name="videos">Video</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Miniature</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">画像</string>
|
||||
<string name="videos">ビデオ</string>
|
||||
<string name="gifs">GIF</string>
|
||||
<string name="raw_images">RAW images</string>
|
||||
<string name="no_media_with_filters">絞り込み条件に該当するメディアがありません。</string>
|
||||
<string name="change_filters_underlined"><u>絞り込み条件を変更</u></string>
|
||||
|
||||
|
@ -147,6 +148,7 @@
|
|||
<string name="replace_zoomable_images">ズーム可能な画像をより高画質なものに置き換える</string>
|
||||
<string name="hide_extended_details">ステータスバーが非表示の時は詳細を表示しない</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 -->
|
||||
<string name="thumbnails">サムネイル</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">이미지</string>
|
||||
<string name="videos">비디오</string>
|
||||
<string name="gifs">GIFs</string>
|
||||
<string name="raw_images">RAW images</string>
|
||||
<string name="no_media_with_filters">설정된 필터와 일치하는 컨텐츠가 존재하지 않습니다.</string>
|
||||
<string name="change_filters_underlined"><u>필터 변경</u></string>
|
||||
|
||||
|
@ -147,6 +148,7 @@
|
|||
<string name="replace_zoomable_images">확대 축소 가능한 이미지를 더 좋은 품질로 교체</string>
|
||||
<string name="hide_extended_details">상태 표시 줄이 숨겨져있을 때 확장 된 세부 정보 숨김</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 -->
|
||||
<string name="thumbnails">섬네일</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Atvaizdai</string>
|
||||
<string name="videos">Vaizdo įraš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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Miniatiūros</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Bilder</string>
|
||||
<string name="videos">Videoer</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Minibilder</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Afbeeldingen</string>
|
||||
<string name="videos">Video\'s</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="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="hide_extended_details">Uitgebreide informatie niet tonen als de statusbalk is verborgen</string>
|
||||
<string name="do_extra_check">Ongeldige bestanden verbergen</string>
|
||||
<string name="show_at_bottom">Enkele actieknoppen onderaan het scherm tonen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Miniatuurvoorbeelden</string>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<string name="edit">Edytuj</string>
|
||||
<string name="open_camera">Uruchom aplikację aparatu</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="unpin_folder">Wypakuj folder</string>
|
||||
<string name="pin_to_the_top">Przypnij na górze</string>
|
||||
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Obrazy</string>
|
||||
<string name="videos">Filmy</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="change_filters_underlined"><u>Zmień filtry</u></string>
|
||||
|
||||
|
@ -110,16 +111,16 @@
|
|||
<string name="change_view_type">Zmień typ widoku</string>
|
||||
<string name="grid">Siatka</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 -->
|
||||
<string name="group_by">Group by</string>
|
||||
<string name="do_not_group_files">Do not group files</string>
|
||||
<string name="by_folder">Folder</string>
|
||||
<string name="by_last_modified">Last modified</string>
|
||||
<string name="by_date_taken">Date taken</string>
|
||||
<string name="by_file_type">File type</string>
|
||||
<string name="by_extension">Extension</string>
|
||||
<string name="group_by">Grupuj według</string>
|
||||
<string name="do_not_group_files">Nie grupuj plików</string>
|
||||
<string name="by_folder">Folderu</string>
|
||||
<string name="by_last_modified">Daty ostatniej modyfikacji</string>
|
||||
<string name="by_date_taken">Daty utworzenia</string>
|
||||
<string name="by_file_type">Typu</string>
|
||||
<string name="by_extension">Rozszerzenia</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<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="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="show_at_bottom">Pokazuj niektóre przyciski akcji na dole ekranu</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<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_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_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_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_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_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_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_title">Czy mogę w tej aplikacji przycinać obrazy?</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 -->
|
||||
<!-- Short description has to have less than 80 chars -->
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Imagens</string>
|
||||
<string name="videos">Vídeos</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Miniaturas</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Imagens</string>
|
||||
<string name="videos">Vídeos</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Miniaturas</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Изображения</string>
|
||||
<string name="videos">Видео</string>
|
||||
<string name="gifs">GIF</string>
|
||||
<string name="raw_images">RAW images</string>
|
||||
<string name="no_media_with_filters">При заданных фильтрах медиафайлы не найдены</string>
|
||||
<string name="change_filters_underlined"><u>Изменить фильтры</u></string>
|
||||
|
||||
|
@ -147,6 +148,7 @@
|
|||
<string name="replace_zoomable_images">Заменять масштабируемые изображения высококачественными</string>
|
||||
<string name="hide_extended_details">Не показывать подробности при скрытой строке состояния</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 -->
|
||||
<string name="thumbnails">Миниатюры</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Obrázky</string>
|
||||
<string name="videos">Videá</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="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="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="show_at_bottom">Zobraziť niektoré akčné tlačidlá na spodku obrazovky</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Náhľady</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Bilder</string>
|
||||
<string name="videos">Videor</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="change_filters_underlined"><u>Ändra filter</u></string>
|
||||
|
||||
|
@ -81,12 +82,12 @@
|
|||
<string name="edit_with">Redigera med</string>
|
||||
|
||||
<!-- Set wallpaper -->
|
||||
<string name="simple_wallpaper">Bakgrundsbild</string>
|
||||
<string name="set_as_wallpaper">Ange som bakgrundsbild</string>
|
||||
<string name="set_as_wallpaper_failed">Det gick inte att byta bakgrundsbild</string>
|
||||
<string name="set_as_wallpaper_with">Ange som bakgrundsbild med:</string>
|
||||
<string name="setting_wallpaper">Inställningar för bakgrundsbild…</string>
|
||||
<string name="wallpaper_set_successfully">Bakgrundsbilden är ändrad</string>
|
||||
<string name="simple_wallpaper">Bakgrund</string>
|
||||
<string name="set_as_wallpaper">Använd som bakgrund</string>
|
||||
<string name="set_as_wallpaper_failed">Det gick inte att ställa in bakgrunden</string>
|
||||
<string name="set_as_wallpaper_with">Ställ in som bakgrund med:</string>
|
||||
<string name="setting_wallpaper">Ställer in bakgrunden…</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="landscape_aspect_ratio">Liggande bildförhållande</string>
|
||||
<string name="home_screen">Startskärm</string>
|
||||
|
@ -110,16 +111,16 @@
|
|||
<string name="change_view_type">Ändra vy</string>
|
||||
<string name="grid">Rutnät</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 -->
|
||||
<string name="group_by">Group by</string>
|
||||
<string name="do_not_group_files">Do not group files</string>
|
||||
<string name="by_folder">Folder</string>
|
||||
<string name="by_last_modified">Last modified</string>
|
||||
<string name="by_date_taken">Date taken</string>
|
||||
<string name="by_file_type">File type</string>
|
||||
<string name="by_extension">Extension</string>
|
||||
<string name="group_by">Gruppera efter</string>
|
||||
<string name="do_not_group_files">Gruppera inte filer</string>
|
||||
<string name="by_folder">Mapp</string>
|
||||
<string name="by_last_modified">Senast ändrad</string>
|
||||
<string name="by_date_taken">Fotodatum</string>
|
||||
<string name="by_file_type">Filtyp</string>
|
||||
<string name="by_extension">Filnamnstillägg</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Miniatyrer</string>
|
||||
|
|
|
@ -4,6 +4,6 @@
|
|||
<dimen name="medium_tmb_size">120dp</dimen>
|
||||
<dimen name="sd_card_icon_size">30dp</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>
|
||||
</resources>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Thumbnails</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">图片</string>
|
||||
<string name="videos">视频</string>
|
||||
<string name="gifs">GIFs</string>
|
||||
<string name="raw_images">RAW images</string>
|
||||
<string name="no_media_with_filters">所选的过滤器没有找到媒体文件。</string>
|
||||
<string name="change_filters_underlined"><u>更改过滤器</u></string>
|
||||
|
||||
|
@ -147,6 +148,7 @@
|
|||
<string name="replace_zoomable_images">用质量更好的图像替换可深度缩放的图像</string>
|
||||
<string name="hide_extended_details">当状态栏隐藏时隐藏扩展详情</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 -->
|
||||
<string name="thumbnails">缩略图</string>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">圖片</string>
|
||||
<string name="videos">影片</string>
|
||||
<string name="gifs">GIF</string>
|
||||
<string name="raw_images">RAW images</string>
|
||||
<string name="no_media_with_filters">選擇的篩選條件未發現媒體檔案。</string>
|
||||
<string name="change_filters_underlined"><u>更改篩選條件</u></string>
|
||||
|
||||
|
@ -115,11 +116,11 @@
|
|||
<!-- Grouping at media thumbnails -->
|
||||
<string name="group_by">Group by</string>
|
||||
<string name="do_not_group_files">Do not group files</string>
|
||||
<string name="by_folder">Folder</string>
|
||||
<string name="by_last_modified">Last modified</string>
|
||||
<string name="by_date_taken">Date taken</string>
|
||||
<string name="by_file_type">File type</string>
|
||||
<string name="by_extension">Extension</string>
|
||||
<string name="by_folder">資料夾</string>
|
||||
<string name="by_last_modified">最後修改</string>
|
||||
<string name="by_date_taken">拍照日期</string>
|
||||
<string name="by_file_type">檔案類型</string>
|
||||
<string name="by_extension">副檔名</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<string name="autoplay_videos">自動播放影片</string>
|
||||
|
@ -147,6 +148,7 @@
|
|||
<string name="replace_zoomable_images">可深度縮放的圖片用品質更佳的來取代</string>
|
||||
<string name="hide_extended_details">狀態欄隱藏時,同時隱藏詳細資訊</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 -->
|
||||
<string name="thumbnails">縮圖</string>
|
||||
|
|
|
@ -5,9 +5,10 @@
|
|||
<dimen name="sd_card_icon_size">20dp</dimen>
|
||||
<dimen name="play_outline_icon_size">22dp</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="media_side_slider_width">60dp</dimen>
|
||||
<dimen name="instant_change_bar_width">30dp</dimen>
|
||||
<dimen name="list_view_folder_thumbnail_size">72dp</dimen>
|
||||
<dimen name="bottom_actions_height">54dp</dimen>
|
||||
</resources>
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
<resources>
|
||||
|
||||
<!-- 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_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>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</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="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="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="show_at_bottom">Show some action buttons at the bottom of the screen</string>
|
||||
|
||||
<!-- Setting sections -->
|
||||
<string name="thumbnails">Thumbnails</string>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.2.41'
|
||||
ext.kotlin_version = '1.2.50'
|
||||
|
||||
repositories {
|
||||
jcenter()
|
||||
|
@ -9,7 +9,7 @@ buildscript {
|
|||
}
|
||||
|
||||
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"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
|
|