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 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)* Version 2.11.1 *(2017-06-19)*
---------------------------- ----------------------------

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -4,7 +4,10 @@ import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
import android.os.Bundle import android.os.Bundle
import com.simplemobiletools.commons.dialogs.RadioGroupDialog 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.extensions.updateTextColors
import com.simplemobiletools.commons.helpers.SHOW_ALL_TABS
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.config
@ -35,7 +38,10 @@ class SettingsActivity : SimpleActivity() {
setupDarkBackground() setupDarkBackground()
setupScrollHorizontally() setupScrollHorizontally()
setupScreenRotation() setupScreenRotation()
setupReplaceShare()
setupPasswordProtection()
setupShowMedia() setupShowMedia()
setupHideSystemUI()
updateTextColors(settings_holder) updateTextColors(settings_holder)
} }
@ -60,10 +66,20 @@ class SettingsActivity : SimpleActivity() {
private fun setupShowHiddenFolders() { private fun setupShowHiddenFolders() {
settings_show_hidden_folders.isChecked = config.showHiddenMedia settings_show_hidden_folders.isChecked = config.showHiddenMedia
settings_show_hidden_folders_holder.setOnClickListener { settings_show_hidden_folders_holder.setOnClickListener {
if (config.showHiddenMedia) {
toggleHiddenFolders()
} else {
handleHiddenFolderPasswordProtection {
toggleHiddenFolders()
}
}
}
}
private fun toggleHiddenFolders() {
settings_show_hidden_folders.toggle() settings_show_hidden_folders.toggle()
config.showHiddenMedia = settings_show_hidden_folders.isChecked config.showHiddenMedia = settings_show_hidden_folders.isChecked
} }
}
private fun setupAutoplayVideos() { private fun setupAutoplayVideos() {
settings_autoplay_videos.isChecked = config.autoplayVideos 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() { private fun setupScreenRotation() {
settings_screen_rotation.text = getScreenRotationText() settings_screen_rotation.text = getScreenRotationText()
settings_screen_rotation_holder.setOnClickListener { settings_screen_rotation_holder.setOnClickListener {

View file

@ -15,13 +15,11 @@ import android.media.ExifInterface
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.provider.MediaStore import android.provider.MediaStore
import android.support.v4.view.ViewPager import android.support.v4.view.ViewPager
import android.util.DisplayMetrics import android.util.DisplayMetrics
import android.view.Menu import android.view.*
import android.view.MenuItem
import android.view.OrientationEventListener
import android.view.View
import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.PropertiesDialog import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog 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.adapters.MyPagerAdapter
import com.simplemobiletools.gallery.asynctasks.GetMediaAsynctask import com.simplemobiletools.gallery.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.dialogs.SaveAsDialog import com.simplemobiletools.gallery.dialogs.SaveAsDialog
import com.simplemobiletools.gallery.dialogs.SlideshowDialog
import com.simplemobiletools.gallery.extensions.* import com.simplemobiletools.gallery.extensions.*
import com.simplemobiletools.gallery.fragments.PhotoFragment import com.simplemobiletools.gallery.fragments.PhotoFragment
import com.simplemobiletools.gallery.fragments.VideoFragment
import com.simplemobiletools.gallery.fragments.ViewPagerFragment import com.simplemobiletools.gallery.fragments.ViewPagerFragment
import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.helpers.*
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
@ -49,10 +49,17 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mIsFullScreen = false private var mIsFullScreen = false
private var mPos = -1 private var mPos = -1
private var mShowAll = false private var mShowAll = false
private var mIsSlideshowActive = false
private var mRotationDegrees = 0f private var mRotationDegrees = 0f
private var mLastHandledOrientation = 0 private var mLastHandledOrientation = 0
private var mPrevHashcode = 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 { companion object {
var screenWidth = 0 var screenWidth = 0
var screenHeight = 0 var screenHeight = 0
@ -91,18 +98,28 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return 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 config.temporarilyShowHidden = true
} }
}
showSystemUI() showSystemUI()
mDirectory = File(mPath).parent mDirectory = File(mPath).parent
title = mPath.getFilenameFromPath() 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()) { if (mMedia.isNotEmpty()) {
gotMedia(mMedia) gotMedia(mMedia)
} }
}
})
reloadViewPager() reloadViewPager()
scanPath(mPath) {} scanPath(mPath) {}
@ -110,6 +127,17 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (config.darkBackground) if (config.darkBackground)
view_pager.background = ColorDrawable(Color.BLACK) 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() { override fun onDestroy() {
@ -163,32 +191,29 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
} else if (config.screenRotation == ROTATE_BY_SYSTEM_SETTING) { } else if (config.screenRotation == ROTATE_BY_SYSTEM_SETTING) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
} }
invalidateOptionsMenu()
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
mOrientationEventListener.disable() mOrientationEventListener.disable()
stopSlideshow()
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_viewpager, menu) menuInflater.inflate(R.menu.menu_viewpager, menu)
if (getCurrentMedium() == null) val currentMedium = getCurrentMedium() ?: return true
return true
menu.apply { menu.apply {
findItem(R.id.menu_set_as).isVisible = getCurrentMedium()!!.isImage() == true findItem(R.id.menu_share_1).isVisible = !config.replaceShare
findItem(R.id.menu_edit).isVisible = getCurrentMedium()!!.isImage() == true findItem(R.id.menu_share_2).isVisible = config.replaceShare
findItem(R.id.menu_rotate).isVisible = getCurrentMedium()!!.isImage() == true 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_save_as).isVisible = mRotationDegrees != 0f
findItem(R.id.menu_hide).isVisible = !getCurrentMedium()!!.name.startsWith('.') findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.')
findItem(R.id.menu_unhide).isVisible = getCurrentMedium()!!.name.startsWith('.') findItem(R.id.menu_unhide).isVisible = currentMedium.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)
}
} }
return true return true
@ -200,39 +225,125 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
when (item.itemId) { when (item.itemId) {
R.id.menu_set_as -> trySetAs(getCurrentFile()) R.id.menu_set_as -> trySetAs(getCurrentFile())
R.id.slideshow -> initSlideshow()
R.id.menu_copy_to -> copyMoveTo(true) R.id.menu_copy_to -> copyMoveTo(true)
R.id.menu_move_to -> copyMoveTo(false) R.id.menu_move_to -> copyMoveTo(false)
R.id.menu_open_with -> openWith(getCurrentFile()) R.id.menu_open_with -> openWith(getCurrentFile())
R.id.menu_hide -> toggleFileVisibility(true) R.id.menu_hide -> toggleFileVisibility(true)
R.id.menu_unhide -> toggleFileVisibility(false) R.id.menu_unhide -> toggleFileVisibility(false)
R.id.menu_share -> shareMedium(getCurrentMedium()!!) R.id.menu_share_1 -> shareMedium(getCurrentMedium()!!)
R.id.menu_share_2 -> shareMedium(getCurrentMedium()!!)
R.id.menu_delete -> askConfirmDelete() R.id.menu_delete -> askConfirmDelete()
R.id.menu_rename -> renameFile() R.id.menu_rename -> renameFile()
R.id.menu_edit -> openFileEditor(getCurrentFile()) R.id.menu_edit -> openFileEditor(getCurrentFile())
R.id.menu_properties -> showProperties() R.id.menu_properties -> showProperties()
R.id.menu_save_as -> saveImageAs()
R.id.show_on_map -> showOnMap() R.id.show_on_map -> showOnMap()
R.id.rotate_right -> rotateImage(90f) R.id.menu_rotate -> rotateImage()
R.id.rotate_left -> rotateImage(-90f) R.id.menu_save_as -> saveImageAs()
R.id.rotate_one_eighty -> rotateImage(180f)
R.id.settings -> launchSettings() R.id.settings -> launchSettings()
else -> return super.onOptionsItemSelected(item) else -> return super.onOptionsItemSelected(item)
} }
return true return true
} }
private fun updatePagerItems() { private fun updatePagerItems(media: MutableList<Medium>) {
val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, mMedia) val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, media)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1 || !isDestroyed) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1 || !isDestroyed) {
view_pager.apply { view_pager.apply {
adapter = pagerAdapter adapter = pagerAdapter
adapter!!.notifyDataSetChanged()
currentItem = mPos currentItem = mPos
addOnPageChangeListener(this@ViewPagerActivity) 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) { private fun copyMoveTo(isCopyOperation: Boolean) {
val files = ArrayList<File>(1).apply { add(getCurrentFile()) } val files = ArrayList<File>(1).apply { add(getCurrentFile()) }
tryCopyMoveFilesTo(files, isCopyOperation) { tryCopyMoveFilesTo(files, isCopyOperation) {
@ -250,12 +361,48 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
getCurrentMedium()!!.apply { getCurrentMedium()!!.apply {
name = newFileName name = newFileName
path = it.absolutePath path = it.absolutePath
mMedia[mPos] = this getCurrentMedia()[mPos] = this
} }
invalidateOptionsMenu() 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() { private fun saveImageAs() {
val currPath = getCurrentPath() val currPath = getCurrentPath()
SaveAsDialog(this, currPath) { SaveAsDialog(this, currPath) {
@ -296,19 +443,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
out.close() out.close()
} }
private fun rotateImage(degrees: Float) { private fun getCurrentFragment() = (view_pager.adapter as MyPagerAdapter).getCurrentFragment(view_pager.currentItem)
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 showProperties() { private fun showProperties() {
if (getCurrentMedium() != null) if (getCurrentMedium() != null)
@ -388,7 +523,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun askConfirmDelete() { private fun askConfirmDelete() {
ConfirmationDialog(this) { ConfirmationDialog(this) {
deleteFileBg(File(mMedia[mPos].path)) { deleteFileBg(File(getCurrentMedia()[mPos].path)) {
reloadViewPager() reloadViewPager()
} }
} }
@ -405,7 +540,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun renameFile() { private fun renameFile() {
RenameItemDialog(this, getCurrentPath()) { RenameItemDialog(this, getCurrentPath()) {
mMedia[mPos].path = it getCurrentMedia()[mPos].path = it
updateActionbarTitle() updateActionbarTitle()
} }
} }
@ -442,21 +577,21 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
mPrevHashcode = media.hashCode() mPrevHashcode = media.hashCode()
mMedia = media mMedia = media
if (mPos == -1) { if (mPos == -1) {
mPos = getProperPosition() mPos = getPositionInList(media)
} else { } else {
mPos = Math.min(mPos, mMedia.size - 1) mPos = Math.min(mPos, mMedia.size - 1)
} }
updateActionbarTitle() updateActionbarTitle()
updatePagerItems() updatePagerItems(mMedia.toMutableList())
invalidateOptionsMenu() invalidateOptionsMenu()
checkOrientation() checkOrientation()
} }
private fun getProperPosition(): Int { private fun getPositionInList(items: MutableList<Medium>): Int {
mPos = 0 mPos = 0
var i = 0 var i = 0
for (medium in mMedia) { for (medium in items) {
if (medium.path == mPath) { if (medium.path == mPath) {
return i return i
} }
@ -487,37 +622,41 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
override fun fragmentClicked() { override fun fragmentClicked() {
mIsFullScreen = !mIsFullScreen mIsFullScreen = !mIsFullScreen
checkSystemUI()
}
override fun videoEnded(): Boolean {
if (mIsSlideshowActive)
swipeToNextMedium()
return mIsSlideshowActive
}
private fun checkSystemUI() {
if (mIsFullScreen) { if (mIsFullScreen) {
hideSystemUI() hideSystemUI()
} else { } else {
stopSlideshow()
showSystemUI() showSystemUI()
} }
} }
override fun systemUiVisibilityChanged(visibility: Int) {
if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
mIsFullScreen = false
showSystemUI()
} else {
mIsFullScreen = true
}
}
private fun updateActionbarTitle() { private fun updateActionbarTitle() {
runOnUiThread { runOnUiThread {
if (mPos < mMedia.size) { if (mPos < getCurrentMedia().size) {
title = mMedia[mPos].path.getFilenameFromPath() title = getCurrentMedia()[mPos].path.getFilenameFromPath()
} }
} }
} }
private fun getCurrentMedium(): Medium? { private fun getCurrentMedium(): Medium? {
return if (mMedia.isEmpty() || mPos == -1) return if (getCurrentMedia().isEmpty() || mPos == -1)
null null
else 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 getCurrentPath() = getCurrentMedium()!!.path
private fun getCurrentFile() = File(getCurrentPath()) private fun getCurrentFile() = File(getCurrentPath())
@ -534,6 +673,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
updateActionbarTitle() updateActionbarTitle()
mRotationDegrees = 0f mRotationDegrees = 0f
supportInvalidateOptionsMenu() supportInvalidateOptionsMenu()
scheduleSwipe()
} }
override fun onPageScrollStateChanged(state: Int) { override fun onPageScrollStateChanged(state: Int) {

View file

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

View file

@ -1,11 +1,10 @@
package com.simplemobiletools.gallery.adapters package com.simplemobiletools.gallery.adapters
import android.os.Build import android.graphics.PorterDuff
import android.support.v7.view.ActionMode import android.support.v7.view.ActionMode
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.util.SparseArray import android.util.SparseArray
import android.view.* import android.view.*
import android.widget.FrameLayout
import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback
import com.bignerdranch.android.multiselector.MultiSelector import com.bignerdranch.android.multiselector.MultiSelector
import com.bignerdranch.android.multiselector.SwappingHolder 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.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.PropertiesDialog import com.simplemobiletools.commons.dialogs.PropertiesDialog
import com.simplemobiletools.commons.dialogs.RenameItemDialog import com.simplemobiletools.commons.dialogs.RenameItemDialog
import com.simplemobiletools.commons.extensions.beGone
import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.activities.SimpleActivity import com.simplemobiletools.gallery.activities.SimpleActivity
import com.simplemobiletools.gallery.extensions.* import com.simplemobiletools.gallery.extensions.*
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
import kotlinx.android.synthetic.main.photo_video_item.view.* import kotlinx.android.synthetic.main.photo_video_item.view.*
import kotlinx.android.synthetic.main.photo_video_tmb.view.*
import java.io.File import java.io.File
import java.util.* import java.util.*
class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>, val listener: MediaOperationsListener?, val itemClick: (Medium) -> Unit) : class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>, val listener: MediaOperationsListener?, val isPickIntent: Boolean,
RecyclerView.Adapter<MediaAdapter.ViewHolder>() { val itemClick: (Medium) -> Unit) : RecyclerView.Adapter<MediaAdapter.ViewHolder>() {
val multiSelector = MultiSelector() val multiSelector = MultiSelector()
val config = activity.config val config = activity.config
@ -32,50 +31,30 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
var actMode: ActionMode? = null var actMode: ActionMode? = null
var itemViews = SparseArray<View>() var itemViews = SparseArray<View>()
val selectedPositions = HashSet<Int>() val selectedPositions = HashSet<Int>()
var foregroundColor = 0 var primaryColor = config.primaryColor
var displayFilenames = config.displayFileNames var displayFilenames = config.displayFileNames
var scrollVertically = !config.scrollHorizontally var scrollVertically = !config.scrollHorizontally
fun toggleItemSelection(select: Boolean, pos: Int) { fun toggleItemSelection(select: Boolean, pos: Int) {
if (itemViews[pos] != null) if (select) {
getProperView(itemViews[pos]!!).isSelected = select itemViews[pos]?.medium_check?.background?.setColorFilter(primaryColor, PorterDuff.Mode.SRC_IN)
if (select)
selectedPositions.add(pos) selectedPositions.add(pos)
else } else
selectedPositions.remove(pos) selectedPositions.remove(pos)
itemViews[pos]?.medium_check?.beVisibleIf(select)
if (selectedPositions.isEmpty()) { if (selectedPositions.isEmpty()) {
actMode?.finish() actMode?.finish()
return return
} }
updateTitle(selectedPositions.size) 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) { fun updateTitle(cnt: Int) {
actMode?.title = "$cnt / ${media.size}" actMode?.title = "$cnt / ${media.size}"
} actMode?.invalidate()
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()
} }
val adapterListener = object : MyAdapterListener { val adapterListener = object : MyAdapterListener {
@ -83,17 +62,9 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
toggleItemSelection(select, position) toggleItemSelection(select, position)
} }
override fun setupItemForeground(itemView: View) {
setupItemViewForeground(itemView)
}
override fun getSelectedPositions(): HashSet<Int> = selectedPositions override fun getSelectedPositions(): HashSet<Int> = selectedPositions
} }
init {
foregroundColor = config.primaryColor
}
val multiSelectorMode = object : ModalMultiSelectorCallback(multiSelector) { val multiSelectorMode = object : ModalMultiSelectorCallback(multiSelector) {
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
@ -131,8 +102,7 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
override fun onDestroyActionMode(actionMode: ActionMode?) { override fun onDestroyActionMode(actionMode: ActionMode?) {
super.onDestroyActionMode(actionMode) super.onDestroyActionMode(actionMode)
selectedPositions.forEach { selectedPositions.forEach {
if (itemViews[it] != null) itemViews[it]?.medium_check?.beGone()
getProperView(itemViews[it]!!).isSelected = false
} }
selectedPositions.clear() selectedPositions.clear()
actMode = null actMode = null
@ -218,7 +188,6 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
notifyItemChanged(i) notifyItemChanged(i)
} }
updateTitle(cnt) updateTitle(cnt)
actMode?.invalidate()
} }
private fun askConfirmDelete() { private fun askConfirmDelete() {
@ -237,6 +206,11 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
val files = ArrayList<File>(selectedPositions.size) val files = ArrayList<File>(selectedPositions.size)
val removeMedia = ArrayList<Medium>(selectedPositions.size) val removeMedia = ArrayList<Medium>(selectedPositions.size)
if (media.size <= selectedPositions.first()) {
actMode?.finish()
return
}
activity.handleSAFDialog(File(media[selectedPositions.first()].path)) { activity.handleSAFDialog(File(media[selectedPositions.first()].path)) {
selectedPositions.sortedDescending().forEach { selectedPositions.sortedDescending().forEach {
val medium = media[it] 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 { override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent?.context).inflate(R.layout.photo_video_item, parent, false) 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) { 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, class ViewHolder(val view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback,
val multiSelector: MultiSelector, val listener: MediaOperationsListener?, val itemClick: (Medium) -> (Unit)) : SwappingHolder(view, MultiSelector()) { 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 { fun bindView(medium: Medium, displayFilenames: Boolean, scrollVertically: Boolean): View {
itemView.apply { itemView.apply {
play_outline.visibility = if (medium.video) View.VISIBLE else View.GONE 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) activity.loadImage(medium.path, medium_thumbnail, scrollVertically)
setOnClickListener { viewClicked(medium) } setOnClickListener { viewClicked(medium) }
setOnLongClickListener { viewLongClicked(); true } setOnLongClickListener { if (isPickIntent) viewClicked(medium) else viewLongClicked(); true }
adapter.setupItemForeground(this)
} }
return itemView return itemView
} }
fun viewClicked(medium: Medium) { fun viewClicked(medium: Medium) {
if (multiSelector.isSelectable) { if (multiSelector.isSelectable) {
val isSelected = adapter.getSelectedPositions().contains(layoutPosition) val isSelected = adapterListener.getSelectedPositions().contains(layoutPosition)
adapter.toggleItemSelectionAdapter(!isSelected, layoutPosition) adapterListener.toggleItemSelectionAdapter(!isSelected, layoutPosition)
} else { } else {
itemClick(medium) itemClick(medium)
} }
@ -366,7 +339,7 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
if (listener != null) { if (listener != null) {
if (!multiSelector.isSelectable) { if (!multiSelector.isSelectable) {
activity.startSupportActionMode(multiSelectorCallback) activity.startSupportActionMode(multiSelectorCallback)
adapter.toggleItemSelectionAdapter(true, layoutPosition) adapterListener.toggleItemSelectionAdapter(true, layoutPosition)
} }
listener.itemLongClicked(layoutPosition) listener.itemLongClicked(layoutPosition)
@ -374,15 +347,14 @@ class MediaAdapter(val activity: SimpleActivity, var media: MutableList<Medium>,
} }
fun stopLoad() { fun stopLoad() {
Glide.clear(view.medium_thumbnail) if (!activity.isDestroyed)
Glide.with(activity).clear(view.medium_thumbnail)
} }
} }
interface MyAdapterListener { interface MyAdapterListener {
fun toggleItemSelectionAdapter(select: Boolean, position: Int) fun toggleItemSelectionAdapter(select: Boolean, position: Int)
fun setupItemForeground(itemView: View)
fun getSelectedPositions(): HashSet<Int> 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.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter import android.support.v4.app.FragmentStatePagerAdapter
import android.support.v4.view.PagerAdapter import android.support.v4.view.PagerAdapter
import android.util.SparseArray
import android.view.ViewGroup import android.view.ViewGroup
import com.simplemobiletools.gallery.activities.ViewPagerActivity import com.simplemobiletools.gallery.activities.ViewPagerActivity
import com.simplemobiletools.gallery.fragments.PhotoFragment import com.simplemobiletools.gallery.fragments.PhotoFragment
@ -15,7 +14,7 @@ import com.simplemobiletools.gallery.helpers.MEDIUM
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val media: MutableList<Medium>) : FragmentStatePagerAdapter(fm) { 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 getCount() = media.size
override fun getItem(position: Int): Fragment { override fun getItem(position: Int): Fragment {
@ -43,10 +42,16 @@ class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val m
return fragment return fragment
} }
override fun destroyItem(container: ViewGroup?, position: Int, `object`: Any?) { override fun destroyItem(container: ViewGroup?, position: Int, any: Any?) {
mFragments.remove(position) mFragments.remove(position)
super.destroyItem(container, position, `object`) super.destroyItem(container, position, any)
} }
fun getCurrentFragment(position: Int) = mFragments.get(position) 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 media = context.getFilesFrom("", isPickImage, isPickVideo)
val excludedPaths = config.excludedFolders val excludedPaths = config.excludedFolders
val includedPaths = config.includedFolders
val directories = groupDirectories(media) 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 Directory.sorting = config.directorySorting
dirs.sort() dirs.sort()
return movePinnedToFront(dirs) return movePinnedToFront(dirs)
@ -43,8 +46,8 @@ class GetDirectoriesAsynctask(val context: Context, val isPickVideo: Boolean, va
cancel(true) cancel(true)
val parentDir = File(path).parent ?: continue val parentDir = File(path).parent ?: continue
if (directories.containsKey(parentDir)) { if (directories.containsKey(parentDir.toLowerCase())) {
val directory = directories[parentDir]!! val directory = directories[parentDir.toLowerCase()]!!
val newImageCnt = directory.mediaCnt + 1 val newImageCnt = directory.mediaCnt + 1
directory.mediaCnt = newImageCnt directory.mediaCnt = newImageCnt
directory.addSize(size) 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) val directory = Directory(parentDir, thumbnail, dirName, 1, dateModified, dateTaken, size)
directories.put(parentDir, directory) directories.put(parentDir.toLowerCase(), directory)
} }
} }
return directories 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) val file = File(path)
return if (isThisOrParentExcluded(path, excludedPaths)) return if (isThisOrParentExcluded(path, excludedPaths, includedPaths)) {
false 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("/.") var containsNoMediaOrDot = file.containsNoMedia() || path.contains("/.")
if (!containsNoMediaOrDot) { if (!containsNoMediaOrDot) {
containsNoMediaOrDot = checkParentHasNoMedia(file.parentFile) containsNoMediaOrDot = checkParentHasNoMedia(file.parentFile)
@ -105,7 +108,8 @@ class GetDirectoriesAsynctask(val context: Context, val isPickVideo: Boolean, va
return false 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> { private fun movePinnedToFront(dirs: ArrayList<Directory>): ArrayList<Directory> {
val foundFolders = 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.R
import com.simplemobiletools.gallery.activities.SimpleActivity import com.simplemobiletools.gallery.activities.SimpleActivity
import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.helpers.Config
import kotlinx.android.synthetic.main.dialog_change_sorting.view.* import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
class ChangeSortingDialog(val activity: SimpleActivity, val isDirectorySorting: Boolean, showFolderCheckbox: Boolean, class ChangeSortingDialog(val activity: SimpleActivity, val isDirectorySorting: Boolean, showFolderCheckbox: Boolean,
val path: String = "", val callback: () -> Unit) : val path: String = "", val callback: () -> Unit) :
DialogInterface.OnClickListener { DialogInterface.OnClickListener {
private var currSorting = 0 private var currSorting = 0
private var config: Config = activity.config private var config = activity.config
private var view: View private var view: View
init { init {
@ -85,6 +84,6 @@ class ChangeSortingDialog(val activity: SimpleActivity, val isDirectorySorting:
config.fileSorting = sorting 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.* import kotlinx.android.synthetic.main.dialog_exclude_folder.view.*
class ExcludeFolderDialog(val activity: SimpleActivity, val selectedPaths: List<String>, val callback: () -> Unit) { class ExcludeFolderDialog(val activity: SimpleActivity, val selectedPaths: List<String>, val callback: () -> Unit) {
var dialog: AlertDialog? = null
val alternativePaths = getAlternativePathsList() val alternativePaths = getAlternativePathsList()
var radioGroup: RadioGroup? = null var radioGroup: RadioGroup? = null
@ -46,7 +45,7 @@ class ExcludeFolderDialog(val activity: SimpleActivity, val selectedPaths: List<
private fun dialogConfirmed() { private fun dialogConfirmed() {
val path = if (alternativePaths.isEmpty()) selectedPaths[0] else alternativePaths[radioGroup!!.checkedRadioButtonId] val path = if (alternativePaths.isEmpty()) selectedPaths[0] else alternativePaths[radioGroup!!.checkedRadioButtonId]
activity.config.addExcludedFolder(path) activity.config.addExcludedFolder(path)
callback.invoke() callback()
} }
private fun getAlternativePathsList(): List<String> { private fun getAlternativePathsList(): List<String> {

View file

@ -1,9 +1,12 @@
package com.simplemobiletools.gallery.dialogs package com.simplemobiletools.gallery.dialogs
import android.support.v7.app.AlertDialog 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.LayoutInflater
import android.view.View
import com.simplemobiletools.commons.dialogs.FilePickerDialog 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.setupDialogStuff
import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.gallery.R 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) { class PickDirectoryDialog(val activity: SimpleActivity, val sourcePath: String, val callback: (path: String) -> Unit) {
var dialog: AlertDialog var dialog: AlertDialog
var directoriesGrid: RecyclerView
var shownDirectories: ArrayList<Directory> = ArrayList() var shownDirectories: ArrayList<Directory> = ArrayList()
var view: View = LayoutInflater.from(activity).inflate(R.layout.dialog_directory_picker, null)
init { init {
val view = LayoutInflater.from(activity).inflate(R.layout.dialog_directory_picker, null) (view.directories_grid.layoutManager as GridLayoutManager).apply {
directoriesGrid = view.directories_grid orientation = if (activity.config.scrollHorizontally) GridLayoutManager.HORIZONTAL else GridLayoutManager.VERTICAL
spanCount = activity.config.dirColumnCnt
}
dialog = AlertDialog.Builder(activity) dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
@ -45,7 +50,7 @@ class PickDirectoryDialog(val activity: SimpleActivity, val sourcePath: String,
fun showOtherFolder() { fun showOtherFolder() {
val showHidden = activity.config.shouldShowHidden val showHidden = activity.config.shouldShowHidden
FilePickerDialog(activity, sourcePath, false, showHidden, true) { FilePickerDialog(activity, sourcePath, false, showHidden, true) {
callback.invoke(it) callback(it)
} }
} }
@ -54,15 +59,31 @@ class PickDirectoryDialog(val activity: SimpleActivity, val sourcePath: String,
return return
shownDirectories = directories shownDirectories = directories
val adapter = DirectoryAdapter(activity, directories, null) { val adapter = DirectoryAdapter(activity, directories, null, true) {
if (it.path.trimEnd('/') == sourcePath) { if (it.path.trimEnd('/') == sourcePath) {
activity.toast(R.string.source_and_destination_same) activity.toast(R.string.source_and_destination_same)
return@DirectoryAdapter return@DirectoryAdapter
} else { } else {
callback.invoke(it.path) callback(it.path)
dialog.dismiss() 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 return
shownMedia = media shownMedia = media
val adapter = MediaAdapter(activity, media, null) { val adapter = MediaAdapter(activity, media, null, true) {
callback(it.path) callback(it.path)
dialog.dismiss() 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)) val newSize = Point(getViewValue(widthView), getViewValue(heightView))
callback.invoke(newSize) callback(newSize)
dismiss() dismiss()
}) })
} }

View file

@ -66,11 +66,11 @@ class SaveAsDialog(val activity: SimpleActivity, val path: String, val callback:
if (newFile.exists()) { if (newFile.exists()) {
val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFile.name) val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFile.name)
ConfirmationDialog(activity, title) { ConfirmationDialog(activity, title) {
callback.invoke(newFile.absolutePath) callback(newFile.absolutePath)
dismiss() dismiss()
} }
} else { } else {
callback.invoke(newFile.absolutePath) callback(newFile.absolutePath)
dismiss() 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.Glide
import com.bumptech.glide.load.DecodeFormat import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy 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.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
@ -194,7 +195,7 @@ fun Activity.launchCamera() {
fun SimpleActivity.launchAbout() { fun SimpleActivity.launchAbout() {
startAboutActivity(R.string.app_name, LICENSE_KOTLIN or LICENSE_GLIDE or LICENSE_CROPPER or LICENSE_MULTISELECT or LICENSE_RTL 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() { 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) { fun Activity.loadImage(path: String, target: MySquareImageView, verticalScroll: Boolean) {
target.isVerticalScrolling = verticalScroll target.isVerticalScrolling = verticalScroll
if (path.isImageFast() || path.isVideoFast()) { if (path.isImageFast() || path.isVideoFast()) {
@ -282,49 +281,55 @@ fun Activity.loadImage(path: String, target: MySquareImageView, verticalScroll:
} }
fun Activity.loadPng(path: String, target: MySquareImageView) { fun Activity.loadPng(path: String, target: MySquareImageView) {
val builder = Glide.with(applicationContext) val options = RequestOptions()
.load(path) .signature(path.getFileSignature())
.asBitmap() .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.signature(getFileSignature(path))
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.format(DecodeFormat.PREFER_ARGB_8888) .format(DecodeFormat.PREFER_ARGB_8888)
if (config.cropThumbnails) builder.centerCrop() else builder.fitCenter() val builder = Glide.with(applicationContext)
builder.into(target) .asBitmap()
.load(path)
if (config.cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options).into(target)
} }
fun Activity.loadJpg(path: String, target: MySquareImageView) { fun Activity.loadJpg(path: String, target: MySquareImageView) {
val options = RequestOptions()
.signature(path.getFileSignature())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
val builder = Glide.with(applicationContext) val builder = Glide.with(applicationContext)
.load(path) .load(path)
.signature(getFileSignature(path))
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.crossFade()
if (config.cropThumbnails) builder.centerCrop() else builder.fitCenter() if (config.cropThumbnails) options.centerCrop() else options.fitCenter()
builder.into(target) builder.apply(options).transition(DrawableTransitionOptions.withCrossFade()).into(target)
} }
fun Activity.loadAnimatedGif(path: String, target: MySquareImageView) { fun Activity.loadAnimatedGif(path: String, target: MySquareImageView) {
val builder = Glide.with(applicationContext) val options = RequestOptions()
.load(path) .signature(path.getFileSignature())
.asGif()
.signature(getFileSignature(path))
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.crossFade()
if (config.cropThumbnails) builder.centerCrop() else builder.fitCenter() val builder = Glide.with(applicationContext)
builder.into(target) .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) { fun Activity.loadStaticGif(path: String, target: MySquareImageView) {
val builder = Glide.with(applicationContext) val options = RequestOptions()
.load(path) .signature(path.getFileSignature())
.asBitmap() .diskCacheStrategy(DiskCacheStrategy.DATA)
.signature(getFileSignature(path))
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
if (config.cropThumbnails) builder.centerCrop() else builder.fitCenter() val builder = Glide.with(applicationContext)
builder.into(target) .asBitmap()
.load(path)
if (config.cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options).into(target)
} }
fun Activity.getCachedDirectories(): ArrayList<Directory> { fun Activity.getCachedDirectories(): ArrayList<Directory> {

View file

@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.database.Cursor import android.database.Cursor
import android.media.AudioManager
import android.net.Uri import android.net.Uri
import android.provider.MediaStore import android.provider.MediaStore
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
@ -21,6 +22,7 @@ import java.io.File
import java.util.* import java.util.*
val Context.portrait get() = resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT 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? { fun Context.getRealPathFromURI(uri: Uri): String? {
var cursor: Cursor? = null var cursor: Cursor? = null
@ -73,6 +75,7 @@ private fun parseCursor(context: Context, cur: Cursor, isPickImage: Boolean, isP
val config = context.config val config = context.config
val showMedia = config.showMedia val showMedia = config.showMedia
val showHidden = config.shouldShowHidden val showHidden = config.shouldShowHidden
val includedFolders = config.includedFolders
val excludedFolders = config.excludedFolders val excludedFolders = config.excludedFolders
val noMediaFolders = context.getNoMediaFolders() val noMediaFolders = context.getNoMediaFolders()
@ -111,14 +114,19 @@ private fun parseCursor(context: Context, cur: Cursor, isPickImage: Boolean, isP
var isExcluded = false var isExcluded = false
excludedFolders.forEach { excludedFolders.forEach {
if (path.startsWith(it)) { if (path.startsWith("$it/")) {
isExcluded = true isExcluded = true
includedFolders.forEach {
if (path.startsWith("$it/")) {
isExcluded = false
}
}
} }
} }
if (!isExcluded && !showHidden) { if (!isExcluded && !showHidden) {
noMediaFolders.forEach { noMediaFolders.forEach {
if (path.startsWith(it)) { if (path.startsWith("$it/")) {
isExcluded = true 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) { for (file in it) {
val size = file.length() val size = file.length()
if (size <= 0L) { 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.Matrix
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.Priority import com.bumptech.glide.Priority
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.DecodeFormat import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy 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.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
import com.davemorrissey.labs.subscaleview.ImageSource import com.davemorrissey.labs.subscaleview.ImageSource
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
@ -33,7 +38,6 @@ import com.simplemobiletools.gallery.helpers.MEDIUM
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
import it.sephiroth.android.library.exif2.ExifInterface import it.sephiroth.android.library.exif2.ExifInterface
import kotlinx.android.synthetic.main.pager_photo_item.view.* import kotlinx.android.synthetic.main.pager_photo_item.view.*
import uk.co.senab.photoview.PhotoViewAttacher
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.IOException import java.io.IOException
@ -43,7 +47,6 @@ class PhotoFragment : ViewPagerFragment() {
lateinit var view: ViewGroup lateinit var view: ViewGroup
private var isFragmentVisible = false private var isFragmentVisible = false
private var wasInit = false private var wasInit = false
private var RATIO_THRESHOLD = 0.1
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
view = inflater.inflate(R.layout.pager_photo_item, container, false) as ViewGroup view = inflater.inflate(R.layout.pager_photo_item, container, false) as ViewGroup
@ -89,21 +92,16 @@ class PhotoFragment : ViewPagerFragment() {
view.photo_view.apply { view.photo_view.apply {
maximumScale = 8f maximumScale = 8f
mediumScale = 3f mediumScale = 3f
setOnPhotoTapListener(object : PhotoViewAttacher.OnPhotoTapListener { setOnOutsidePhotoTapListener {
override fun onPhotoTap(view: View?, x: Float, y: Float) {
photoClicked() photoClicked()
} }
override fun onOutsidePhotoTap() { setOnPhotoTapListener { view, x, y ->
photoClicked() photoClicked()
} }
})
} }
loadImage() loadImage()
activity.window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
listener?.systemUiVisibilityChanged(visibility)
}
wasInit = true wasInit = true
return view return view
@ -147,12 +145,15 @@ class PhotoFragment : ViewPagerFragment() {
private fun loadImage() { private fun loadImage() {
if (medium.isGif()) { if (medium.isGif()) {
Glide.with(this) val options = RequestOptions()
.load(medium.path)
.asGif()
.crossFade()
.priority(if (isFragmentVisible) Priority.IMMEDIATE else Priority.LOW) .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) .into(view.photo_view)
} else { } else {
loadBitmap() loadBitmap()
@ -164,31 +165,37 @@ class PhotoFragment : ViewPagerFragment() {
val targetWidth = if (ViewPagerActivity.screenWidth == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenWidth val targetWidth = if (ViewPagerActivity.screenWidth == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenWidth
val targetHeight = if (ViewPagerActivity.screenHeight == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenHeight val targetHeight = if (ViewPagerActivity.screenHeight == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenHeight
Glide.with(this) val options = RequestOptions()
.load(medium.path) .signature(medium.path.getFileSignature())
.asBitmap() .format(DecodeFormat.PREFER_ARGB_8888)
.signature(activity.getFileSignature(medium.path))
.format(if (medium.isPng()) DecodeFormat.PREFER_ARGB_8888 else DecodeFormat.PREFER_RGB_565)
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.override(targetWidth, targetHeight) .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 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) if (isFragmentVisible)
addZoomableView() addZoomableView()
return false return false
} }
}).into(view.photo_view) }).into(view.photo_view)
} else { } else {
Glide.with(this) val options = RequestOptions()
.load(medium.path)
.asBitmap()
.transform(GlideRotateTransformation(context, degrees))
.thumbnail(0.2f)
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.transform(GlideRotateTransformation(context, degrees))
Glide.with(this)
.asBitmap()
.load(medium.path)
.thumbnail(0.2f)
.apply(options)
.into(view.photo_view) .into(view.photo_view)
} }
} }
@ -249,9 +256,9 @@ class PhotoFragment : ViewPagerFragment() {
} }
} }
override fun onDestroyView() { fun refreshBitmap() {
super.onDestroyView() view.subsampling_view.beGone()
Glide.clear(view.photo_view) loadBitmap()
} }
fun rotateImageViewBy(degrees: Float) { fun rotateImageViewBy(degrees: Float) {
@ -259,7 +266,14 @@ class PhotoFragment : ViewPagerFragment() {
loadBitmap(degrees) 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) super.onConfigurationChanged(newConfig)
loadImage() loadImage()
} }
@ -267,4 +281,8 @@ class PhotoFragment : ViewPagerFragment() {
private fun photoClicked() { private fun photoClicked() {
listener?.fragmentClicked() listener?.fragmentClicked()
} }
override fun fullscreenToggled(isFullscreen: Boolean) {
}
} }

View file

@ -7,6 +7,7 @@ import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.provider.Settings
import android.util.DisplayMetrics import android.util.DisplayMetrics
import android.util.Log import android.util.Log
import android.view.* import android.view.*
@ -17,6 +18,8 @@ import com.simplemobiletools.commons.extensions.getFormattedDuration
import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.gallery.R 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.config
import com.simplemobiletools.gallery.extensions.getNavBarHeight import com.simplemobiletools.gallery.extensions.getNavBarHeight
import com.simplemobiletools.gallery.extensions.hasNavBar import com.simplemobiletools.gallery.extensions.hasNavBar
@ -26,6 +29,8 @@ import kotlinx.android.synthetic.main.pager_video_item.view.*
import java.io.IOException import java.io.IOException
class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSeekBarChangeListener { 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 mMediaPlayer: MediaPlayer? = null
private var mSurfaceView: SurfaceView? = null private var mSurfaceView: SurfaceView? = null
@ -39,9 +44,21 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
private var mIsDragged = false private var mIsDragged = false
private var mIsFullscreen = false private var mIsFullscreen = false
private var mIsFragmentVisible = false private var mIsFragmentVisible = false
private var mPlayOnPrepare = false
private var mCurrTime = 0 private var mCurrTime = 0
private var mDuration = 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 mView: View
lateinit var medium: Medium 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 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() checkFullscreen()
listener?.systemUiVisibilityChanged(visibility)
}
return mView return mView
} }
@ -87,6 +98,15 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
mSurfaceHolder!!.addCallback(this) mSurfaceHolder!!.addCallback(this)
mSurfaceView!!.setOnClickListener({ toggleFullscreen() }) mSurfaceView!!.setOnClickListener({ toggleFullscreen() })
mView.video_holder.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() initTimeHolder()
} }
@ -95,8 +115,9 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
super.setMenuVisibility(menuVisible) super.setMenuVisibility(menuVisible)
mIsFragmentVisible = menuVisible mIsFragmentVisible = menuVisible
if (menuVisible) { if (menuVisible) {
if (mSurfaceView != null) if (mSurfaceView != null && mSurfaceHolder!!.surface.isValid) {
initMediaPlayer() initMediaPlayer()
}
if (context?.config?.autoplayVideos == true) { if (context?.config?.autoplayVideos == true) {
playVideo() 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) super.onConfigurationChanged(newConfig)
setVideoSize() setVideoSize()
initTimeHolder() initTimeHolder()
} }
private fun toggleFullscreen() { private fun toggleFullscreen() {
mIsFullscreen = !mIsFullscreen
checkFullscreen()
listener?.fragmentClicked() 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() { private fun initTimeHolder() {
mTimeHolder = mView.video_time_holder mTimeHolder = mView.video_time_holder
val res = resources val res = resources
@ -201,9 +339,13 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
} }
} }
private fun playVideo() { fun playVideo() {
if (mMediaPlayer != null) {
mIsPlaying = true mIsPlaying = true
mMediaPlayer?.start() mMediaPlayer?.start()
} else {
mPlayOnPrepare = true
}
mView.video_play_outline.setImageDrawable(null) mView.video_play_outline.setImageDrawable(null)
activity.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) activity.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} }
@ -278,12 +420,12 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
setupTimeHolder() setupTimeHolder()
setProgress(mCurrTime) setProgress(mCurrTime)
if (mIsFragmentVisible && context.config.autoplayVideos) if (mIsFragmentVisible && (context.config.autoplayVideos || mPlayOnPrepare))
playVideo() playVideo()
} }
private fun videoCompleted() { private fun videoCompleted() {
if (context.config.loopVideos) { if (listener?.videoEnded() == false && context.config.loopVideos) {
playVideo() playVideo()
} else { } else {
mSeekBar!!.progress = mSeekBar!!.max mSeekBar!!.progress = mSeekBar!!.max
@ -366,9 +508,14 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
if (!mIsPlaying) { if (!mIsPlaying) {
togglePlayPause() togglePlayPause()
} else { } else {
mMediaPlayer!!.start() mMediaPlayer?.start()
} }
mIsDragged = false 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() { abstract class ViewPagerFragment : Fragment() {
var listener: FragmentListener? = null var listener: FragmentListener? = null
abstract fun fullscreenToggled(isFullscreen: Boolean)
interface FragmentListener { interface FragmentListener {
fun fragmentClicked() fun fragmentClicked()
fun systemUiVisibilityChanged(visibility: Int) fun videoEnded(): Boolean
} }
} }

View file

@ -224,4 +224,36 @@ class Config(context: Context) : BaseConfig(context) {
var scrollHorizontally: Boolean var scrollHorizontally: Boolean
get() = prefs.getBoolean(SCROLL_HORIZONTALLY, false) get() = prefs.getBoolean(SCROLL_HORIZONTALLY, false)
set(scrollHorizontally) = prefs.edit().putBoolean(SCROLL_HORIZONTALLY, scrollHorizontally).apply() 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 INCLUDED_FOLDERS = "included_folders"
val ALBUM_COVERS = "album_covers" val ALBUM_COVERS = "album_covers"
val SCROLL_HORIZONTALLY = "scroll_horizontally" 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" val NOMEDIA = ".nomedia"

View file

@ -5,9 +5,9 @@ import android.graphics.Bitmap
import android.graphics.Matrix import android.graphics.Matrix
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import java.security.MessageDigest
class GlideRotateTransformation(context: Context, val rotateRotationAngle: Float) : BitmapTransformation(context) { class GlideRotateTransformation(context: Context, val rotateRotationAngle: Float) : BitmapTransformation(context) {
override fun transform(pool: BitmapPool, bitmap: Bitmap, outWidth: Int, outHeight: Int): Bitmap { override fun transform(pool: BitmapPool, bitmap: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
if (rotateRotationAngle % 360 == 0f) if (rotateRotationAngle % 360 == 0f)
return bitmap 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) 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 package com.simplemobiletools.gallery.models
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.helpers.SORT_BY_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
import java.io.Serializable 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, 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 { override fun compareTo(other: Directory): Int {
var result: Int var result: Int
if (sorting and SORT_BY_NAME != 0) { 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) { } else if (sorting and SORT_BY_SIZE != 0) {
result = if (size == other.size) result = if (size == other.size)
0 0

View file

@ -3,10 +3,7 @@ package com.simplemobiletools.gallery.models
import com.simplemobiletools.commons.extensions.getMimeType import com.simplemobiletools.commons.extensions.getMimeType
import com.simplemobiletools.commons.extensions.isGif import com.simplemobiletools.commons.extensions.isGif
import com.simplemobiletools.commons.extensions.isPng import com.simplemobiletools.commons.extensions.isPng
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.helpers.SORT_BY_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
import java.io.File import java.io.File
import java.io.Serializable 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 isGif() = path.isGif()
fun isJpg() = path.endsWith(".jpg", true) || path.endsWith(".jpeg", true)
fun isImage() = !isGif() && !video fun isImage() = !isGif() && !video
fun getMimeType() = File(path).getMimeType() fun getMimeType() = File(path).getMimeType()
override fun compareTo(other: Medium): Int { override fun compareTo(other: Medium): Int {
var res: Int var result: Int
if (sorting and SORT_BY_NAME != 0) { 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) { } else if (sorting and SORT_BY_SIZE != 0) {
res = if (size == other.size) result = if (size == other.size)
0 0
else if (size > other.size) else if (size > other.size)
1 1
else else
-1 -1
} else if (sorting and SORT_BY_DATE_MODIFIED != 0) { } else if (sorting and SORT_BY_DATE_MODIFIED != 0) {
res = if (modified == other.modified) result = if (modified == other.modified)
0 0
else if (modified > other.modified) else if (modified > other.modified)
1 1
else else
-1 -1
} else { } else {
res = if (taken == other.taken) result = if (taken == other.taken)
0 0
else if (taken > other.taken) else if (taken > other.taken)
1 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) { 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_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.simplemobiletools.gallery.views.MyScalableRecyclerView <com.simplemobiletools.commons.views.MyScalableRecyclerView
android:id="@+id/directories_grid" android:id="@+id/directories_grid"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -20,13 +20,41 @@
app:spanCount="@integer/directory_columns_vertical_scroll"/> app:spanCount="@integer/directory_columns_vertical_scroll"/>
<com.simplemobiletools.commons.views.FastScroller <com.simplemobiletools.commons.views.FastScroller
android:id="@+id/directories_fastscroller" android:id="@+id/directories_vertical_fastscroller"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:paddingLeft="@dimen/normal_margin" 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> </RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout> </android.support.v4.widget.SwipeRefreshLayout>

View file

@ -11,7 +11,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.simplemobiletools.gallery.views.MyScalableRecyclerView <com.simplemobiletools.commons.views.MyScalableRecyclerView
android:id="@+id/media_grid" android:id="@+id/media_grid"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -20,13 +20,41 @@
app:spanCount="@integer/media_columns_vertical_scroll"/> app:spanCount="@integer/media_columns_vertical_scroll"/>
<com.simplemobiletools.commons.views.FastScroller <com.simplemobiletools.commons.views.FastScroller
android:id="@+id/media_fastscroller" android:id="@+id/media_vertical_fastscroller"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:paddingLeft="@dimen/normal_margin" 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> </RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout> </android.support.v4.widget.SwipeRefreshLayout>

View file

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

View file

@ -1,10 +1,55 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" 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:id="@+id/directories_grid"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_margin" android:scrollbars="none"
app:layoutManager="android.support.v7.widget.GridLayoutManager" app:layoutManager="android.support.v7.widget.GridLayoutManager"
app:spanCount="@integer/directory_columns_vertical_scroll"/> 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:layout_height="wrap_content"
android:padding="1px"> 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 <ImageView
android:id="@+id/dir_pin" android:id="@+id/dir_pin"
android:layout_width="@dimen/pin_size" android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/pin_size" android:layout_height="@dimen/selection_check_size"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_margin="@dimen/small_margin" android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_black_background"
android:padding="@dimen/small_margin"
android:src="@drawable/ic_pin"/> android:src="@drawable/ic_pin"/>
<ImageView <ImageView
@ -29,7 +46,9 @@
android:id="@+id/dir_bottom_holder" android:id="@+id/dir_bottom_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignLeft="@+id/dir_thumbnail"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/dir_thumbnail"
android:gravity="bottom" android:gravity="bottom"
android:orientation="vertical" android:orientation="vertical"
android:paddingBottom="@dimen/small_margin" android:paddingBottom="@dimen/small_margin"
@ -55,4 +74,19 @@
android:textSize="@dimen/normal_text_size"/> android:textSize="@dimen/normal_text_size"/>
</LinearLayout> </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> </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_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<uk.co.senab.photoview.PhotoView <com.github.chrisbanes.photoview.PhotoView
android:id="@+id/photo_view" android:id="@+id/photo_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent"/>

View file

@ -12,6 +12,18 @@
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:background="@android:color/transparent"/> 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 <ImageView
android:id="@+id/video_play_outline" android:id="@+id/video_play_outline"
android:layout_width="@dimen/play_outline_size_big" android:layout_width="@dimen/play_outline_size_big"
@ -21,6 +33,23 @@
android:padding="@dimen/activity_margin" android:padding="@dimen/activity_margin"
android:src="@drawable/img_play_outline_big"/> 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 <RelativeLayout
android:id="@+id/video_time_holder" android:id="@+id/video_time_holder"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View file

@ -6,16 +6,31 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="1px"> 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 <ImageView
android:id="@+id/play_outline" android:id="@+id/medium_check"
android:layout_width="@dimen/play_outline_size" android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/play_outline_size" android:layout_height="@dimen/selection_check_size"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_alignParentTop="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:src="@drawable/img_play_outline"
android:visibility="gone"/> android:visibility="gone"/>
@ -23,11 +38,12 @@
android:id="@+id/photo_name" android:id="@+id/photo_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignLeft="@+id/medium_thumbnail"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/medium_thumbnail"
android:background="@drawable/gradient_background" android:background="@drawable/gradient_background"
android:gravity="bottom" android:gravity="bottom"
android:maxLines="3" android:maxLines="3"
android:minHeight="@dimen/play_outline_size"
android:paddingBottom="@dimen/small_margin" android:paddingBottom="@dimen/small_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingRight="@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" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/cab_properties" android:id="@+id/cab_delete"
android:icon="@drawable/ic_info" android:icon="@drawable/ic_delete"
android:title="@string/properties" android:title="@string/delete"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/cab_pin" android:id="@+id/cab_pin"
@ -16,6 +16,11 @@
android:icon="@drawable/ic_unpin" android:icon="@drawable/ic_unpin"
android:title="@string/unpin_folder" android:title="@string/unpin_folder"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_properties"
android:icon="@drawable/ic_info"
android:title="@string/properties"
app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/cab_rename" android:id="@+id/cab_rename"
android:icon="@drawable/ic_rename" android:icon="@drawable/ic_rename"
@ -61,9 +66,4 @@
android:title="@string/use_default"/> android:title="@string/use_default"/>
</menu> </menu>
</item> </item>
<item
android:id="@+id/cab_delete"
android:icon="@drawable/ic_delete"
android:title="@string/delete"
app:showAsAction="ifRoom"/>
</menu> </menu>

View file

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

View file

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

View file

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

View file

@ -1,23 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> 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 <item
android:id="@+id/menu_save_as" android:id="@+id/menu_save_as"
android:icon="@drawable/ic_check" android:icon="@drawable/ic_check"
@ -30,10 +13,25 @@
android:title="@string/delete" android:title="@string/delete"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/menu_share" android:id="@+id/menu_share_1"
android:icon="@drawable/ic_share" android:icon="@drawable/ic_share"
android:title="@string/share" android:title="@string/share"
app:showAsAction="ifRoom"/> 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 <item
android:id="@+id/menu_copy_to" android:id="@+id/menu_copy_to"
android:title="@string/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="no_camera_app_found">Nebyla nalezena žádná fotografická aplikace</string>
<string name="increase_column_count">Zvýšit počet sloupců</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="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="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string> <string name="select_photo">Select photo</string>
<string name="use_default">Use default</string> <string name="use_default">Use default</string>
<string name="set_as">Nastavit jako</string> <string name="set_as">Nastavit jako</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- 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> <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">Překlopit</string>
<string name="flip_horizontally">Překlopit vodorovně</string> <string name="flip_horizontally">Překlopit vodorovně</string>
<string name="flip_vertically">Překlopit svisle</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> <string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string> <string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape 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 --> <!-- Settings -->
<string name="show_hidden_media">Zobrazit skryté média</string> <string name="show_hidden_media">Zobrazit skryté média</string>
<string name="autoplay_videos">Automaticky přehrávat videa</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="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</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">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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Keine Kamera-App gefunden</string> <string name="no_camera_app_found">Keine Kamera-App gefunden</string>
<string name="increase_column_count">Kacheln verkleinern</string> <string name="increase_column_count">Kacheln verkleinern</string>
<string name="reduce_column_count">Kacheln vergrößern</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">Cover-Bild ändern</string>
<string name="change_cover_image">Change cover image</string> <string name="select_photo">Auswählen</string>
<string name="select_photo">Bild auswählen</string> <string name="use_default">Standard</string>
<string name="use_default">Standard verwenden</string>
<string name="set_as">Festlegen als</string> <string name="set_as">Festlegen als</string>
<string name="volume">Lautstärke</string>
<string name="brightness">Helligkeit</string>
<!-- Hide / Exclude --> <!-- 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> <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="path">Pfad</string>
<string name="invalid_image_path">Ungültiger Dateipfad</string> <string name="invalid_image_path">Ungültiger Dateipfad</string>
<string name="image_editing_failed">Bildbearbeitung fehlgeschlagen</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="no_editor_found">Keine Bildeditor-App gefunden</string>
<string name="unknown_file_location">Unbekannter Dateiort</string> <string name="unknown_file_location">Unbekannter Dateiort</string>
<string name="error_saving_file">Konnte Quelldatei nicht überschreiben</string> <string name="error_saving_file">Konnte Quelldatei nicht überschreiben</string>
@ -67,20 +68,30 @@
<string name="flip">Spiegeln</string> <string name="flip">Spiegeln</string>
<string name="flip_horizontally">Horizontal spiegeln</string> <string name="flip_horizontally">Horizontal spiegeln</string>
<string name="flip_vertically">Vertikal spiegeln</string> <string name="flip_vertically">Vertikal spiegeln</string>
<string name="out_of_memory_error">Fehler: Zuwenig Speicher</string> <string name="edit_with">Bearbeiten mit</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Schlichter Hintergrund</string> <string name="simple_wallpaper">Schlichter Hintergrund</string>
<string name="set_as_wallpaper">Als Hintergrund festlegen</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_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="no_capable_app_found">Keine Hintergrundbild-App gefunden</string>
<string name="setting_wallpaper">Hintergrund festlegen&#8230;</string> <string name="setting_wallpaper">Hintergrund festlegen&#8230;</string>
<string name="wallpaper_set_successfully">Hintergrundbild erfolgreich festgelegt</string> <string name="wallpaper_set_successfully">Hintergrundbild erfolgreich festgelegt</string>
<string name="portrait_aspect_ratio">Hochformat</string> <string name="portrait_aspect_ratio">Hochformat</string>
<string name="landscape_aspect_ratio">Querformat</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 --> <!-- Settings -->
<string name="show_hidden_media">Versteckte Ordner zeigen</string> <string name="show_hidden_media">Versteckte Ordner zeigen</string>
<string name="autoplay_videos">Videos automatisch abspielen</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_videos_gifs">Bilder, Videos und GIFs</string>
<string name="images_and_videos">Bilder und Videos</string> <string name="images_and_videos">Bilder und Videos</string>
<string name="loop_videos">Videos in Endlosschleife spielen</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="max_brightness">Helligkeit beim Betrachten maximieren</string>
<string name="crop_thumbnails">Kacheln quadratisch zuschneiden</string> <string name="crop_thumbnails">Kacheln quadratisch zuschneiden</string>
<string name="screen_rotation_by">Im Vollbild ausrichten nach</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="screen_rotation_aspect_ratio">Seitenverhältnis</string>
<string name="dark_background_at_fullscreen">Schwarzer Hintergrund im Vollbild</string> <string name="dark_background_at_fullscreen">Schwarzer Hintergrund im Vollbild</string>
<string name="scroll_thumbnails_horizontally">Kacheln horizontal scrollen</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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">Simple Gallery</string> <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="edit">Editar</string>
<string name="open_camera">Abrir cámara</string> <string name="open_camera">Abrir cámara</string>
<string name="open_with">Abrir con&#8230;</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="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="increase_column_count">Aumentar el número de columnas</string>
<string name="reduce_column_count">Reducir 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">Cambiar imagen de portada</string>
<string name="change_cover_image">Change cover image</string> <string name="select_photo">Seleccionar imagen</string>
<string name="select_photo">Select photo</string> <string name="use_default">Uso por defecto</string>
<string name="use_default">Use default</string> <string name="set_as">Establecer como</string>
<string name="set_as">Set as</string> <string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- 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> <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="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_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="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">Eliminar todo</string>
<string name="remove_all_description">¿Eliminar todas las carpetas de la lista de excluidas? Esto no borrará las carpetas.</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">Girar</string>
<string name="flip_horizontally">Horizontalmente</string> <string name="flip_horizontally">Horizontalmente</string>
<string name="flip_vertically">Verticalmente</string> <string name="flip_vertically">Verticalmente</string>
<string name="out_of_memory_error">Error: sin memoria</string> <string name="edit_with">Editar con</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Fondos de pantalla Simple Gallery</string> <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="portrait_aspect_ratio">Relación de aspecto tipo retrato</string>
<string name="landscape_aspect_ratio">Relación de aspecto tipo paisaje</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 --> <!-- Settings -->
<string name="show_hidden_media">Mostrar carpetas ocultas</string> <string name="show_hidden_media">Mostrar carpetas ocultas</string>
<string name="autoplay_videos">Reproducir vídeos automáticamente</string> <string name="autoplay_videos">Reproducir vídeos automáticamente</string>
@ -88,8 +99,8 @@
<string name="show_media">Mostrar multimedia</string> <string name="show_media">Mostrar multimedia</string>
<string name="images">Solo imágenes</string> <string name="images">Solo imágenes</string>
<string name="videos">Solo vídeos</string> <string name="videos">Solo vídeos</string>
<string name="gifs">GIFs only</string> <string name="gifs">solo GIFs</string>
<string name="images_videos_gifs">Images, videos, 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="images_and_videos">Imágenes y vídeos</string>
<string name="loop_videos">Reproducción continua de vídeos</string> <string name="loop_videos">Reproducción continua de vídeos</string>
<string name="animate_gifs">Animar las miniaturas de GIFs</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_device_rotation">Rotación del dispositivo</string>
<string name="screen_rotation_aspect_ratio">Relación de aspecto</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="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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -3,7 +3,7 @@
<string name="app_name">Simple Galerie</string> <string name="app_name">Simple Galerie</string>
<string name="app_launcher_name">Galerie</string> <string name="app_launcher_name">Galerie</string>
<string name="edit">Édition</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="open_with">Ouvrir avec</string>
<string name="no_app_found">Aucune application valide trouvée</string> <string name="no_app_found">Aucune application valide trouvée</string>
<string name="hidden">(caché)</string> <string name="hidden">(caché)</string>
@ -16,14 +16,15 @@
<string name="show_on_map">Afficher sur la carte</string> <string name="show_on_map">Afficher sur la carte</string>
<string name="unknown_location">Position inconnue</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_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="increase_column_count">Augmenter le nombre de colonnes</string>
<string name="reduce_column_count">Réduire 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="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="use_default">Use default</string>
<string name="set_as">Set as</string> <string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Luminosité</string>
<!-- Hide / Exclude --> <!-- 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> <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="rotate_one_eighty">Pivoter à 180º</string>
<string name="flip">Retourner</string> <string name="flip">Retourner</string>
<string name="flip_horizontally">Retourner horizontalement</string> <string name="flip_horizontally">Retourner horizontalement</string>
<string name="flip_vertically">Retourner verticallement</string> <string name="flip_vertically">Retourner verticalement</string>
<string name="out_of_memory_error">Erreur excès de mémoire</string> <string name="edit_with">Éditer avec</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Simple fond d\'écran</string> <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_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="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="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="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="wallpaper_set_successfully">Fond d\'écran défini avec succès</string>
<string name="portrait_aspect_ratio">Ratio aspect Portrait</string> <string name="portrait_aspect_ratio">Ratio aspect Portrait</string>
<string name="landscape_aspect_ratio">Ratio aspect Paysage</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 --> <!-- Settings -->
<string name="show_hidden_media">Afficher les dossiers cachés</string> <string name="show_hidden_media">Afficher les dossiers cachés</string>
<string name="autoplay_videos">Lecture automatique des vidéos</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="show_media">Afficher les médias</string>
<string name="images">Seulement les images</string> <string name="images">Seulement les images</string>
<string name="videos">Vidéos uniquement</string> <string name="videos">Vidéos uniquement</string>
<string name="gifs">GIFs only</string> <string name="gifs">GIFs seulement</string>
<string name="images_videos_gifs">Images, videos, GIFs</string> <string name="images_videos_gifs">Images, vidéos, GIFs</string>
<string name="images_and_videos">Images et vidéos</string> <string name="images_and_videos">Images et vidéos</string>
<string name="loop_videos">Tourner en boucle les 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="animate_gifs">GIFs animés sur les miniatures</string>
<string name="max_brightness">Luminosité maximale lors de l\'affichage de media</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="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_system_setting">Paramètres système</string>
<string name="screen_rotation_device_rotation">Rotation de l\'appareil</string> <string name="screen_rotation_device_rotation">Rotation de l\'appareil</string>
<string name="screen_rotation_aspect_ratio">Ratio d\'aspect</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="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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Un album pour visionner photos et vidéos sans publicité.</string> <string name="app_short_description">Un album pour visionner photos et vidéos sans publicité.</string>
<string name="app_long_description"> <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>
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 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="no_camera_app_found">No Camera app has been found</string>
<string name="increase_column_count">Increase column count</string> <string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce 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="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string> <string name="select_photo">Select photo</string>
<string name="use_default">Use default</string> <string name="use_default">Use default</string>
<string name="set_as">Set as</string> <string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- 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="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">Flip</string>
<string name="flip_horizontally">Flip horizontally</string> <string name="flip_horizontally">Flip horizontally</string>
<string name="flip_vertically">Flip vertically</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="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string> <string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape 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 --> <!-- Settings -->
<string name="show_hidden_media">Show hidden media</string> <string name="show_hidden_media">Show hidden media</string>
<string name="autoplay_videos">Play videos automatically</string> <string name="autoplay_videos">Play videos automatically</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Aspect ratio</string> <string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</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">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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Nessuna app fotocamera trovata</string> <string name="no_camera_app_found">Nessuna app fotocamera trovata</string>
<string name="increase_column_count">Aumenta numero colonne</string> <string name="increase_column_count">Aumenta numero colonne</string>
<string name="reduce_column_count">Riduci 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">Cambia immagine copertina</string>
<string name="change_cover_image">Change cover image</string> <string name="select_photo">Seleziona foto</string>
<string name="select_photo">Select photo</string> <string name="use_default">Usa predefinita</string>
<string name="use_default">Use default</string> <string name="set_as">Imposta come</string>
<string name="set_as">Set as</string> <string name="volume">Volume</string>
<string name="brightness">Luminosità</string>
<!-- Hide / Exclude --> <!-- 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> <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">Capovolgi</string>
<string name="flip_horizontally">Capovolgi orizzontalmente</string> <string name="flip_horizontally">Capovolgi orizzontalmente</string>
<string name="flip_vertically">Capovolgi verticalmente</string> <string name="flip_vertically">Capovolgi verticalmente</string>
<string name="out_of_memory_error">Errore memoria esaurita</string> <string name="edit_with">Modifica con</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Sfondo semplice</string> <string name="simple_wallpaper">Sfondo semplice</string>
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Proporzioni ritratto</string> <string name="portrait_aspect_ratio">Proporzioni ritratto</string>
<string name="landscape_aspect_ratio">Proporzioni panorama</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 --> <!-- Settings -->
<string name="show_hidden_media">Mostra cartelle nascoste</string> <string name="show_hidden_media">Mostra cartelle nascoste</string>
<string name="autoplay_videos">Riproduci video automaticamente</string> <string name="autoplay_videos">Riproduci video automaticamente</string>
@ -88,8 +99,8 @@
<string name="show_media">Mostra tipo di media</string> <string name="show_media">Mostra tipo di media</string>
<string name="images">Solo immagini</string> <string name="images">Solo immagini</string>
<string name="videos">Solo video</string> <string name="videos">Solo video</string>
<string name="gifs">GIFs only</string> <string name="gifs">Solo GIF</string>
<string name="images_videos_gifs">Images, videos, GIFs</string> <string name="images_videos_gifs">Immagini, video, GIF</string>
<string name="images_and_videos">Immagini e video</string> <string name="images_and_videos">Immagini e video</string>
<string name="loop_videos">Ripeti i video</string> <string name="loop_videos">Ripeti i video</string>
<string name="animate_gifs">Anima le GIF in miniatura</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_device_rotation">Rotazione dispositivo</string>
<string name="screen_rotation_aspect_ratio">Proporzioni</string> <string name="screen_rotation_aspect_ratio">Proporzioni</string>
<string name="dark_background_at_fullscreen">Sfondo scuro a schermo intero</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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">No Camera app 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="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce 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="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string> <string name="select_photo">Select photo</string>
<string name="use_default">Use default</string> <string name="use_default">Use default</string>
<string name="set_as">Set as</string> <string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- 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="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">Flip</string>
<string name="flip_horizontally">Flip horizontally</string> <string name="flip_horizontally">Flip horizontally</string>
<string name="flip_vertically">Flip vertically</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="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string> <string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape 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 --> <!-- Settings -->
<string name="show_hidden_media">非表示フォルダーを表示</string> <string name="show_hidden_media">非表示フォルダーを表示</string>
<string name="autoplay_videos">自動的にビデオを再生</string> <string name="autoplay_videos">自動的にビデオを再生</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Aspect ratio</string> <string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</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">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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">Simple Gallery</string> <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="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="open_with">Otwórz w</string>
<string name="no_app_found">Nie znaleziono danych aplikacji</string> <string name="no_app_found">Nie znaleziono danych aplikacji</string>
<string name="hidden">(ukryty)</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="unpin_folder">Wypakuj folder</string>
<string name="show_all">Pokaż wszystko</string> <string name="show_all">Pokaż wszystko</string>
<string name="all_folders">Wszystkie foldery</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="no_camera_app_found">Brak aplikacji powiązanej z aparatem</string>
<string name="increase_column_count">Zwiększ liczbę kolumn</string> <string name="increase_column_count">Zwiększ liczbę kolumn</string>
<string name="reduce_column_count">Zmniejsz 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">Zmień okładkę</string>
<string name="change_cover_image">Change cover image</string> <string name="select_photo">Wybierz obraz</string>
<string name="select_photo">Select photo</string> <string name="use_default">Użyj domyślnej</string>
<string name="use_default">Use default</string> <string name="set_as">Ustaw jako</string>
<string name="set_as">Set as</string> <string name="volume">Głośność</string>
<string name="brightness">Jasność</string>
<!-- Hide / Exclude --> <!-- 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="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="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_description">Działa na folderach galerii. Możesz zarządzać wykluczonymi folderami w ustawieniach aplikacji.</string>
<string name="exclude_folder_parent">Wykluczyć folder nadżędny ?</string> <string name="exclude_folder_parent">Wykluczyć folder nadrzę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="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">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 --> <!-- Include folders -->
<string name="include_folders">Included folders</string> <string name="include_folders">Dołączone foldery</string>
<string name="manage_included_folders">Manage included folders</string> <string name="manage_included_folders">Zarządzaj dołączonymi folderami</string>
<string name="add_folder">Add folder</string> <string name="add_folder">Dodaj 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="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 --> <!-- Resizing -->
<string name="resize">Zmień rozmiar</string> <string name="resize">Zmień rozmiar</string>
<string name="resize_and_save">Zmień i zapisz</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="height">Wysokość</string>
<string name="keep_aspect_ratio">Zachowaj proporcje</string> <string name="keep_aspect_ratio">Zachowaj proporcje</string>
<string name="invalid_values">Wpisz poprawną rozdzielczość</string> <string name="invalid_values">Wpisz poprawną rozdzielczość</string>
<!-- Editor --> <!-- Editor -->
<string name="editor">Edycja</string> <string name="editor">Edycja</string>
<string name="save">zapisz</string> <string name="save">Zapisz</string>
<string name="rotate">Obróć</string> <string name="rotate">Obróć</string>
<string name="path">Ścieżka</string> <string name="path">Ścieżka</string>
<string name="invalid_image_path">Nieprawidłowa ś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="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="unknown_file_location">Nieznana lokalizacja pliku</string>
<string name="error_saving_file">Nie udało się zastąpić 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_left">Obróć w lewo</string>
<string name="rotate_right">Obróć w prawo</string> <string name="rotate_right">Obróć w prawo</string>
<string name="rotate_one_eighty">Obróć o 180o</string> <string name="rotate_one_eighty">Obróć o 180 stopni</string>
<string name="flip">Flip</string> <string name="flip">Przewróć</string>
<string name="flip_horizontally">Flip poziomo</string> <string name="flip_horizontally">Przewróć w poziomie</string>
<string name="flip_vertically">Flip pionowo</string> <string name="flip_vertically">Przewróć w pionie</string>
<string name="out_of_memory_error">Błąd pamięci</string> <string name="edit_with">Edytuj w:</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Tapeta</string> <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_failed">Ustawienie tapety nie powiodło się</string>
<string name="set_as_wallpaper_with">Ustaw jako tapetę w:</string> <string name="set_as_wallpaper_with">Ustaw jako tapetę w:</string>
<string name="no_capable_app_found">Brak odpowiednich ustawień</string> <string name="no_capable_app_found">Brak odpowiednich ustawień</string>
<string name="setting_wallpaper">Ustawianie tapety&#8230;</string> <string name="setting_wallpaper">Ustawiam tapetę&#8230;</string>
<string name="wallpaper_set_successfully">Tapeta ustawiona</string> <string name="wallpaper_set_successfully">Tapeta została ustawiona</string>
<string name="portrait_aspect_ratio">Portrait aspect ratio</string> <string name="portrait_aspect_ratio">Proporcje ekranu w trybie pionowym</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</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 --> <!-- Settings -->
<string name="show_hidden_media">Pokaż ukryte foldery</string> <string name="show_hidden_media">Pokazuj ukryte foldery</string>
<string name="autoplay_videos">Odtwarzaj pliki wideo automatycznie</string> <string name="autoplay_videos">Odtwarzaj filmy automatycznie</string>
<string name="toggle_filename">Włącz widoczność nazwy pliku</string> <string name="toggle_filename">Pokazuj / ukrywaj nazwy plików</string>
<string name="show_media">Wybierz co pokazywać</string> <string name="show_media">Pokazywane typy multimediów</string>
<string name="images">Tylko Zdjęcia</string> <string name="images">Tylko obrazy</string>
<string name="videos">Tylko Filmy</string> <string name="videos">Tylko filmy</string>
<string name="gifs">GIFs only</string> <string name="gifs">Tylko GIFy</string>
<string name="images_videos_gifs">Images, videos, GIFs</string> <string name="images_videos_gifs">Obrazy, filmy i GIFy</string>
<string name="images_and_videos">Obrazy i wideo</string> <string name="images_and_videos">Obrazy i filmy</string>
<string name="loop_videos">Pętla wideo</string> <string name="loop_videos">Zapętlaj odtwarzanie filmów</string>
<string name="animate_gifs">Animowanie GIFy z miniaturkami</string> <string name="animate_gifs">Animowane miniatury GIFów</string>
<string name="max_brightness">Max brightness when viewing media</string> <string name="max_brightness">Maksymalna jasność podczas wyświetlania multimediów</string>
<string name="crop_thumbnails">Crop thumbnails into squares</string> <string name="crop_thumbnails">Przycinaj miniatury do kwadratów</string>
<string name="screen_rotation_by">Rotate fullscreen media by</string> <string name="screen_rotation_by">Obracaj pełnoekranowe multimedia według</string>
<string name="screen_rotation_system_setting">System setting</string> <string name="screen_rotation_system_setting">Ustawień systemowych</string>
<string name="screen_rotation_device_rotation">Device rotation</string> <string name="screen_rotation_device_rotation">Orientacji urządzenia</string>
<string name="screen_rotation_aspect_ratio">Aspect ratio</string> <string name="screen_rotation_aspect_ratio">Proporcji</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string> <string name="dark_background_at_fullscreen">Czarne tło przy podglądzie pełnoekranowym</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->
<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"> <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. Niniejsza aplikacja jest tylko częścią naszego zestawu prostych aplikacji. Znajdziecie je na stronie http://www.simplemobiletools.com.
Ta aplikacja jest tylko jedą z większego szeregu naszych aplikacji. Można znaleźć resztę z nich w http://www.simplemobiletools.com
</string> </string>
<!-- <!--
Haven't found some strings? There's more at Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
Polish translation : Dariusz Dróżdż - www.onlan.pl
--> -->
</resources> </resources>

View file

@ -6,7 +6,8 @@
<string name="open_camera">Abrir câmera</string> <string name="open_camera">Abrir câmera</string>
<string name="open_with">Abrir com</string> <string name="open_with">Abrir com</string>
<string name="no_app_found">Nenhum aplicativo encontrado</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="pin_folder">Fixar pasta</string>
<string name="unpin_folder">Desfixar pasta</string> <string name="unpin_folder">Desfixar pasta</string>
<string name="show_all">Mostrar conteúdo de todas as pastas</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="no_camera_app_found">Nenhum aplicativo de câmera encontrado</string>
<string name="increase_column_count">Aumentar número de colunas</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="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="change_cover_image">Trocar imagem de capa</string>
<string name="select_photo">Selecionar foto</string> <string name="select_photo">Selecionar foto</string>
<string name="use_default">Usar padrão</string> <string name="use_default">Usar padrão</string>
<string name="set_as">Set as</string> <string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- 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> <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">Inverter</string>
<string name="flip_horizontally">Horizontalmente</string> <string name="flip_horizontally">Horizontalmente</string>
<string name="flip_vertically">Verticalmente</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">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +82,17 @@
<string name="portrait_aspect_ratio">Retrato</string> <string name="portrait_aspect_ratio">Retrato</string>
<string name="landscape_aspect_ratio">Paisagem</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 --> <!-- Settings -->
<string name="show_hidden_media">Mostrar pastas ocultas</string> <string name="show_hidden_media">Mostrar pastas ocultas</string>
<string name="autoplay_videos">Reproduzir vídeos automaticamente</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="images_and_videos">Imagens e vídeos</string>
<string name="loop_videos">Reproduzir vídeos em ciclo</string> <string name="loop_videos">Reproduzir vídeos em ciclo</string>
<string name="animate_gifs">Animação de GIFs nas miniaturas</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="crop_thumbnails">Recortar miniaturas em quadrados</string>
<string name="screen_rotation_by">Critério para rotação de tela</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> <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="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="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="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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Não existe uma aplicação adequeada</string> <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="increase_column_count">Aumentar número de colunas</string>
<string name="reduce_column_count">Diminuir 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="change_cover_image">Alterar imagem da capa</string>
<string name="select_photo">Selecionar foto</string> <string name="select_photo">Selecionar foto</string>
<string name="use_default">Predefinição</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 --> <!-- 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> <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">Inverter</string>
<string name="flip_horizontally">Horizontalmente</string> <string name="flip_horizontally">Horizontalmente</string>
<string name="flip_vertically">Verticalmente</string> <string name="flip_vertically">Verticalmente</string>
<string name="out_of_memory_error">Memória insuficiente</string> <string name="edit_with">Editar com</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Simple Wallpaper</string> <string name="simple_wallpaper">Simple Wallpaper</string>
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Proporção na vertical</string> <string name="portrait_aspect_ratio">Proporção na vertical</string>
<string name="landscape_aspect_ratio">Proporção na horizontal</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 --> <!-- Settings -->
<string name="show_hidden_media">Mostrar pastas ocultas</string> <string name="show_hidden_media">Mostrar pastas ocultas</string>
<string name="autoplay_videos">Reproduzir vídeos automaticamente</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="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="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="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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Не найдено приложения камеры</string> <string name="no_camera_app_found">Не найдено приложения камеры</string>
<string name="increase_column_count">Добавить 1 столбец</string> <string name="increase_column_count">Добавить 1 столбец</string>
<string name="reduce_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="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string> <string name="select_photo">Select photo</string>
<string name="use_default">Use default</string> <string name="use_default">Use default</string>
<string name="set_as">Set as</string> <string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- Hide / Exclude -->
<string name="hide_folder_description">Эта опция скрывает папку, добавляя в неё файл \'.nomedia\'; будут скрыты все подпапки. Можно показывать их, переключая \'Показать скрытые папки\' в настройках. Продолжить?</string> <string name="hide_folder_description">Эта опция скрывает папку, добавляя в неё файл \'.nomedia\'; будут скрыты все подпапки. Можно показывать их, переключая \'Показать скрытые папки\' в настройках. Продолжить?</string>
@ -67,7 +68,6 @@
<string name="flip">Отразить</string> <string name="flip">Отразить</string>
<string name="flip_horizontally">По горизонтали</string> <string name="flip_horizontally">По горизонтали</string>
<string name="flip_vertically">По вертикали</string> <string name="flip_vertically">По вертикали</string>
<string name="out_of_memory_error">Память переполнена</string>
<string name="edit_with">Edit with</string> <string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Формат изображения</string> <string name="portrait_aspect_ratio">Формат изображения</string>
<string name="landscape_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 --> <!-- Settings -->
<string name="show_hidden_media">Показать скрытые папки</string> <string name="show_hidden_media">Показать скрытые папки</string>
<string name="autoplay_videos">Воспроизводить видео автоматически</string> <string name="autoplay_videos">Воспроизводить видео автоматически</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Соотношение сторон</string> <string name="screen_rotation_aspect_ratio">Соотношение сторон</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</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">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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Nenašla sa žiadna aplikácia pre fotoaparát</string> <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="increase_column_count">Zvýšiť počet stĺpcov</string>
<string name="reduce_column_count">Zníž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="change_cover_image">Zmeniť obal albumu</string>
<string name="select_photo">Zvoliť foto</string> <string name="select_photo">Zvoliť foto</string>
<string name="use_default">Použiť predvolený</string> <string name="use_default">Použiť predvolený</string>
<string name="set_as">Nastaviť ako</string> <string name="set_as">Nastaviť ako</string>
<string name="volume">Hlasitosť</string>
<string name="brightness">Jas</string>
<!-- Hide / Exclude --> <!-- 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> <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">Preklopiť</string>
<string name="flip_horizontally">Preklopiť vodorovne</string> <string name="flip_horizontally">Preklopiť vodorovne</string>
<string name="flip_vertically">Preklopiť zvisle</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> <string name="edit_with">Upraviť s</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Orientácia nastojato</string> <string name="portrait_aspect_ratio">Orientácia nastojato</string>
<string name="landscape_aspect_ratio">Orientácia naležato</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 --> <!-- Settings -->
<string name="show_hidden_media">Zobraziť skryté médiá</string> <string name="show_hidden_media">Zobraziť skryté médiá</string>
<string name="autoplay_videos">Spúšťať videá automaticky</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="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="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="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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">Simple Gallery</string> <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="edit">Redigera</string>
<string name="open_camera">Starta kameran</string> <string name="open_camera">Starta kameran</string>
<string name="open_with">Öppna med</string> <string name="open_with">Öppna med</string>
@ -13,34 +13,35 @@
<string name="all_folders">Alla mappar</string> <string name="all_folders">Alla mappar</string>
<string name="folder_view">Byt till mappvy</string> <string name="folder_view">Byt till mappvy</string>
<string name="other_folder">Andra mappar</string> <string name="other_folder">Andra mappar</string>
<string name="show_on_map">Show on map</string> <string name="show_on_map">Visa på karta</string>
<string name="unknown_location">Unknown location</string> <string name="unknown_location">Okänd plats</string>
<string name="no_map_application">No application with maps has been found</string> <string name="no_map_application">Ingen app med kartor hittades</string>
<string name="no_camera_app_found">No Camera app has been found</string> <string name="no_camera_app_found">Ingen Kamera-app hittades</string>
<string name="increase_column_count">Increase column count</string> <string name="increase_column_count">Öka antalet kolumner</string>
<string name="reduce_column_count">Reduce column count</string> <string name="reduce_column_count">Minska antalet kolumner</string>
<string name="temporarily_show_hidden">Temporarily show hidden</string> <string name="change_cover_image">Byt omslagsbild</string>
<string name="change_cover_image">Change cover image</string> <string name="select_photo">Välj foto</string>
<string name="select_photo">Select photo</string> <string name="use_default">Använd standard</string>
<string name="use_default">Use default</string> <string name="set_as">Ange som</string>
<string name="set_as">Set as</string> <string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- 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="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">Exclude</string> <string name="exclude">Uteslut</string>
<string name="excluded_folders">Excluded folders</string> <string name="excluded_folders">Uteslutna mappar</string>
<string name="manage_excluded_folders">Manage excluded folders</string> <string name="manage_excluded_folders">Hantera uteslutna mappar</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_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">Exclude a parent instead?</string> <string name="exclude_folder_parent">Vill du utesluta en överordnad mapp istället?</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">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">Remove all</string> <string name="remove_all">Ta bort alla</string>
<string name="remove_all_description">Remove all folders from the list of excluded? This will not delete the folders.</string> <string name="remove_all_description">Vill du ta bort alla mappar från uteslutningslistan? Detta raderar inte mapparna.</string>
<!-- Include folders --> <!-- Include folders -->
<string name="include_folders">Included folders</string> <string name="include_folders">Inkluderade mappar</string>
<string name="manage_included_folders">Manage included folders</string> <string name="manage_included_folders">Hantera inkluderade mappar</string>
<string name="add_folder">Add folder</string> <string name="add_folder">Lägg till mapp</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="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 --> <!-- Resizing -->
<string name="resize">Ändra storlek</string> <string name="resize">Ändra storlek</string>
@ -56,19 +57,18 @@
<string name="rotate">Rotera</string> <string name="rotate">Rotera</string>
<string name="path">Sökväg</string> <string name="path">Sökväg</string>
<string name="invalid_image_path">Ogiltig bildsö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="edit_image_with">Redigera bilden med:</string>
<string name="no_editor_found">Hittade ingen bildredigerare</string> <string name="no_editor_found">Hittade ingen bildredigerare</string>
<string name="unknown_file_location">Okänd filplats</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="error_saving_file">Det gick inte att skriva över källfilen</string>
<string name="rotate_left">Rotate left</string> <string name="rotate_left">Rotera åt vänster</string>
<string name="rotate_right">Rotate right</string> <string name="rotate_right">Rotera åt höger</string>
<string name="rotate_one_eighty">Rotate by 180º</string> <string name="rotate_one_eighty">Rotera 180º</string>
<string name="flip">Flip</string> <string name="flip">Vänd</string>
<string name="flip_horizontally">Flip horizontally</string> <string name="flip_horizontally">Vänd horisontellt</string>
<string name="flip_vertically">Flip vertically</string> <string name="flip_vertically">Vänd vertikalt</string>
<string name="out_of_memory_error">Out of memory error</string> <string name="edit_with">Redigera med</string>
<string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
<string name="simple_wallpaper">Bakgrundsbild</string> <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="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="setting_wallpaper">Inställningar för bakgrundsbild&#8230;</string>
<string name="wallpaper_set_successfully">Bakgrundsbilden är ändrad</string> <string name="wallpaper_set_successfully">Bakgrundsbilden är ändrad</string>
<string name="portrait_aspect_ratio">Portrait aspect ratio</string> <string name="portrait_aspect_ratio">Stående bildförhållande</string>
<string name="landscape_aspect_ratio">Landscape aspect ratio</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 --> <!-- Settings -->
<string name="show_hidden_media">Visa dolda mappar</string> <string name="show_hidden_media">Visa dolda mappar</string>
@ -88,19 +99,21 @@
<string name="show_media">Visa media</string> <string name="show_media">Visa media</string>
<string name="images">Endast bilder</string> <string name="images">Endast bilder</string>
<string name="videos">Endast videos</string> <string name="videos">Endast videos</string>
<string name="gifs">GIFs only</string> <string name="gifs">Bara GIF-bilder</string>
<string name="images_videos_gifs">Images, videos, GIFs</string> <string name="images_videos_gifs">Bilder, videor, GIF-bilder</string>
<string name="images_and_videos">Bilder och videos</string> <string name="images_and_videos">Bilder och videos</string>
<string name="loop_videos">Återspela videos</string> <string name="loop_videos">Återspela videos</string>
<string name="animate_gifs">Animate GIFs at thumbnails</string> <string name="animate_gifs">Animera GIF-bilders miniatyrer</string>
<string name="max_brightness">Max brightness when viewing media</string> <string name="max_brightness">Maximal ljusstyrka när media visas</string>
<string name="crop_thumbnails">Crop thumbnails into squares</string> <string name="crop_thumbnails">Beskär miniatyrer till kvadrater</string>
<string name="screen_rotation_by">Rotate fullscreen media by</string> <string name="screen_rotation_by">Rotera media i helskärmsläge</string>
<string name="screen_rotation_system_setting">System setting</string> <string name="screen_rotation_system_setting">Systeminställning</string>
<string name="screen_rotation_device_rotation">Device rotation</string> <string name="screen_rotation_device_rotation">Enhetens rotation</string>
<string name="screen_rotation_aspect_ratio">Aspect ratio</string> <string name="screen_rotation_aspect_ratio">Bildförhållande</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</string> <string name="dark_background_at_fullscreen">Mörk bakgrund när media visas i helskärmsläge</string>
<string name="scroll_thumbnails_horizontally">Scroll thumbnails horizontally</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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<dimen name="dir_tmb_size">150dp</dimen> <dimen name="dir_tmb_size">150dp</dimen>
<dimen name="medium_tmb_size">120dp</dimen> <dimen name="medium_tmb_size">120dp</dimen>
<dimen name="pin_size">30dp</dimen> <dimen name="sd_card_icon_size">30dp</dimen>
<dimen name="play_outline_size">60dp</dimen> <dimen name="selection_check_size">38dp</dimen>
<dimen name="play_outline_size_big">230dp</dimen> <dimen name="play_outline_size_big">230dp</dimen>
<dimen name="timer_padding">32dp</dimen> <dimen name="timer_padding">32dp</dimen>
<dimen name="tmb_shadow_height">60dp</dimen> <dimen name="tmb_shadow_height">60dp</dimen>
<dimen name="video_side_slider_width">250dp</dimen>
</resources> </resources>

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">Hiçbir Kamera uygulaması bulunamadı</string> <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="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="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="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string> <string name="select_photo">Select photo</string>
<string name="use_default">Use default</string> <string name="use_default">Use default</string>
<string name="set_as">Set as</string> <string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- 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> <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">Çevir</string>
<string name="flip_horizontally">Yatay</string> <string name="flip_horizontally">Yatay</string>
<string name="flip_vertically">Dikey</string> <string name="flip_vertically">Dikey</string>
<string name="out_of_memory_error">Yetersiz bellek hatası</string>
<string name="edit_with">Edit with</string> <string name="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string> <string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape 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 --> <!-- Settings -->
<string name="show_hidden_media">Gizli klasörleri göster</string> <string name="show_hidden_media">Gizli klasörleri göster</string>
<string name="autoplay_videos">Videoları otomatik olarak oynat</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="screen_rotation_aspect_ratio">En-boy oranı</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</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">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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

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

View file

@ -19,11 +19,12 @@
<string name="no_camera_app_found">未找到相机应用</string> <string name="no_camera_app_found">未找到相机应用</string>
<string name="increase_column_count">增加一栏</string> <string name="increase_column_count">增加一栏</string>
<string name="reduce_column_count">减少一栏</string> <string name="reduce_column_count">减少一栏</string>
<string name="temporarily_show_hidden">显示/隐藏缓存内容</string>
<string name="change_cover_image">更改封面图片</string> <string name="change_cover_image">更改封面图片</string>
<string name="select_photo">选择图片</string> <string name="select_photo">选择图片</string>
<string name="use_default">使用默认</string> <string name="use_default">使用默认</string>
<string name="set_as">设置为</string> <string name="set_as">设置为</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- Hide / Exclude -->
<string name="hide_folder_description">通过添加文件 \'.nomedia\' 到目录,可以防止目录及其子目录下的所有媒体被扫描。您可以通过设置中的 \'显示隐藏目录\' 选项改变设置,是否继续?</string> <string name="hide_folder_description">通过添加文件 \'.nomedia\' 到目录,可以防止目录及其子目录下的所有媒体被扫描。您可以通过设置中的 \'显示隐藏目录\' 选项改变设置,是否继续?</string>
@ -67,7 +68,6 @@
<string name="flip">翻转</string> <string name="flip">翻转</string>
<string name="flip_horizontally">水平翻转</string> <string name="flip_horizontally">水平翻转</string>
<string name="flip_vertically">垂直翻转</string> <string name="flip_vertically">垂直翻转</string>
<string name="out_of_memory_error">内存不足</string>
<string name="edit_with">编辑方式</string> <string name="edit_with">编辑方式</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">纵向长宽比</string> <string name="portrait_aspect_ratio">纵向长宽比</string>
<string name="landscape_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 --> <!-- Settings -->
<string name="show_hidden_media">显示所有</string> <string name="show_hidden_media">显示所有</string>
<string name="autoplay_videos">自动播放</string> <string name="autoplay_videos">自动播放</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">根据长宽比</string> <string name="screen_rotation_aspect_ratio">根据长宽比</string>
<string name="dark_background_at_fullscreen">全屏时黑色背景</string> <string name="dark_background_at_fullscreen">全屏时黑色背景</string>
<string name="scroll_thumbnails_horizontally">水平滚动缩略图</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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

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

View file

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

View file

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

View file

@ -2,6 +2,16 @@
<resources> <resources>
<!-- Release notes --> <!-- 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_108">Allow setting custom folder covers</string>
<string name="release_98"> <string name="release_98">
Allow selecting multiple items by finger dragging\n 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="no_camera_app_found">No Camera app has been found</string>
<string name="increase_column_count">Increase column count</string> <string name="increase_column_count">Increase column count</string>
<string name="reduce_column_count">Reduce 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="change_cover_image">Change cover image</string>
<string name="select_photo">Select photo</string> <string name="select_photo">Select photo</string>
<string name="use_default">Use default</string> <string name="use_default">Use default</string>
<string name="set_as">Set as</string> <string name="set_as">Set as</string>
<string name="volume">Volume</string>
<string name="brightness">Brightness</string>
<!-- Hide / Exclude --> <!-- 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="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">Flip</string>
<string name="flip_horizontally">Flip horizontally</string> <string name="flip_horizontally">Flip horizontally</string>
<string name="flip_vertically">Flip vertically</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="edit_with">Edit with</string>
<!-- Set wallpaper --> <!-- Set wallpaper -->
@ -81,6 +81,17 @@
<string name="portrait_aspect_ratio">Portrait aspect ratio</string> <string name="portrait_aspect_ratio">Portrait aspect ratio</string>
<string name="landscape_aspect_ratio">Landscape 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 --> <!-- Settings -->
<string name="show_hidden_media">Show hidden media</string> <string name="show_hidden_media">Show hidden media</string>
<string name="autoplay_videos">Play videos automatically</string> <string name="autoplay_videos">Play videos automatically</string>
@ -101,6 +112,8 @@
<string name="screen_rotation_aspect_ratio">Aspect ratio</string> <string name="screen_rotation_aspect_ratio">Aspect ratio</string>
<string name="dark_background_at_fullscreen">Dark background at fullscreen media</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">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 --> <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->

View file

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