Merge pull request #20 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2018-03-04 11:19:49 +03:00 committed by GitHub
commit 2138ee5699
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 139 additions and 105 deletions

View file

@ -1,6 +1,12 @@
Changelog Changelog
========== ==========
Version 3.5.3 *(2018-03-03)*
----------------------------
* Properly keep last-modified at file copy/move if set so
* Misc other smaller glitch and translation improvements
Version 3.5.2 *(2018-02-25)* Version 3.5.2 *(2018-02-25)*
---------------------------- ----------------------------

View file

@ -10,8 +10,8 @@ android {
applicationId "com.simplemobiletools.gallery" applicationId "com.simplemobiletools.gallery"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 27 targetSdkVersion 27
versionCode 164 versionCode 165
versionName "3.5.2" versionName "3.5.3"
multiDexEnabled true multiDexEnabled true
setProperty("archivesBaseName", "gallery") setProperty("archivesBaseName", "gallery")
} }
@ -46,9 +46,9 @@ ext {
} }
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:3.13.8' implementation 'com.simplemobiletools:commons:3.14.12'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.6.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.6.0'
implementation 'com.android.support:multidex:1.0.2' implementation 'com.android.support:multidex:1.0.3'
implementation 'com.google.code.gson:gson:2.8.2' implementation 'com.google.code.gson:gson:2.8.2'
implementation 'it.sephiroth.android.exif:library:1.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.8' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.8'

View file

@ -16,6 +16,7 @@ import android.widget.FrameLayout
import com.google.gson.Gson import com.google.gson.Gson
import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.dialogs.NewAppDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_READ_STORAGE import com.simplemobiletools.commons.helpers.PERMISSION_READ_STORAGE
@ -44,6 +45,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
private val PICK_MEDIA = 2 private val PICK_MEDIA = 2
private val PICK_WALLPAPER = 3 private val PICK_WALLPAPER = 3
private val LAST_MEDIA_CHECK_PERIOD = 3000L private val LAST_MEDIA_CHECK_PERIOD = 3000L
private val CONTACTS_PACKAGE = "com.simplemobiletools.contacts"
lateinit var mDirs: ArrayList<Directory> lateinit var mDirs: ArrayList<Directory>
@ -99,6 +101,12 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
mIsPasswordProtectionPending = config.appPasswordProtectionOn mIsPasswordProtectionPending = config.appPasswordProtectionOn
setupLatestMediaId() setupLatestMediaId()
// notify the users about the Contacts app
if (System.currentTimeMillis() < 1521015000000 && !config.wasNewAppShown && config.appRunCount > 100 && config.appRunCount % 50 != 0 && !isPackageInstalled(CONTACTS_PACKAGE)) {
config.wasNewAppShown = true
NewAppDialog(this, CONTACTS_PACKAGE, "Simple Contacts")
}
} }
override fun onStart() { override fun onStart() {
@ -163,10 +171,6 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
mIsGettingDirs = false mIsGettingDirs = false
storeStateVariables() storeStateVariables()
mLastMediaHandler.removeCallbacksAndMessages(null) mLastMediaHandler.removeCallbacksAndMessages(null)
if (!mDirs.isEmpty()) {
mCurrAsyncTask?.stopFetching()
}
} }
override fun onStop() { override fun onStop() {

View file

@ -625,7 +625,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
var parent = file.parentFile ?: return false var parent = file.parentFile ?: return false
while (true) { while (true) {
if (parent.isHidden || parent.list()?.contains(NOMEDIA) == true) { if (parent.isHidden || parent.list()?.any { it.startsWith(NOMEDIA) } == true) {
return true return true
} }

View file

@ -51,7 +51,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList<Direc
view?.dir_check?.beVisibleIf(select) view?.dir_check?.beVisibleIf(select)
} }
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layoutType = if (isListViewType) R.layout.directory_item_list else R.layout.directory_item_grid val layoutType = if (isListViewType) R.layout.directory_item_list else R.layout.directory_item_grid
return createViewHolder(layoutType, parent) return createViewHolder(layoutType, parent)
} }
@ -100,10 +100,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList<Direc
override fun getSelectableItemCount() = dirs.size override fun getSelectableItemCount() = dirs.size
override fun onViewRecycled(holder: ViewHolder?) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isActivityDestroyed()) { if (!activity.isActivityDestroyed()) {
Glide.with(activity).clear(holder?.itemView?.dir_thumbnail!!) Glide.with(activity).clear(holder.itemView?.dir_thumbnail!!)
} }
} }

View file

@ -35,7 +35,7 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList<
override fun getSelectableItemCount() = folders.size override fun getSelectableItemCount() = folders.size
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = createViewHolder(R.layout.item_manage_folder, parent) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_folder, parent)
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val folder = folders[position] val folder = folders[position]

View file

@ -37,7 +37,7 @@ class ManageHiddenFoldersAdapter(activity: BaseSimpleActivity, var folders: Arra
override fun getSelectableItemCount() = folders.size override fun getSelectableItemCount() = folders.size
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = createViewHolder(R.layout.item_manage_folder, parent) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_folder, parent)
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val folder = folders[position] val folder = folders[position]

View file

@ -57,7 +57,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Medium>,
view?.medium_check?.beVisibleIf(select) view?.medium_check?.beVisibleIf(select)
} }
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layoutType = if (isListViewType) R.layout.photo_video_item_list else R.layout.photo_video_item_grid val layoutType = if (isListViewType) R.layout.photo_video_item_list else R.layout.photo_video_item_grid
return createViewHolder(layoutType, parent) return createViewHolder(layoutType, parent)
} }
@ -107,10 +107,10 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Medium>,
override fun getSelectableItemCount() = media.size override fun getSelectableItemCount() = media.size
override fun onViewRecycled(holder: ViewHolder?) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isActivityDestroyed()) { if (!activity.isActivityDestroyed()) {
val itemView = holder?.itemView val itemView = holder.itemView
visibleItemPaths.remove(itemView?.photo_name?.tag) visibleItemPaths.remove(itemView?.photo_name?.tag)
Glide.with(activity).clear(itemView?.medium_thumbnail!!) Glide.with(activity).clear(itemView?.medium_thumbnail!!)
} }

View file

@ -22,9 +22,7 @@ class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val m
val medium = media[position] val medium = media[position]
val bundle = Bundle() val bundle = Bundle()
bundle.putSerializable(MEDIUM, medium) bundle.putSerializable(MEDIUM, medium)
val fragment: ViewPagerFragment val fragment = if (medium.isVideo()) {
fragment = if (medium.isVideo()) {
VideoFragment() VideoFragment()
} else { } else {
PhotoFragment() PhotoFragment()
@ -39,7 +37,7 @@ class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val m
override fun instantiateItem(container: ViewGroup, position: Int): Any { override fun instantiateItem(container: ViewGroup, position: Int): Any {
val fragment = super.instantiateItem(container, position) as ViewPagerFragment val fragment = super.instantiateItem(container, position) as ViewPagerFragment
fragments.put(position, fragment) fragments[position] = fragment
return fragment return fragment
} }

View file

@ -4,10 +4,10 @@ import android.graphics.Point
import android.support.v7.app.AlertDialog import android.support.v7.app.AlertDialog
import android.text.Editable import android.text.Editable
import android.text.TextWatcher import android.text.TextWatcher
import android.view.WindowManager
import android.widget.EditText import android.widget.EditText
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.showKeyboard
import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.value import com.simplemobiletools.commons.extensions.value
import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.R
@ -72,22 +72,22 @@ class ResizeDialog(val activity: BaseSimpleActivity, val size: Point, val callba
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.create().apply { .create().apply {
window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) activity.setupDialogStuff(view, this, R.string.resize_and_save) {
activity.setupDialogStuff(view, this, R.string.resize_and_save) { showKeyboard(view.image_width)
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val width = getViewValue(widthView) val width = getViewValue(widthView)
val height = getViewValue(heightView) val height = getViewValue(heightView)
if (width <= 0 || height <= 0) { if (width <= 0 || height <= 0) {
activity.toast(R.string.invalid_values) activity.toast(R.string.invalid_values)
return@setOnClickListener return@setOnClickListener
} }
val newSize = Point(getViewValue(widthView), getViewValue(heightView)) val newSize = Point(getViewValue(widthView), getViewValue(heightView))
callback(newSize) callback(newSize)
dismiss() dismiss()
}
}
} }
}
}
} }
fun getViewValue(view: EditText): Int { fun getViewValue(view: EditText): Int {

View file

@ -1,7 +1,6 @@
package com.simplemobiletools.gallery.dialogs package com.simplemobiletools.gallery.dialogs
import android.support.v7.app.AlertDialog import android.support.v7.app.AlertDialog
import android.view.WindowManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog
@ -45,40 +44,40 @@ class SaveAsDialog(val activity: BaseSimpleActivity, val path: String, val appen
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.create().apply { .create().apply {
window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) activity.setupDialogStuff(view, this, R.string.save_as) {
activity.setupDialogStuff(view, this, R.string.save_as) { showKeyboard(view.save_as_name)
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val filename = view.save_as_name.value val filename = view.save_as_name.value
val extension = view.save_as_extension.value val extension = view.save_as_extension.value
if (filename.isEmpty()) { if (filename.isEmpty()) {
activity.toast(R.string.filename_cannot_be_empty) activity.toast(R.string.filename_cannot_be_empty)
return@setOnClickListener return@setOnClickListener
} }
if (extension.isEmpty()) { if (extension.isEmpty()) {
activity.toast(R.string.extension_cannot_be_empty) activity.toast(R.string.extension_cannot_be_empty)
return@setOnClickListener return@setOnClickListener
} }
val newFile = File(realPath, "$filename.$extension") val newFile = File(realPath, "$filename.$extension")
if (!newFile.name.isAValidFilename()) { if (!newFile.name.isAValidFilename()) {
activity.toast(R.string.filename_invalid_characters) activity.toast(R.string.filename_invalid_characters)
return@setOnClickListener return@setOnClickListener
} }
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(newFile.absolutePath) callback(newFile.absolutePath)
dismiss() dismiss()
}
} else {
callback(newFile.absolutePath)
dismiss()
}
} }
} else {
callback(newFile.absolutePath)
dismiss()
} }
} }
}
}
} }
} }

View file

@ -2,7 +2,6 @@ package com.simplemobiletools.gallery.dialogs
import android.support.v7.app.AlertDialog import android.support.v7.app.AlertDialog
import android.view.View import android.view.View
import android.view.WindowManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.hideKeyboard import com.simplemobiletools.commons.extensions.hideKeyboard
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
@ -71,20 +70,20 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.create().apply { .create().apply {
window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) activity.setupDialogStuff(view, this) {
activity.setupDialogStuff(view, this) { hideKeyboard()
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
if (!view.include_photos.isChecked && !view.include_videos.isChecked && !view.include_gifs.isChecked) { if (!view.include_photos.isChecked && !view.include_videos.isChecked && !view.include_gifs.isChecked) {
activity.toast(R.string.no_media_for_slideshow) activity.toast(R.string.no_media_for_slideshow)
return@setOnClickListener return@setOnClickListener
} }
storeValues() storeValues()
callback() callback()
dismiss() dismiss()
}
}
} }
}
}
} }
private fun setupValues() { private fun setupValues() {

View file

@ -11,6 +11,7 @@ import android.provider.MediaStore
import android.view.WindowManager import android.view.WindowManager
import com.simplemobiletools.commons.extensions.getStringValue import com.simplemobiletools.commons.extensions.getStringValue
import com.simplemobiletools.commons.extensions.humanizePath import com.simplemobiletools.commons.extensions.humanizePath
import com.simplemobiletools.commons.helpers.OTG_PATH
import com.simplemobiletools.gallery.activities.SettingsActivity import com.simplemobiletools.gallery.activities.SettingsActivity
import com.simplemobiletools.gallery.helpers.Config import com.simplemobiletools.gallery.helpers.Config
import com.simplemobiletools.gallery.helpers.NOMEDIA import com.simplemobiletools.gallery.helpers.NOMEDIA
@ -98,7 +99,7 @@ fun Context.getNoMediaFolders(callback: (folders: ArrayList<String>) -> Unit) {
do { do {
val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA) ?: continue val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA) ?: continue
val noMediaFile = File(path) val noMediaFile = File(path)
if (noMediaFile.exists()) { if (noMediaFile.exists() && noMediaFile.name == NOMEDIA) {
folders.add("${noMediaFile.parent}/") folders.add("${noMediaFile.parent}/")
} }
} while (cursor.moveToNext()) } while (cursor.moveToNext())
@ -110,3 +111,20 @@ fun Context.getNoMediaFolders(callback: (folders: ArrayList<String>) -> Unit) {
callback(folders) callback(folders)
}.start() }.start()
} }
fun Context.isPathInMediaStore(path: String): Boolean {
if (path.startsWith(OTG_PATH)) {
return false
}
val projection = arrayOf(MediaStore.Images.Media.DATE_MODIFIED)
val uri = MediaStore.Files.getContentUri("external")
val selection = "${MediaStore.MediaColumns.DATA} = ?"
val selectionArgs = arrayOf(path)
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
cursor?.use {
return cursor.moveToFirst()
}
return false
}

View file

@ -185,9 +185,9 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee
private fun initTimeHolder() { private fun initTimeHolder() {
val res = resources val res = resources
val left = mTimeHolder!!.paddingLeft val left = 0
val top = mTimeHolder!!.paddingTop val top = 0
var right = mTimeHolder!!.paddingRight var right = 0
var bottom = 0 var bottom = 0
if (hasNavBar()) { if (hasNavBar()) {

View file

@ -316,4 +316,8 @@ class Config(context: Context) : BaseConfig(context) {
var doExtraCheck: Boolean var doExtraCheck: Boolean
get() = prefs.getBoolean(DO_EXTRA_CHECK, false) get() = prefs.getBoolean(DO_EXTRA_CHECK, false)
set(doExtraCheck) = prefs.edit().putBoolean(DO_EXTRA_CHECK, doExtraCheck).apply() set(doExtraCheck) = prefs.edit().putBoolean(DO_EXTRA_CHECK, doExtraCheck).apply()
var wasNewAppShown: Boolean
get() = prefs.getBoolean(WAS_NEW_APP_SHOWN, false)
set(wasNewAppShown) = prefs.edit().putBoolean(WAS_NEW_APP_SHOWN, wasNewAppShown).apply()
} }

View file

@ -46,6 +46,7 @@ const val ONE_FINGER_ZOOM = "one_finger_zoom"
const val ALLOW_INSTANT_CHANGE = "allow_instant_change" const val ALLOW_INSTANT_CHANGE = "allow_instant_change"
const val REPLACE_ZOOMABLE_IMAGES = "replace_zoomable_images" const val REPLACE_ZOOMABLE_IMAGES = "replace_zoomable_images"
const val DO_EXTRA_CHECK = "do_extra_check" const val DO_EXTRA_CHECK = "do_extra_check"
const val WAS_NEW_APP_SHOWN = "was_new_app_shown"
// slideshow // slideshow
const val SLIDESHOW_INTERVAL = "slideshow_interval" const val SLIDESHOW_INTERVAL = "slideshow_interval"

View file

@ -9,6 +9,7 @@ import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.extensions.containsNoMedia import com.simplemobiletools.gallery.extensions.containsNoMedia
import com.simplemobiletools.gallery.extensions.doesParentHaveNoMedia import com.simplemobiletools.gallery.extensions.doesParentHaveNoMedia
import com.simplemobiletools.gallery.extensions.isPathInMediaStore
import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.Medium
import java.io.File import java.io.File
import java.util.LinkedHashMap import java.util.LinkedHashMap
@ -64,7 +65,7 @@ class MediaFetcher(val context: Context) {
files.forEach { files.forEach {
val filePath = it.absolutePath val filePath = it.absolutePath
if ((showHidden || !it.name.startsWith(".")) && !dirPaths.contains(filePath)) { if ((showHidden || !it.name.startsWith(".")) && !dirPaths.contains(filePath)) {
if (it.exists() && it.length() > 0 && it.isImageVideoGif()) { if (it.exists() && it.length() > 0 && it.isImageVideoGif() && !context.isPathInMediaStore(it.absolutePath)) {
newPaths.add(it.absolutePath) newPaths.add(it.absolutePath)
} }
} }

View file

@ -153,17 +153,17 @@
<string name="faq_3_text">Du kannst lange auf das gewünschte Album drücken und im Aktionsmenü das Stecknadelsymbol auswählen; es wird nun zuoberst angepinnt. Ebenso kannst du mehrere Ordner anpinnen. Angepinnte Objekte werden nach der Standardmethode sortiert.</string> <string name="faq_3_text">Du kannst lange auf das gewünschte Album drücken und im Aktionsmenü das Stecknadelsymbol auswählen; es wird nun zuoberst angepinnt. Ebenso kannst du mehrere Ordner anpinnen. Angepinnte Objekte werden nach der Standardmethode sortiert.</string>
<string name="faq_4_title">Wie kann ich Videos vorspulen?</string> <string name="faq_4_title">Wie kann ich Videos vorspulen?</string>
<string name="faq_4_text">Du kannst auf den Text der aktuellen oder der maximalen Dauer nahe der Suchleiste drücken, um das Video zurück- oder vorzuspulen.</string> <string name="faq_4_text">Du kannst auf den Text der aktuellen oder der maximalen Dauer nahe der Suchleiste drücken, um das Video zurück- oder vorzuspulen.</string>
<string name="faq_5_title">What is the difference between hiding and excluding a folder?</string> <string name="faq_5_title">Was ist der Unterschied zwischen Verstecken und Ausschliessen eines Ordners?</string>
<string name="faq_5_text">Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too.</string> <string name="faq_5_text">Ausschliessen verhindert lediglich, dass der Ordner in Schlichte Galerie angezeigt, Verstecken hingegen funktioniert systemweit und versteckt den Ordner auch vor anderen Gallerieapps. Dies funktioniert durch das Erstellen einer leeren \".nomedia\"-Datei im betroffenen Ordner, welche du mit jedem Dateimanager löschen kannst.</string>
<string name="faq_6_title">Why do folders with music cover art or stickers show up?</string> <string name="faq_6_title">Wieso erscheinen Ordner mit Musik-Cover oder Stickers?</string>
<string name="faq_6_text">It can happen that you will see some unusual albums show up. You can easily exclude them by long pressing them and selecting Exclude. In the next dialog you can then select the parent folder, chances are it will prevent the other related albums showing up too.</string> <string name="faq_6_text">Es kann geschehen, dass manche ungewöhnliche Alben erscheinen. Diese kannst du ausschliessen durch gedrückt halten und Auswählen von Ausschliessen. Im nächsten Dialog kannst du den übergeordneten Ordner auswählen und dadurch sollten die anderen zugehörigen Alben auch nicht auftauchen.</string>
<string name="faq_7_title">A folder with images isn\'t showing up, what can I do?</string> <string name="faq_7_title">Ein Ordner mit Bilder wird nicht angezeigt. Was kann ich tun?</string>
<string name="faq_7_text">That can have multiple reasons, but solving it is easy. Just go in Settings -> Manage Included Folders, select Plus and navigate to the required folder.</string> <string name="faq_7_text">Dies kann mehrere Gründe haben, aber es zu lösen ist einfach. Gehe einfach zu Einstellungen -> Einbezogene Ordner verwalten, wähle das Plus aus und navigiere zum gewünschten Ordner.</string>
<string name="faq_8_title">What if I want just a few particular folders visible?</string> <string name="faq_8_title">Was ist, wenn ich nur ein paar definierte Ordner sichtbar haben will?</string>
<string name="faq_8_text">Adding a folder at the Included Folders doesn\'t automatically exclude anything. What you can do is go in Settings -> Manage Excluded Folders, exclude the root folder \"/\", then add the desired folders at Settings -> Manage Included Folders. <string name="faq_8_text">Einen Ordner zu den einbezogenen Ordner hinzuzufügen schliesst nicht automatisch alle anderen aus. Eine Möglichkeit ist, in Einstellungen -> Ausgeschlossene Ordner verwalten den Stammordner \"/\" auszuschliessen und dann alle gewünschten Ordner in Einstellungen -> Einbezogene Ordner verwalten hinzuzufügen.
That will make only the selected folders visible, as both excluding and including are recursive and if a folder is both excluded and included, it will show up.</string> Dadurch werden nur die ausgewählten Ordner sichtbar, da Auschliessen und Einbeziehen rekursiv erfolgen und wenn ein Ordner ausgeschlossen und einbezogen wurde, wird er dennoch angezeigt.</string>
<string name="faq_9_title">Fullscreen images have weird artifacts, can I somehow improve the quality?</string> <string name="faq_9_title">Vollbildfotos haben seltsame Artefakte. Kann ich die Qualität verbessern?</string>
<string name="faq_9_text">Yea, there is a toggle in Settings saying \"Replace deep zoomable images with better quality ones\", you can use that. It will improve the quality of the images, but they will get blurred once you try zooming in too much.</string> <string name="faq_9_text">Ja, es gibt einen Schalter in den Einstellungen gekennzeichnet mit \"Stark zoombare Bilder durch Bilder mit hoher Qualität ersetzen\". Dieser wird die Bildqualität verbessern, aber sie werden bei sehr hoher Zoomstufe unscharf.</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

@ -7,7 +7,7 @@
<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="pin_to_the_top">Pin to the top</string> <string name="pin_to_the_top">상단에 고정</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>
@ -16,9 +16,9 @@
<string name="unknown_location">위치정보 없음</string> <string name="unknown_location">위치정보 없음</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="change_cover_image">Change cover image</string> <string name="change_cover_image">커버 이미지 변경</string>
<string name="select_photo">사진 선택</string> <string name="select_photo">사진 선택</string>
<string name="use_default">Use default</string> <string name="use_default">기본값 사용</string>
<string name="volume">볼륨</string> <string name="volume">볼륨</string>
<string name="brightness">밝기</string> <string name="brightness">밝기</string>
<string name="do_not_ask_again">다시 물어보지 않음</string> <string name="do_not_ask_again">다시 물어보지 않음</string>
@ -135,7 +135,7 @@
<string name="one_finger_zoom">전체화면 모드에서 한 손가락으로 확대 및 축소</string> <string name="one_finger_zoom">전체화면 모드에서 한 손가락으로 확대 및 축소</string>
<string name="allow_instant_change">측면 클릭으로 미디어 즉시변경</string> <string name="allow_instant_change">측면 클릭으로 미디어 즉시변경</string>
<string name="replace_zoomable_images">확대 축소 가능한 이미지를 더 좋은 품질로 교체</string> <string name="replace_zoomable_images">확대 축소 가능한 이미지를 더 좋은 품질로 교체</string>
<string name="hide_extended_details">Hide extended details when status bar is hidden</string> <string name="hide_extended_details">상태 표시 줄이 숨겨져있을 때 확장 된 세부 정보 숨김</string>
<string name="do_extra_check">잘못된 파일 표시를 방지하기 위해 추가 검사 수행</string> <string name="do_extra_check">잘못된 파일 표시를 방지하기 위해 추가 검사 수행</string>
<!-- Setting sections --> <!-- Setting sections -->
@ -169,15 +169,19 @@
<!-- 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">
사진과 비디오 보기위한 간편한 툴입니다. 날짜, 크기, 이름을 오름차순 또는 내림차순으로 정렬 할 수 있으며 사진을 확대 할 수 있습니다. 미디어 파일은 디스플레이의 크기에 따라 여러 열로 표시되며 핀치 제스처로 열 수를 변경할 수 있습니다. 이름 변경, 공유, 삭제, 복사, 이동이 가능합니다. 이미지는 자르기, 회전, 반전 또는 앱에서 직접 배경 화면으로 설정할 수도 있습니다. 사진과 동영상을 간편하게 관리 할 수 있는 툴입니다.
날짜, 크기, 이름을 기준으로 정렬 할 수 있으며 사진을 확대 할 수 있습니다. 미디어 파일은 디스플레이의 크기에 맞춰 여러 열로 표시되며 핀치 제스처를 이용하여 변경 할 수도 있습니다.
이름변경, 공유, 삭제, 복사, 이동, 이미지편집, 배경화면 설정 등의 기능을 제공합니다.
갤러리는 \'이미지/비디오 미리보기\', \'이메일 클라이언트에서 첨부파일 추가하기\' 등의 기능을 서드파티에 제공합니다. 언제나 완벽하게 사용할 수 있습니다. 갤러리는 \'이미지/비디오 미리보기\', \'이메일 클라이언트에서 첨부파일 추가하기\' 등의 기능을 서드파티 애플리케이션에 제공합니다. 언제나 완벽하게 사용할 수 있습니다.
The fingerprint permission is needed for locking either hidden item visibility, or the whole app. 앱을 잠그거나 숨김파일을 보기위하여 지문인식 기능을 사용하는 경우 지문사용 권한이 필요합니다.
광고가 포함되어 있거나, 불필요한 권한을 요청하지 않습니다. 이 앱의 모든 소스는 오픈소스이며, 사용자가 직접 애플리케이션의 컬러를 설정 할 수 있습니다. 광고가 포함되어 있거나, 불필요한 권한을 요청하지 않습니다. 이 앱의 모든 소스는 오픈소스이며, 사용자가 직접 애플리케이션의 컬러를 설정 할 수 있습니다.
이 앱은 다양한 시리즈의 모바일앱 중 하나입니다. 나머지는 http://www.simplemobiletools.com 에서 찾아 보실 수 있습니다. 이 앱은 다양한 시리즈의 모바일앱 중 하나입니다. 나머지는 http://www.simplemobiletools.com 에서 찾아보실 수 있습니다.
</string> </string>
<!-- <!--

View file

@ -160,8 +160,8 @@
   <string name="faq_7_text">Wejdź do ustawień aplikacji i w sekcji z dołączonymi folderami dodaj tenże folder do listy.</string>    <string name="faq_7_text">Wejdź do ustawień aplikacji i w sekcji z dołączonymi folderami dodaj tenże folder do listy.</string>
   <string name="faq_8_title">Co jeśli chcę widzieć tylko.wybrane foldery?</string>    <string name="faq_8_title">Co jeśli chcę widzieć tylko.wybrane foldery?</string>
   <string name="faq_8_text">Przejdź do sekcji z wykluczonymi folderami w ustawieniach aplikacji, dodaj tam folder główny (\"/\"), a następnie dodaj pożądane foldery w sekcji z dołączonymi folderami.</string>    <string name="faq_8_text">Przejdź do sekcji z wykluczonymi folderami w ustawieniach aplikacji, dodaj tam folder główny (\"/\"), a następnie dodaj pożądane foldery w sekcji z dołączonymi folderami.</string>
<string name="faq_9_title">Fullscreen images have weird artifacts, can I somehow improve the quality?</string>    <string name="faq_9_title">Zdjęcia w widoku pełnoekranowym mają dziwne artefakty. Jak mogę to naprawić?</string>
<string name="faq_9_text">Yea, there is a toggle in Settings saying \"Replace deep zoomable images with better quality ones\", you can use that. It will improve the quality of the images, but they will get blurred once you try zooming in too much.</string>    <string name="faq_9_text">U ustawieniach aplikacji włącz opcję \'Zamieniaj powiększalne obrazy na te o lepszej jakości\'. Poprawi ona jakość zdjęć, jednak przy bardzo dużych powiększeniach mogą się stać one zbyt rozmazane.</string>
<!-- 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 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.2.21' ext.kotlin_version = '1.2.30'
repositories { repositories {
jcenter() jcenter()