Merge pull request #5 from SimpleMobileTools/master

merge
This commit is contained in:
fiepi 2017-08-22 22:54:24 +08:00 committed by GitHub
commit 519892989c
86 changed files with 2000 additions and 998 deletions

View file

@ -1,6 +1,73 @@
Changelog
==========
Version 2.13.0 *(2017-08-07)*
----------------------------
* Allow changing the screen brightness and volume at videos by vertically dragging the screen sides
* Fixed sorting of numbers in filenames
* Fixed a glitch with hidden files sometimes temporarily visible
* Unified thumbnail corner icon sizes and style
Version 2.12.6 *(2017-08-05)*
----------------------------
* Added slideshow at the fullscreen view
* Replaced the foreground color of selected items with a check
* Made copy/move to SD card a lot faster
Version 2.12.5 *(2017-08-03)*
----------------------------
* Updating file operation on SD card
Version 2.12.4 *(2017-08-03)*
----------------------------
* Fixed SD card file operations
Version 2.12.3 *(2017-08-02)*
----------------------------
* Added pattern/pin protection for showing hidden items
* Hopefully fixed unintentional SD card file deleting
Version 2.12.2 *(2017-07-09)*
----------------------------
* Added a toggle for replacing Share with Rotate at fullscreen media
* Some crashfixes and translation updates
Version 2.12.1 *(2017-07-02)*
----------------------------
* Couple crashfixes
Version 2.12.0 *(2017-07-01)*
----------------------------
* Added a button for disabling "Temporarily show hidden"
* Updated Glide (library used for loading images) to 4.0.0
* Made playing gifs smooth
Version 2.11.5 *(2017-06-29)*
----------------------------
* Added an indicator of folders located on SD cards
* Improved the way of rotating jpg images on the internal storage by modifying the exif tags + added autosave
Version 2.11.4 *(2017-06-26)*
----------------------------
* Added an option for automatically hiding the system UI at entering fullscreen mode
* Fix deleting SD card files on some devices
* Couple crashfixes
Version 2.11.3 *(2017-06-24)*
----------------------------
* Added optional horizontal scrolling
Version 2.11.1 *(2017-06-19)*
----------------------------

View file

@ -10,8 +10,8 @@ android {
applicationId "com.simplemobiletools.gallery"
minSdkVersion 16
targetSdkVersion 23
versionCode 111
versionName "2.11.1"
versionCode 124
versionName "2.13.1"
}
signingConfigs {
@ -29,25 +29,30 @@ android {
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
}
dependencies {
compile 'com.simplemobiletools:commons:2.21.4'
compile 'com.simplemobiletools:commons:2.25.4'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'
compile 'com.theartofdev.edmodo:android-image-cropper:2.4.0'
compile 'com.bignerdranch.android:recyclerview-multiselect:0.2'
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.github.chrisbanes:PhotoView:1.3.1'
compile 'com.github.chrisbanes:PhotoView:2.1.2'
compile 'it.sephiroth.android.exif:library:1.0.1'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
}
buildscript {
ext.kotlin_version = '1.1.2-5'
ext.kotlin_version = '1.1.4-2'
repositories {
mavenCentral()
}

View file

@ -2,4 +2,4 @@
-dontwarn com.simplemobiletools.**
-renamesourcefileattribute SourceFile
-keepattributes SourceFile, LineNumberTable
-keepattributes SourceFile,LineNumberTable

View file

@ -11,6 +11,7 @@
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_launcher_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">

View file

@ -4,11 +4,14 @@ import android.app.Application
import com.squareup.leakcanary.LeakCanary
class App : Application() {
val USE_LEAK_CANARY = false
override fun onCreate() {
super.onCreate()
if (USE_LEAK_CANARY) {
if (LeakCanary.isInAnalyzerProcess(this)) {
return
}
LeakCanary.install(this)
}
}
}

View file

@ -19,6 +19,7 @@ import android.widget.FrameLayout
import com.google.gson.Gson
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.models.Release
import com.simplemobiletools.commons.views.MyScalableRecyclerView
import com.simplemobiletools.gallery.BuildConfig
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.adapters.DirectoryAdapter
@ -27,7 +28,6 @@ import com.simplemobiletools.gallery.dialogs.ChangeSortingDialog
import com.simplemobiletools.gallery.extensions.*
import com.simplemobiletools.gallery.helpers.*
import com.simplemobiletools.gallery.models.Directory
import com.simplemobiletools.gallery.views.MyScalableRecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import java.io.*
import java.util.*
@ -87,7 +87,8 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
menu.findItem(R.id.increase_column_count).isVisible = config.dirColumnCnt < 10
menu.findItem(R.id.reduce_column_count).isVisible = config.dirColumnCnt > 1
}
menu.findItem(R.id.temporarily_show_hidden).isVisible = !config.showHiddenMedia
menu.findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
menu.findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden
return true
}
@ -96,7 +97,8 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
R.id.sort -> showSortingDialog()
R.id.open_camera -> launchCamera()
R.id.show_all -> showAllMedia()
R.id.temporarily_show_hidden -> temporarilyShowHidden()
R.id.temporarily_show_hidden -> tryToggleTemporarilyShowHidden()
R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden()
R.id.increase_column_count -> increaseColumnCount()
R.id.reduce_column_count -> reduceColumnCount()
R.id.settings -> launchSettings()
@ -109,16 +111,19 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
override fun onResume() {
super.onResume()
if (mStoredAnimateGifs != config.animateGifs) {
directories_grid.adapter.notifyDataSetChanged()
directories_grid.adapter?.notifyDataSetChanged()
}
if (mStoredCropThumbnails != config.cropThumbnails) {
directories_grid.adapter.notifyDataSetChanged()
directories_grid.adapter?.notifyDataSetChanged()
}
if (mStoredScrollHorizontally != config.scrollHorizontally) {
(directories_grid.adapter as DirectoryAdapter).scrollVertically = !config.scrollHorizontally
directories_grid.adapter.notifyDataSetChanged()
directories_grid.adapter?.let {
(it as DirectoryAdapter).scrollVertically = !config.scrollHorizontally
it.notifyDataSetChanged()
}
setupScrollDirection()
}
tryloadGallery()
@ -134,7 +139,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
mStoredAnimateGifs = config.animateGifs
mStoredCropThumbnails = config.cropThumbnails
mStoredScrollHorizontally = config.scrollHorizontally
MyScalableRecyclerView.mListener = null
directories_grid.listener = null
mLastMediaHandler.removeCallbacksAndMessages(null)
}
@ -205,15 +210,27 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
finish()
}
private fun temporarilyShowHidden() {
config.temporarilyShowHidden = true
private fun tryToggleTemporarilyShowHidden() {
if (config.temporarilyShowHidden) {
toggleTemporarilyShowHidden(false)
} else {
handleHiddenFolderPasswordProtection {
toggleTemporarilyShowHidden(true)
}
}
}
private fun toggleTemporarilyShowHidden(show: Boolean) {
config.temporarilyShowHidden = show
getDirectories()
invalidateOptionsMenu()
}
private fun checkIfColorChanged() {
if (directories_grid.adapter != null && getRecyclerAdapter().foregroundColor != config.primaryColor) {
getRecyclerAdapter().updatePrimaryColor(config.primaryColor)
directories_fastscroller.updateHandleColor()
if (directories_grid.adapter != null && getRecyclerAdapter().primaryColor != config.primaryColor) {
getRecyclerAdapter().primaryColor = config.primaryColor
directories_vertical_fastscroller.updateHandleColor()
directories_horizontal_fastscroller.updateHandleColor()
}
}
@ -239,8 +256,10 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
directories_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
directories_grid.isDragSelectionEnabled = true
directories_grid.isZoomingEnabled = true
layoutManager.spanCount = config.dirColumnCnt
MyScalableRecyclerView.mListener = object : MyScalableRecyclerView.MyScalableRecyclerViewListener {
directories_grid.listener = object : MyScalableRecyclerView.MyScalableRecyclerViewListener {
override fun zoomIn() {
if (layoutManager.spanCount > 1) {
reduceColumnCount()
@ -268,13 +287,13 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
private fun increaseColumnCount() {
config.dirColumnCnt = ++(directories_grid.layoutManager as GridLayoutManager).spanCount
invalidateOptionsMenu()
directories_grid.adapter.notifyDataSetChanged()
directories_grid.adapter?.notifyDataSetChanged()
}
private fun reduceColumnCount() {
config.dirColumnCnt = --(directories_grid.layoutManager as GridLayoutManager).spanCount
invalidateOptionsMenu()
directories_grid.adapter.notifyDataSetChanged()
directories_grid.adapter?.notifyDataSetChanged()
}
private fun isPickImageIntent(intent: Intent) = isPickIntent(intent) && (hasImageContentData(intent) || isImageType(intent))
@ -373,7 +392,9 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
mDirs = dirs
runOnUiThread {
setupAdapter()
}
storeDirectories()
}
@ -385,17 +406,29 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
}
private fun setupAdapter() {
val adapter = DirectoryAdapter(this, mDirs, this) {
val currAdapter = directories_grid.adapter
if (currAdapter == null) {
directories_grid.adapter = DirectoryAdapter(this, mDirs, this, isPickIntent(intent) || isGetAnyContentIntent(intent)) {
itemClicked(it.path)
}
val currAdapter = directories_grid.adapter
if (currAdapter != null) {
(currAdapter as DirectoryAdapter).updateDirs(mDirs)
} else {
directories_grid.adapter = adapter
(currAdapter as DirectoryAdapter).updateDirs(mDirs)
}
setupScrollDirection()
}
private fun setupScrollDirection() {
directories_vertical_fastscroller.isHorizontal = false
directories_vertical_fastscroller.beGoneIf(config.scrollHorizontally)
directories_horizontal_fastscroller.isHorizontal = true
directories_horizontal_fastscroller.beVisibleIf(config.scrollHorizontally)
if (config.scrollHorizontally) {
directories_horizontal_fastscroller.setViews(directories_grid, directories_refresh_layout)
} else {
directories_vertical_fastscroller.setViews(directories_grid, directories_refresh_layout)
}
directories_fastscroller.setViews(directories_grid, directories_refresh_layout)
}
private fun checkLastMediaChanged() {
@ -454,6 +487,13 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
add(Release(97, R.string.release_97))
add(Release(98, R.string.release_98))
add(Release(108, R.string.release_108))
add(Release(112, R.string.release_112))
add(Release(114, R.string.release_114))
add(Release(115, R.string.release_115))
add(Release(118, R.string.release_118))
add(Release(119, R.string.release_119))
add(Release(122, R.string.release_122))
add(Release(123, R.string.release_123))
checkWhatsNew(this, BuildConfig.VERSION_CODE)
}
}

View file

@ -9,18 +9,19 @@ import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.support.v7.widget.GridLayoutManager
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.ViewGroup
import android.widget.FrameLayout
import com.bumptech.glide.Glide
import com.bumptech.glide.request.animation.GlideAnimation
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.views.MyScalableRecyclerView
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.adapters.MediaAdapter
import com.simplemobiletools.gallery.asynctasks.GetMediaAsynctask
@ -29,7 +30,6 @@ import com.simplemobiletools.gallery.dialogs.ExcludeFolderDialog
import com.simplemobiletools.gallery.extensions.*
import com.simplemobiletools.gallery.helpers.*
import com.simplemobiletools.gallery.models.Medium
import com.simplemobiletools.gallery.views.MyScalableRecyclerView
import kotlinx.android.synthetic.main.activity_media.*
import java.io.File
import java.io.IOException
@ -79,16 +79,19 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
override fun onResume() {
super.onResume()
if (mShowAll && mStoredAnimateGifs != config.animateGifs) {
media_grid.adapter.notifyDataSetChanged()
media_grid.adapter?.notifyDataSetChanged()
}
if (mStoredCropThumbnails != config.cropThumbnails) {
media_grid.adapter.notifyDataSetChanged()
media_grid.adapter?.notifyDataSetChanged()
}
if (mStoredScrollHorizontally != config.scrollHorizontally) {
(media_grid.adapter as MediaAdapter).scrollVertically = !config.scrollHorizontally
media_grid.adapter.notifyDataSetChanged()
media_grid.adapter?.let {
(it as MediaAdapter).scrollVertically = !config.scrollHorizontally
it.notifyDataSetChanged()
}
setupScrollDirection()
}
tryloadGallery()
@ -102,7 +105,7 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
mStoredAnimateGifs = config.animateGifs
mStoredCropThumbnails = config.cropThumbnails
mStoredScrollHorizontally = config.scrollHorizontally
MyScalableRecyclerView.mListener = null
media_grid.listener = null
mLastMediaHandler.removeCallbacksAndMessages(null)
}
@ -126,9 +129,10 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
}
private fun checkIfColorChanged() {
if (media_grid.adapter != null && getRecyclerAdapter().foregroundColor != config.primaryColor) {
getRecyclerAdapter().updatePrimaryColor(config.primaryColor)
media_fastscroller.updateHandleColor()
if (media_grid.adapter != null && getRecyclerAdapter().primaryColor != config.primaryColor) {
getRecyclerAdapter().primaryColor = config.primaryColor
media_horizontal_fastscroller.updateHandleColor()
media_vertical_fastscroller.updateHandleColor()
}
}
@ -136,17 +140,29 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
if (isDirEmpty())
return
val adapter = MediaAdapter(this, mMedia, this) {
val currAdapter = media_grid.adapter
if (currAdapter == null) {
media_grid.adapter = MediaAdapter(this, mMedia, this, mIsGetAnyIntent) {
itemClicked(it.path)
}
val currAdapter = media_grid.adapter
if (currAdapter != null) {
(currAdapter as MediaAdapter).updateMedia(mMedia)
} else {
media_grid.adapter = adapter
(currAdapter as MediaAdapter).updateMedia(mMedia)
}
setupScrollDirection()
}
private fun setupScrollDirection() {
media_vertical_fastscroller.isHorizontal = false
media_vertical_fastscroller.beGoneIf(config.scrollHorizontally)
media_horizontal_fastscroller.isHorizontal = true
media_horizontal_fastscroller.beVisibleIf(config.scrollHorizontally)
if (config.scrollHorizontally) {
media_horizontal_fastscroller.setViews(media_grid, media_refresh_layout)
} else {
media_vertical_fastscroller.setViews(media_grid, media_refresh_layout)
}
media_fastscroller.setViews(media_grid, media_refresh_layout)
}
private fun checkLastMediaChanged() {
@ -181,7 +197,8 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
findItem(R.id.open_camera).isVisible = mShowAll
findItem(R.id.about).isVisible = mShowAll
findItem(R.id.temporarily_show_hidden).isVisible = !config.showHiddenMedia
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden
findItem(R.id.increase_column_count).isVisible = config.mediaColumnCnt < 10
findItem(R.id.reduce_column_count).isVisible = config.mediaColumnCnt > 1
@ -199,7 +216,8 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
R.id.hide_folder -> tryHideFolder()
R.id.unhide_folder -> unhideFolder()
R.id.exclude_folder -> tryExcludeFolder()
R.id.temporarily_show_hidden -> temporarilyShowHidden()
R.id.temporarily_show_hidden -> tryToggleTemporarilyShowHidden()
R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden()
R.id.increase_column_count -> increaseColumnCount()
R.id.reduce_column_count -> reduceColumnCount()
R.id.settings -> launchSettings()
@ -298,9 +316,20 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
false
}
private fun temporarilyShowHidden() {
config.temporarilyShowHidden = true
private fun tryToggleTemporarilyShowHidden() {
if (config.temporarilyShowHidden) {
toggleTemporarilyShowHidden(false)
} else {
handleHiddenFolderPasswordProtection {
toggleTemporarilyShowHidden(true)
}
}
}
private fun toggleTemporarilyShowHidden(show: Boolean) {
config.temporarilyShowHidden = show
getMedia()
invalidateOptionsMenu()
}
private fun getRecyclerAdapter() = (media_grid.adapter as MediaAdapter)
@ -315,8 +344,10 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
media_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
media_grid.isDragSelectionEnabled = true
media_grid.isZoomingEnabled = true
layoutManager.spanCount = config.mediaColumnCnt
MyScalableRecyclerView.mListener = object : MyScalableRecyclerView.MyScalableRecyclerViewListener {
media_grid.listener = object : MyScalableRecyclerView.MyScalableRecyclerViewListener {
override fun zoomIn() {
if (layoutManager.spanCount > 1) {
reduceColumnCount()
@ -344,13 +375,13 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
private fun increaseColumnCount() {
config.mediaColumnCnt = ++(media_grid.layoutManager as GridLayoutManager).spanCount
invalidateOptionsMenu()
media_grid.adapter.notifyDataSetChanged()
media_grid.adapter?.notifyDataSetChanged()
}
private fun reduceColumnCount() {
config.mediaColumnCnt = --(media_grid.layoutManager as GridLayoutManager).spanCount
invalidateOptionsMenu()
media_grid.adapter.notifyDataSetChanged()
media_grid.adapter?.notifyDataSetChanged()
}
private fun isSetWallpaperIntent() = intent.getBooleanExtra(SET_WALLPAPER_INTENT, false)
@ -372,18 +403,22 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
val wantedWidth = wallpaperDesiredMinimumWidth
val wantedHeight = wallpaperDesiredMinimumHeight
val ratio = wantedWidth.toFloat() / wantedHeight
Glide.with(this)
.load(File(path))
.asBitmap()
val options = RequestOptions()
.override((wantedWidth * ratio).toInt(), wantedHeight)
.fitCenter()
Glide.with(this)
.asBitmap()
.load(File(path))
.apply(options)
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(bitmap: Bitmap?, glideAnimation: GlideAnimation<in Bitmap>?) {
override fun onResourceReady(resource: Bitmap?, transition: Transition<in Bitmap>?) {
try {
WallpaperManager.getInstance(applicationContext).setBitmap(bitmap)
WallpaperManager.getInstance(applicationContext).setBitmap(resource)
setResult(Activity.RESULT_OK)
} catch (e: IOException) {
Log.e(TAG, "item click $e")
} catch (ignored: IOException) {
}
finish()
@ -424,7 +459,9 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
mLastDrawnHashCode = media.hashCode()
mMedia = media
runOnUiThread {
setupAdapter()
}
storeFolder()
}

View file

@ -31,9 +31,9 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
private val STORAGE_PERMISSION = 1
private var mMedium: Medium? = null
private var mIsFullScreen = false
private var mFragment: ViewPagerFragment? = null
lateinit var mUri: Uri
lateinit var mFragment: ViewPagerFragment
companion object {
var mIsVideo = false
@ -76,8 +76,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
if (savedInstanceState == null) {
mFragment = if (mIsVideo) VideoFragment() else PhotoFragment()
mFragment.listener = this
mFragment.arguments = bundle
mFragment!!.listener = this
mFragment!!.arguments = bundle
supportFragmentManager.beginTransaction().replace(R.id.fragment_holder, mFragment).commit()
}
@ -98,6 +98,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
} finally {
cursor?.close()
}
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
val isFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
mFragment?.fullscreenToggled(isFullscreen)
}
}
override fun onResume() {
@ -158,12 +163,5 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
}
}
override fun systemUiVisibilityChanged(visibility: Int) {
if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
mIsFullScreen = false
showSystemUI()
} else {
mIsFullScreen = true
}
}
override fun videoEnded() = false
}

View file

@ -4,7 +4,10 @@ import android.content.Intent
import android.content.res.Resources
import android.os.Bundle
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.dialogs.SecurityDialog
import com.simplemobiletools.commons.extensions.handleHiddenFolderPasswordProtection
import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.commons.helpers.SHOW_ALL_TABS
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.extensions.config
@ -35,7 +38,10 @@ class SettingsActivity : SimpleActivity() {
setupDarkBackground()
setupScrollHorizontally()
setupScreenRotation()
setupReplaceShare()
setupPasswordProtection()
setupShowMedia()
setupHideSystemUI()
updateTextColors(settings_holder)
}
@ -60,10 +66,20 @@ class SettingsActivity : SimpleActivity() {
private fun setupShowHiddenFolders() {
settings_show_hidden_folders.isChecked = config.showHiddenMedia
settings_show_hidden_folders_holder.setOnClickListener {
if (config.showHiddenMedia) {
toggleHiddenFolders()
} else {
handleHiddenFolderPasswordProtection {
toggleHiddenFolders()
}
}
}
}
private fun toggleHiddenFolders() {
settings_show_hidden_folders.toggle()
config.showHiddenMedia = settings_show_hidden_folders.isChecked
}
}
private fun setupAutoplayVideos() {
settings_autoplay_videos.isChecked = config.autoplayVideos
@ -121,6 +137,36 @@ class SettingsActivity : SimpleActivity() {
}
}
private fun setupHideSystemUI() {
settings_hide_system_ui.isChecked = config.hideSystemUI
settings_hide_system_ui_holder.setOnClickListener {
settings_hide_system_ui.toggle()
config.hideSystemUI = settings_hide_system_ui.isChecked
}
}
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 {
val tabToShow = if (config.isPasswordProtectionOn) config.protectionType else SHOW_ALL_TABS
SecurityDialog(this, config.passwordHash, tabToShow) { hash, type ->
val hasPasswordProtection = config.isPasswordProtectionOn
settings_password_protection.isChecked = !hasPasswordProtection
config.isPasswordProtectionOn = !hasPasswordProtection
config.passwordHash = if (hasPasswordProtection) "" else hash
config.protectionType = type
}
}
}
private fun setupScreenRotation() {
settings_screen_rotation.text = getScreenRotationText()
settings_screen_rotation_holder.setOnClickListener {

View file

@ -15,13 +15,11 @@ import android.media.ExifInterface
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.provider.MediaStore
import android.support.v4.view.ViewPager
import android.util.DisplayMetrics
import android.view.Menu
import android.view.MenuItem
import android.view.OrientationEventListener
import android.view.View
import android.view.*
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
@ -31,8 +29,10 @@ import com.simplemobiletools.gallery.activities.MediaActivity.Companion.mMedia
import com.simplemobiletools.gallery.adapters.MyPagerAdapter
import com.simplemobiletools.gallery.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.dialogs.SaveAsDialog
import com.simplemobiletools.gallery.dialogs.SlideshowDialog
import com.simplemobiletools.gallery.extensions.*
import com.simplemobiletools.gallery.fragments.PhotoFragment
import com.simplemobiletools.gallery.fragments.VideoFragment
import com.simplemobiletools.gallery.fragments.ViewPagerFragment
import com.simplemobiletools.gallery.helpers.*
import com.simplemobiletools.gallery.models.Medium
@ -49,10 +49,17 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mIsFullScreen = false
private var mPos = -1
private var mShowAll = false
private var mIsSlideshowActive = false
private var mRotationDegrees = 0f
private var mLastHandledOrientation = 0
private var mPrevHashcode = 0
private var mSlideshowHandler = Handler()
private var mSlideshowInterval = SLIDESHOW_DEFAULT_INTERVAL
private var mSlideshowMoveBackwards = false
private var mSlideshowMedia = mutableListOf<Medium>()
private var mAreSlideShowMediaVisible = false
companion object {
var screenWidth = 0
var screenHeight = 0
@ -91,18 +98,28 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return
}
if (intent.extras?.containsKey(IS_VIEW_INTENT) == true) {
if (intent.extras?.containsKey(IS_VIEW_INTENT) == true && File(mPath).isHidden) {
if (!config.isPasswordProtectionOn) {
config.temporarilyShowHidden = true
}
}
showSystemUI()
mDirectory = File(mPath).parent
title = mPath.getFilenameFromPath()
view_pager.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
view_pager.viewTreeObserver.removeOnGlobalLayoutListener(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && isDestroyed)
return
if (mMedia.isNotEmpty()) {
gotMedia(mMedia)
}
}
})
reloadViewPager()
scanPath(mPath) {}
@ -110,6 +127,17 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (config.darkBackground)
view_pager.background = ColorDrawable(Color.BLACK)
if (config.hideSystemUI)
fragmentClicked()
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
mIsFullScreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
view_pager.adapter?.let {
(it as MyPagerAdapter).toggleFullscreen(mIsFullScreen)
checkSystemUI()
}
}
}
override fun onDestroy() {
@ -163,32 +191,29 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} else if (config.screenRotation == ROTATE_BY_SYSTEM_SETTING) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}
invalidateOptionsMenu()
}
override fun onPause() {
super.onPause()
mOrientationEventListener.disable()
stopSlideshow()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_viewpager, menu)
if (getCurrentMedium() == null)
return true
val currentMedium = getCurrentMedium() ?: return true
menu.apply {
findItem(R.id.menu_set_as).isVisible = getCurrentMedium()!!.isImage() == true
findItem(R.id.menu_edit).isVisible = getCurrentMedium()!!.isImage() == true
findItem(R.id.menu_rotate).isVisible = getCurrentMedium()!!.isImage() == true
findItem(R.id.menu_share_1).isVisible = !config.replaceShare
findItem(R.id.menu_share_2).isVisible = config.replaceShare
findItem(R.id.menu_set_as).isVisible = currentMedium.isImage()
findItem(R.id.menu_edit).isVisible = currentMedium.isImage()
findItem(R.id.menu_rotate).isVisible = currentMedium.isImage()
findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0f
findItem(R.id.menu_hide).isVisible = !getCurrentMedium()!!.name.startsWith('.')
findItem(R.id.menu_unhide).isVisible = getCurrentMedium()!!.name.startsWith('.')
findItem(R.id.menu_rotate).subMenu.apply {
clearHeader()
findItem(R.id.rotate_right).icon = resources.getColoredDrawable(R.drawable.ic_rotate_right, R.color.actionbar_menu_icon)
findItem(R.id.rotate_left).icon = resources.getColoredDrawable(R.drawable.ic_rotate_left, R.color.actionbar_menu_icon)
findItem(R.id.rotate_one_eighty).icon = resources.getColoredDrawable(R.drawable.ic_rotate_one_eighty, R.color.actionbar_menu_icon)
}
findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.')
findItem(R.id.menu_unhide).isVisible = currentMedium.name.startsWith('.')
}
return true
@ -200,39 +225,125 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
when (item.itemId) {
R.id.menu_set_as -> trySetAs(getCurrentFile())
R.id.slideshow -> initSlideshow()
R.id.menu_copy_to -> copyMoveTo(true)
R.id.menu_move_to -> copyMoveTo(false)
R.id.menu_open_with -> openWith(getCurrentFile())
R.id.menu_hide -> toggleFileVisibility(true)
R.id.menu_unhide -> toggleFileVisibility(false)
R.id.menu_share -> shareMedium(getCurrentMedium()!!)
R.id.menu_share_1 -> shareMedium(getCurrentMedium()!!)
R.id.menu_share_2 -> shareMedium(getCurrentMedium()!!)
R.id.menu_delete -> askConfirmDelete()
R.id.menu_rename -> renameFile()
R.id.menu_edit -> openFileEditor(getCurrentFile())
R.id.menu_properties -> showProperties()
R.id.menu_save_as -> saveImageAs()
R.id.show_on_map -> showOnMap()
R.id.rotate_right -> rotateImage(90f)
R.id.rotate_left -> rotateImage(-90f)
R.id.rotate_one_eighty -> rotateImage(180f)
R.id.menu_rotate -> rotateImage()
R.id.menu_save_as -> saveImageAs()
R.id.settings -> launchSettings()
else -> return super.onOptionsItemSelected(item)
}
return true
}
private fun updatePagerItems() {
val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, mMedia)
private fun updatePagerItems(media: MutableList<Medium>) {
val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, media)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1 || !isDestroyed) {
view_pager.apply {
adapter = pagerAdapter
adapter!!.notifyDataSetChanged()
currentItem = mPos
addOnPageChangeListener(this@ViewPagerActivity)
adapter!!.notifyDataSetChanged()
}
}
}
private fun initSlideshow() {
SlideshowDialog(this) {
startSlideshow()
}
}
private fun startSlideshow() {
if (getMediaForSlideshow()) {
view_pager.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
view_pager.viewTreeObserver.removeOnGlobalLayoutListener(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && isDestroyed)
return
hideSystemUI()
mSlideshowInterval = config.slideshowInterval
mSlideshowMoveBackwards = config.slideshowMoveBackwards
mIsSlideshowActive = true
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
scheduleSwipe()
}
})
}
}
private fun stopSlideshow() {
if (mIsSlideshowActive) {
showSystemUI()
mIsSlideshowActive = false
mSlideshowHandler.removeCallbacksAndMessages(null)
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
private fun scheduleSwipe() {
mSlideshowHandler.removeCallbacksAndMessages(null)
if (mIsSlideshowActive) {
if (getCurrentMedium()!!.isImage() || getCurrentMedium()!!.isGif()) {
mSlideshowHandler.postDelayed({
if (mIsSlideshowActive && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && !isDestroyed) {
swipeToNextMedium()
}
}, mSlideshowInterval * 1000L)
} else {
(getCurrentFragment() as? VideoFragment)!!.playVideo()
}
}
}
private fun swipeToNextMedium() {
val before = view_pager.currentItem
view_pager.currentItem = if (mSlideshowMoveBackwards) --view_pager.currentItem else ++view_pager.currentItem
if (before == view_pager.currentItem) {
stopSlideshow()
toast(R.string.slideshow_ended)
}
}
private fun getMediaForSlideshow(): Boolean {
mSlideshowMedia = mMedia.toMutableList()
if (!config.slideshowIncludePhotos) {
mSlideshowMedia = mSlideshowMedia.filter { !it.isImage() && !it.isGif() } as MutableList
}
if (!config.slideshowIncludeVideos) {
mSlideshowMedia = mSlideshowMedia.filter { it.isImage() || it.isGif() } as MutableList
}
if (config.slideshowRandomOrder) {
Collections.shuffle(mSlideshowMedia)
mPos = 0
} else {
mPath = getCurrentPath()
mPos = getPositionInList(mSlideshowMedia)
}
return if (mSlideshowMedia.isEmpty()) {
toast(R.string.no_media_for_slideshow)
false
} else {
updatePagerItems(mSlideshowMedia)
mAreSlideShowMediaVisible = true
true
}
}
private fun copyMoveTo(isCopyOperation: Boolean) {
val files = ArrayList<File>(1).apply { add(getCurrentFile()) }
tryCopyMoveFilesTo(files, isCopyOperation) {
@ -250,12 +361,48 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
getCurrentMedium()!!.apply {
name = newFileName
path = it.absolutePath
mMedia[mPos] = this
getCurrentMedia()[mPos] = this
}
invalidateOptionsMenu()
}
}
private fun rotateImage() {
val currentMedium = getCurrentMedium() ?: return
if (currentMedium.isJpg() && !isPathOnSD(currentMedium.path)) {
rotateByExif()
} else {
rotateByDegrees()
}
}
private fun rotateByExif() {
val exif = ExifInterface(getCurrentPath())
val rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
val newRotation = getNewRotation(rotation)
exif.setAttribute(ExifInterface.TAG_ORIENTATION, newRotation)
exif.saveAttributes()
File(getCurrentPath()).setLastModified(System.currentTimeMillis())
(getCurrentFragment() as? PhotoFragment)?.refreshBitmap()
}
private fun getNewRotation(rotation: Int): String {
return when (rotation) {
ExifInterface.ORIENTATION_ROTATE_90 -> ExifInterface.ORIENTATION_ROTATE_180
ExifInterface.ORIENTATION_ROTATE_180 -> ExifInterface.ORIENTATION_ROTATE_270
ExifInterface.ORIENTATION_ROTATE_270 -> ExifInterface.ORIENTATION_NORMAL
else -> ExifInterface.ORIENTATION_ROTATE_90
}.toString()
}
private fun rotateByDegrees() {
mRotationDegrees = (mRotationDegrees + 90) % 360
getCurrentFragment()?.let {
(it as? PhotoFragment)?.rotateImageViewBy(mRotationDegrees)
}
supportInvalidateOptionsMenu()
}
private fun saveImageAs() {
val currPath = getCurrentPath()
SaveAsDialog(this, currPath) {
@ -296,19 +443,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
out.close()
}
private fun rotateImage(degrees: Float) {
mRotationDegrees = (mRotationDegrees + degrees) % 360
getCurrentFragment()?.rotateImageViewBy(mRotationDegrees)
supportInvalidateOptionsMenu()
}
private fun getCurrentFragment(): PhotoFragment? {
val fragment = (view_pager.adapter as MyPagerAdapter).getCurrentFragment(view_pager.currentItem)
return if (fragment is PhotoFragment)
fragment
else
null
}
private fun getCurrentFragment() = (view_pager.adapter as MyPagerAdapter).getCurrentFragment(view_pager.currentItem)
private fun showProperties() {
if (getCurrentMedium() != null)
@ -388,7 +523,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun askConfirmDelete() {
ConfirmationDialog(this) {
deleteFileBg(File(mMedia[mPos].path)) {
deleteFileBg(File(getCurrentMedia()[mPos].path)) {
reloadViewPager()
}
}
@ -405,7 +540,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun renameFile() {
RenameItemDialog(this, getCurrentPath()) {
mMedia[mPos].path = it
getCurrentMedia()[mPos].path = it
updateActionbarTitle()
}
}
@ -442,21 +577,21 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
mPrevHashcode = media.hashCode()
mMedia = media
if (mPos == -1) {
mPos = getProperPosition()
mPos = getPositionInList(media)
} else {
mPos = Math.min(mPos, mMedia.size - 1)
}
updateActionbarTitle()
updatePagerItems()
updatePagerItems(mMedia.toMutableList())
invalidateOptionsMenu()
checkOrientation()
}
private fun getProperPosition(): Int {
private fun getPositionInList(items: MutableList<Medium>): Int {
mPos = 0
var i = 0
for (medium in mMedia) {
for (medium in items) {
if (medium.path == mPath) {
return i
}
@ -487,37 +622,41 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun fragmentClicked() {
mIsFullScreen = !mIsFullScreen
checkSystemUI()
}
override fun videoEnded(): Boolean {
if (mIsSlideshowActive)
swipeToNextMedium()
return mIsSlideshowActive
}
private fun checkSystemUI() {
if (mIsFullScreen) {
hideSystemUI()
} else {
stopSlideshow()
showSystemUI()
}
}
override fun systemUiVisibilityChanged(visibility: Int) {
if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
mIsFullScreen = false
showSystemUI()
} else {
mIsFullScreen = true
}
}
private fun updateActionbarTitle() {
runOnUiThread {
if (mPos < mMedia.size) {
title = mMedia[mPos].path.getFilenameFromPath()
if (mPos < getCurrentMedia().size) {
title = getCurrentMedia()[mPos].path.getFilenameFromPath()
}
}
}
private fun getCurrentMedium(): Medium? {
return if (mMedia.isEmpty() || mPos == -1)
return if (getCurrentMedia().isEmpty() || mPos == -1)
null
else
mMedia[Math.min(mPos, mMedia.size - 1)]
getCurrentMedia()[Math.min(mPos, getCurrentMedia().size - 1)]
}
private fun getCurrentMedia() = if (mAreSlideShowMediaVisible) mSlideshowMedia else mMedia
private fun getCurrentPath() = getCurrentMedium()!!.path
private fun getCurrentFile() = File(getCurrentPath())
@ -534,6 +673,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
updateActionbarTitle()
mRotationDegrees = 0f
supportInvalidateOptionsMenu()
scheduleSwipe()
}
override fun onPageScrollStateChanged(state: Int) {

View file

@ -1,11 +1,10 @@
package com.simplemobiletools.gallery.adapters
import android.os.Build
import android.graphics.PorterDuff
import android.support.v7.view.ActionMode
import android.support.v7.widget.RecyclerView
import android.util.SparseArray
import android.view.*
import android.widget.FrameLayout
import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback
import com.bignerdranch.android.multiselector.MultiSelector
import com.bignerdranch.android.multiselector.SwappingHolder
@ -14,10 +13,7 @@ import com.google.gson.Gson
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.extensions.isAStorageRootFolder
import com.simplemobiletools.commons.extensions.isImageVideoGif
import com.simplemobiletools.commons.extensions.needsStupidWritePermissions
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.activities.SimpleActivity
import com.simplemobiletools.gallery.dialogs.ExcludeFolderDialog
@ -26,12 +22,11 @@ import com.simplemobiletools.gallery.extensions.*
import com.simplemobiletools.gallery.models.AlbumCover
import com.simplemobiletools.gallery.models.Directory
import kotlinx.android.synthetic.main.directory_item.view.*
import kotlinx.android.synthetic.main.directory_tmb.view.*
import java.io.File
import java.util.*
class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Directory>, val listener: DirOperationsListener?, val itemClick: (Directory) -> Unit) :
RecyclerView.Adapter<DirectoryAdapter.ViewHolder>() {
class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Directory>, val listener: DirOperationsListener?, val isPickIntent: Boolean,
val itemClick: (Directory) -> Unit) : RecyclerView.Adapter<DirectoryAdapter.ViewHolder>() {
val multiSelector = MultiSelector()
val config = activity.config
@ -39,50 +34,30 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
var actMode: ActionMode? = null
var itemViews = SparseArray<View>()
val selectedPositions = HashSet<Int>()
var foregroundColor = 0
var primaryColor = config.primaryColor
var pinnedFolders = config.pinnedFolders
var scrollVertically = !config.scrollHorizontally
fun toggleItemSelection(select: Boolean, pos: Int) {
if (itemViews[pos] != null)
getProperView(itemViews[pos]!!).isSelected = select
if (select)
if (select) {
itemViews[pos]?.dir_check?.background?.setColorFilter(primaryColor, PorterDuff.Mode.SRC_IN)
selectedPositions.add(pos)
else
} else
selectedPositions.remove(pos)
itemViews[pos]?.dir_check?.beVisibleIf(select)
if (selectedPositions.isEmpty()) {
actMode?.finish()
return
}
updateTitle(selectedPositions.size)
actMode?.invalidate()
}
fun getProperView(itemView: View): View {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
itemView.dir_frame
else
itemView.dir_thumbnail
}
fun updateTitle(cnt: Int) {
actMode?.title = "$cnt / ${dirs.size}"
}
fun updatePrimaryColor(color: Int) {
foregroundColor = color
(0..itemViews.size() - 1).mapNotNull { itemViews[it] }
.forEach { setupItemViewForeground(it) }
}
private fun setupItemViewForeground(itemView: View) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
(getProperView(itemView) as FrameLayout).foreground = foregroundColor.createSelector()
else
getProperView(itemView).foreground = foregroundColor.createSelector()
actMode?.invalidate()
}
val adapterListener = object : MyAdapterListener {
@ -90,17 +65,9 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
toggleItemSelection(select, position)
}
override fun setupItemForeground(itemView: View) {
setupItemViewForeground(itemView)
}
override fun getSelectedPositions(): HashSet<Int> = selectedPositions
}
init {
foregroundColor = config.primaryColor
}
val multiSelectorMode = object : ModalMultiSelectorCallback(multiSelector) {
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
when (item.itemId) {
@ -142,8 +109,7 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
override fun onDestroyActionMode(actionMode: ActionMode?) {
super.onDestroyActionMode(actionMode)
selectedPositions.forEach {
if (itemViews[it] != null)
getProperView(itemViews[it]!!).isSelected = false
itemViews[it]?.dir_check?.beGone()
}
selectedPositions.clear()
actMode = null
@ -279,7 +245,6 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
notifyItemChanged(i)
}
updateTitle(cnt)
actMode?.invalidate()
}
private fun askConfirmDelete() {
@ -305,12 +270,14 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
activity.handleSAFDialog(File(needPermissionForPath)) {
selectedPositions.sortedDescending().forEach {
if (dirs.size > it) {
val directory = dirs[it]
folders.add(File(directory.path))
removeFolders.add(directory)
notifyItemRemoved(it)
itemViews.put(it, null)
}
}
dirs.removeAll(removeFolders)
selectedPositions.clear()
@ -362,7 +329,7 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent?.context).inflate(R.layout.directory_item, parent, false)
return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, listener, itemClick)
return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, listener, isPickIntent, itemClick)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
@ -423,28 +390,29 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
}
}
class ViewHolder(val view: View, val adapter: MyAdapterListener, val activity: SimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback,
val multiSelector: MultiSelector, val listener: DirOperationsListener?, val itemClick: (Directory) -> (Unit)) :
class ViewHolder(val view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback,
val multiSelector: MultiSelector, val listener: DirOperationsListener?, val isPickIntent: Boolean, val itemClick: (Directory) -> (Unit)) :
SwappingHolder(view, MultiSelector()) {
fun bindView(directory: Directory, isPinned: Boolean, scrollVertically: Boolean): View {
itemView.apply {
dir_name.text = directory.name
photo_cnt.text = directory.mediaCnt.toString()
dir_pin.visibility = if (isPinned) View.VISIBLE else View.GONE
activity.loadImage(directory.tmb, dir_thumbnail, scrollVertically)
dir_pin.beVisibleIf(isPinned)
dir_sd_card.beVisibleIf(activity.isPathOnSD(directory.path))
setOnClickListener { viewClicked(directory) }
setOnLongClickListener { viewLongClicked(); true }
setOnLongClickListener { if (isPickIntent) viewClicked(directory) else viewLongClicked(); true }
adapter.setupItemForeground(this)
}
return itemView
}
fun viewClicked(directory: Directory) {
if (multiSelector.isSelectable) {
val isSelected = adapter.getSelectedPositions().contains(layoutPosition)
adapter.toggleItemSelectionAdapter(!isSelected, layoutPosition)
val isSelected = adapterListener.getSelectedPositions().contains(layoutPosition)
adapterListener.toggleItemSelectionAdapter(!isSelected, layoutPosition)
} else {
itemClick(directory)
}
@ -454,7 +422,7 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
if (listener != null) {
if (!multiSelector.isSelectable) {
activity.startSupportActionMode(multiSelectorCallback)
adapter.toggleItemSelectionAdapter(true, layoutPosition)
adapterListener.toggleItemSelectionAdapter(true, layoutPosition)
}
listener.itemLongClicked(layoutPosition)
@ -462,15 +430,14 @@ class DirectoryAdapter(val activity: SimpleActivity, var dirs: MutableList<Direc
}
fun stopLoad() {
Glide.clear(view.dir_thumbnail)
if (!activity.isDestroyed)
Glide.with(activity).clear(view.dir_thumbnail)
}
}
interface MyAdapterListener {
fun toggleItemSelectionAdapter(select: Boolean, position: Int)
fun setupItemForeground(itemView: View)
fun getSelectedPositions(): HashSet<Int>
}

View file

@ -1,11 +1,10 @@
package com.simplemobiletools.gallery.adapters
import android.os.Build
import android.graphics.PorterDuff
import android.support.v7.view.ActionMode
import android.support.v7.widget.RecyclerView
import android.util.SparseArray
import android.view.*
import android.widget.FrameLayout
import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback
import com.bignerdranch.android.multiselector.MultiSelector
import com.bignerdranch.android.multiselector.SwappingHolder
@ -13,18 +12,18 @@ import com.bumptech.glide.Glide
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.extensions.beGone
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.activities.SimpleActivity
import com.simplemobiletools.gallery.extensions.*
import com.simplemobiletools.gallery.models.Medium
import kotlinx.android.synthetic.main.photo_video_item.view.*
import kotlinx.android.synthetic.main.photo_video_tmb.view.*
import java.io.File
import java.util.*
class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>, val listener: MediaOperationsListener?, val itemClick: (Medium) -> Unit) :
RecyclerView.Adapter<MediaAdapter.ViewHolder>() {
class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>, val listener: MediaOperationsListener?, val isPickIntent: Boolean,
val itemClick: (Medium) -> Unit) : RecyclerView.Adapter<MediaAdapter.ViewHolder>() {
val multiSelector = MultiSelector()
val config = activity.config
@ -32,50 +31,30 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
var actMode: ActionMode? = null
var itemViews = SparseArray<View>()
val selectedPositions = HashSet<Int>()
var foregroundColor = 0
var primaryColor = config.primaryColor
var displayFilenames = config.displayFileNames
var scrollVertically = !config.scrollHorizontally
fun toggleItemSelection(select: Boolean, pos: Int) {
if (itemViews[pos] != null)
getProperView(itemViews[pos]!!).isSelected = select
if (select)
if (select) {
itemViews[pos]?.medium_check?.background?.setColorFilter(primaryColor, PorterDuff.Mode.SRC_IN)
selectedPositions.add(pos)
else
} else
selectedPositions.remove(pos)
itemViews[pos]?.medium_check?.beVisibleIf(select)
if (selectedPositions.isEmpty()) {
actMode?.finish()
return
}
updateTitle(selectedPositions.size)
actMode?.invalidate()
}
fun getProperView(itemView: View): View {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
itemView.medium_thumbnail_holder
else
itemView.medium_thumbnail
}
fun updateTitle(cnt: Int) {
actMode?.title = "$cnt / ${media.size}"
}
fun updatePrimaryColor(color: Int) {
foregroundColor = color
(0..itemViews.size() - 1).mapNotNull { itemViews[it] }
.forEach { setupItemViewForeground(it) }
}
private fun setupItemViewForeground(itemView: View) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
(getProperView(itemView) as FrameLayout).foreground = foregroundColor.createSelector()
else
getProperView(itemView).foreground = foregroundColor.createSelector()
actMode?.invalidate()
}
val adapterListener = object : MyAdapterListener {
@ -83,17 +62,9 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
toggleItemSelection(select, position)
}
override fun setupItemForeground(itemView: View) {
setupItemViewForeground(itemView)
}
override fun getSelectedPositions(): HashSet<Int> = selectedPositions
}
init {
foregroundColor = config.primaryColor
}
val multiSelectorMode = object : ModalMultiSelectorCallback(multiSelector) {
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
when (item.itemId) {
@ -131,8 +102,7 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
override fun onDestroyActionMode(actionMode: ActionMode?) {
super.onDestroyActionMode(actionMode)
selectedPositions.forEach {
if (itemViews[it] != null)
getProperView(itemViews[it]!!).isSelected = false
itemViews[it]?.medium_check?.beGone()
}
selectedPositions.clear()
actMode = null
@ -218,7 +188,6 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
notifyItemChanged(i)
}
updateTitle(cnt)
actMode?.invalidate()
}
private fun askConfirmDelete() {
@ -237,6 +206,11 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
val files = ArrayList<File>(selectedPositions.size)
val removeMedia = ArrayList<Medium>(selectedPositions.size)
if (media.size <= selectedPositions.first()) {
actMode?.finish()
return
}
activity.handleSAFDialog(File(media[selectedPositions.first()].path)) {
selectedPositions.sortedDescending().forEach {
val medium = media[it]
@ -271,7 +245,7 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent?.context).inflate(R.layout.photo_video_item, parent, false)
return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, listener, itemClick)
return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, listener, isPickIntent, itemClick)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
@ -336,8 +310,9 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
}
}
class ViewHolder(val view: View, val adapter: MyAdapterListener, val activity: SimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback,
val multiSelector: MultiSelector, val listener: MediaOperationsListener?, val itemClick: (Medium) -> (Unit)) : SwappingHolder(view, MultiSelector()) {
class ViewHolder(val view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback,
val multiSelector: MultiSelector, val listener: MediaOperationsListener?, val isPickIntent: Boolean, val itemClick: (Medium) -> (Unit)) :
SwappingHolder(view, MultiSelector()) {
fun bindView(medium: Medium, displayFilenames: Boolean, scrollVertically: Boolean): View {
itemView.apply {
play_outline.visibility = if (medium.video) View.VISIBLE else View.GONE
@ -346,17 +321,15 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
activity.loadImage(medium.path, medium_thumbnail, scrollVertically)
setOnClickListener { viewClicked(medium) }
setOnLongClickListener { viewLongClicked(); true }
adapter.setupItemForeground(this)
setOnLongClickListener { if (isPickIntent) viewClicked(medium) else viewLongClicked(); true }
}
return itemView
}
fun viewClicked(medium: Medium) {
if (multiSelector.isSelectable) {
val isSelected = adapter.getSelectedPositions().contains(layoutPosition)
adapter.toggleItemSelectionAdapter(!isSelected, layoutPosition)
val isSelected = adapterListener.getSelectedPositions().contains(layoutPosition)
adapterListener.toggleItemSelectionAdapter(!isSelected, layoutPosition)
} else {
itemClick(medium)
}
@ -366,7 +339,7 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
if (listener != null) {
if (!multiSelector.isSelectable) {
activity.startSupportActionMode(multiSelectorCallback)
adapter.toggleItemSelectionAdapter(true, layoutPosition)
adapterListener.toggleItemSelectionAdapter(true, layoutPosition)
}
listener.itemLongClicked(layoutPosition)
@ -374,15 +347,14 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
}
fun stopLoad() {
Glide.clear(view.medium_thumbnail)
if (!activity.isDestroyed)
Glide.with(activity).clear(view.medium_thumbnail)
}
}
interface MyAdapterListener {
fun toggleItemSelectionAdapter(select: Boolean, position: Int)
fun setupItemForeground(itemView: View)
fun getSelectedPositions(): HashSet<Int>
}

View file

@ -5,7 +5,6 @@ import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter
import android.support.v4.view.PagerAdapter
import android.util.SparseArray
import android.view.ViewGroup
import com.simplemobiletools.gallery.activities.ViewPagerActivity
import com.simplemobiletools.gallery.fragments.PhotoFragment
@ -15,7 +14,7 @@ import com.simplemobiletools.gallery.helpers.MEDIUM
import com.simplemobiletools.gallery.models.Medium
class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val media: MutableList<Medium>) : FragmentStatePagerAdapter(fm) {
private val mFragments = SparseArray<ViewPagerFragment>()
private val mFragments = HashMap<Int, ViewPagerFragment>()
override fun getCount() = media.size
override fun getItem(position: Int): Fragment {
@ -43,10 +42,16 @@ class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val m
return fragment
}
override fun destroyItem(container: ViewGroup?, position: Int, `object`: Any?) {
override fun destroyItem(container: ViewGroup?, position: Int, any: Any?) {
mFragments.remove(position)
super.destroyItem(container, position, `object`)
super.destroyItem(container, position, any)
}
fun getCurrentFragment(position: Int) = mFragments.get(position)
fun toggleFullscreen(isFullscreen: Boolean) {
for ((pos, fragment) in mFragments) {
fragment.fullscreenToggled(isFullscreen)
}
}
}

View file

@ -27,8 +27,11 @@ class GetDirectoriesAsynctask(val context: Context, val isPickVideo: Boolean, va
val media = context.getFilesFrom("", isPickImage, isPickVideo)
val excludedPaths = config.excludedFolders
val includedPaths = config.includedFolders
val directories = groupDirectories(media)
val dirs = ArrayList(directories.values.filter { File(it.path).exists() }).filter { shouldFolderBeVisible(it.path, excludedPaths) } as ArrayList<Directory>
val dirs = ArrayList(directories.values
.filter { File(it.path).exists() })
.filter { shouldFolderBeVisible(it.path, excludedPaths, includedPaths) } as ArrayList<Directory>
Directory.sorting = config.directorySorting
dirs.sort()
return movePinnedToFront(dirs)
@ -43,8 +46,8 @@ class GetDirectoriesAsynctask(val context: Context, val isPickVideo: Boolean, va
cancel(true)
val parentDir = File(path).parent ?: continue
if (directories.containsKey(parentDir)) {
val directory = directories[parentDir]!!
if (directories.containsKey(parentDir.toLowerCase())) {
val directory = directories[parentDir.toLowerCase()]!!
val newImageCnt = directory.mediaCnt + 1
directory.mediaCnt = newImageCnt
directory.addSize(size)
@ -71,17 +74,17 @@ class GetDirectoriesAsynctask(val context: Context, val isPickVideo: Boolean, va
}
val directory = Directory(parentDir, thumbnail, dirName, 1, dateModified, dateTaken, size)
directories.put(parentDir, directory)
directories.put(parentDir.toLowerCase(), directory)
}
}
return directories
}
private fun shouldFolderBeVisible(path: String, excludedPaths: MutableSet<String>): Boolean {
private fun shouldFolderBeVisible(path: String, excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>): Boolean {
val file = File(path)
return if (isThisOrParentExcluded(path, excludedPaths))
return if (isThisOrParentExcluded(path, excludedPaths, includedPaths)) {
false
else if (!config.shouldShowHidden && file.isDirectory && file.canonicalFile == file.absoluteFile) {
} else if (!config.shouldShowHidden && file.isDirectory && file.canonicalFile == file.absoluteFile) {
var containsNoMediaOrDot = file.containsNoMedia() || path.contains("/.")
if (!containsNoMediaOrDot) {
containsNoMediaOrDot = checkParentHasNoMedia(file.parentFile)
@ -105,7 +108,8 @@ class GetDirectoriesAsynctask(val context: Context, val isPickVideo: Boolean, va
return false
}
private fun isThisOrParentExcluded(path: String, excludedPaths: MutableSet<String>) = excludedPaths.any { path.startsWith(it) }
private fun isThisOrParentExcluded(path: String, excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>) =
includedPaths.none { path.startsWith(it) } && excludedPaths.any { path.startsWith(it) }
private fun movePinnedToFront(dirs: ArrayList<Directory>): ArrayList<Directory> {
val foundFolders = ArrayList<Directory>()

View file

@ -10,14 +10,13 @@ import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.activities.SimpleActivity
import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.helpers.Config
import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
class ChangeSortingDialog(val activity: SimpleActivity, val isDirectorySorting: Boolean, showFolderCheckbox: Boolean,
val path: String = "", val callback: () -> Unit) :
DialogInterface.OnClickListener {
private var currSorting = 0
private var config: Config = activity.config
private var config = activity.config
private var view: View
init {
@ -85,6 +84,6 @@ class ChangeSortingDialog(val activity: SimpleActivity, val isDirectorySorting:
config.fileSorting = sorting
}
}
callback.invoke()
callback()
}
}

View file

@ -14,7 +14,6 @@ import com.simplemobiletools.gallery.extensions.config
import kotlinx.android.synthetic.main.dialog_exclude_folder.view.*
class ExcludeFolderDialog(val activity: SimpleActivity, val selectedPaths: List<String>, val callback: () -> Unit) {
var dialog: AlertDialog? = null
val alternativePaths = getAlternativePathsList()
var radioGroup: RadioGroup? = null
@ -46,7 +45,7 @@ class ExcludeFolderDialog(val activity: SimpleActivity, val selectedPaths: List<
private fun dialogConfirmed() {
val path = if (alternativePaths.isEmpty()) selectedPaths[0] else alternativePaths[radioGroup!!.checkedRadioButtonId]
activity.config.addExcludedFolder(path)
callback.invoke()
callback()
}
private fun getAlternativePathsList(): List<String> {

View file

@ -1,9 +1,12 @@
package com.simplemobiletools.gallery.dialogs
import android.support.v7.app.AlertDialog
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.GridLayoutManager
import android.view.LayoutInflater
import android.view.View
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.gallery.R
@ -17,12 +20,14 @@ import kotlinx.android.synthetic.main.dialog_directory_picker.view.*
class PickDirectoryDialog(val activity: SimpleActivity, val sourcePath: String, val callback: (path: String) -> Unit) {
var dialog: AlertDialog
var directoriesGrid: RecyclerView
var shownDirectories: ArrayList<Directory> = ArrayList()
var view: View = LayoutInflater.from(activity).inflate(R.layout.dialog_directory_picker, null)
init {
val view = LayoutInflater.from(activity).inflate(R.layout.dialog_directory_picker, null)
directoriesGrid = view.directories_grid
(view.directories_grid.layoutManager as GridLayoutManager).apply {
orientation = if (activity.config.scrollHorizontally) GridLayoutManager.HORIZONTAL else GridLayoutManager.VERTICAL
spanCount = activity.config.dirColumnCnt
}
dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, null)
@ -45,7 +50,7 @@ class PickDirectoryDialog(val activity: SimpleActivity, val sourcePath: String,
fun showOtherFolder() {
val showHidden = activity.config.shouldShowHidden
FilePickerDialog(activity, sourcePath, false, showHidden, true) {
callback.invoke(it)
callback(it)
}
}
@ -54,15 +59,31 @@ class PickDirectoryDialog(val activity: SimpleActivity, val sourcePath: String,
return
shownDirectories = directories
val adapter = DirectoryAdapter(activity, directories, null) {
val adapter = DirectoryAdapter(activity, directories, null, true) {
if (it.path.trimEnd('/') == sourcePath) {
activity.toast(R.string.source_and_destination_same)
return@DirectoryAdapter
} else {
callback.invoke(it.path)
callback(it.path)
dialog.dismiss()
}
}
directoriesGrid.adapter = adapter
val scrollHorizontally = activity.config.scrollHorizontally
view.apply {
directories_grid.adapter = adapter
directories_vertical_fastscroller.isHorizontal = false
directories_vertical_fastscroller.beGoneIf(scrollHorizontally)
directories_horizontal_fastscroller.isHorizontal = true
directories_horizontal_fastscroller.beVisibleIf(scrollHorizontally)
if (scrollHorizontally) {
directories_horizontal_fastscroller.setViews(directories_grid)
} else {
directories_vertical_fastscroller.setViews(directories_grid)
}
}
}
}

View file

@ -47,7 +47,7 @@ class PickMediumDialog(val activity: SimpleActivity, val path: String, val callb
return
shownMedia = media
val adapter = MediaAdapter(activity, media, null) {
val adapter = MediaAdapter(activity, media, null, true) {
callback(it.path)
dialog.dismiss()
}

View file

@ -84,7 +84,7 @@ class ResizeDialog(val activity: SimpleActivity, val size: Point, val callback:
}
val newSize = Point(getViewValue(widthView), getViewValue(heightView))
callback.invoke(newSize)
callback(newSize)
dismiss()
})
}

View file

@ -66,11 +66,11 @@ class SaveAsDialog(val activity: SimpleActivity, val path: String, val callback:
if (newFile.exists()) {
val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFile.name)
ConfirmationDialog(activity, title) {
callback.invoke(newFile.absolutePath)
callback(newFile.absolutePath)
dismiss()
}
} else {
callback.invoke(newFile.absolutePath)
callback(newFile.absolutePath)
dismiss()
}
})

View file

@ -0,0 +1,99 @@
package com.simplemobiletools.gallery.dialogs
import android.support.v7.app.AlertDialog
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import com.simplemobiletools.commons.extensions.hideKeyboard
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.activities.SimpleActivity
import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.helpers.SLIDESHOW_DEFAULT_INTERVAL
import kotlinx.android.synthetic.main.dialog_slideshow.view.*
class SlideshowDialog(val activity: SimpleActivity, val callback: () -> Unit) {
val dialog: AlertDialog
val view: View
init {
view = LayoutInflater.from(activity).inflate(R.layout.dialog_slideshow, null).apply {
interval_value.setOnClickListener {
val text = interval_value.text
if (text.isNotEmpty()) {
text.replace(0, 1, text.subSequence(0, 1), 0, 1)
interval_value.selectAll()
}
}
interval_value.setOnFocusChangeListener { v, hasFocus ->
if (!hasFocus)
activity.hideKeyboard(v)
}
include_photos_holder.setOnClickListener {
interval_value.clearFocus()
include_photos.toggle()
}
include_videos_holder.setOnClickListener {
interval_value.clearFocus()
include_videos.toggle()
}
random_order_holder.setOnClickListener {
interval_value.clearFocus()
random_order.toggle()
}
use_fade_holder.setOnClickListener {
interval_value.clearFocus()
use_fade.toggle()
}
move_backwards_holder.setOnClickListener {
interval_value.clearFocus()
move_backwards.toggle()
}
}
setupValues()
dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() })
.setNegativeButton(R.string.cancel, null)
.create().apply {
window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
activity.setupDialogStuff(view, this)
}
}
private fun setupValues() {
val config = activity.config
view.apply {
interval_value.setText(config.slideshowInterval.toString())
include_photos.isChecked = config.slideshowIncludePhotos
include_videos.isChecked = config.slideshowIncludeVideos
random_order.isChecked = config.slideshowRandomOrder
use_fade.isChecked = config.slideshowUseFade
move_backwards.isChecked = config.slideshowMoveBackwards
}
}
private fun dialogConfirmed() {
var interval = view.interval_value.text.toString()
if (interval.trim('0').isEmpty())
interval = SLIDESHOW_DEFAULT_INTERVAL.toString()
activity.config.apply {
slideshowInterval = interval.toInt()
slideshowIncludePhotos = view.include_photos.isChecked
slideshowIncludeVideos = view.include_videos.isChecked
slideshowRandomOrder = view.random_order.isChecked
slideshowUseFade = view.use_fade.isChecked
slideshowMoveBackwards = view.move_backwards.isChecked
}
dialog.dismiss()
callback()
}
}

View file

@ -1,24 +0,0 @@
package com.simplemobiletools.gallery.extensions
import android.content.res.ColorStateList
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.RippleDrawable
import android.graphics.drawable.StateListDrawable
import android.os.Build
import com.simplemobiletools.commons.extensions.adjustAlpha
fun Int.createSelector(): StateListDrawable {
val statelist = StateListDrawable()
val selectedDrawable = ColorDrawable(adjustAlpha(0.5f))
statelist.addState(intArrayOf(android.R.attr.state_selected), selectedDrawable)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
val pressedDrawable = ColorDrawable(adjustAlpha(0.2f))
statelist.addState(intArrayOf(android.R.attr.state_pressed), pressedDrawable)
} else {
val pressedDrawable = RippleDrawable(ColorStateList.valueOf(adjustAlpha(0.2f)), null, ColorDrawable(Color.WHITE))
statelist.addState(intArrayOf(), pressedDrawable)
}
return statelist
}

View file

@ -15,7 +15,8 @@ import android.view.ViewConfiguration
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.signature.StringSignature
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.extensions.*
@ -194,7 +195,7 @@ fun Activity.launchCamera() {
fun SimpleActivity.launchAbout() {
startAboutActivity(R.string.app_name, LICENSE_KOTLIN or LICENSE_GLIDE or LICENSE_CROPPER or LICENSE_MULTISELECT or LICENSE_RTL
or LICENSE_PHOTOVIEW or LICENSE_SUBSAMPLING, BuildConfig.VERSION_NAME)
or LICENSE_PHOTOVIEW or LICENSE_SUBSAMPLING or LICENSE_PATTERN, BuildConfig.VERSION_NAME)
}
fun AppCompatActivity.showSystemUI() {
@ -262,8 +263,6 @@ fun SimpleActivity.toggleFileVisibility(oldFile: File, hide: Boolean, callback:
}
}
fun Activity.getFileSignature(path: String) = StringSignature(File(path).lastModified().toString())
fun Activity.loadImage(path: String, target: MySquareImageView, verticalScroll: Boolean) {
target.isVerticalScrolling = verticalScroll
if (path.isImageFast() || path.isVideoFast()) {
@ -282,49 +281,55 @@ fun Activity.loadImage(path: String, target: MySquareImageView, verticalScroll:
}
fun Activity.loadPng(path: String, target: MySquareImageView) {
val builder = Glide.with(applicationContext)
.load(path)
.asBitmap()
.signature(getFileSignature(path))
.diskCacheStrategy(DiskCacheStrategy.RESULT)
val options = RequestOptions()
.signature(path.getFileSignature())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.format(DecodeFormat.PREFER_ARGB_8888)
if (config.cropThumbnails) builder.centerCrop() else builder.fitCenter()
builder.into(target)
val builder = Glide.with(applicationContext)
.asBitmap()
.load(path)
if (config.cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options).into(target)
}
fun Activity.loadJpg(path: String, target: MySquareImageView) {
val options = RequestOptions()
.signature(path.getFileSignature())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
val builder = Glide.with(applicationContext)
.load(path)
.signature(getFileSignature(path))
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.crossFade()
if (config.cropThumbnails) builder.centerCrop() else builder.fitCenter()
builder.into(target)
if (config.cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options).transition(DrawableTransitionOptions.withCrossFade()).into(target)
}
fun Activity.loadAnimatedGif(path: String, target: MySquareImageView) {
val builder = Glide.with(applicationContext)
.load(path)
.asGif()
.signature(getFileSignature(path))
val options = RequestOptions()
.signature(path.getFileSignature())
.diskCacheStrategy(DiskCacheStrategy.NONE)
.crossFade()
if (config.cropThumbnails) builder.centerCrop() else builder.fitCenter()
builder.into(target)
val builder = Glide.with(applicationContext)
.asGif()
.load(path)
if (config.cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options).transition(DrawableTransitionOptions.withCrossFade()).into(target)
}
fun Activity.loadStaticGif(path: String, target: MySquareImageView) {
val builder = Glide.with(applicationContext)
.load(path)
.asBitmap()
.signature(getFileSignature(path))
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
val options = RequestOptions()
.signature(path.getFileSignature())
.diskCacheStrategy(DiskCacheStrategy.DATA)
if (config.cropThumbnails) builder.centerCrop() else builder.fitCenter()
builder.into(target)
val builder = Glide.with(applicationContext)
.asBitmap()
.load(path)
if (config.cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options).into(target)
}
fun Activity.getCachedDirectories(): ArrayList<Directory> {

View file

@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.database.Cursor
import android.media.AudioManager
import android.net.Uri
import android.provider.MediaStore
import com.simplemobiletools.commons.extensions.*
@ -21,6 +22,7 @@ import java.io.File
import java.util.*
val Context.portrait get() = resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT
val Context.audioManager get() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
fun Context.getRealPathFromURI(uri: Uri): String? {
var cursor: Cursor? = null
@ -73,6 +75,7 @@ private fun parseCursor(context: Context, cur: Cursor, isPickImage: Boolean, isP
val config = context.config
val showMedia = config.showMedia
val showHidden = config.shouldShowHidden
val includedFolders = config.includedFolders
val excludedFolders = config.excludedFolders
val noMediaFolders = context.getNoMediaFolders()
@ -111,14 +114,19 @@ private fun parseCursor(context: Context, cur: Cursor, isPickImage: Boolean, isP
var isExcluded = false
excludedFolders.forEach {
if (path.startsWith(it)) {
if (path.startsWith("$it/")) {
isExcluded = true
includedFolders.forEach {
if (path.startsWith("$it/")) {
isExcluded = false
}
}
}
}
if (!isExcluded && !showHidden) {
noMediaFolders.forEach {
if (path.startsWith(it)) {
if (path.startsWith("$it/")) {
isExcluded = true
}
}
@ -142,7 +150,7 @@ private fun parseCursor(context: Context, cur: Cursor, isPickImage: Boolean, isP
}
}
config.includedFolders.filter { it.isEmpty() || it == curPath }.mapNotNull { File(it).listFiles() }.forEach {
config.includedFolders.filter { it.isNotEmpty() && (curPath.isEmpty() || it == curPath) }.mapNotNull { File(it).listFiles() }.forEach {
for (file in it) {
val size = file.length()
if (size <= 0L) {

View file

@ -0,0 +1,6 @@
package com.simplemobiletools.gallery.extensions
import com.bumptech.glide.signature.ObjectKey
import java.io.File
fun String.getFileSignature() = ObjectKey(File(this).lastModified().toString())

View file

@ -7,15 +7,20 @@ import android.graphics.Color
import android.graphics.Matrix
import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.bumptech.glide.Glide
import com.bumptech.glide.Priority
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.davemorrissey.labs.subscaleview.ImageSource
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
@ -33,7 +38,6 @@ import com.simplemobiletools.gallery.helpers.MEDIUM
import com.simplemobiletools.gallery.models.Medium
import it.sephiroth.android.library.exif2.ExifInterface
import kotlinx.android.synthetic.main.pager_photo_item.view.*
import uk.co.senab.photoview.PhotoViewAttacher
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
@ -43,7 +47,6 @@ class PhotoFragment : ViewPagerFragment() {
lateinit var view: ViewGroup
private var isFragmentVisible = false
private var wasInit = false
private var RATIO_THRESHOLD = 0.1
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
view = inflater.inflate(R.layout.pager_photo_item, container, false) as ViewGroup
@ -89,21 +92,16 @@ class PhotoFragment : ViewPagerFragment() {
view.photo_view.apply {
maximumScale = 8f
mediumScale = 3f
setOnPhotoTapListener(object : PhotoViewAttacher.OnPhotoTapListener {
override fun onPhotoTap(view: View?, x: Float, y: Float) {
setOnOutsidePhotoTapListener {
photoClicked()
}
override fun onOutsidePhotoTap() {
setOnPhotoTapListener { view, x, y ->
photoClicked()
}
})
}
loadImage()
activity.window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
listener?.systemUiVisibilityChanged(visibility)
}
wasInit = true
return view
@ -147,12 +145,15 @@ class PhotoFragment : ViewPagerFragment() {
private fun loadImage() {
if (medium.isGif()) {
Glide.with(this)
.load(medium.path)
.asGif()
.crossFade()
val options = RequestOptions()
.priority(if (isFragmentVisible) Priority.IMMEDIATE else Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.diskCacheStrategy(DiskCacheStrategy.DATA)
Glide.with(this)
.asGif()
.load(medium.path)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
.into(view.photo_view)
} else {
loadBitmap()
@ -164,31 +165,37 @@ class PhotoFragment : ViewPagerFragment() {
val targetWidth = if (ViewPagerActivity.screenWidth == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenWidth
val targetHeight = if (ViewPagerActivity.screenHeight == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenHeight
Glide.with(this)
.load(medium.path)
.asBitmap()
.signature(activity.getFileSignature(medium.path))
.format(if (medium.isPng()) DecodeFormat.PREFER_ARGB_8888 else DecodeFormat.PREFER_RGB_565)
val options = RequestOptions()
.signature(medium.path.getFileSignature())
.format(DecodeFormat.PREFER_ARGB_8888)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(targetWidth, targetHeight)
.listener(object : RequestListener<String, Bitmap> {
override fun onException(e: Exception?, model: String?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
Glide.with(this)
.asBitmap()
.load(medium.path)
.apply(options)
.listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean {
return false
}
override fun onResourceReady(resource: Bitmap, model: String?, target: Target<Bitmap>?, isFromMemoryCache: Boolean, isFirstResource: Boolean): Boolean {
override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
if (isFragmentVisible)
addZoomableView()
return false
}
}).into(view.photo_view)
} else {
Glide.with(this)
.load(medium.path)
.asBitmap()
.transform(GlideRotateTransformation(context, degrees))
.thumbnail(0.2f)
val options = RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.transform(GlideRotateTransformation(context, degrees))
Glide.with(this)
.asBitmap()
.load(medium.path)
.thumbnail(0.2f)
.apply(options)
.into(view.photo_view)
}
}
@ -249,9 +256,9 @@ class PhotoFragment : ViewPagerFragment() {
}
}
override fun onDestroyView() {
super.onDestroyView()
Glide.clear(view.photo_view)
fun refreshBitmap() {
view.subsampling_view.beGone()
loadBitmap()
}
fun rotateImageViewBy(degrees: Float) {
@ -259,7 +266,14 @@ class PhotoFragment : ViewPagerFragment() {
loadBitmap(degrees)
}
override fun onConfigurationChanged(newConfig: Configuration?) {
override fun onDestroyView() {
super.onDestroyView()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && !activity.isDestroyed) {
Glide.with(context).clear(view.photo_view)
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
loadImage()
}
@ -267,4 +281,8 @@ class PhotoFragment : ViewPagerFragment() {
private fun photoClicked() {
listener?.fragmentClicked()
}
override fun fullscreenToggled(isFullscreen: Boolean) {
}
}

View file

@ -7,6 +7,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.provider.Settings
import android.util.DisplayMetrics
import android.util.Log
import android.view.*
@ -17,6 +18,8 @@ import com.simplemobiletools.commons.extensions.getFormattedDuration
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.activities.ViewPagerActivity
import com.simplemobiletools.gallery.extensions.audioManager
import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.extensions.getNavBarHeight
import com.simplemobiletools.gallery.extensions.hasNavBar
@ -26,6 +29,8 @@ import kotlinx.android.synthetic.main.pager_video_item.view.*
import java.io.IOException
class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSeekBarChangeListener {
private val CLICK_MAX_DURATION = 150
private val SLIDE_INFO_FADE_DELAY = 1000L
private var mMediaPlayer: MediaPlayer? = null
private var mSurfaceView: SurfaceView? = null
@ -39,9 +44,21 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
private var mIsDragged = false
private var mIsFullscreen = false
private var mIsFragmentVisible = false
private var mPlayOnPrepare = false
private var mCurrTime = 0
private var mDuration = 0
private var mTouchDownX = 0f
private var mTouchDownY = 0f
private var mTouchDownTime = 0L
private var mTouchDownVolume = 0
private var mTouchDownBrightness = -1
private var mTempBrightness = 0
private var mLastTouchY = 0f
private var mSlideInfoText = ""
private var mSlideInfoFadeHandler = Handler()
lateinit var mView: View
lateinit var medium: Medium
@ -60,13 +77,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
}
mIsFullscreen = activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
activity.window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
val fullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
mIsFullscreen = fullscreen
checkFullscreen()
listener?.systemUiVisibilityChanged(visibility)
}
return mView
}
@ -87,6 +98,15 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
mSurfaceHolder!!.addCallback(this)
mSurfaceView!!.setOnClickListener({ toggleFullscreen() })
mView.video_holder.setOnClickListener { toggleFullscreen() }
mView.video_volume_controller.setOnTouchListener { v, event ->
handleVolumeTouched(event)
true
}
mView.video_brightness_controller.setOnTouchListener { v, event ->
handleBrightnessTouched(event)
true
}
initTimeHolder()
}
@ -95,8 +115,9 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
super.setMenuVisibility(menuVisible)
mIsFragmentVisible = menuVisible
if (menuVisible) {
if (mSurfaceView != null)
if (mSurfaceView != null && mSurfaceHolder!!.surface.isValid) {
initMediaPlayer()
}
if (context?.config?.autoplayVideos == true) {
playVideo()
@ -106,18 +127,135 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
}
}
override fun onConfigurationChanged(newConfig: Configuration?) {
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
setVideoSize()
initTimeHolder()
}
private fun toggleFullscreen() {
mIsFullscreen = !mIsFullscreen
checkFullscreen()
listener?.fragmentClicked()
}
private fun handleVolumeTouched(event: MotionEvent) {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
mTouchDownX = event.x
mTouchDownY = event.y
mLastTouchY = event.y
mTouchDownTime = System.currentTimeMillis()
mTouchDownVolume = getCurrentVolume()
mSlideInfoText = "${getString(R.string.volume)}:\n"
}
MotionEvent.ACTION_MOVE -> {
val diffX = mTouchDownX - event.x
val diffY = mTouchDownY - event.y
if (Math.abs(diffY) > Math.abs(diffX)) {
var percent = ((diffY / ViewPagerActivity.screenHeight) * 100).toInt() * 3
percent = Math.min(100, Math.max(-100, percent))
if ((percent == 100 && event.y > mLastTouchY) || (percent == -100 && event.y < mLastTouchY)) {
mTouchDownY = event.y
mTouchDownVolume = getCurrentVolume()
}
volumePercentChanged(percent)
}
mLastTouchY = event.y
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
if (System.currentTimeMillis() - mTouchDownTime < CLICK_MAX_DURATION) {
mView.video_holder.performClick()
}
}
}
}
private fun handleBrightnessTouched(event: MotionEvent) {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
mTouchDownX = event.x
mTouchDownY = event.y
mLastTouchY = event.y
mTouchDownTime = System.currentTimeMillis()
mSlideInfoText = "${getString(R.string.brightness)}:\n"
if (mTouchDownBrightness == -1)
mTouchDownBrightness = getCurrentBrightness()
}
MotionEvent.ACTION_MOVE -> {
val diffX = mTouchDownX - event.x
val diffY = mTouchDownY - event.y
if (Math.abs(diffY) > Math.abs(diffX)) {
var percent = ((diffY / ViewPagerActivity.screenHeight) * 100).toInt() * 3
percent = Math.min(100, Math.max(-100, percent))
if ((percent == 100 && event.y > mLastTouchY) || (percent == -100 && event.y < mLastTouchY)) {
mTouchDownY = event.y
mTouchDownBrightness = mTempBrightness
}
brightnessPercentChanged(percent)
}
mLastTouchY = event.y
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
if (System.currentTimeMillis() - mTouchDownTime < CLICK_MAX_DURATION) {
mView.video_holder.performClick()
}
mTouchDownBrightness = mTempBrightness
}
}
mView.video_holder
}
private fun getCurrentVolume() = context.audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
private fun getCurrentBrightness() = Settings.System.getInt(activity.contentResolver, Settings.System.SCREEN_BRIGHTNESS)
private fun volumePercentChanged(percent: Int) {
val stream = AudioManager.STREAM_MUSIC
val maxVolume = context.audioManager.getStreamMaxVolume(stream)
val percentPerPoint = 100 / maxVolume
val addPoints = percent / percentPerPoint
val newVolume = Math.min(maxVolume, Math.max(0, mTouchDownVolume + addPoints))
context.audioManager.setStreamVolume(stream, newVolume, 0)
val absolutePercent = ((newVolume / maxVolume.toFloat()) * 100).toInt()
mView.slide_info.apply {
text = "$mSlideInfoText$absolutePercent%"
alpha = 1f
}
mSlideInfoFadeHandler.removeCallbacksAndMessages(null)
mSlideInfoFadeHandler.postDelayed({
mView.slide_info.animate().alpha(0f)
}, SLIDE_INFO_FADE_DELAY)
}
private fun brightnessPercentChanged(percent: Int) {
val maxBrightness = 255f
var newBrightness = (mTouchDownBrightness + 2.55 * percent).toFloat()
newBrightness = Math.min(maxBrightness, Math.max(0f, newBrightness))
mTempBrightness = newBrightness.toInt()
val absolutePercent = ((newBrightness / maxBrightness) * 100).toInt()
mView.slide_info.apply {
text = "$mSlideInfoText$absolutePercent%"
alpha = 1f
}
val attributes = activity.window.attributes
attributes.screenBrightness = absolutePercent / 100f
activity.window.attributes = attributes
mSlideInfoFadeHandler.removeCallbacksAndMessages(null)
mSlideInfoFadeHandler.postDelayed({
mView.slide_info.animate().alpha(0f)
}, SLIDE_INFO_FADE_DELAY)
}
private fun initTimeHolder() {
mTimeHolder = mView.video_time_holder
val res = resources
@ -201,9 +339,13 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
}
}
private fun playVideo() {
fun playVideo() {
if (mMediaPlayer != null) {
mIsPlaying = true
mMediaPlayer?.start()
} else {
mPlayOnPrepare = true
}
mView.video_play_outline.setImageDrawable(null)
activity.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
@ -278,12 +420,12 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
setupTimeHolder()
setProgress(mCurrTime)
if (mIsFragmentVisible && context.config.autoplayVideos)
if (mIsFragmentVisible && (context.config.autoplayVideos || mPlayOnPrepare))
playVideo()
}
private fun videoCompleted() {
if (context.config.loopVideos) {
if (listener?.videoEnded() == false && context.config.loopVideos) {
playVideo()
} else {
mSeekBar!!.progress = mSeekBar!!.max
@ -366,9 +508,14 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
if (!mIsPlaying) {
togglePlayPause()
} else {
mMediaPlayer!!.start()
mMediaPlayer?.start()
}
mIsDragged = false
}
override fun fullscreenToggled(isFullscreen: Boolean) {
mIsFullscreen = isFullscreen
checkFullscreen()
}
}

View file

@ -5,9 +5,11 @@ import android.support.v4.app.Fragment
abstract class ViewPagerFragment : Fragment() {
var listener: FragmentListener? = null
abstract fun fullscreenToggled(isFullscreen: Boolean)
interface FragmentListener {
fun fragmentClicked()
fun systemUiVisibilityChanged(visibility: Int)
fun videoEnded(): Boolean
}
}

View file

@ -224,4 +224,36 @@ class Config(context: Context) : BaseConfig(context) {
var scrollHorizontally: Boolean
get() = prefs.getBoolean(SCROLL_HORIZONTALLY, false)
set(scrollHorizontally) = prefs.edit().putBoolean(SCROLL_HORIZONTALLY, scrollHorizontally).apply()
var hideSystemUI: Boolean
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 slideshowInterval: Int
get() = prefs.getInt(SLIDESHOW_INTERVAL, SLIDESHOW_DEFAULT_INTERVAL)
set(slideshowInterval) = prefs.edit().putInt(SLIDESHOW_INTERVAL, slideshowInterval).apply()
var slideshowIncludePhotos: Boolean
get() = prefs.getBoolean(SLIDESHOW_INCLUDE_PHOTOS, true)
set(slideshowIncludePhotos) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_PHOTOS, slideshowIncludePhotos).apply()
var slideshowIncludeVideos: Boolean
get() = prefs.getBoolean(SLIDESHOW_INCLUDE_VIDEOS, false)
set(slideshowIncludeVideos) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_VIDEOS, slideshowIncludeVideos).apply()
var slideshowRandomOrder: Boolean
get() = prefs.getBoolean(SLIDESHOW_RANDOM_ORDER, false)
set(slideshowRandomOrder) = prefs.edit().putBoolean(SLIDESHOW_RANDOM_ORDER, slideshowRandomOrder).apply()
var slideshowUseFade: Boolean
get() = prefs.getBoolean(SLIDESHOW_USE_FADE, false)
set(slideshowUseFade) = prefs.edit().putBoolean(SLIDESHOW_USE_FADE, slideshowUseFade).apply()
var slideshowMoveBackwards: Boolean
get() = prefs.getBoolean(SLIDESHOW_MOVE_BACKWARDS, false)
set(slideshowMoveBackwards) = prefs.edit().putBoolean(SLIDESHOW_MOVE_BACKWARDS, slideshowMoveBackwards).apply()
}

View file

@ -31,6 +31,17 @@ val EXCLUDED_FOLDERS = "excluded_folders"
val INCLUDED_FOLDERS = "included_folders"
val ALBUM_COVERS = "album_covers"
val SCROLL_HORIZONTALLY = "scroll_horizontally"
val HIDE_SYSTEM_UI = "hide_system_ui"
val REPLACE_SHARE_WITH_ROTATE = "replace_share_with_rotate"
// slideshow
val SLIDESHOW_INTERVAL = "slideshow_interval"
val SLIDESHOW_INCLUDE_PHOTOS = "slideshow_include_photos"
val SLIDESHOW_INCLUDE_VIDEOS = "slideshow_include_videos"
val SLIDESHOW_RANDOM_ORDER = "slideshow_random_order"
val SLIDESHOW_USE_FADE = "slideshow_use_fade"
val SLIDESHOW_MOVE_BACKWARDS = "slideshow_move_backwards"
val SLIDESHOW_DEFAULT_INTERVAL = 5
val NOMEDIA = ".nomedia"

View file

@ -5,9 +5,9 @@ import android.graphics.Bitmap
import android.graphics.Matrix
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import java.security.MessageDigest
class GlideRotateTransformation(context: Context, val rotateRotationAngle: Float) : BitmapTransformation(context) {
override fun transform(pool: BitmapPool, bitmap: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
if (rotateRotationAngle % 360 == 0f)
return bitmap
@ -17,5 +17,6 @@ class GlideRotateTransformation(context: Context, val rotateRotationAngle: Float
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
}
override fun getId() = "GlideRotateTransformation $rotateRotationAngle"
override fun updateDiskCacheKey(messageDigest: MessageDigest?) {
}
}

View file

@ -1,9 +1,6 @@
package com.simplemobiletools.gallery.models
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_BY_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
import com.simplemobiletools.commons.helpers.*
import java.io.Serializable
data class Directory(val path: String, val tmb: String, val name: String, var mediaCnt: Int, val modified: Long, val taken: Long,
@ -20,7 +17,7 @@ data class Directory(val path: String, val tmb: String, val name: String, var me
override fun compareTo(other: Directory): Int {
var result: Int
if (sorting and SORT_BY_NAME != 0) {
result = name.toLowerCase().compareTo(other.name.toLowerCase())
result = AlphanumComparator().compare(name.toLowerCase(), other.name.toLowerCase())
} else if (sorting and SORT_BY_SIZE != 0) {
result = if (size == other.size)
0

View file

@ -3,10 +3,7 @@ package com.simplemobiletools.gallery.models
import com.simplemobiletools.commons.extensions.getMimeType
import com.simplemobiletools.commons.extensions.isGif
import com.simplemobiletools.commons.extensions.isPng
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_BY_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
import com.simplemobiletools.commons.helpers.*
import java.io.File
import java.io.Serializable
@ -20,30 +17,32 @@ data class Medium(var name: String, var path: String, val video: Boolean, val mo
fun isGif() = path.isGif()
fun isJpg() = path.endsWith(".jpg", true) || path.endsWith(".jpeg", true)
fun isImage() = !isGif() && !video
fun getMimeType() = File(path).getMimeType()
override fun compareTo(other: Medium): Int {
var res: Int
var result: Int
if (sorting and SORT_BY_NAME != 0) {
res = name.toLowerCase().compareTo(other.name.toLowerCase())
result = AlphanumComparator().compare(name.toLowerCase(), other.name.toLowerCase())
} else if (sorting and SORT_BY_SIZE != 0) {
res = if (size == other.size)
result = if (size == other.size)
0
else if (size > other.size)
1
else
-1
} else if (sorting and SORT_BY_DATE_MODIFIED != 0) {
res = if (modified == other.modified)
result = if (modified == other.modified)
0
else if (modified > other.modified)
1
else
-1
} else {
res = if (taken == other.taken)
result = if (taken == other.taken)
0
else if (taken > other.taken)
1
@ -52,8 +51,8 @@ data class Medium(var name: String, var path: String, val video: Boolean, val mo
}
if (sorting and SORT_DESCENDING != 0) {
res *= -1
result *= -1
}
return res
return result
}
}

View file

@ -1,208 +0,0 @@
package com.simplemobiletools.gallery.views
import android.content.Context
import android.os.Handler
import android.support.v7.widget.RecyclerView
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.ScaleGestureDetector
import com.simplemobiletools.gallery.R
// drag selection is based on https://github.com/afollestad/drag-select-recyclerview
class MyScalableRecyclerView : RecyclerView {
private val AUTO_SCROLL_DELAY = 25L
private var mScaleDetector: ScaleGestureDetector
private var dragSelectActive = false
private var lastDraggedIndex = -1
private var minReached = 0
private var maxReached = 0
private var initialSelection = 0
private var hotspotHeight = 0
private var hotspotOffsetTop = 0
private var hotspotOffsetBottom = 0
private var hotspotTopBoundStart = 0
private var hotspotTopBoundEnd = 0
private var hotspotBottomBoundStart = 0
private var hotspotBottomBoundEnd = 0
private var autoScrollVelocity = 0
private var inTopHotspot = false
private var inBottomHotspot = false
companion object {
var mListener: MyScalableRecyclerViewListener? = null
var mCurrScaleFactor = 1.0f
var mLastUp = 0L // allow only pinch zoom, not double tap
}
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
init {
hotspotHeight = context.resources.getDimensionPixelSize(R.dimen.dragselect_hotspot_height)
mScaleDetector = ScaleGestureDetector(context, GestureListener())
}
override fun onMeasure(widthSpec: Int, heightSpec: Int) {
super.onMeasure(widthSpec, heightSpec)
if (hotspotHeight > -1) {
hotspotTopBoundStart = hotspotOffsetTop
hotspotTopBoundEnd = hotspotOffsetTop + hotspotHeight
hotspotBottomBoundStart = measuredHeight - hotspotHeight - hotspotOffsetBottom
hotspotBottomBoundEnd = measuredHeight - hotspotOffsetBottom
}
}
private var autoScrollHandler = Handler()
private val autoScrollRunnable = object : Runnable {
override fun run() {
if (inTopHotspot) {
scrollBy(0, -autoScrollVelocity)
autoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY)
} else if (inBottomHotspot) {
scrollBy(0, autoScrollVelocity)
autoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY)
}
}
}
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
if (!dragSelectActive)
super.dispatchTouchEvent(ev)
when (ev.action) {
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
dragSelectActive = false
inTopHotspot = false
inBottomHotspot = false
autoScrollHandler.removeCallbacks(autoScrollRunnable)
mCurrScaleFactor = 1.0f
mLastUp = System.currentTimeMillis()
return true
}
MotionEvent.ACTION_MOVE -> {
if (dragSelectActive) {
val itemPosition = getItemPosition(ev)
if (hotspotHeight > -1) {
if (ev.y in hotspotTopBoundStart..hotspotTopBoundEnd) {
inBottomHotspot = false
if (!inTopHotspot) {
inTopHotspot = true
autoScrollHandler.removeCallbacks(autoScrollRunnable)
autoScrollHandler.postDelayed(autoScrollRunnable, AUTO_SCROLL_DELAY.toLong())
}
val simulatedFactor = (hotspotTopBoundEnd - hotspotTopBoundStart).toFloat()
val simulatedY = ev.y - hotspotTopBoundStart
autoScrollVelocity = (simulatedFactor - simulatedY).toInt() / 2
} else if (ev.y in hotspotBottomBoundStart..hotspotBottomBoundEnd) {
inTopHotspot = false
if (!inBottomHotspot) {
inBottomHotspot = true
autoScrollHandler.removeCallbacks(autoScrollRunnable)
autoScrollHandler.postDelayed(autoScrollRunnable, AUTO_SCROLL_DELAY.toLong())
}
val simulatedY = ev.y + hotspotBottomBoundEnd
val simulatedFactor = (hotspotBottomBoundStart + hotspotBottomBoundEnd).toFloat()
autoScrollVelocity = (simulatedY - simulatedFactor).toInt() / 2
} else if (inTopHotspot || inBottomHotspot) {
autoScrollHandler.removeCallbacks(autoScrollRunnable)
inTopHotspot = false
inBottomHotspot = false
}
}
if (itemPosition != RecyclerView.NO_POSITION && lastDraggedIndex != itemPosition) {
lastDraggedIndex = itemPosition
if (minReached == -1) {
minReached = lastDraggedIndex
}
if (maxReached == -1) {
maxReached = lastDraggedIndex
}
if (lastDraggedIndex > maxReached) {
maxReached = lastDraggedIndex
}
if (lastDraggedIndex < minReached) {
minReached = lastDraggedIndex
}
mListener?.selectRange(initialSelection, lastDraggedIndex, minReached, maxReached)
if (initialSelection == lastDraggedIndex) {
minReached = lastDraggedIndex
maxReached = lastDraggedIndex
}
}
return true
}
}
}
return mScaleDetector.onTouchEvent(ev)
}
fun setDragSelectActive(initialSelection: Int) {
if (dragSelectActive)
return
lastDraggedIndex = -1
minReached = -1
maxReached = -1
this.initialSelection = initialSelection
dragSelectActive = true
mListener?.selectItem(initialSelection)
}
private fun getItemPosition(e: MotionEvent): Int {
val v = findChildViewUnder(e.x, e.y) ?: return RecyclerView.NO_POSITION
if (v.tag == null || v.tag !is RecyclerView.ViewHolder) {
throw IllegalStateException("Make sure your adapter makes a call to super.onBindViewHolder(), and doesn't override itemView tags.")
}
val holder = v.tag as RecyclerView.ViewHolder
return holder.adapterPosition
}
class GestureListener : ScaleGestureDetector.SimpleOnScaleGestureListener() {
private val ZOOM_IN_THRESHOLD = -0.4f
private val ZOOM_OUT_THRESHOLD = 0.15f
override fun onScale(detector: ScaleGestureDetector): Boolean {
if (System.currentTimeMillis() - mLastUp < 1000)
return false
val diff = mCurrScaleFactor - detector.scaleFactor
if (diff < ZOOM_IN_THRESHOLD && mCurrScaleFactor == 1.0f) {
mListener?.zoomIn()
mCurrScaleFactor = detector.scaleFactor
} else if (diff > ZOOM_OUT_THRESHOLD && mCurrScaleFactor == 1.0f) {
mListener?.zoomOut()
mCurrScaleFactor = detector.scaleFactor
}
return false
}
}
interface MyScalableRecyclerViewListener {
fun zoomOut()
fun zoomIn()
fun selectItem(position: Int)
fun selectRange(initialSelection: Int, lastDraggedIndex: Int, minReached: Int, maxReached: Int)
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:radius="@dimen/medium_margin"/>
<solid
android:color="@color/gradient_grey_start"/>
</shape>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="@color/color_primary"/>
</shape>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="@color/circle_black_background"/>
</shape>

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.gallery.views.MySquareImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dir_thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.gallery.views.MySquareImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/medium_thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

View file

@ -11,7 +11,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.simplemobiletools.gallery.views.MyScalableRecyclerView
<com.simplemobiletools.commons.views.MyScalableRecyclerView
android:id="@+id/directories_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -20,13 +20,41 @@
app:spanCount="@integer/directory_columns_vertical_scroll"/>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/directories_fastscroller"
android:id="@+id/directories_vertical_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingLeft="@dimen/normal_margin"
android:paddingStart="@dimen/normal_margin"/>
android:paddingStart="@dimen/normal_margin">
<ImageView
android:id="@+id/fastscroller_handle_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:alpha="0"
android:background="@drawable/fastscroller_handle_vertical"/>
</com.simplemobiletools.commons.views.FastScroller>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/directories_horizontal_fastscroller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:paddingTop="@dimen/normal_margin">
<ImageView
android:id="@+id/fastscroller_handle_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:alpha="0"
android:background="@drawable/fastscroller_handle_horizontal"/>
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout>

View file

@ -11,7 +11,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.simplemobiletools.gallery.views.MyScalableRecyclerView
<com.simplemobiletools.commons.views.MyScalableRecyclerView
android:id="@+id/media_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -20,13 +20,41 @@
app:spanCount="@integer/media_columns_vertical_scroll"/>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/media_fastscroller"
android:id="@+id/media_vertical_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingLeft="@dimen/normal_margin"
android:paddingStart="@dimen/normal_margin"/>
android:paddingStart="@dimen/normal_margin">
<ImageView
android:id="@+id/fastscroller_handle_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:alpha="0"
android:background="@drawable/fastscroller_handle_vertical"/>
</com.simplemobiletools.commons.views.FastScroller>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/media_horizontal_fastscroller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:paddingTop="@dimen/normal_margin">
<ImageView
android:id="@+id/fastscroller_handle_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:alpha="0"
android:background="@drawable/fastscroller_handle_horizontal"/>
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout>

View file

@ -214,8 +214,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin"
android:visibility="gone">
android:padding="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_scroll_horizontally"
@ -229,6 +228,66 @@
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_hide_system_ui_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_hide_system_ui"
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/hide_system_ui_at_fullscreen"/>
</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:padding="@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_password_protection_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_password_protection"
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/password_protect_hidden_items"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_screen_rotation_holder"
android:layout_width="match_parent"

View file

@ -1,10 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/directories_grid_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyScalableRecyclerView
android:id="@+id/directories_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_margin"
android:scrollbars="none"
app:layoutManager="android.support.v7.widget.GridLayoutManager"
app:spanCount="@integer/directory_columns_vertical_scroll"/>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/directories_vertical_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingLeft="@dimen/normal_margin"
android:paddingStart="@dimen/normal_margin">
<ImageView
android:id="@+id/fastscroller_handle_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:alpha="0"
android:background="@drawable/fastscroller_handle_vertical"/>
</com.simplemobiletools.commons.views.FastScroller>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/directories_horizontal_fastscroller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:paddingTop="@dimen/normal_margin">
<ImageView
android:id="@+id/fastscroller_handle_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:alpha="0"
android:background="@drawable/fastscroller_handle_horizontal"/>
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>

View file

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/slideshow_scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/slideshow_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/interval_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:text="@string/interval"/>
<com.simplemobiletools.commons.views.MyEditText
android:id="@+id/interval_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:ems="5"
android:gravity="right"
android:imeOptions="actionDone"
android:inputType="number"
android:maxLength="2"
android:textCursorDrawable="@null"/>
<RelativeLayout
android:id="@+id/include_photos_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/interval_label"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/include_photos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:text="@string/include_photos"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/include_videos_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/include_photos_holder"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/include_videos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:text="@string/include_videos"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/random_order_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/include_videos_holder"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/random_order"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:text="@string/random_order"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/use_fade_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/random_order_holder"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin"
android:visibility="gone">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/use_fade"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:text="@string/use_fade"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/move_backwards_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/use_fade_holder"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/move_backwards"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:text="@string/move_backwards"/>
</RelativeLayout>
</RelativeLayout>
</ScrollView>

View file

@ -6,16 +6,33 @@
android:layout_height="wrap_content"
android:padding="1px">
<include layout="@layout/directory_tmb"/>
<com.simplemobiletools.gallery.views.MySquareImageView
android:id="@+id/dir_thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/dir_check"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_background"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_check"/>
<ImageView
android:id="@+id/dir_pin"
android:layout_width="@dimen/pin_size"
android:layout_height="@dimen/pin_size"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_black_background"
android:padding="@dimen/small_margin"
android:src="@drawable/ic_pin"/>
<ImageView
@ -29,7 +46,9 @@
android:id="@+id/dir_bottom_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/dir_thumbnail"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/dir_thumbnail"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="@dimen/small_margin"
@ -55,4 +74,19 @@
android:textSize="@dimen/normal_text_size"/>
</LinearLayout>
<ImageView
android:id="@+id/dir_sd_card"
android:layout_width="@dimen/sd_card_icon_size"
android:layout_height="@dimen/sd_card_icon_size"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:alpha="0.8"
android:paddingBottom="@dimen/small_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:src="@drawable/ic_sd_card"
android:visibility="gone"/>
</RelativeLayout>

View file

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dir_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.simplemobiletools.gallery.views.MySquareImageView
android:id="@+id/dir_thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
</merge>

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<uk.co.senab.photoview.PhotoView
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/photo_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

View file

@ -12,6 +12,18 @@
android:layout_centerInParent="true"
android:background="@android:color/transparent"/>
<RelativeLayout
android:id="@+id/video_volume_controller"
android:layout_width="@dimen/video_side_slider_width"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"/>
<RelativeLayout
android:id="@+id/video_brightness_controller"
android:layout_width="@dimen/video_side_slider_width"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/video_play_outline"
android:layout_width="@dimen/play_outline_size_big"
@ -21,6 +33,23 @@
android:padding="@dimen/activity_margin"
android:src="@drawable/img_play_outline_big"/>
<TextView
android:id="@+id/slide_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="120dp"
android:alpha="0"
android:background="@drawable/black_rounded_background"
android:gravity="center"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin"
android:textColor="@android:color/white"
android:textSize="@dimen/extra_big_text_size"/>
<RelativeLayout
android:id="@+id/video_time_holder"
android:layout_width="wrap_content"

View file

@ -6,16 +6,31 @@
android:layout_height="wrap_content"
android:padding="1px">
<include layout="@layout/photo_video_tmb"/>
<com.simplemobiletools.gallery.views.MySquareImageView
android:id="@+id/medium_thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/play_outline"
android:layout_width="@dimen/play_outline_size"
android:layout_height="@dimen/play_outline_size"
android:id="@+id/medium_check"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_margin="@dimen/tiny_margin"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_background"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_check"/>
<ImageView
android:id="@+id/play_outline"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_margin="@dimen/small_margin"
android:src="@drawable/img_play_outline"
android:visibility="gone"/>
@ -23,11 +38,12 @@
android:id="@+id/photo_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/medium_thumbnail"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/medium_thumbnail"
android:background="@drawable/gradient_background"
android:gravity="bottom"
android:maxLines="3"
android:minHeight="@dimen/play_outline_size"
android:paddingBottom="@dimen/small_margin"
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"

View file

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/medium_thumbnail_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.simplemobiletools.gallery.views.MySquareImageView
android:id="@+id/medium_thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
</merge>

View file

@ -2,9 +2,9 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/cab_properties"
android:icon="@drawable/ic_info"
android:title="@string/properties"
android:id="@+id/cab_delete"
android:icon="@drawable/ic_delete"
android:title="@string/delete"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_pin"
@ -16,6 +16,11 @@
android:icon="@drawable/ic_unpin"
android:title="@string/unpin_folder"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_properties"
android:icon="@drawable/ic_info"
android:title="@string/properties"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_rename"
android:icon="@drawable/ic_rename"
@ -61,9 +66,4 @@
android:title="@string/use_default"/>
</menu>
</item>
<item
android:id="@+id/cab_delete"
android:icon="@drawable/ic_delete"
android:title="@string/delete"
app:showAsAction="ifRoom"/>
</menu>

View file

@ -19,6 +19,10 @@
android:id="@+id/temporarily_show_hidden"
android:title="@string/temporarily_show_hidden"
app:showAsAction="never"/>
<item
android:id="@+id/stop_showing_hidden"
android:title="@string/stop_showing_hidden"
app:showAsAction="never"/>
<item
android:id="@+id/increase_column_count"
android:title="@string/increase_column_count"

View file

@ -5,4 +5,8 @@
android:id="@+id/temporarily_show_hidden"
android:title="@string/temporarily_show_hidden"
app:showAsAction="never"/>
<item
android:id="@+id/stop_showing_hidden"
android:title="@string/stop_showing_hidden"
app:showAsAction="never"/>
</menu>

View file

@ -36,6 +36,10 @@
android:id="@+id/temporarily_show_hidden"
android:title="@string/temporarily_show_hidden"
app:showAsAction="never"/>
<item
android:id="@+id/stop_showing_hidden"
android:title="@string/stop_showing_hidden"
app:showAsAction="never"/>
<item
android:id="@+id/increase_column_count"
android:title="@string/increase_column_count"

View file

@ -1,23 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_rotate"
android:icon="@drawable/ic_rotate_right"
android:title="@string/rotate"
app:showAsAction="ifRoom">
<menu>
<item
android:id="@+id/rotate_right"
android:title="@string/rotate_right"/>
<item
android:id="@+id/rotate_left"
android:title="@string/rotate_left"/>
<item
android:id="@+id/rotate_one_eighty"
android:title="@string/rotate_one_eighty"/>
</menu>
</item>
<item
android:id="@+id/menu_save_as"
android:icon="@drawable/ic_check"
@ -30,10 +13,25 @@
android:title="@string/delete"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_share"
android:id="@+id/menu_share_1"
android:icon="@drawable/ic_share"
android:title="@string/share"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_rotate"
android:icon="@drawable/ic_rotate_right"
android:title="@string/rotate"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_share_2"
android:icon="@drawable/ic_share"
android:title="@string/share"
android:visible="false"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/slideshow"
android:title="@string/slideshow"
app:showAsAction="never"/>
<item
android:id="@+id/menu_copy_to"
android:title="@string/copy_to"

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Nebyla nalezena žádná fotografická aplikace</string>
<string name="increase_column_count">Zvýšit počet sloupců</string>
<string name="reduce_column_count">Snížit počet sloupců</string>
<string name="temporarily_show_hidden">Dočasně zobrazit skryté</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Nastavit jako</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Tato funkce skryje složku, včetně podsložek, přidáním souboru \'.nomedia\'. Zobrazíte je zvolením možnosti \'Zobrazit skryté složky\' v nastavení. Pokračovat?</string>
@ -67,7 +68,6 @@
<string name="flip">Překlopit</string>
<string name="flip_horizontally">Překlopit vodorovně</string>
<string name="flip_vertically">Překlopit svisle</string>
<string name="out_of_memory_error">Zařízení nemá dostatek paměti</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Zobrazit skryté média</string>
<string name="autoplay_videos">Automaticky přehrávat videa</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Keine Kamera-App gefunden</string>
<string name="increase_column_count">Kacheln verkleinern</string>
<string name="reduce_column_count">Kacheln vergrößern</string>
<string name="temporarily_show_hidden">Verstecktes temporär zeigen</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Bild auswählen</string>
<string name="use_default">Standard verwenden</string>
<string name="change_cover_image">Cover-Bild ändern</string>
<string name="select_photo">Auswählen</string>
<string name="use_default">Standard</string>
<string name="set_as">Festlegen als</string>
<string name="volume">Lautstärke</string>
<string name="brightness">Helligkeit</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Diese Funktion versteckt ausgewählte Ordner (auch für andere Apps), indem dort im Dateisystem eine \'.nomedia\'-Datei abgelegt wird. Dadurch werden auch deren Unterordner versteckt. Solche Ordner werden nur gezeigt, wenn die Einstellung \'Versteckte Ordner zeigen\' aktiv ist (auch andere Apps bieten üblicherweise eine solche Option). Fortfahren?</string>
@ -57,7 +58,7 @@
<string name="path">Pfad</string>
<string name="invalid_image_path">Ungültiger Dateipfad</string>
<string name="image_editing_failed">Bildbearbeitung fehlgeschlagen</string>
<string name="edit_image_with">Bild bearbeiten mit:</string>
<string name="edit_image_with">Bild bearbeiten mit</string>
<string name="no_editor_found">Keine Bildeditor-App gefunden</string>
<string name="unknown_file_location">Unbekannter Dateiort</string>
<string name="error_saving_file">Konnte Quelldatei nicht überschreiben</string>
@ -67,20 +68,30 @@
<string name="flip">Spiegeln</string>
<string name="flip_horizontally">Horizontal spiegeln</string>
<string name="flip_vertically">Vertikal spiegeln</string>
<string name="out_of_memory_error">Fehler: Zuwenig Speicher</string>
<string name="edit_with">Edit with</string>
<string name="edit_with">Bearbeiten mit</string>
<!-- Set wallpaper -->
<string name="simple_wallpaper">Schlichter Hintergrund</string>
<string name="set_as_wallpaper">Als Hintergrund festlegen</string>
<string name="set_as_wallpaper_failed">Hintergrundbild festlegen fehlgeschlagen</string>
<string name="set_as_wallpaper_with">Als Hintergrund festlegen mit:</string>
<string name="set_as_wallpaper_with">Als Hintergrund festlegen mit</string>
<string name="no_capable_app_found">Keine Hintergrundbild-App gefunden</string>
<string name="setting_wallpaper">Hintergrund festlegen&#8230;</string>
<string name="wallpaper_set_successfully">Hintergrundbild erfolgreich festgelegt</string>
<string name="portrait_aspect_ratio">Hochformat</string>
<string name="landscape_aspect_ratio">Querformat</string>
<!-- Slideshow -->
<string name="slideshow">Diashow</string>
<string name="interval">Intervall (Sekunden):</string>
<string name="include_photos">Bilder/GIFs verwenden</string>
<string name="include_videos">Videos verwenden</string>
<string name="random_order">Zufällige Reihenfolge</string>
<string name="use_fade">Übergänge animieren</string>
<string name="move_backwards">Rückwärts abspielen</string>
<string name="slideshow_ended">Diashow beendet</string>
<string name="no_media_for_slideshow">Keine Medien für Diashow gefunden</string>
<!-- Settings -->
<string name="show_hidden_media">Versteckte Ordner zeigen</string>
<string name="autoplay_videos">Videos automatisch abspielen</string>
@ -92,7 +103,7 @@
<string name="images_videos_gifs">Bilder, Videos und GIFs</string>
<string name="images_and_videos">Bilder und Videos</string>
<string name="loop_videos">Videos in Endlosschleife spielen</string>
<string name="animate_gifs">Kacheln bei GIFs animieren</string>
<string name="animate_gifs">Kacheln von GIFs animieren</string>
<string name="max_brightness">Helligkeit beim Betrachten maximieren</string>
<string name="crop_thumbnails">Kacheln quadratisch zuschneiden</string>
<string name="screen_rotation_by">Im Vollbild ausrichten nach</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Seitenverhältnis</string>
<string name="dark_background_at_fullscreen">Schwarzer Hintergrund im Vollbild</string>
<string name="scroll_thumbnails_horizontally">Kacheln horizontal scrollen</string>
<string name="hide_system_ui_at_fullscreen">Systemleisten ausblenden im Vollbild</string>
<string name="replace_share_with_rotate">Teilen/Drehen im Vollbild-Menü vertauschen</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Gallery</string>
<string name="app_launcher_name">Gallery</string>
<string name="app_launcher_name">Galería</string>
<string name="edit">Editar</string>
<string name="open_camera">Abrir cámara</string>
<string name="open_with">Abrir con&#8230;</string>
@ -19,11 +19,12 @@
<string name="no_camera_app_found">No se encontró aplicación de cámara</string>
<string name="increase_column_count">Aumentar el número de columnas</string>
<string name="reduce_column_count">Reducir el número de columnas</string>
<string name="temporarily_show_hidden">Mostrar ocultos temporalmente</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="change_cover_image">Cambiar imagen de portada</string>
<string name="select_photo">Seleccionar imagen</string>
<string name="use_default">Uso por defecto</string>
<string name="set_as">Establecer como</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Esta función oculta la carpeta agregando un archivo \'.nomedia\' en ella, y ocultará también las subcarpetas. Puede mostrarlas cambiando la opción \'Mostrar carpetas ocultas\' en los Ajustes. ¿Continuar?</string>
@ -32,7 +33,7 @@
<string name="manage_excluded_folders">Gestionar carpetas excluidas</string>
<string name="exclude_folder_description">Esto excluirá la selección junto con sus subcarpetas, solamente de Simple Gallery. Puede gestionar las carpetas excluidas en los Ajustes.</string>
<string name="exclude_folder_parent">¿Excluir mejor la carpeta superior?</string>
<string name="excluded_activity_placeholder">Excluding folders will make them together with their subfolders hidden just in Simple Gallery, they will still be visible in other applications.\\n\\nIf you want to hide them from other apps too, use the Hide function.</string>
<string name="excluded_activity_placeholder">Excluir las carpetas las hará junto a sus subcarpetas ocultas sólo en Simple Gallery, estas seguirán siendo visibles en otras aplicaciones.\\n\\nSi desea ocultarlo de otras aplicaciones, utilice la función de Ocultar.</string>
<string name="remove_all">Eliminar todo</string>
<string name="remove_all_description">¿Eliminar todas las carpetas de la lista de excluidas? Esto no borrará las carpetas.</string>
@ -67,8 +68,7 @@
<string name="flip">Girar</string>
<string name="flip_horizontally">Horizontalmente</string>
<string name="flip_vertically">Verticalmente</string>
<string name="out_of_memory_error">Error: sin memoria</string>
<string name="edit_with">Edit with</string>
<string name="edit_with">Editar con</string>
<!-- Set wallpaper -->
<string name="simple_wallpaper">Fondos de pantalla Simple Gallery</string>
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Relación de aspecto tipo retrato</string>
<string name="landscape_aspect_ratio">Relación de aspecto tipo paisaje</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Mostrar carpetas ocultas</string>
<string name="autoplay_videos">Reproducir vídeos automáticamente</string>
@ -88,8 +99,8 @@
<string name="show_media">Mostrar multimedia</string>
<string name="images">Solo imágenes</string>
<string name="videos">Solo vídeos</string>
<string name="gifs">GIFs only</string>
<string name="images_videos_gifs">Images, videos, GIFs</string>
<string name="gifs">solo GIFs</string>
<string name="images_videos_gifs">Imágenes, vídeos, GIFs</string>
<string name="images_and_videos">Imágenes y vídeos</string>
<string name="loop_videos">Reproducción continua de vídeos</string>
<string name="animate_gifs">Animar las miniaturas de GIFs</string>
@ -100,7 +111,9 @@
<string name="screen_rotation_device_rotation">Rotación del dispositivo</string>
<string name="screen_rotation_aspect_ratio">Relación de aspecto</string>
<string name="dark_background_at_fullscreen">Utilizar siempre fondo oscuro en pantalla completa</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="scroll_thumbnails_horizontally">Desplazar miniaturas horizontalmente</string>
<string name="hide_system_ui_at_fullscreen">Ocultar automáticamente la interfaz de usuario del sistema en medios de pantalla completa</string>
<string name="replace_share_with_rotate">Reemplazar Compartir con Girar en el menú de pantalla completa</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -3,7 +3,7 @@
<string name="app_name">Simple Galerie</string>
<string name="app_launcher_name">Galerie</string>
<string name="edit">Édition</string>
<string name="open_camera">Ouvrir caméra</string>
<string name="open_camera">Ouvrir appareil photo</string>
<string name="open_with">Ouvrir avec</string>
<string name="no_app_found">Aucune application valide trouvée</string>
<string name="hidden">(caché)</string>
@ -16,14 +16,15 @@
<string name="show_on_map">Afficher sur la carte</string>
<string name="unknown_location">Position inconnue</string>
<string name="no_map_application">Aucune application de cartes n\'a été trouvée</string>
<string name="no_camera_app_found">Aucune application d\appareil photo n\'a été trouvée</string>
<string name="no_camera_app_found">Aucune application d\\appareil photo n\'a été trouvée</string>
<string name="increase_column_count">Augmenter le nombre de colonnes</string>
<string name="reduce_column_count">Réduire le nombre de colonnes</string>
<string name="temporarily_show_hidden">Afficher temporairement les fichiers masqués</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="select_photo">Sélectionner une photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Luminosité</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Cette option masque le dossier en ajoutant un fichier \'.nomedia\' à l\'intérieur, cela masquera aussi tous les sous-dossiers. Vous pouvez les voir en modifiant l\'option \'Afficher les dossiers cachés\' dans les Paramètres. Continuer ?</string>
@ -66,9 +67,8 @@
<string name="rotate_one_eighty">Pivoter à 180º</string>
<string name="flip">Retourner</string>
<string name="flip_horizontally">Retourner horizontalement</string>
<string name="flip_vertically">Retourner verticallement</string>
<string name="out_of_memory_error">Erreur excès de mémoire</string>
<string name="edit_with">Edit with</string>
<string name="flip_vertically">Retourner verticalement</string>
<string name="edit_with">Éditer avec</string>
<!-- Set wallpaper -->
<string name="simple_wallpaper">Simple fond d\'écran</string>
@ -76,44 +76,49 @@
<string name="set_as_wallpaper_failed">Échec de la définition en tant que fond d\'écran.</string>
<string name="set_as_wallpaper_with">Définir comme fond d\'écran avec :</string>
<string name="no_capable_app_found">Aucune application trouvée pour continuer cette action</string>
<string name="setting_wallpaper">Paramètre de fond d\'écran…</string>
<string name="wallpaper_set_successfully">Fond d\'écran défini avec succès.</string>
<string name="setting_wallpaper">Paramètres de fond d\'écran…</string>
<string name="wallpaper_set_successfully">Fond d\'écran défini avec succès</string>
<string name="portrait_aspect_ratio">Ratio aspect Portrait</string>
<string name="landscape_aspect_ratio">Ratio aspect Paysage</string>
<!-- Slideshow -->
<string name="slideshow">Diaporama</string>
<string name="interval">Intervalle (secondes):</string>
<string name="include_photos">Inclure photos et GIFs</string>
<string name="include_videos">Inclure vidéos</string>
<string name="random_order">Ordre aléatoire</string>
<string name="use_fade">Utiliser un fondu</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">Diaporama terminé</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Afficher les dossiers cachés</string>
<string name="autoplay_videos">Lecture automatique des vidéos</string>
<string name="toggle_filename">Permutter la visibilité des noms de fichier</string>
<string name="toggle_filename">Permuter la visibilité des noms de fichier</string>
<string name="show_media">Afficher les médias</string>
<string name="images">Seulement les images</string>
<string name="videos">Vidéos uniquement</string>
<string name="gifs">GIFs only</string>
<string name="images_videos_gifs">Images, videos, GIFs</string>
<string name="gifs">GIFs seulement</string>
<string name="images_videos_gifs">Images, vidéos, GIFs</string>
<string name="images_and_videos">Images et vidéos</string>
<string name="loop_videos">Tourner en boucle les vidéos</string>
<string name="animate_gifs">GIFs animés sur les miniatures</string>
<string name="max_brightness">Luminosité maximale lors de l\'affichage de media</string>
<string name="crop_thumbnails">Rogner les miniatures en carrés</string>
<string name="screen_rotation_by">Pivoter les medias plen écran selon</string>
<string name="screen_rotation_by">Pivoter les medias plein écran selon</string>
<string name="screen_rotation_system_setting">Paramètres système</string>
<string name="screen_rotation_device_rotation">Rotation de l\'appareil</string>
<string name="screen_rotation_aspect_ratio">Ratio d\'aspect</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="scroll_thumbnails_horizontally">Défilement des mignatures horizontalement</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Un album pour visionner photos et vidéos sans publicité.</string>
<string name="app_long_description">
Un simple outil pour visionner les photos et les vidéos. Elles peuvent être triées par dates, tailles, noms dans les deux sens (alphabétique comme désalphabétique), il est possible de zoomer sur les photos. Les fichiers sont affichés sur de multiple colonnes en fonction de la taille de l\'écran, vous pouvez changer le nombre de colonnes par pincement. Elles peuvent être renommées, partagées, supprimées, copiées et déplacées. Les images peuvent en plus être tournées, rognées ou être définies comme fond d\'écran directement depuis l\'application.
La galerie est aussi offerte pour l\'utiliser comme une tierce partie pour de la prévisualisation des images/vidéos, joindre aux clients mail etc. C\'est parfait pour un usage au quotidien.
L\'application ne contient ni de publicité ni d\'autorisation inutile. Elle est totalement OpenSource et est aussi fournie avec un thème sombre.
Cette application est juste l\'une des applications d\'une plus grande suite. Vous pouvez trouver les autres sur http://www.simplemobiletools.com
</string>
<string name="app_long_description">Un simple outil pour visionner les photos et les vidéos. Elles peuvent être triées par dates, tailles, noms dans les deux sens (alphabétique comme désalphabétique), il est possible de zoomer sur les photos. Les fichiers sont affichés sur de multiple colonnes en fonction de la taille de l\'écran, vous pouvez changer le nombre de colonnes par pincement. Elles peuvent être renommées, partagées, supprimées, copiées et déplacées. Les images peuvent en plus être tournées, rognées ou être définies comme fond d\'écran directement depuis l\'application. La galerie est aussi offerte pour l\'utiliser comme une tierce partie pour de la prévisualisation des images/vidéos, joindre aux clients mail etc. C\'est parfait pour un usage au quotidien. L\'application ne contient ni de publicité ni d\'autorisation inutile. Elle est totalement OpenSource et est aussi fournie avec un thème sombre. Cette application est juste l\'une des applications d\'une plus grande suite. Vous pouvez trouver les autres sur http://www.simplemobiletools.com</string>
<!--
Haven't found some strings? There's more at

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">No Camera app has been found</string>
<string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce column count</string>
<string name="temporarily_show_hidden">Temporarily show hidden</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">This function hides the folder by adding a \'.nomedia\' file into it, it will hide all subfolders too. You can see them by toggling the \'Show hidden folders\' option in Settings. Continue?</string>
@ -67,7 +68,6 @@
<string name="flip">Flip</string>
<string name="flip_horizontally">Flip horizontally</string>
<string name="flip_vertically">Flip vertically</string>
<string name="out_of_memory_error">Out of memory error</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Show hidden media</string>
<string name="autoplay_videos">Play videos automatically</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Nessuna app fotocamera trovata</string>
<string name="increase_column_count">Aumenta numero colonne</string>
<string name="reduce_column_count">Riduci numero colonne</string>
<string name="temporarily_show_hidden">Mostra temporaneamente nascosti</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="change_cover_image">Cambia immagine copertina</string>
<string name="select_photo">Seleziona foto</string>
<string name="use_default">Usa predefinita</string>
<string name="set_as">Imposta come</string>
<string name="volume">Volume</string>
<string name="brightness">Luminosità</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Questa funzione nasconde la cartella aggiungendo un file \'.nomedia\' all\'interno, nasconderà anche tutte le sottocartelle. Puoi vederle attivando l\'opzione \'Mostra cartelle nascoste\' nelle impostazioni. Continuare?</string>
@ -67,8 +68,7 @@
<string name="flip">Capovolgi</string>
<string name="flip_horizontally">Capovolgi orizzontalmente</string>
<string name="flip_vertically">Capovolgi verticalmente</string>
<string name="out_of_memory_error">Errore memoria esaurita</string>
<string name="edit_with">Edit with</string>
<string name="edit_with">Modifica con</string>
<!-- Set wallpaper -->
<string name="simple_wallpaper">Sfondo semplice</string>
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Proporzioni ritratto</string>
<string name="landscape_aspect_ratio">Proporzioni panorama</string>
<!-- Slideshow -->
<string name="slideshow">Presentazione</string>
<string name="interval">Intervallo (secondi):</string>
<string name="include_photos">Includi foto e GIF</string>
<string name="include_videos">Includi video</string>
<string name="random_order">Ordine sparso</string>
<string name="use_fade">Usa animazioni a dissolvenza</string>
<string name="move_backwards">Scorri al contrario</string>
<string name="slideshow_ended">La presentazione è terminata</string>
<string name="no_media_for_slideshow">Nessun media trovato per la presentazione</string>
<!-- Settings -->
<string name="show_hidden_media">Mostra cartelle nascoste</string>
<string name="autoplay_videos">Riproduci video automaticamente</string>
@ -88,8 +99,8 @@
<string name="show_media">Mostra tipo di media</string>
<string name="images">Solo immagini</string>
<string name="videos">Solo video</string>
<string name="gifs">GIFs only</string>
<string name="images_videos_gifs">Images, videos, GIFs</string>
<string name="gifs">Solo GIF</string>
<string name="images_videos_gifs">Immagini, video, GIF</string>
<string name="images_and_videos">Immagini e video</string>
<string name="loop_videos">Ripeti i video</string>
<string name="animate_gifs">Anima le GIF in miniatura</string>
@ -100,7 +111,9 @@
<string name="screen_rotation_device_rotation">Rotazione dispositivo</string>
<string name="screen_rotation_aspect_ratio">Proporzioni</string>
<string name="dark_background_at_fullscreen">Sfondo scuro a schermo intero</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="scroll_thumbnails_horizontally">Scorri miniature orizzontalmente</string>
<string name="hide_system_ui_at_fullscreen">Nascondi UI di sistema con media a schermo intero</string>
<string name="replace_share_with_rotate">Sostituisci Condividi con Ruota a schermo intero</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">No Camera app has been found</string>
<string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce column count</string>
<string name="temporarily_show_hidden">Temporarily show hidden</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">This function hides the folder by adding a \'.nomedia\' file into it, it will hide all subfolders too. You can see them by toggling the \'Show hidden folders\' option in Settings. Continue?</string>
@ -67,7 +68,6 @@
<string name="flip">Flip</string>
<string name="flip_horizontally">Flip horizontally</string>
<string name="flip_vertically">Flip vertically</string>
<string name="out_of_memory_error">Out of memory error</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">非表示フォルダーを表示</string>
<string name="autoplay_videos">自動的にビデオを再生</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Gallery</string>
<string name="app_launcher_name">Galeria</string>
<string name="app_launcher_name">Simple Gallery</string>
<string name="edit">Edytuj</string>
<string name="open_camera">Aparat</string>
<string name="open_camera">Uruchom aplikację aparatu</string>
<string name="open_with">Otwórz w</string>
<string name="no_app_found">Nie znaleziono danych aplikacji</string>
<string name="hidden">(ukryty)</string>
<string name="pin_folder">Pin folder</string>
<string name="pin_folder">Przypnij folder</string>
<string name="unpin_folder">Wypakuj folder</string>
<string name="show_all">Pokaż wszystko</string>
<string name="all_folders">Wszystkie foldery</string>
@ -19,105 +19,115 @@
<string name="no_camera_app_found">Brak aplikacji powiązanej z aparatem</string>
<string name="increase_column_count">Zwiększ liczbę kolumn</string>
<string name="reduce_column_count">Zmniejsz liczbę kolumn</string>
<string name="temporarily_show_hidden">Temporarily show hidden</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="change_cover_image">Zmień okładkę</string>
<string name="select_photo">Wybierz obraz</string>
<string name="use_default">Użyj domyślnej</string>
<string name="set_as">Ustaw jako</string>
<string name="volume">Głośność</string>
<string name="brightness">Jasność</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Ta funkcja ukrywa folder dodając \'. \' Nomedia plik do niego, można tak ukryć wszystkie podfoldery. Można je zobaczyć poprzez przełączanie \'Pokaż ukryte foldery \' opcję w ustawieniach. Kontyntynuj?</string>
<string name="hide_folder_description">Ta funkcja ukrywa foldery dodając do nich pusty plik .nomedia. Aby móc je zobaczyć, należy włączyć opcję \'Pokazuj ukryte foldery\' w ustawieniach. Kontyntynuować?</string>
<string name="exclude">Wyklucz</string>
<string name="excluded_folders">Wyklucz foldery</string>
<string name="excluded_folders">Wykluczone foldery</string>
<string name="manage_excluded_folders">Zarządzaj wykluczonymi folderami</string>
<string name="exclude_folder_description">Działa na folderach Galerii. Możesz zarządzać wykluczonymi folderami w Menu/Ustawienia.</string>
<string name="exclude_folder_parent">Wykluczyć folder nadżędny ?</string>
<string name="excluded_activity_placeholder">Excluding folders will make them together with their subfolders hidden just in Simple Gallery, they will still be visible in other applications.\\n\\nIf you want to hide them from other apps too, use the Hide function.</string>
<string name="exclude_folder_description">Działa na folderach galerii. Możesz zarządzać wykluczonymi folderami w ustawieniach aplikacji.</string>
<string name="exclude_folder_parent">Wykluczyć folder nadrzędny?</string>
<string name="excluded_activity_placeholder">Wykluczenie folderów ukryje je tylko w aplikacji Simple Gallery, w innych aplikacjach będą one wciąż widoczne.\n\nJeśli chcesz je ukryć także w innych aplikacjach, użyj funkcji ukrywania.</string>
<string name="remove_all">Usuń wszystko</string>
<string name="remove_all_description">Usuń wszystkie foldery z listy wykluczone? To nie usuwa folderów.</string>
<string name="remove_all_description">Usunąć wszystkie foldery z listy wykluczonych? Foldery nie zostaną fizycznie usunięte.</string>
<!-- Include folders -->
<string name="include_folders">Included folders</string>
<string name="manage_included_folders">Manage included folders</string>
<string name="add_folder">Add folder</string>
<string name="included_activity_placeholder">If you have some folders which contain media, but were not recognized by the app, you can add them manually here.</string>
<string name="include_folders">Dołączone foldery</string>
<string name="manage_included_folders">Zarządzaj dołączonymi folderami</string>
<string name="add_folder">Dodaj folder</string>
<string name="included_activity_placeholder">Jeśli masz jakieś foldery z multimediami, ale aplikacja ich nie wykryła, możesz je tutaj dodać ręcznie.</string>
<!-- Resizing -->
<string name="resize">Zmień rozmiar</string>
<string name="resize_and_save">Zmień i zapisz</string>
<string name="width">Długość</string>
<string name="width">Szerokość</string>
<string name="height">Wysokość</string>
<string name="keep_aspect_ratio">Zachowaj proporcje</string>
<string name="invalid_values">Wpisz poprawną rozdzielczość</string>
<!-- Editor -->
<string name="editor">Edycja</string>
<string name="save">zapisz</string>
<string name="save">Zapisz</string>
<string name="rotate">Obróć</string>
<string name="path">Ścieżka</string>
<string name="invalid_image_path">Nieprawidłowa ścieżka</string>
<string name="image_editing_failed">Edycja obrazu nie powiodło się</string>
<string name="image_editing_failed">Edycja obrazu nie powiodła się</string>
<string name="edit_image_with">Edytuj obraz w:</string>
<string name="no_editor_found">Nie znaleziono edytora zdjęć</string>
<string name="no_editor_found">Nie znalazłem edytora zdjęć</string>
<string name="unknown_file_location">Nieznana lokalizacja pliku</string>
<string name="error_saving_file">Nie udało się zastąpić pliku</string>
<string name="rotate_left">Obróć w lewo</string>
<string name="rotate_right">Obróć w prawo</string>
<string name="rotate_one_eighty">Obróć o 180o</string>
<string name="flip">Flip</string>
<string name="flip_horizontally">Flip poziomo</string>
<string name="flip_vertically">Flip pionowo</string>
<string name="out_of_memory_error">Błąd pamięci</string>
<string name="edit_with">Edit with</string>
<string name="rotate_one_eighty">Obróć o 180 stopni</string>
<string name="flip">Przewróć</string>
<string name="flip_horizontally">Przewróć w poziomie</string>
<string name="flip_vertically">Przewróć w pionie</string>
<string name="edit_with">Edytuj w:</string>
<!-- Set wallpaper -->
<string name="simple_wallpaper">Tapeta</string>
<string name="set_as_wallpaper">Ustaw jako tapeta</string>
<string name="set_as_wallpaper">Ustaw jako tapetę</string>
<string name="set_as_wallpaper_failed">Ustawienie tapety nie powiodło się</string>
<string name="set_as_wallpaper_with">Ustaw jako tapetę w:</string>
<string name="no_capable_app_found">Brak odpowiednich ustawień</string>
<string name="setting_wallpaper">Ustawianie tapety&#8230;</string>
<string name="wallpaper_set_successfully">Tapeta ustawiona</string>
<string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</string>
<string name="setting_wallpaper">Ustawiam tapetę&#8230;</string>
<string name="wallpaper_set_successfully">Tapeta została ustawiona</string>
<string name="portrait_aspect_ratio">Proporcje ekranu w trybie pionowym</string>
<string name="landscape_aspect_ratio">Proporcje ekranu w trybie poziomym</string>
<!-- Slideshow -->
<string name="slideshow">Pokaz slajdów</string>
<string name="interval">Przedział (sekundy):</string>
<string name="include_photos">Dołączaj zdjęcia i GIFy</string>
<string name="include_videos">Dołączaj filmy</string>
<string name="random_order">Losowa kolejność</string>
<string name="use_fade">Używaj płynnych przejść</string>
   <string name="move_backwards">Odwrotna kolejność</string>
<string name="slideshow_ended">Pokaz slajdów zakończony</string>
<string name="no_media_for_slideshow">Nie znalazłem multimediów do pokazu slajdów</string>
<!-- Settings -->
<string name="show_hidden_media">Pokaż ukryte foldery</string>
<string name="autoplay_videos">Odtwarzaj pliki wideo automatycznie</string>
<string name="toggle_filename">Włącz widoczność nazwy pliku</string>
<string name="show_media">Wybierz co pokazywać</string>
<string name="images">Tylko Zdjęcia</string>
<string name="videos">Tylko Filmy</string>
<string name="gifs">GIFs only</string>
<string name="images_videos_gifs">Images, videos, GIFs</string>
<string name="images_and_videos">Obrazy i wideo</string>
<string name="loop_videos">Pętla wideo</string>
<string name="animate_gifs">Animowanie GIFy z miniaturkami</string>
<string name="max_brightness">Max brightness when viewing media</string>
<string name="crop_thumbnails">Crop thumbnails into squares</string>
<string name="screen_rotation_by">Rotate fullscreen media by</string>
<string name="screen_rotation_system_setting">System setting</string>
<string name="screen_rotation_device_rotation">Device rotation</string>
<string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="show_hidden_media">Pokazuj ukryte foldery</string>
<string name="autoplay_videos">Odtwarzaj filmy automatycznie</string>
<string name="toggle_filename">Pokazuj / ukrywaj nazwy plików</string>
<string name="show_media">Pokazywane typy multimediów</string>
<string name="images">Tylko obrazy</string>
<string name="videos">Tylko filmy</string>
<string name="gifs">Tylko GIFy</string>
<string name="images_videos_gifs">Obrazy, filmy i GIFy</string>
<string name="images_and_videos">Obrazy i filmy</string>
<string name="loop_videos">Zapętlaj odtwarzanie filmów</string>
<string name="animate_gifs">Animowane miniatury GIFów</string>
<string name="max_brightness">Maksymalna jasność podczas wyświetlania multimediów</string>
<string name="crop_thumbnails">Przycinaj miniatury do kwadratów</string>
<string name="screen_rotation_by">Obracaj pełnoekranowe multimedia według</string>
<string name="screen_rotation_system_setting">Ustawień systemowych</string>
<string name="screen_rotation_device_rotation">Orientacji urządzenia</string>
<string name="screen_rotation_aspect_ratio">Proporcji</string>
<string name="dark_background_at_fullscreen">Czarne tło przy podglądzie pełnoekranowym</string>
<string name="scroll_thumbnails_horizontally">Przewijaj miniatury poziomo</string>
<string name="hide_system_ui_at_fullscreen">Ukrywaj interfejs przy pełnoekranowym podglądzie</string>
<string name="replace_share_with_rotate">Zamień funkcję udostępniania na obracanie 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 -->
<string name="app_short_description">Darmowa Galeria bez reklam do przeglądania zdjęć i filmów.</string>
<string name="app_short_description">Darmowa galeria bez reklam do przeglądania obrazów i filmów.</string>
<string name="app_long_description">
Prosta aplikacja galerii do oglądania zdjęć i filmów. Pliki mogą być sortowane według daty, rozmiaru, nazwy zarówno w porządku rosnącym lub malejącym, zdjęcia można powiększać. Pliki multimedialne są wyświetlane w wielu kolumnach w zależności od wielkości ekranu, można zmienić liczbę kolumn za pomocą gestów. Obrazy mogą być edytowane w galerii. Zdjęcia mogą być przycięte, można je obracać lub ustawić jako tapetę bezpośrednio z aplikacji. Kolor aplikacji mozna dowolnie ustawić według własnych preferencji.
Prosta aplikacja galerii do oglądania obrazów i filmów. Pliki mogą być sortowane według daty, rozmiaru i nazwy, zarówno w porządku rosnącym jak i malejącym. W zależności od wielkości ekranu wyświetlane mogą być w wielu kolumnach. Liczbę kolumn można zmieniać za pomocą gestów. Zdjęcia mogą być powiększane, przycinane, obracane lub ustawiane jako tapeta bezpośrednio z poziomu aplikacji. Kolory aplikacji można dowolnie ustawiać.
Galeria jest również oferowane do użytkowania przez osoby trzecie do podglądu zdjęć/filmów, dodawania załączników do klientów e-mail itp, Idealne nadaje się do codziennego użytku.
Aplikacja nie zawiera żadnych reklam ani niepotrzebnych uprawnień. Jest też w pełni otawrtoźrodłowa.
Nie zawiera żadnych reklam ani niepotrzebnych uprawnień. Jest w pełni opensource.
Ta aplikacja jest tylko jedą z większego szeregu naszych aplikacji. Można znaleźć resztę z nich w http://www.simplemobiletools.com
Niniejsza aplikacja jest tylko częścią naszego zestawu prostych aplikacji. Znajdziecie je na stronie http://www.simplemobiletools.com.
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
Polish translation : Dariusz Dróżdż - www.onlan.pl
-->
</resources>

View file

@ -6,7 +6,8 @@
<string name="open_camera">Abrir câmera</string>
<string name="open_with">Abrir com</string>
<string name="no_app_found">Nenhum aplicativo encontrado</string>
   <string name="hidden">(oculto)</string>
   
<string name="hidden">(oculto)</string>
<string name="pin_folder">Fixar pasta</string>
<string name="unpin_folder">Desfixar pasta</string>
<string name="show_all">Mostrar conteúdo de todas as pastas</string>
@ -19,11 +20,12 @@
<string name="no_camera_app_found">Nenhum aplicativo de câmera encontrado</string>
<string name="increase_column_count">Aumentar número de colunas</string>
<string name="reduce_column_count">Reduzir número de colunas</string>
<string name="temporarily_show_hidden">Mostrar pastas ocultas temporariamente</string>
<string name="change_cover_image">Trocar imagem de capa</string>
<string name="select_photo">Selecionar foto</string>
<string name="use_default">Usar padrão</string>
<string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Esta opção oculta uma pasta com a adição de um arquivo \'.nomedia\' dentro dela, e irá ocultar todas as subpastas que estejam dentro da mesma. Você poderá rever essas pastas com a opção \'Mostrar pastas ocultas\'. Continuar?</string>
@ -67,7 +69,6 @@
<string name="flip">Inverter</string>
<string name="flip_horizontally">Horizontalmente</string>
<string name="flip_vertically">Verticalmente</string>
<string name="out_of_memory_error">Memória insuficiente</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper -->
@ -81,6 +82,17 @@
<string name="portrait_aspect_ratio">Retrato</string>
<string name="landscape_aspect_ratio">Paisagem</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Mostrar pastas ocultas</string>
<string name="autoplay_videos">Reproduzir vídeos automaticamente</string>
@ -93,7 +105,7 @@
<string name="images_and_videos">Imagens e vídeos</string>
<string name="loop_videos">Reproduzir vídeos em ciclo</string>
<string name="animate_gifs">Animação de GIFs nas miniaturas</string>
   <string name="max_brightness">Brilho máximo ao visualizar mídia</string>
<string name="max_brightness">Brilho máximo ao visualizar mídia</string>
<string name="crop_thumbnails">Recortar miniaturas em quadrados</string>
<string name="screen_rotation_by">Critério para rotação de tela</string>
<string name="screen_rotation_system_setting">Padrão do sistema</string>
@ -101,6 +113,8 @@
<string name="screen_rotation_aspect_ratio">Proporção da mídia</string>
<string name="dark_background_at_fullscreen">Fundo de tela escuro em mídia tela cheia</string>
<string name="scroll_thumbnails_horizontally">Rolar miniaturas horizontalmente</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Não existe uma aplicação adequeada</string>
<string name="increase_column_count">Aumentar número de colunas</string>
<string name="reduce_column_count">Diminuir número de colunas</string>
<string name="temporarily_show_hidden">Mostrar ocultas temporariamente</string>
<string name="change_cover_image">Alterar imagem da capa</string>
<string name="select_photo">Selecionar foto</string>
<string name="use_default">Predefinição</string>
<string name="set_as">Set as</string>
<string name="set_as">Definir como</string>
<string name="volume">Volume</string>
<string name="brightness">Brilho</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Esta opção oculta uma pasta com a adição de um ficheiro \'.nomedia\' na pasta, e irá ocultar todas as subpastas existentes. Pode ver as pastas com a opção \'Mostrar pastas ocultas\'. Continuar?</string>
@ -67,8 +68,7 @@
<string name="flip">Inverter</string>
<string name="flip_horizontally">Horizontalmente</string>
<string name="flip_vertically">Verticalmente</string>
<string name="out_of_memory_error">Memória insuficiente</string>
<string name="edit_with">Edit with</string>
<string name="edit_with">Editar com</string>
<!-- Set wallpaper -->
<string name="simple_wallpaper">Simple Wallpaper</string>
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Proporção na vertical</string>
<string name="landscape_aspect_ratio">Proporção na horizontal</string>
<!-- Slideshow -->
<string name="slideshow">Apresentação</string>
<string name="interval">Intervalo (segundos):</string>
<string name="include_photos">Incluir fotos e GIFs</string>
<string name="include_videos">Incluir vídeos</string>
<string name="random_order">Ordem aleatória</string>
<string name="use_fade">Usar animações</string>
<string name="move_backwards">Mover para trás</string>
<string name="slideshow_ended">Apresentação terminada</string>
<string name="no_media_for_slideshow">Não foram encontrados ficheiros para a apresentação</string>
<!-- Settings -->
<string name="show_hidden_media">Mostrar pastas ocultas</string>
<string name="autoplay_videos">Reproduzir vídeos automaticamente</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Proporção</string>
<string name="dark_background_at_fullscreen">Usar sempre um fundo escuro se em ecrã completo</string>
<string name="scroll_thumbnails_horizontally">Deslocação horizontal de miniaturas</string>
<string name="hide_system_ui_at_fullscreen">Ocultar interface do sistema se em ecrã completo</string>
<string name="replace_share_with_rotate">Substituir a opção Partilhar pela opção Rodar se em ecrã completo</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Не найдено приложения камеры</string>
<string name="increase_column_count">Добавить 1 столбец</string>
<string name="reduce_column_count">Убрать 1 столбец</string>
<string name="temporarily_show_hidden">Временный показ скрытых</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Эта опция скрывает папку, добавляя в неё файл \'.nomedia\'; будут скрыты все подпапки. Можно показывать их, переключая \'Показать скрытые папки\' в настройках. Продолжить?</string>
@ -67,7 +68,6 @@
<string name="flip">Отразить</string>
<string name="flip_horizontally">По горизонтали</string>
<string name="flip_vertically">По вертикали</string>
<string name="out_of_memory_error">Память переполнена</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Формат изображения</string>
<string name="landscape_aspect_ratio">Пейзажное соотношение сторон</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Показать скрытые папки</string>
<string name="autoplay_videos">Воспроизводить видео автоматически</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Соотношение сторон</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Nenašla sa žiadna aplikácia pre fotoaparát</string>
<string name="increase_column_count">Zvýšiť počet stĺpcov</string>
<string name="reduce_column_count">Znížiť počet stĺpcov</string>
<string name="temporarily_show_hidden">Dočasne zobraziť skryté</string>
<string name="change_cover_image">Zmeniť obal albumu</string>
<string name="select_photo">Zvoliť foto</string>
<string name="use_default">Použiť predvolený</string>
<string name="set_as">Nastaviť ako</string>
<string name="volume">Hlasitosť</string>
<string name="brightness">Jas</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Táto funkcia skryje priečinok pridaním súboru \'.nomedia\', skryté budú aj podpriečinky. Môžete ich vidieť zvolením možnosti \'Zobraziť skryté priečinky\' v nastaveniach. Pokračovať?</string>
@ -67,7 +68,6 @@
<string name="flip">Preklopiť</string>
<string name="flip_horizontally">Preklopiť vodorovne</string>
<string name="flip_vertically">Preklopiť zvisle</string>
<string name="out_of_memory_error">Došlo k chybe s nedostatkom pamäte</string>
<string name="edit_with">Upraviť s</string>
<!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Orientácia nastojato</string>
<string name="landscape_aspect_ratio">Orientácia naležato</string>
<!-- Slideshow -->
<string name="slideshow">Prezentácia</string>
<string name="interval">Interval (sekundy):</string>
<string name="include_photos">Zahrnúť fotky a GIF súbory</string>
<string name="include_videos">Zahrnúť videá</string>
<string name="random_order">Náhodné poradie</string>
<string name="use_fade">Používať miznúce animácie</string>
<string name="move_backwards">Ísť opačným smerom</string>
<string name="slideshow_ended">Prezentácia skončila</string>
<string name="no_media_for_slideshow">Pre prezentáciu sa nenašli žiadne vhodné súbory</string>
<!-- Settings -->
<string name="show_hidden_media">Zobraziť skryté médiá</string>
<string name="autoplay_videos">Spúšťať videá automaticky</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Pomeru strán</string>
<string name="dark_background_at_fullscreen">Tmavé pozadie pri médiách na celú obrazovku</string>
<string name="scroll_thumbnails_horizontally">Prehliadať miniatúry vodorovne</string>
<string name="hide_system_ui_at_fullscreen">Automaticky skrývať systémové lišty pri celoobrazovkových médiách</string>
<string name="replace_share_with_rotate">Nahradiť Zdieľanie s Otočením v celoobrazovkovom menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Gallery</string>
<string name="app_launcher_name">Gallery</string>
<string name="app_launcher_name">Galleri</string>
<string name="edit">Redigera</string>
<string name="open_camera">Starta kameran</string>
<string name="open_with">Öppna med</string>
@ -13,34 +13,35 @@
<string name="all_folders">Alla mappar</string>
<string name="folder_view">Byt till mappvy</string>
<string name="other_folder">Andra mappar</string>
<string name="show_on_map">Show on map</string>
<string name="unknown_location">Unknown location</string>
<string name="no_map_application">No application with maps has been found</string>
<string name="no_camera_app_found">No Camera app has been found</string>
<string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce column count</string>
<string name="temporarily_show_hidden">Temporarily show hidden</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="show_on_map">Visa på karta</string>
<string name="unknown_location">Okänd plats</string>
<string name="no_map_application">Ingen app med kartor hittades</string>
<string name="no_camera_app_found">Ingen Kamera-app hittades</string>
<string name="increase_column_count">Öka antalet kolumner</string>
<string name="reduce_column_count">Minska antalet kolumner</string>
<string name="change_cover_image">Byt omslagsbild</string>
<string name="select_photo">Välj foto</string>
<string name="use_default">Använd standard</string>
<string name="set_as">Ange som</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">This function hides the folder by adding a \'.nomedia\' file into it, it will hide all subfolders too. You can see them by toggling the \'Show hidden folders\' option in Settings. Continue?</string>
<string name="exclude">Exclude</string>
<string name="excluded_folders">Excluded folders</string>
<string name="manage_excluded_folders">Manage excluded folders</string>
<string name="exclude_folder_description">This will exclude the selection together with its subfolders from Simple Gallery only. You can manage excluded folders in Settings.</string>
<string name="exclude_folder_parent">Exclude a parent instead?</string>
<string name="excluded_activity_placeholder">Excluding folders will make them together with their subfolders hidden just in Simple Gallery, they will still be visible in other applications.\\n\\nIf you want to hide them from other apps too, use the Hide function.</string>
<string name="remove_all">Remove all</string>
<string name="remove_all_description">Remove all folders from the list of excluded? This will not delete the folders.</string>
<string name="hide_folder_description">Denna funktion döljer mappen och alla dess undermappar genom att lägga till en \'.nomedia\'-fil i den. Du kan se dem genom att växla \'Visa dolda mappar\'-alternativet i Inställningar. Vill du fortsätta?</string>
<string name="exclude">Uteslut</string>
<string name="excluded_folders">Uteslutna mappar</string>
<string name="manage_excluded_folders">Hantera uteslutna mappar</string>
<string name="exclude_folder_description">Detta utesluter bara den markerade mappen och dess undermappar från Simple Gallery. Du kan hantera uteslutna mappar i Inställningar.</string>
<string name="exclude_folder_parent">Vill du utesluta en överordnad mapp istället?</string>
<string name="excluded_activity_placeholder">Uteslutning av mappar döljer bara dem och deras undermappar i Simple Gallery, de visas fortfarande i andra appar.\\n\\nAnvänd Dölj-funktionen om du även vill dölja dem från andra appar.</string>
<string name="remove_all">Ta bort alla</string>
<string name="remove_all_description">Vill du ta bort alla mappar från uteslutningslistan? Detta raderar inte mapparna.</string>
<!-- Include folders -->
<string name="include_folders">Included folders</string>
<string name="manage_included_folders">Manage included folders</string>
<string name="add_folder">Add folder</string>
<string name="included_activity_placeholder">If you have some folders which contain media, but were not recognized by the app, you can add them manually here.</string>
<string name="include_folders">Inkluderade mappar</string>
<string name="manage_included_folders">Hantera inkluderade mappar</string>
<string name="add_folder">Lägg till mapp</string>
<string name="included_activity_placeholder">Om du har vissa mappar som innehåller media men som inte känns igen av appen kan du lägga till dem manuellt här.</string>
<!-- Resizing -->
<string name="resize">Ändra storlek</string>
@ -56,19 +57,18 @@
<string name="rotate">Rotera</string>
<string name="path">Sökväg</string>
<string name="invalid_image_path">Ogiltig bildsökväg</string>
<string name="image_editing_failed">Image editing failed</string>
<string name="image_editing_failed">Bilden kunde inte redigeras</string>
<string name="edit_image_with">Redigera bilden med:</string>
<string name="no_editor_found">Hittade ingen bildredigerare</string>
<string name="unknown_file_location">Okänd filplats</string>
<string name="error_saving_file">Det gick inte att skriva över källfilen</string>
<string name="rotate_left">Rotate left</string>
<string name="rotate_right">Rotate right</string>
<string name="rotate_one_eighty">Rotate by 180º</string>
<string name="flip">Flip</string>
<string name="flip_horizontally">Flip horizontally</string>
<string name="flip_vertically">Flip vertically</string>
<string name="out_of_memory_error">Out of memory error</string>
<string name="edit_with">Edit with</string>
<string name="rotate_left">Rotera åt vänster</string>
<string name="rotate_right">Rotera åt höger</string>
<string name="rotate_one_eighty">Rotera 180º</string>
<string name="flip">Vänd</string>
<string name="flip_horizontally">Vänd horisontellt</string>
<string name="flip_vertically">Vänd vertikalt</string>
<string name="edit_with">Redigera med</string>
<!-- Set wallpaper -->
<string name="simple_wallpaper">Bakgrundsbild</string>
@ -78,8 +78,19 @@
<string name="no_capable_app_found">Hittade ingen app som klarar av detta</string>
<string name="setting_wallpaper">Inställningar för bakgrundsbild&#8230;</string>
<string name="wallpaper_set_successfully">Bakgrundsbilden är ändrad</string>
<string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</string>
<string name="portrait_aspect_ratio">Stående bildförhållande</string>
<string name="landscape_aspect_ratio">Liggande bildförhållande</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Visa dolda mappar</string>
@ -88,19 +99,21 @@
<string name="show_media">Visa media</string>
<string name="images">Endast bilder</string>
<string name="videos">Endast videos</string>
<string name="gifs">GIFs only</string>
<string name="images_videos_gifs">Images, videos, GIFs</string>
<string name="gifs">Bara GIF-bilder</string>
<string name="images_videos_gifs">Bilder, videor, GIF-bilder</string>
<string name="images_and_videos">Bilder och videos</string>
<string name="loop_videos">Återspela videos</string>
<string name="animate_gifs">Animate GIFs at thumbnails</string>
<string name="max_brightness">Max brightness when viewing media</string>
<string name="crop_thumbnails">Crop thumbnails into squares</string>
<string name="screen_rotation_by">Rotate fullscreen media by</string>
<string name="screen_rotation_system_setting">System setting</string>
<string name="screen_rotation_device_rotation">Device rotation</string>
<string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="animate_gifs">Animera GIF-bilders miniatyrer</string>
<string name="max_brightness">Maximal ljusstyrka när media visas</string>
<string name="crop_thumbnails">Beskär miniatyrer till kvadrater</string>
<string name="screen_rotation_by">Rotera media i helskärmsläge</string>
<string name="screen_rotation_system_setting">Systeminställning</string>
<string name="screen_rotation_device_rotation">Enhetens rotation</string>
<string name="screen_rotation_aspect_ratio">Bildförhållande</string>
<string name="dark_background_at_fullscreen">Mörk bakgrund när media visas i helskärmsläge</string>
<string name="scroll_thumbnails_horizontally">Rulla horisontellt genom miniatyrer</string>
<string name="hide_system_ui_at_fullscreen">Dölj systemanvändargränssnittet automatiskt när media visas i helskärmsläge</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dir_tmb_size">150dp</dimen>
<dimen name="medium_tmb_size">120dp</dimen>
<dimen name="pin_size">30dp</dimen>
<dimen name="play_outline_size">60dp</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="timer_padding">32dp</dimen>
<dimen name="tmb_shadow_height">60dp</dimen>
<dimen name="video_side_slider_width">250dp</dimen>
</resources>

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Hiçbir Kamera uygulaması bulunamadı</string>
<string name="increase_column_count">Sütun sayısını artır</string>
<string name="reduce_column_count">Sütun sayısını azalt</string>
<string name="temporarily_show_hidden">Geçici olarak gizli göster</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">Bu işlev, klasöre\'.medya yok\'dosyası ekleyerek gizler; tüm alt klasörleri de gizler. Bunları Ayarlar\'da\'Gizli klasörleri göster\'seçeneğine basarak görebilirsiniz. Devam et?</string>
@ -67,7 +68,6 @@
<string name="flip">Çevir</string>
<string name="flip_horizontally">Yatay</string>
<string name="flip_vertically">Dikey</string>
<string name="out_of_memory_error">Yetersiz bellek hatası</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Gizli klasörleri göster</string>
<string name="autoplay_videos">Videoları otomatik olarak oynat</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">En-boy oranı</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -3,4 +3,5 @@
<style name="FullScreenTheme" parent="FullScreenTheme.Base">
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">未找到相机应用</string>
<string name="increase_column_count">增加一栏</string>
<string name="reduce_column_count">减少一栏</string>
<string name="temporarily_show_hidden">显示/隐藏缓存内容</string>
<string name="change_cover_image">更改封面图片</string>
<string name="select_photo">选择图片</string>
<string name="use_default">使用默认</string>
<string name="set_as">设置为</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">通过添加文件 \'.nomedia\' 到目录,可以防止目录及其子目录下的所有媒体被扫描。您可以通过设置中的 \'显示隐藏目录\' 选项改变设置,是否继续?</string>
@ -67,7 +68,6 @@
<string name="flip">翻转</string>
<string name="flip_horizontally">水平翻转</string>
<string name="flip_vertically">垂直翻转</string>
<string name="out_of_memory_error">内存不足</string>
<string name="edit_with">编辑方式</string>
<!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">纵向长宽比</string>
<string name="landscape_aspect_ratio">横向长宽比</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">显示所有</string>
<string name="autoplay_videos">自动播放</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">根据长宽比</string>
<string name="dark_background_at_fullscreen">全屏时黑色背景</string>
<string name="scroll_thumbnails_horizontally">水平滚动缩略图</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -1,50 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">簡易藝廊</string>
<string name="app_launcher_name">藝廊</string>
<string name="app_name">簡易相簿</string>
<string name="app_launcher_name">簡易相簿</string>
<string name="edit">編輯</string>
<string name="open_camera">開啟相機</string>
<string name="open_with">以其他應用軟體開啟</string>
<string name="no_app_found">沒有可用的應用軟體</string>
<string name="hidden">(隱藏)</string>
<string name="pin_folder">鎖定資料夾</string>
<string name="unpin_folder">解除鎖定資料夾</string>
<string name="show_all">顯示所有資料夾內容</string>
<string name="all_folders">所有資料夾</string>
<string name="folder_view">切換資料夾檢視</string>
<string name="open_with">以其他應用程式開啟</string>
<string name="no_app_found">找不到應用程式</string>
<string name="hidden">(隱藏)</string>
<string name="pin_folder">釘選資料夾</string>
<string name="unpin_folder">取消釘選資料夾</string>
<string name="show_all">資料夾內容全部顯示</string>
<string name="all_folders">全部資料夾</string>
<string name="folder_view">切換資料夾檢視</string>
<string name="other_folder">其他資料夾</string>
<string name="show_on_map">Show on map</string>
<string name="unknown_location">Unknown location</string>
<string name="no_map_application">No application with maps has been found</string>
<string name="no_camera_app_found">No Camera app has been found</string>
<string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce column count</string>
<string name="temporarily_show_hidden">Temporarily show hidden</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="show_on_map">在地圖上顯示</string>
<string name="unknown_location">未知的位置</string>
<string name="no_map_application">找不到地圖程式</string>
<string name="no_camera_app_found">找不到相機程式</string>
<string name="increase_column_count">增加欄數</string>
<string name="reduce_column_count">減少欄數</string>
<string name="change_cover_image">更換封面圖片</string>
<string name="select_photo">選擇相片</string>
<string name="use_default">使用預設</string>
<string name="set_as">設為</string>
<string name="volume">音量</string>
<string name="brightness">亮度</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">This function hides the folder by adding a \'.nomedia\' file into it, it will hide all subfolders too. You can see them by toggling the \'Show hidden folders\' option in Settings. Continue?</string>
<string name="exclude">Exclude</string>
<string name="excluded_folders">Excluded folders</string>
<string name="manage_excluded_folders">Manage excluded folders</string>
<string name="exclude_folder_description">This will exclude the selection together with its subfolders from Simple Gallery only. You can manage excluded folders in Settings.</string>
<string name="exclude_folder_parent">Exclude a parent instead?</string>
<string name="excluded_activity_placeholder">Excluding folders will make them together with their subfolders hidden just in Simple Gallery, they will still be visible in other applications.\\n\\nIf you want to hide them from other apps too, use the Hide function.</string>
<string name="remove_all">Remove all</string>
<string name="remove_all_description">Remove all folders from the list of excluded? This will not delete the folders.</string>
<string name="hide_folder_description">這功能藉由添加一個\'.nomedia\'檔案,來隱藏資料夾和所有子資料夾。您可以透過設定中的「顯示隱藏的資料夾」選項來查看。\n是否繼續?</string>
<string name="exclude">排除</string>
<string name="excluded_folders">排除資料夾</string>
<string name="manage_excluded_folders">管理排除資料夾</string>
<string name="exclude_folder_description">此資料夾與子資料夾將只會都從簡易相簿中排除。您可以在設定中進行管理。</string>
<string name="exclude_folder_parent">是否排除上層資料夾?</string>
<string name="excluded_activity_placeholder">「排除資料夾」只會將選擇的資料夾與子資料夾一起從簡易相簿中隱藏,他們仍會出現在其他應用程式中。\n\n如果您要在其他應用程式中也隱藏請使用「隱藏」功能。</string>
<string name="remove_all">移除全部</string>
<string name="remove_all_description">是否將排除列表中的所有資料夾都移除?這不會刪除資料夾。</string>
<!-- Include folders -->
<string name="include_folders">Included folders</string>
<string name="manage_included_folders">Manage included folders</string>
<string name="add_folder">Add folder</string>
<string name="included_activity_placeholder">If you have some folders which contain media, but were not recognized by the app, you can add them manually here.</string>
<string name="include_folders">包含資料夾</string>
<string name="manage_included_folders">管理包含資料夾</string>
<string name="add_folder">增加資料夾</string>
<string name="included_activity_placeholder">如果有些資料夾含有媒體檔案,卻沒被辨識到,您可以在此手動加入。</string>
<!-- Resizing -->
<string name="resize">縮放</string>
<string name="resize_and_save">縮放選區並儲存</string>
<string name="resize_and_save">縮放選區並儲存</string>
<string name="width">寬度</string>
<string name="height">高度</string>
<string name="keep_aspect_ratio">保持長寬比</string>
@ -55,64 +56,76 @@
<string name="save">儲存</string>
<string name="rotate">旋轉</string>
<string name="path">路徑</string>
<string name="invalid_image_path">圖檔路徑錯誤</string>
<string name="image_editing_failed">圖檔編輯失敗</string>
<string name="edit_image_with">編輯用:</string>
<string name="no_editor_found">沒有可用的圖檔編輯器</string>
<string name="unknown_file_location">未知檔案路徑</string>
<string name="error_saving_file">不能覆蓋源檔案</string>
<string name="rotate_left">Rotate left</string>
<string name="rotate_right">Rotate right</string>
<string name="rotate_one_eighty">Rotate by 180º</string>
<string name="flip">Flip</string>
<string name="flip_horizontally">Flip horizontally</string>
<string name="flip_vertically">Flip vertically</string>
<string name="out_of_memory_error">Out of memory error</string>
<string name="edit_with">Edit with</string>
<string name="invalid_image_path">無效的圖片路徑</string>
<string name="image_editing_failed">圖片編輯失敗</string>
<string name="edit_image_with">編輯圖片:</string>
<string name="no_editor_found">找不到圖片編輯器</string>
<string name="unknown_file_location">未知的檔案位置</string>
<string name="error_saving_file">無法誤蓋原始檔案</string>
<string name="rotate_left">向左轉</string>
<string name="rotate_right">向右轉</string>
<string name="rotate_one_eighty">旋轉180º</string>
<string name="flip">翻轉</string>
<string name="flip_horizontally">水平翻轉</string>
<string name="flip_vertically">垂直翻轉</string>
<string name="edit_with">用其他程式編輯</string>
<!-- Set wallpaper -->
<string name="simple_wallpaper">簡易桌布</string>
<string name="set_as_wallpaper">設定為桌布</string>
<string name="set_as_wallpaper_failed">桌布設定失敗</string>
<string name="set_as_wallpaper_with">用其他應用軟體設定桌布……</string>
<string name="no_capable_app_found">沒有可用的應用軟體</string>
<string name="setting_wallpaper">正在應用軟體桌布&#8230;</string>
<string name="wallpaper_set_successfully">成功應用軟體桌布</string>
<string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</string>
<string name="set_as_wallpaper">設為桌布</string>
<string name="set_as_wallpaper_failed">設為桌布失敗</string>
<string name="set_as_wallpaper_with">用其他程式設為桌布:</string>
<string name="no_capable_app_found">找不到可用的應用程式</string>
<string name="setting_wallpaper">桌布設定中&#8230;</string>
<string name="wallpaper_set_successfully">成功設為桌布</string>
<string name="portrait_aspect_ratio">直向長寬比</string>
<string name="landscape_aspect_ratio">橫向長寬比</string>
<!-- Slideshow -->
<string name="slideshow">投影片</string>
<string name="interval">間隔 (秒):</string>
<string name="include_photos">包含照片和GIF</string>
<string name="include_videos">包含影片</string>
<string name="random_order">隨機順序</string>
<string name="use_fade">使用淡入淡出動畫</string>
<string name="move_backwards">反向播放</string>
<string name="slideshow_ended">投影片結束</string>
<string name="no_media_for_slideshow">找不到投影片的媒體檔案</string>
<!-- Settings -->
<string name="show_hidden_media">秀出隱藏資料夾</string>
<string name="show_hidden_media">顯示隱藏的媒體檔案</string>
<string name="autoplay_videos">自動播放影片</string>
<string name="toggle_filename">顯示檔案名稱</string>
<string name="show_media">秀出多媒體檔案</string>
<string name="images">僅圖片</string>
<string name="videos">僅影片</string>
<string name="gifs">GIFs only</string>
<string name="images_videos_gifs">Images, videos, GIFs</string>
<string name="show_media">顯示媒體檔案</string>
<string name="images">只有圖片</string>
<string name="videos">只有影片</string>
<string name="gifs">只有GIF</string>
<string name="images_videos_gifs">圖片、影片、GIF</string>
<string name="images_and_videos">圖片和影片</string>
<string name="loop_videos">迴圈播放影片</string>
<string name="animate_gifs">Animate GIFs at thumbnails</string>
<string name="max_brightness">Max brightness when viewing media</string>
<string name="crop_thumbnails">Crop thumbnails into squares</string>
<string name="screen_rotation_by">Rotate fullscreen media by</string>
<string name="screen_rotation_system_setting">System setting</string>
<string name="screen_rotation_device_rotation">Device rotation</string>
<string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="loop_videos">影片循環播放</string>
<string name="animate_gifs">縮圖顯示GIF動畫</string>
<string name="max_brightness">瀏覽時最大亮度</string>
<string name="crop_thumbnails">縮圖裁剪成正方形</string>
<string name="screen_rotation_by">全螢幕時旋轉方向</string>
<string name="screen_rotation_system_setting">系統設定方向</string>
<string name="screen_rotation_device_rotation">裝置實際方向</string>
<string name="screen_rotation_aspect_ratio">圖片長寬比</string>
<string name="dark_background_at_fullscreen">全螢幕時黑背景</string>
<string name="scroll_thumbnails_horizontally">橫向滑動縮圖</string>
<string name="hide_system_ui_at_fullscreen">全螢幕時自動隱藏系統介面</string>
<string name="replace_share_with_rotate">將全螢幕選單的分享取代為旋轉</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">一個沒有廣告,用來觀看照片及影片的藝廊</string>
<string name="app_short_description">一個用來瀏覽相片和影片,且沒有廣告的相簿</string>
<string name="app_long_description">
一個觀看照片跟影片的簡單實用工具。項目可以根據日期、大小、名稱來進行遞增及遞減排序,照片可以縮放。媒體檔案們根據螢幕的大小呈列在多個方格中,您可以使用捏放手勢來調整一列中的方格數量。媒體檔案可以被重新命名、分享、刪除、複製以及移動。照片亦可被裁切、旋轉或是直接在應用軟體中設定為桌布。
一個適合用來瀏覽相片和影片的簡單工具。可以根據日期、大小、名稱來遞增或遞減排序項目,相片能被縮放。媒體檔案會依畫面大小呈現在數個欄位內,你可以使用縮放手勢來改變欄數。媒體檔案可以重新命名、分享、刪除、複製、移動;圖片還能縮放、旋轉、翻轉,或者直接設為桌布。
藝廊亦提供讓第三方軟體能夠用來預覽圖片/影片、添加附件於電子郵件客戶端軟體中等功能。非常適合日常使用
這相簿也支援第三方應用,像是預覽圖片/影片、添加電子信箱附件...等功能,日常使用上相當適合
應用軟體不包含廣告與非必要的權限。它是完全開放原始碼的,並內建自訂顔色之使用者介面主題
優點包含沒廣告,也沒非必要的權限,而且完全開放原始碼,並提供自訂顏色
這個應用軟體只是一系列應用軟體中的一小部份。您可以在 http://www.simplemobiletools.com 找到剩下的軟體。
這只是一個大系列應用程式的其中一項程式,你可以在這發現更多 http://www.simplemobiletools.com
</string>
<!--

View file

@ -2,6 +2,7 @@
<resources>
<color name="actionbar_menu_icon">#454545</color>
<color name="crop_image_view_background">#BB000000</color>
<color name="circle_black_background">#66000000</color>
<!-- Default colors -->
<color name="default_text_color">@color/default_dark_theme_text_color</color>

View file

@ -2,11 +2,10 @@
<resources>
<dimen name="dir_tmb_size">150dp</dimen>
<dimen name="medium_tmb_size">100dp</dimen>
<dimen name="pin_size">20dp</dimen>
<dimen name="play_outline_size">40dp</dimen>
<dimen name="sd_card_icon_size">20dp</dimen>
<dimen name="selection_check_size">26dp</dimen>
<dimen name="play_outline_size_big">150dp</dimen>
<dimen name="timer_padding">24dp</dimen>
<dimen name="tmb_shadow_height">50dp</dimen>
<dimen name="dragselect_hotspot_height">56dp</dimen>
<dimen name="video_side_slider_width">150dp</dimen>
</resources>

View file

@ -2,6 +2,16 @@
<resources>
<!-- Release notes -->
<string name="release_123">Allow changing the screen brightness and volume at videos by vertically dragging the screen sides</string>
<string name="release_122">Added slideshow at the fullscreen view</string>
<string name="release_119">Added pattern/pin protection for showing hidden items</string>
<string name="release_118">Added a toggle for replacing Share with Rotate at fullscreen media</string>
<string name="release_115">
Added an indicator of folders located on SD cards
Improved the way of rotating jpg images on the internal storage by modifying the exif tags + added autosave
</string>
<string name="release_114">Added an option for automatically hiding the system UI at entering fullscreen mode</string>
<string name="release_112">Added an option for enabling horizontal scrolling</string>
<string name="release_108">Allow setting custom folder covers</string>
<string name="release_98">
Allow selecting multiple items by finger dragging\n

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">No Camera app has been found</string>
<string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce column count</string>
<string name="temporarily_show_hidden">Temporarily show hidden</string>
<string name="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string>
<string name="use_default">Use default</string>
<string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude -->
<string name="hide_folder_description">This function hides the folder by adding a \'.nomedia\' file into it, it will hide all subfolders too. You can see them by toggling the \'Show hidden folders\' option in Settings. Continue?</string>
@ -67,7 +68,6 @@
<string name="flip">Flip</string>
<string name="flip_horizontally">Flip horizontally</string>
<string name="flip_vertically">Flip vertically</string>
<string name="out_of_memory_error">Out of memory error</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</string>
<!-- Slideshow -->
<string name="slideshow">Slideshow</string>
<string name="interval">Interval (seconds):</string>
<string name="include_photos">Include photos and GIFs</string>
<string name="include_videos">Include videos</string>
<string name="random_order">Random order</string>
<string name="use_fade">Use fade animations</string>
<string name="move_backwards">Move backwards</string>
<string name="slideshow_ended">The slideshow ended</string>
<string name="no_media_for_slideshow">No media for the slideshow have been found</string>
<!-- Settings -->
<string name="show_hidden_media">Show hidden media</string>
<string name="autoplay_videos">Play videos automatically</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</string>
<string name="hide_system_ui_at_fullscreen">Automatically hide system UI at fullscreen media</string>
<string name="replace_share_with_rotate">Replace Share with Rotate at fullscreen menu</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View file

@ -15,4 +15,5 @@
<style name="MyFullScreenActionBar" parent="Widget.AppCompat.Light.ActionBar">
<item name="titleTextStyle">@style/AppTheme.ActionBar.TitleTextStyle</item>
</style>
</resources>