diff --git a/CHANGELOG.md b/CHANGELOG.md index f1484fbfc..f789d7bb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,28 @@ Changelog ========== +Version 3.2.2 *(2018-01-09)* +---------------------------- + + * Some scrolling issues fixed + * Improve new media file discovery + +Version 3.2.1 *(2018-01-08)* +---------------------------- + + * Adding a crashfix + * Couple scrollbar glitch fixes + +Version 3.2.0 *(2018-01-07)* +---------------------------- + + * Rewrote scrolling to improve the performance + * Disable "Delete empty folders" by default + * Added initial Search to media thumbnails screen + * Apply the hidden folder password protection to "Manage hidden folders" + * Replace Move with Copy/Delete on Android 7+ + * Improve SD card file support + Version 3.1.2 *(2017-12-30)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index 3c49e690e..f27660636 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.simplemobiletools.gallery" minSdkVersion 16 targetSdkVersion 27 - versionCode 152 - versionName "3.1.2" + versionCode 155 + versionName "3.2.2" multiDexEnabled true setProperty("archivesBaseName", "gallery") } @@ -42,8 +42,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.5.0' - implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.9.0' + implementation 'com.simplemobiletools:commons:3.6.15' implementation 'com.theartofdev.edmodo:android-image-cropper:2.6.0' implementation 'com.android.support:multidex:1.0.2' implementation 'com.google.code.gson:gson:2.8.2' @@ -51,6 +50,9 @@ dependencies { implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.8' implementation 'com.github.chrisbanes:PhotoView:2.1.3' + //implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.9.0' + implementation 'com.github.tibbi:subsampling-scale-image-view:v3.9.0-fork' + debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion" releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c50f0162..c49d7cf4d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,7 +55,17 @@ + android:parentActivityName=".activities.MainActivity"> + + + + + + + + , isFromCache: Boolean) { - Thread { - mLatestMediaId = getLatestMediaId() - }.start() + if (!isFromCache) { + Thread { + mLatestMediaId = getLatestMediaId() + }.start() + } val dirs = getSortedDirectories(newDirs) directories_refresh_layout.isRefreshing = false @@ -533,6 +541,11 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { directories_empty_text_label.beVisibleIf(dirs.isEmpty() && !isFromCache) directories_empty_text.beVisibleIf(dirs.isEmpty() && !isFromCache) + directories_grid.beVisibleIf(directories_empty_text_label.isGone()) + + val allowHorizontalScroll = config.scrollHorizontally && config.viewTypeFiles == VIEW_TYPE_GRID + directories_vertical_fastscroller.beVisibleIf(directories_grid.isVisible() && !allowHorizontalScroll) + directories_horizontal_fastscroller.beVisibleIf(directories_grid.isVisible() && allowHorizontalScroll) checkLastMediaChanged() if (dirs.hashCode() == mDirs.hashCode()) { @@ -559,7 +572,8 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { val currAdapter = directories_grid.adapter if (currAdapter == null) { initZoomListener() - DirectoryAdapter(this, mDirs, this, directories_grid, isPickIntent(intent) || isGetAnyContentIntent(intent)) { + val fastscroller = if (config.scrollHorizontally) directories_horizontal_fastscroller else directories_vertical_fastscroller + DirectoryAdapter(this, mDirs, this, directories_grid, isPickIntent(intent) || isGetAnyContentIntent(intent), fastscroller) { itemClicked((it as Directory).path) }.apply { setupZoomListener(mZoomListener) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt index 5f0ab42fa..e4aaa8ad2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt @@ -1,13 +1,17 @@ package com.simplemobiletools.gallery.activities import android.app.Activity +import android.app.SearchManager import android.app.WallpaperManager +import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.net.Uri import android.os.Bundle import android.os.Handler +import android.support.v4.view.MenuItemCompat import android.support.v7.widget.GridLayoutManager +import android.support.v7.widget.SearchView import android.view.Menu import android.view.MenuItem import android.view.ViewGroup @@ -60,6 +64,7 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { private var mLastMediaHandler = Handler() private var mCurrAsyncTask: GetMediaAsynctask? = null private var mZoomListener: MyRecyclerView.MyZoomListener? = null + private var mSearchMenuItem: MenuItem? = null companion object { var mMedia = ArrayList() @@ -130,6 +135,13 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { } } + override fun onStop() { + super.onStop() + if (mSearchMenuItem != null) { + MenuItemCompat.collapseActionView(mSearchMenuItem) + } + } + override fun onDestroy() { super.onDestroy() if (config.showAll) @@ -138,6 +150,53 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { mMedia.clear() } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_media, menu) + + val isFolderHidden = File(mPath).containsNoMedia() + menu.apply { + findItem(R.id.hide_folder).isVisible = !isFolderHidden && !mShowAll + findItem(R.id.unhide_folder).isVisible = isFolderHidden && !mShowAll + + findItem(R.id.folder_view).isVisible = mShowAll + findItem(R.id.open_camera).isVisible = mShowAll + findItem(R.id.about).isVisible = mShowAll + + 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.viewTypeFiles == VIEW_TYPE_GRID && config.mediaColumnCnt < MAX_COLUMN_COUNT + findItem(R.id.reduce_column_count).isVisible = config.viewTypeFiles == VIEW_TYPE_GRID && config.mediaColumnCnt > 1 + + findItem(R.id.toggle_filename).isVisible = config.viewTypeFiles == VIEW_TYPE_GRID + } + + setupSearch(menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.sort -> showSortingDialog() + R.id.filter -> showFilterMediaDialog() + R.id.toggle_filename -> toggleFilenameVisibility() + R.id.open_camera -> launchCamera() + R.id.folder_view -> switchToFolderView() + R.id.change_view_type -> changeViewType() + R.id.hide_folder -> tryHideFolder() + R.id.unhide_folder -> unhideFolder() + R.id.exclude_folder -> tryExcludeFolder() + R.id.temporarily_show_hidden -> tryToggleTemporarilyShowHidden() + R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden() + R.id.increase_column_count -> increaseColumnCount() + R.id.reduce_column_count -> reduceColumnCount() + R.id.settings -> launchSettings() + R.id.about -> launchAbout() + else -> return super.onOptionsItemSelected(item) + } + return true + } + private fun storeStateVariables() { config.apply { mStoredUseEnglish = useEnglish @@ -150,6 +209,33 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { } } + private fun setupSearch(menu: Menu) { + val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager + mSearchMenuItem = menu.findItem(R.id.search) + (mSearchMenuItem!!.actionView as SearchView).apply { + setSearchableInfo(searchManager.getSearchableInfo(componentName)) + isSubmitButtonEnabled = false + setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String) = false + + override fun onQueryTextChange(newText: String): Boolean { + searchQueryChanged(newText) + return true + } + }) + } + } + + private fun searchQueryChanged(text: String) { + Thread { + val filtered = mMedia.filter { it.name.contains(text, true) } as ArrayList + filtered.sortBy { !it.name.startsWith(text, true) } + runOnUiThread { + (media_grid.adapter as? MediaAdapter)?.updateMedia(filtered) + } + }.start() + } + private fun tryloadGallery() { handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { @@ -176,13 +262,15 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { } private fun setupAdapter() { - if (isDirEmpty()) + if (isDirEmpty()) { return + } val currAdapter = media_grid.adapter if (currAdapter == null) { initZoomListener() - MediaAdapter(this, mMedia, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent, mAllowPickingMultiple, media_grid) { + val fastscroller = if (config.scrollHorizontally) media_horizontal_fastscroller else media_vertical_fastscroller + MediaAdapter(this, mMedia, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent, mAllowPickingMultiple, media_grid, fastscroller) { itemClicked((it as Medium).path) }.apply { setupZoomListener(mZoomListener) @@ -238,52 +326,6 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { }, LAST_MEDIA_CHECK_PERIOD) } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_media, menu) - - val isFolderHidden = File(mPath).containsNoMedia() - menu.apply { - findItem(R.id.hide_folder).isVisible = !isFolderHidden && !mShowAll - findItem(R.id.unhide_folder).isVisible = isFolderHidden && !mShowAll - - findItem(R.id.folder_view).isVisible = mShowAll - findItem(R.id.open_camera).isVisible = mShowAll - findItem(R.id.about).isVisible = mShowAll - - 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.viewTypeFiles == VIEW_TYPE_GRID && config.mediaColumnCnt < MAX_COLUMN_COUNT - findItem(R.id.reduce_column_count).isVisible = config.viewTypeFiles == VIEW_TYPE_GRID && config.mediaColumnCnt > 1 - - findItem(R.id.toggle_filename).isVisible = config.viewTypeFiles == VIEW_TYPE_GRID - } - - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.sort -> showSortingDialog() - R.id.filter -> showFilterMediaDialog() - R.id.toggle_filename -> toggleFilenameVisibility() - R.id.open_camera -> launchCamera() - R.id.folder_view -> switchToFolderView() - R.id.change_view_type -> changeViewType() - R.id.hide_folder -> tryHideFolder() - R.id.unhide_folder -> unhideFolder() - R.id.exclude_folder -> tryExcludeFolder() - R.id.temporarily_show_hidden -> tryToggleTemporarilyShowHidden() - R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden() - R.id.increase_column_count -> increaseColumnCount() - R.id.reduce_column_count -> reduceColumnCount() - R.id.settings -> launchSettings() - R.id.about -> launchAbout() - else -> return super.onOptionsItemSelected(item) - } - return true - } - private fun showSortingDialog() { ChangeSortingDialog(this, false, !config.showAll, mPath) { getMedia() @@ -367,8 +409,9 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { } private fun getMedia() { - if (mIsGettingMedia) + if (mIsGettingMedia) { return + } mIsGettingMedia = true val media = getCachedMedia(mPath) @@ -466,12 +509,16 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { } private fun increaseColumnCount() { + media_vertical_fastscroller.measureRecyclerViewOnRedraw() + media_horizontal_fastscroller.measureRecyclerViewOnRedraw() config.mediaColumnCnt = ++(media_grid.layoutManager as GridLayoutManager).spanCount invalidateOptionsMenu() media_grid.adapter?.notifyDataSetChanged() } private fun reduceColumnCount() { + media_vertical_fastscroller.measureRecyclerViewOnRedraw() + media_horizontal_fastscroller.measureRecyclerViewOnRedraw() config.mediaColumnCnt = --(media_grid.layoutManager as GridLayoutManager).spanCount invalidateOptionsMenu() media_grid.adapter?.notifyDataSetChanged() @@ -506,12 +553,11 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { .load(File(path)) .apply(options) .into(object : SimpleTarget() { - override fun onResourceReady(resource: Bitmap?, transition: Transition?) { + override fun onResourceReady(resource: Bitmap, transition: Transition?) { try { WallpaperManager.getInstance(applicationContext).setBitmap(resource) setResult(Activity.RESULT_OK) } catch (ignored: IOException) { - } finish() @@ -548,13 +594,17 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { media_empty_text_label.beVisibleIf(media.isEmpty() && !isFromCache) media_empty_text.beVisibleIf(media.isEmpty() && !isFromCache) + media_grid.beVisibleIf(media_empty_text_label.isGone()) + + val allowHorizontalScroll = config.scrollHorizontally && config.viewTypeFiles == VIEW_TYPE_GRID + media_vertical_fastscroller.beVisibleIf(media_grid.isVisible() && !allowHorizontalScroll) + media_horizontal_fastscroller.beVisibleIf(media_grid.isVisible() && allowHorizontalScroll) checkLastMediaChanged() - if (mLastDrawnHashCode == 0) - mLastDrawnHashCode = media.hashCode() - if (media.hashCode() == mMedia.hashCode() && media.hashCode() == mLastDrawnHashCode) + if (media.hashCode() == mMedia.hashCode() && media.hashCode() == mLastDrawnHashCode) { return + } mLastDrawnHashCode = media.hashCode() mMedia = media diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt index 18cbad383..6a32c732a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt @@ -39,7 +39,7 @@ class SettingsActivity : SimpleActivity() { setupManageIncludedFolders() setupManageExcludedFolders() setupManageHiddenFolders() - setupShowHiddenFolders() + setupShowHiddenItems() setupAutoplayVideos() setupLoopVideos() setupAnimateGifs() @@ -92,26 +92,28 @@ class SettingsActivity : SimpleActivity() { private fun setupManageHiddenFolders() { settings_manage_hidden_folders_holder.setOnClickListener { - startActivity(Intent(this, HiddenFoldersActivity::class.java)) + handleHiddenFolderPasswordProtection { + startActivity(Intent(this, HiddenFoldersActivity::class.java)) + } } } - private fun setupShowHiddenFolders() { - settings_show_hidden_folders.isChecked = config.showHiddenMedia - settings_show_hidden_folders_holder.setOnClickListener { + private fun setupShowHiddenItems() { + settings_show_hidden_items.isChecked = config.showHiddenMedia + settings_show_hidden_items_holder.setOnClickListener { if (config.showHiddenMedia) { - toggleHiddenFolders() + toggleHiddenItems() } else { handleHiddenFolderPasswordProtection { - toggleHiddenFolders() + toggleHiddenItems() } } } } - private fun toggleHiddenFolders() { - settings_show_hidden_folders.toggle() - config.showHiddenMedia = settings_show_hidden_folders.isChecked + private fun toggleHiddenItems() { + settings_show_hidden_items.toggle() + config.showHiddenMedia = settings_show_hidden_items.isChecked } private fun setupAutoplayVideos() { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt index 84fd594f8..348b78881 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -177,6 +177,13 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View return } + val file = File(mPath) + if (!file.exists()) { + deleteFromMediaStore(file) + finish() + return + } + if (intent.extras?.containsKey(IS_VIEW_INTENT) == true) { if (isShowHiddenFlagNeeded()) { if (!config.isPasswordProtectionOn) { @@ -189,7 +196,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View showSystemUI() - mDirectory = File(mPath).parent + mDirectory = file.parent supportActionBar?.title = mPath.getFilenameFromPath() view_pager.onGlobalLayout { @@ -679,7 +686,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { - toast(R.string.no_map_application) + toast(R.string.no_app_found) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index a8ee3f75f..e1e0def89 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -11,6 +11,7 @@ import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.PropertiesDialog import com.simplemobiletools.commons.dialogs.RenameItemDialog import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.dialogs.ExcludeFolderDialog @@ -24,7 +25,8 @@ import java.io.File import java.util.* class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList, val listener: DirOperationsListener?, recyclerView: MyRecyclerView, - val isPickIntent: Boolean, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) { + val isPickIntent: Boolean, fastScroller: FastScroller? = null, itemClick: (Any) -> Unit) : + MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private val config = activity.config private val isListViewType = config.viewTypeFolders == VIEW_TYPE_LIST @@ -92,7 +94,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList, val isShowingExcludedFolders: Boolean, val listener: RefreshRecyclerViewListener?, - recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) { + recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { private val config = activity.config - override fun getActionMenuId() = R.menu.cab_delete_only + override fun getActionMenuId() = R.menu.cab_remove_only override fun prepareActionMode(menu: Menu) {} @@ -30,7 +29,7 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList< override fun actionItemPressed(id: Int) { when (id) { - R.id.cab_delete -> askConfirmDelete() + R.id.cab_remove -> removeSelection() } } @@ -57,13 +56,7 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList< } } - private fun askConfirmDelete() { - ConfirmationDialog(activity) { - deleteSelection() - } - } - - private fun deleteSelection() { + private fun removeSelection() { val removeFolders = ArrayList(selectedPositions.size) selectedPositions.sortedDescending().forEach { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt index 4126a5c21..8bc51ea3a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt @@ -16,7 +16,7 @@ import java.io.File import java.util.* class ManageHiddenFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList, val listener: RefreshRecyclerViewListener?, - recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) { + recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { private val config = activity.config diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt index f2c3dfb17..66df85b70 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt @@ -1,6 +1,8 @@ package com.simplemobiletools.gallery.adapters import android.net.Uri +import android.os.Handler +import android.os.Looper import android.view.Menu import android.view.View import android.view.ViewGroup @@ -12,28 +14,40 @@ import com.simplemobiletools.commons.dialogs.RenameItemDialog import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.isActivityDestroyed +import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.dialogs.DeleteWithRememberDialog import com.simplemobiletools.gallery.extensions.* import com.simplemobiletools.gallery.helpers.VIEW_TYPE_LIST import com.simplemobiletools.gallery.models.Medium -import kotlinx.android.synthetic.main.photo_video_item_list.view.* +import kotlinx.android.synthetic.main.photo_video_item_grid.view.* import java.io.File import java.util.* class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, val listener: MediaOperationsListener?, val isAGetIntent: Boolean, - val allowMultiplePicks: Boolean, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) { + val allowMultiplePicks: Boolean, recyclerView: MyRecyclerView, fastScroller: FastScroller? = null, + itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { + + private val INSTANT_LOAD_DURATION = 2000L + private val IMAGE_LOAD_DELAY = 100L private val config = activity.config private val isListViewType = config.viewTypeFiles == VIEW_TYPE_LIST private var skipConfirmationDialog = false + private var visibleItemPaths = ArrayList() + private var loadImageInstantly = false + private var delayHandler = Handler(Looper.getMainLooper()) private var scrollHorizontally = config.scrollHorizontally private var animateGifs = config.animateGifs private var cropThumbnails = config.cropThumbnails private var displayFilenames = config.displayFileNames + init { + enableInstantLoad() + } + override fun getActionMenuId() = R.menu.cab_media override fun prepareItemSelection(view: View) { @@ -51,6 +65,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { val medium = media[position] + visibleItemPaths.add(medium.path) val view = holder.bindView(medium, !allowMultiplePicks) { itemView, layoutPosition -> setupView(itemView, medium) } @@ -92,7 +107,9 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, override fun onViewRecycled(holder: ViewHolder?) { super.onViewRecycled(holder) if (!activity.isActivityDestroyed()) { - Glide.with(activity).clear(holder?.itemView?.medium_thumbnail) + val itemView = holder?.itemView + visibleItemPaths.remove(itemView?.photo_name?.tag) + Glide.with(activity).clear(itemView?.medium_thumbnail!!) } } @@ -230,12 +247,14 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, fun updateMedia(newMedia: ArrayList) { media = newMedia + enableInstantLoad() notifyDataSetChanged() finishActMode() } fun updateDisplayFilenames(displayFilenames: Boolean) { this.displayFilenames = displayFilenames + enableInstantLoad() notifyDataSetChanged() } @@ -254,12 +273,32 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, notifyDataSetChanged() } + private fun enableInstantLoad() { + loadImageInstantly = true + delayHandler.postDelayed({ + loadImageInstantly = false + }, INSTANT_LOAD_DURATION) + } + private fun setupView(view: View, medium: Medium) { view.apply { play_outline.beVisibleIf(medium.video) photo_name.beVisibleIf(displayFilenames || isListViewType) photo_name.text = medium.name - activity.loadImage(medium.path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails) + photo_name.tag = medium.path + + if (loadImageInstantly) { + activity.loadImage(medium.path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails) + } else { + medium_thumbnail.setImageDrawable(null) + medium_thumbnail.isHorizontalScrolling = scrollHorizontally + delayHandler.postDelayed({ + val isVisible = visibleItemPaths.contains(medium.path) + if (isVisible) { + activity.loadImage(medium.path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails) + } + }, IMAGE_LOAD_DELAY) + } if (isListViewType) { photo_name.setTextColor(textColor) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt index ec99f9352..9d3cd9335 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt @@ -64,7 +64,7 @@ fun Activity.launchCamera() { if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { - toast(R.string.no_camera_app_found) + toast(R.string.no_app_found) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt index b99ac8867..eecaff05c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -246,6 +246,7 @@ class PhotoFragment : ViewPagerFragment() { view.subsampling_view.apply { maxScale = 10f beVisible() + isQuickScaleEnabled = false setImage(ImageSource.uri(medium.path)) orientation = if (orient == -1) SubsamplingScaleImageView.ORIENTATION_USE_EXIF else degreesForRotation(orient) setOnImageEventListener(object : SubsamplingScaleImageView.OnImageEventListener { @@ -325,7 +326,7 @@ class PhotoFragment : ViewPagerFragment() { override fun onDestroyView() { super.onDestroyView() if (activity?.isActivityDestroyed() == false) { - Glide.with(context).clear(view.gif_view) + Glide.with(context!!).clear(view.gif_view) view.subsampling_view.recycle() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/GlideRotateTransformation.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/GlideRotateTransformation.kt index 8a48b23f4..aae7d66ca 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/GlideRotateTransformation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/GlideRotateTransformation.kt @@ -17,6 +17,6 @@ class GlideRotateTransformation(context: Context, val rotateRotationAngle: Float return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true) } - override fun updateDiskCacheKey(messageDigest: MessageDigest?) { + override fun updateDiskCacheKey(messageDigest: MessageDigest) { } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a01449b1a..033563bb1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -36,7 +36,7 @@ @@ -48,7 +48,8 @@ android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:paddingLeft="@dimen/normal_margin" - android:paddingStart="@dimen/normal_margin"> + android:paddingStart="@dimen/normal_margin" + android:visibility="gone"> @@ -61,7 +62,8 @@ android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" - android:paddingTop="@dimen/normal_margin"> + android:paddingTop="@dimen/normal_margin" + android:visibility="gone"> diff --git a/app/src/main/res/layout/activity_media.xml b/app/src/main/res/layout/activity_media.xml index 918e39428..b4bcb9c16 100644 --- a/app/src/main/res/layout/activity_media.xml +++ b/app/src/main/res/layout/activity_media.xml @@ -36,7 +36,7 @@ @@ -48,7 +48,8 @@ android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:paddingLeft="@dimen/normal_margin" - android:paddingStart="@dimen/normal_margin"> + android:paddingStart="@dimen/normal_margin" + android:visibility="gone"> @@ -61,7 +62,8 @@ android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" - android:paddingTop="@dimen/normal_margin"> + android:paddingTop="@dimen/normal_margin" + android:visibility="gone"> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 7e96f52dd..8ec33b33f 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -68,6 +68,25 @@ + + + + + + - - - - - - + android:id="@+id/search" + android:icon="@drawable/ic_search" + android:title="@string/search" + app:actionViewClass="android.support.v7.widget.SearchView" + app:showAsAction="collapseActionView|ifRoom"/> + مجلد آخر عرض على الخريطة موقع غير معروف - لم يتم العثور على أي تطبيق مع الخرائط - لم يتم العثور على تطبيق كاميرا زيادة عدد الأعمدة تقليل عدد الأعمدة تغيير صورة الغلاف @@ -91,7 +89,6 @@ تعيين كخلفية الشاشة فشل الإعداد كخلفية تعيين كخلفية بواسطة: - لم يتم العثور على أي تطبيق لأداء المهمة ... جار تعيين الخلفية ... تم تعيبن الخلفية بنجاح صورة نسبة العرض إلى الارتفاع diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml new file mode 100644 index 000000000..6fbfd736d --- /dev/null +++ b/app/src/main/res/values-ca/strings.xml @@ -0,0 +1,154 @@ + + + Simple Gallery + Galeria + Editar + Obrir càmera + (ocult) + Fixar carpeta + No fixar carpeta + Ancorar a l\'inici + Mostrar el contingut de totes les carpetes + Tots els mitjans + Canviar a vista de carpeta + Un altre carpeta + Mostrar al mapa + Ubicació desconeguda + Augmentar el número de columnes + Reduir el número de columnes + Canviar imatge de portada + Sel·leccionar imatge + Us per defecte + Volum + Brillantor + No tornar a preguntar en aquesta sessió + Bloquejar orientació + Desbloquejar orientació + + + Filtre d\'arxius + Imatges + Vídeos + GIFs + No s\'han tronat arxius amb els filtres seleccionats. + Canviar filtres + + + Aquesta funció oculta les carpetes agregant un arxiu \'.nomedia\' dins d\'ella. També ocultarà les subcarpetes. Pots mostrar-les canviant la opció \'Mostrar carpetes ocultes\' als ajustaments. Continuar? + Excloure + Carpetes excloses + Gestionar carpetes excloses + Això exclou la selecció juntament amb les carpetes, només de Simple Gallery. Pots gestionar les carpetes excloses en els Ajustaments. + Excloure millor la carpeta superior? + Excloure les carpetes les ocultarà junt amb les seves subcarpetes, però només a Simple Gallery. Seguirant sent visibles a altres aplicacions.\\n\\nSi vols ocultar-les d'altres aplicacions fes servir la opció Ocultar. + Eliminar tot + Eliminar totes les carpetes de la llista d\'excloses? Això no eliminarà les carpetes. + Carpetes ocultes + Gestionar carpetes ocultes + Sembla que no tens cap carpeta amb l\'arxiu \".nomedia\". + + + Carpetes incloses + Gestionar carpetes incloses + Agregar carpeta + Si tens alguna carpeta que contingui multimèdia però no ha estat reconeguda per la aplicació, pots agregar-les manualment aquí. + + + Redimensionar + Redimensionar la selecció i desar + Ample + Alt + Mantenir proporcions + Si us plau, introdueix una resolució vàlida + + + Editor + Guardar + Rotar + Ruta + Ruta de imatge no vàlida + Ha fallat la edició de la imatge + Editar imatge utilitzant: + No s\'ha trobat cap editor d\'imatges + Ubicació de l\'arxiu desconeguda + No s\'ha pogut sobreescriure l\'arxiu d\'origen + Rotar a l\'esquerra + Rotar a la dreta + Rotar 180º + Girar + Horizontalment + Verticalment + Editar amb + + + Fons de pantalla de Simple Gallery + Establir com a fons de pantalla + Error a l\'establir com fons de pantalla + Establir com fons de pantalla amb: + Establint fons de pantalla… + Fons de pantalla establert correctament + Relació d\'aspecte tipus retrat + Relació d\'aspecte tipus paisatge + Pantalla principal + Pantalla de bloqueig + Pantalla principal i de bloqueig + + + Presentació de diapositives + Interval (segons): + Inclou imatges + Inclou vídeos + Inclou GIFs + Ordre aleatori + Utilitza animacions de desaparició + Moure cap enrere + Presentació de diapositives + S\'ha acabat la presentació de diapositives + No s\'han trobat mitjans per a la presentació de diapositives + + + Canviar el tipus de vista + Reixeta + Llista + + + Reproduir vídeos automàticament + Canviar la visibilitat del nom d\'arxiu + Reproducció continua de vídeos + Animar les miniatures dels GIFs + Brillantor màxima quan es mostra multimèdia + Retallar miniatures en quadrats + Gira els mitjans a pantalla completa segons + Configuració del sistema + Rotació del dispositiu + Relació d\'aspecte + Fons i barra d\'estat negre als mitjans de pantalla completa + Desplaçar miniatures horizontalment + Ocultar automàticament la interficie de usuari del sistema a pantalla complerta + Eliminar carpetes buides després d\'esborrar el seu contingut + Permet controlar el volum i la brillantor del vídeo amb gestos verticals + Mostrar el número de mitjans de les carpetes a la vista principal + Reemplaçar Compartir per Girar al menú de pantalla complerta + Mostrar detalls estesos sobre mitjans a pantalla complerta + Gestioneu els detalls ampliats + + + + Una galeria per veure imatges i vídeos sense publicitat. + + Una eina senzilla que es pot fer servir per veure imatges i vídeos. Els elements es poden ordenar per data, mida o nom, tant ascendent com descendent. Es pot fer zoom a les imatges. Els arxius de mitjans es mostren en múltiples columnes depenent de la mida de la pantalla i es pot canviar el número de columnes mitjançant gestos. Permet canviar el nom, compartir, esborrar, i moure. Les imatges també es poden retalla, rotar o utilitzar com a fons de pantalla directament des de l\'aplicació. + + Gallery també s'ofereix per us de tercers, per visualitzar imatges/vídeos, agregar adjunts a clients de correu, etc. Es perfecta per l\'ús diari. + + El permís d\'empremtes dactilars és necessari per bloquejar la visibilitat d'elements ocults o tota l\'aplicació. + + No conté ni publicitat ni permisos innecessaris. Es totalment Lliure i proporciona colors personalitzables. + + Aquesta aplicació es només una peça d'una sèrie més gran d'aplicacions. Pots trobar la resta a http://www.simplemobiletools.com + + + + diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d3409cad7..e81d248ca 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -14,8 +14,6 @@ Jiná složka Zobrazit na mapě Neznámá poloha - Nebyla nalezena žádná mapová aplikace - Nebyla nalezena žádná fotografická aplikace Zvýšit počet sloupců Snížit počet sloupců Change cover image @@ -87,7 +85,6 @@ Nastavit jako tapetu Nastavení tapety selhalo Nastavit jako tapetu pomocí: - Nebyla nalezena žádná vhodná aplikace Nastavuje se tapeta… Tapeta byla úspěšně změněna Portrait aspect ratio diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7bc1848a5..565eb25c2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -14,8 +14,6 @@ Ordner wählen Auf Karte zeigen Unbekannter Pfad - Keine Karten-App gefunden - Keine Kamera-App gefunden Kacheln verkleinern Kacheln vergrößern Coverbild ändern @@ -37,12 +35,12 @@ Diese Funktion versteckt die ausgewählten 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? - Ordner ausblenden - Ausgeblendete Ordner - Ausgeblendete Ordner verwalten - Diese Funktion blendet die ausgewählten Ordner und deren Unterordner aus (nur in dieser App). Ausgeblendete Ordner können in den Einstellungen verwaltet werden. - Möchten Sie stattdessen einen höherliegenden Ordner ausblenden? - \'Ordner ausblenden\' wird ausgewählte Ordner und deren Unterordner nur in dieser App ausblenden. Andere Apps werden solche Ordner weiterhin anzeigen.\\n\\nWenn Sie Ordner auch für andere Apps verstecken wollen, verwenden Sie dafür die Funktion \'Ordner verstecken\'. + Ordner ausschließen + Ausgeschlossene Ordner + Ausgeschlossene Ordner verwalten + Diese Funktion blendet die ausgewählten Ordner und deren Unterordner nur in dieser App aus. Ausgeschlossene Ordner können in den Einstellungen verwaltet werden. + Möchtest du stattdessen einen höherliegenden Ordner ausschließen? + \'Ordner ausschließen\' wird ausgewählte Ordner und deren Unterordner nur in dieser App ausblenden. Andere Apps werden solche Ordner weiterhin anzeigen.\\n\\nWenn du Ordner auch für andere Apps verstecken willst, verwende dafür die Funktion \'Ordner verstecken\'. Alle entfernen Alle Ordner aus der Ausgeblendet-Liste entfernen? Die Ordner selbst werden nicht gelöscht. Versteckte Ordner @@ -53,7 +51,7 @@ Einbezogene Ordner Einbezogene Ordner verwalten Ordner hinzufügen - Sollten Sie weitere Medienordner haben, die von der App nicht erkannt wurden, können Sie diese hier manuell hinzufügen. + Solltest du weitere Medienordner haben, die von der App nicht erkannt wurden, kannst du diese hier manuell hinzufügen. Größe ändern @@ -87,7 +85,6 @@ Als Hintergrund festlegen Hintergrundbild festlegen fehlgeschlagen Als Hintergrund festlegen mit - Keine Hintergrundbild-App gefunden Hintergrund festlegen… Hintergrundbild erfolgreich festgelegt Hochformat diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f0e42eb02..ff2b8cc85 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -7,33 +7,31 @@ (oculto) Fijar carpeta No fijar carpeta - Pin to the top + Anclar arriba Mostrar el contenido de todas las carpetas Todos los medios Cambiar a vista de carpeta Otra carpeta Mostrar en el mapa Ubicación desconocida - No se encontró aplicación de mapas - No se encontró aplicación de cámara Aumentar el número de columnas Reducir el número de columnas Cambiar imagen de portada Seleccionar imagen Uso por defecto - Volume - Brightness - Do not ask again in this session - Lock orientation - Unlock orientation + Volumen + Brillo + No volver a preguntar en esta sesión + Bloquear orientación + Desbloquear orientación Filtro de medios - Images - Videos + Imágenes + Vídeos GIFs - No media files have been found with the selected filters. - Change filters + No se han encontrado ficheros con los filtros seleccionados. + Ccambiar flitros 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? @@ -45,9 +43,9 @@ 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. Eliminar todo ¿Eliminar todas las carpetas de la lista de excluidas? Esto no borrará las carpetas. - Hidden folders - Manage hidden folders - Seems like you don\'t have any folders hidden with a \".nomedia\" file. + Carpetas ocultas + Gestionar carpetas ocultas + Parece que no tienes carpetas ocultas con \".nomedia\" ficheros. Carpetas incluidas @@ -87,32 +85,31 @@ Establecer como fondo de pantalla Error al establecer fondo de pantalla Establecer como fondo de pantalla con: - No se encontró aplicación para ello Estableciendo fondo de pantalla… Fondo de pantalla establecido correctamente Relación de aspecto tipo retrato Relación de aspecto tipo paisaje - Home screen - Lock screen - Home and lock screen + Pantalla de inicio + Pantalla de bloqueo + Pantalla de inicio y de bloqueo - Slideshow - Interval (seconds): - Include photos - Include videos - Include GIFs - Random order - Use fade animations - Move backwards - Loop slideshow - The slideshow ended - No media for the slideshow have been found + Diapositivas + Intervalo (segundos): + Incluir fotos + Incluir vídeos + Incluir GIFs + Orden aleatorio + Usar animaciones de desvanecimiento + Mover hacia atrás + Presentación de diapositivas + La diapositiva terminó + No se han encontrado medios para la presentación de diapositivas Cambiar tipo de vista - Grid - List + Cuadrícula + Lista Reproducir vídeos automáticamente @@ -125,7 +122,7 @@ Configuración del sistema Rotación del dispositivo Relación de aspecto - Black background and status bar at fullscreen media + Fondo y barra de estado negra en medios de pantalla completa Desplazar miniaturas horizontalmente Ocultar automáticamente la interfaz de usuario del sistema en medios de pantalla completa Eliminar carpetas vacias despues de borrar su contenido @@ -133,7 +130,7 @@ Mostrar el conteo de medios de las carpetas en la vista principal Reemplazar Compartir con Girar en el menú de pantalla completa Mostrar detalles extendidos sobre medios en pantalla completa - Manage extended details + Administrar detalles ampliados @@ -143,7 +140,7 @@ Gallery también se ofrece para uso de terceros para previsualizar imágenes/vídeos, agregar adjuntos en clientes de correo, etc. Es perfecta para uso diario. - The fingerprint permission is needed for locking either hidden item visibility, or the whole app. + El permiso de huella digital es necesario para bloquear la visibilidad de elementos ocultos o toda la aplicación. No contiene publicidad ni permisos innecesarios. Es totalmente libre, proporciona colores personalizables. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 5ffb8ac09..85e95f0bc 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -14,8 +14,6 @@ Muu kansio Näytä kartalla Tuntematon sijainti - Karttasovellusta ei löytynyt - Kamerasovellusta ei löytynyt Increase column count Reduce column count Vaihda kansikuva @@ -87,7 +85,6 @@ Aseta taustakuvaksi Taustakuvan asetus epäonnistui Aseta taustakuvaksi sovelluksella: - Toimivaa sovellusta ei löydetty Asetetaan taustakuvaa… Taustakuva asetettu onnistuneesti Kuvasuhde pystyssä diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 348478ac1..752ad5b36 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -7,15 +7,13 @@ (caché) Épingler le dossier Désépingler le dossier - Pin to the top + Épingler en haut Afficher le contenu de tous les dossiers Tous les dossiers Permuter vers la vue du dossier Autre dossier Afficher sur la carte Position inconnue - Aucune application de carte n\'a été trouvée - Aucune application d\'appareil photo n\'a été trouvée Augmenter le nombre de colonnes Réduire le nombre de colonnes Changer l\'image de couverture @@ -24,8 +22,8 @@ Volume Luminosité Ne pas redemander pour cette session - Lock orientation - Unlock orientation + Verrouiller la rotation + Déverrouiller la rotation Filtrer les médias @@ -41,13 +39,13 @@ Dossiers exclus Gérer les dossiers exclus Cela va exclure la sélection ainsi que ses sous-dossiers depuis Simple Galerie uniquement. Vous pouvez gérer les dossiers exclus depuis les Paramètres. - Exclure un parent plutôt ? + Exclure un dossier parent ? Exclure des dossiers les masquera ainsi que leurs sous-dossiers uniquement dans Simple Galerie, ils seront toujours visibles depuis d\'autres applications.\\n\\nSi vous voulez aussi les masquer ailleurs, utilisez la fonction Masquer. Tout supprimer Supprimer tous les dossiers de la liste des exclusions ? Ceci n\'effacera pas les dossiers. - Hidden folders - Manage hidden folders - Seems like you don\'t have any folders hidden with a \".nomedia\" file. + Dossiers masqués + Gérer les dossiers masqués + Il semblerait que vous n\'ayez pas de dossier cachés avec un fichier \".nomedia\". Dossiers inclus @@ -87,14 +85,13 @@ Définir comme fond d\'écran Échec de la définition en tant que fond d\'écran. Définir comme fond d\'écran avec : - Aucune application trouvée pour continuer cette action Paramètres de fond d\'écran… Fond d\'écran défini avec succès Ratio d\'aspect portrait Ratio d\'aspect paysage - Home screen - Lock screen - Home and lock screen + Page d\'accueil + Écran de verouillage + Page d\'accueil et écran de verrouillage Diaporama @@ -125,7 +122,7 @@ Paramètres système Rotation de l\'appareil Ratio d\'aspect - Black background and status bar at fullscreen media + Fond et barre de statur noir en plein écran Défilement des miniatures horizontalement Masquer automatiquement l\'interface utilisateur si média plein écran Supprimer les dossiers vides après avoir supprimé leur contenu @@ -143,11 +140,11 @@ La galerie est également proposée pour une utilisation comme tierce partie pour la prévisualisation des images/vidéos, ajouter des pièces jointes aux clients email etc. C\'est parfait pour un usage au quotidien. - The fingerprint permission is needed for locking either hidden item visibility, or the whole app. + L\'autorisation d\'empreinte digitale est nécessaire pour verrouiller les dossiers cachés et/ou l\'application. L\'application ne contient ni publicité ni autorisation inutile. Elle est totalement opensource et est aussi fournie avec des couleurs personnalisables. - Cette application est juste l\'une des applications d\'une plus grande suite. Vous pouvez trouver les autres sur http://www.simplemobiletools.com + Cette application fait partie d\'une plus grande suite. Vous pouvez trouver les autres applications sur http://www.simplemobiletools.com