diff --git a/CHANGELOG.md b/CHANGELOG.md
index 914c2a716..ec08cac15 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,29 @@
Changelog
==========
+Version 4.1.1 *(2018-05-26)*
+----------------------------
+
+ * Always set folder thumbnail based on folder content sorting
+ * Make sure hidden folders have the "(hidden)" appended
+
+Version 4.1.0 *(2018-05-25)*
+----------------------------
+
+ * Added sorting by Date Taken
+ * Fixed file renaming on Android Oreo
+ * Fixed some scrollbar glitches
+ * Fixed broken "Use english language" in some cases
+ * Make sure only the proper files are shown at "Show all folders content"
+ * Many other smaller UX, stability improvements and bugfixes
+
+Version 4.0.0 *(2018-05-13)*
+----------------------------
+
+ * Allow customizing the app launcher color
+ * Remove the top spinning circle at initial launch
+ * Many other bugfixes and UX/stability improvements
+
Version 3.8.2 *(2018-04-26)*
----------------------------
diff --git a/app/build.gradle b/app/build.gradle
index 5584b3101..77b4f15bb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,8 +11,8 @@ android {
applicationId "com.simplemobiletools.gallery"
minSdkVersion 16
targetSdkVersion 27
- versionCode 176
- versionName "3.8.2"
+ versionCode 179
+ versionName "4.1.1"
multiDexEnabled true
setProperty("archivesBaseName", "gallery")
}
@@ -47,16 +47,16 @@ ext {
}
dependencies {
- implementation 'com.simplemobiletools:commons:3.19.21'
+ implementation 'com.simplemobiletools:commons:4.1.4'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0'
implementation 'com.android.support:multidex:1.0.3'
implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.12'
implementation 'com.github.chrisbanes:PhotoView:2.1.3'
- kapt "android.arch.persistence.room:compiler:1.0.0"
- implementation "android.arch.persistence.room:runtime:1.0.0"
- annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
+ kapt "android.arch.persistence.room:compiler:1.1.0"
+ implementation "android.arch.persistence.room:runtime:1.1.0"
+ annotationProcessor "android.arch.persistence.room:compiler:1.1.0"
//implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.9.0'
implementation 'com.github.tibbi:subsampling-scale-image-view:v3.10.0-fork'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 09a160080..7f0b41b8a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -20,8 +20,6 @@
android:name=".activities.SplashActivity"
android:theme="@style/SplashTheme">
-
-
@@ -212,5 +210,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt
index e54ba3251..79ea0700e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt
@@ -176,6 +176,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
Intent().apply {
+ data = saveUri
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
setResult(RESULT_OK, this)
}
@@ -260,7 +261,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
private fun scanFinalPath(path: String) {
- scanPath(path) {
+ scanPathRecursively(path) {
setResult(Activity.RESULT_OK, intent)
toast(R.string.file_saved)
finish()
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/IncludedFoldersActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/IncludedFoldersActivity.kt
index cbbb5e701..ede3ab8d8 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/IncludedFoldersActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/IncludedFoldersActivity.kt
@@ -5,7 +5,7 @@ import android.view.Menu
import android.view.MenuItem
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.beVisibleIf
-import com.simplemobiletools.commons.extensions.scanPath
+import com.simplemobiletools.commons.extensions.scanPathRecursively
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.adapters.ManageFoldersAdapter
@@ -55,7 +55,7 @@ class IncludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener {
config.addIncludedFolder(it)
updateFolders()
Thread {
- scanPath(it)
+ scanPathRecursively(it)
}.start()
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt
index 76e45fc22..09098adaf 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt
@@ -26,7 +26,7 @@ import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.gallery.BuildConfig
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.adapters.DirectoryAdapter
-import com.simplemobiletools.gallery.databases.GalleryDataBase
+import com.simplemobiletools.gallery.databases.GalleryDatabase
import com.simplemobiletools.gallery.dialogs.ChangeSortingDialog
import com.simplemobiletools.gallery.dialogs.FilterMediaDialog
import com.simplemobiletools.gallery.extensions.*
@@ -72,7 +72,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- appLaunched()
+ appLaunched(BuildConfig.APPLICATION_ID)
mIsPickImageIntent = isPickImageIntent(intent)
mIsPickVideoIntent = isPickVideoIntent(intent)
@@ -188,10 +188,11 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
override fun onDestroy() {
super.onDestroy()
config.temporarilyShowHidden = false
+ config.tempSkipDeleteConfirmation = false
mTempShowHiddenHandler.removeCallbacksAndMessages(null)
removeTempFolder()
if (!isChangingConfigurations) {
- GalleryDataBase.destroyInstance()
+ GalleryDatabase.destroyInstance()
}
}
@@ -294,11 +295,6 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
val getVideosOnly = mIsPickVideoIntent || mIsGetVideoContentIntent
getCachedDirectories(getVideosOnly, getImagesOnly) {
- if (!mLoadedInitialPhotos) {
- runOnUiThread {
- directories_refresh_layout.isRefreshing = true
- }
- }
gotDirectories(addTempFolderIfNeeded(it))
}
}
@@ -542,7 +538,8 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
}
private fun fillIntentPath(resultData: Intent, resultIntent: Intent) {
- val path = resultData.data.path
+ val data = resultData.data
+ val path = if (data.toString().startsWith("/")) data.toString() else data.path
val uri = getFilePublicUri(File(path), BuildConfig.APPLICATION_ID)
val type = path.getMimeType()
resultIntent.setDataAndTypeAndNormalize(uri, type)
@@ -595,9 +592,10 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0
val mediumDao = galleryDB.MediumDao()
val directoryDao = galleryDB.DirectoryDao()
+ val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
for (directory in dirs) {
- val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly)
+ val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken)
val newDir = if (curMedia.isEmpty()) {
directory
} else {
@@ -611,6 +609,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
directory.apply {
tmb = newDir.tmb
+ name = newDir.name
mediaCnt = newDir.mediaCnt
modified = newDir.modified
taken = newDir.taken
@@ -632,13 +631,14 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
}
}
- val foldersToScan = mediaFetcher.getFoldersToScan("")
+ val foldersToScan = mediaFetcher.getFoldersToScan()
dirs.forEach {
foldersToScan.remove(it.path)
}
+ // check the remaining folders which were not cached at all yet
for (folder in foldersToScan) {
- val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly)
+ val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken)
if (newMedia.isEmpty()) {
continue
}
@@ -779,7 +779,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
private fun getCurrentlyDisplayedDirs() = getRecyclerAdapter()?.dirs ?: ArrayList()
- private fun getBubbleTextItem(index: Int) = getRecyclerAdapter()?.dirs?.getOrNull(index)?.getBubbleText() ?: ""
+ private fun getBubbleTextItem(index: Int) = getRecyclerAdapter()?.dirs?.getOrNull(index)?.getBubbleText(config.directorySorting) ?: ""
private fun setupLatestMediaId() {
Thread {
@@ -873,6 +873,8 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
add(Release(158, R.string.release_158))
add(Release(159, R.string.release_159))
add(Release(163, R.string.release_163))
+ add(Release(177, R.string.release_177))
+ add(Release(178, R.string.release_178))
checkWhatsNew(this, BuildConfig.VERSION_CODE)
}
}
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 7ef0ac69b..fa5ebcb5f 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt
@@ -175,6 +175,7 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
super.onDestroy()
if (config.showAll) {
config.temporarilyShowHidden = false
+ config.tempSkipDeleteConfirmation = false
}
mTempShowHiddenHandler.removeCallbacksAndMessages(null)
@@ -333,20 +334,22 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
media_horizontal_fastscroller.isHorizontal = true
media_horizontal_fastscroller.beVisibleIf(allowHorizontalScroll)
+ val sorting = config.getFileSorting(mPath)
+
if (allowHorizontalScroll) {
media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid, media_refresh_layout) {
- media_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it))
+ media_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
} else {
media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid, media_refresh_layout) {
- media_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it))
+ media_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
}
}
- private fun getBubbleTextItem(index: Int) = getMediaAdapter()?.media?.getOrNull(index)?.getBubbleText() ?: ""
+ private fun getBubbleTextItem(index: Int, sorting: Int) = getMediaAdapter()?.media?.getOrNull(index)?.getBubbleText(sorting) ?: ""
private fun checkLastMediaChanged() {
if (isActivityDestroyed())
@@ -479,6 +482,7 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
mCurrAsyncTask = GetMediaAsynctask(applicationContext, mPath, mIsGetImageIntent, mIsGetVideoIntent, mShowAll) {
gotMedia(it)
}
+
mCurrAsyncTask!!.execute()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt
index 3cd1fcecc..d230fa2f6 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt
@@ -67,14 +67,14 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
mIsFromGallery = intent.getBooleanExtra(IS_FROM_GALLERY, false)
if (mUri!!.scheme == "file") {
- scanPath(mUri!!.path)
+ scanPathRecursively(mUri!!.path)
sendViewPagerIntent(mUri!!.path)
finish()
return
} else {
val path = applicationContext.getRealPathFromURI(mUri!!) ?: ""
if (path != mUri.toString() && path.isNotEmpty() && mUri!!.authority != "mms") {
- scanPath(mUri!!.path)
+ scanPathRecursively(mUri!!.path)
sendViewPagerIntent(path)
finish()
return
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SimpleActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SimpleActivity.kt
index 42e8828dc..627ff7da9 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SimpleActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SimpleActivity.kt
@@ -1,5 +1,30 @@
package com.simplemobiletools.gallery.activities
import com.simplemobiletools.commons.activities.BaseSimpleActivity
+import com.simplemobiletools.gallery.R
-open class SimpleActivity : BaseSimpleActivity()
+open class SimpleActivity : BaseSimpleActivity() {
+ override fun getAppIconIDs() = arrayListOf(
+ R.mipmap.ic_launcher_red,
+ R.mipmap.ic_launcher_pink,
+ R.mipmap.ic_launcher_purple,
+ R.mipmap.ic_launcher_deep_purple,
+ R.mipmap.ic_launcher_indigo,
+ R.mipmap.ic_launcher_blue,
+ R.mipmap.ic_launcher_light_blue,
+ R.mipmap.ic_launcher_cyan,
+ R.mipmap.ic_launcher_teal,
+ R.mipmap.ic_launcher_green,
+ R.mipmap.ic_launcher_light_green,
+ R.mipmap.ic_launcher_lime,
+ R.mipmap.ic_launcher_yellow,
+ R.mipmap.ic_launcher_amber,
+ R.mipmap.ic_launcher,
+ R.mipmap.ic_launcher_deep_orange,
+ R.mipmap.ic_launcher_brown,
+ R.mipmap.ic_launcher_blue_grey,
+ R.mipmap.ic_launcher_grey_black
+ )
+
+ override fun getAppLauncherName() = getString(R.string.app_launcher_name)
+}
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 1c6a30d40..31a23202a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt
@@ -58,7 +58,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mPos = -1
private var mShowAll = false
private var mIsSlideshowActive = false
- private var mSkipConfirmationDialog = false
private var mRotationDegrees = 0
private var mPrevHashcode = 0
@@ -182,7 +181,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (!getDoesFilePathExist(mPath)) {
Thread {
- scanPath(mPath)
+ scanPathRecursively(mPath)
}.start()
finish()
return
@@ -554,7 +553,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
copyFile(tmpPath, newPath)
- scanPath(newPath)
+ scanPathRecursively(newPath)
toast(R.string.file_saved)
if (config.keepLastModified) {
@@ -728,7 +727,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun checkDeleteConfirmation() {
- if (mSkipConfirmationDialog || config.skipDeleteConfirmation) {
+ if (config.tempSkipDeleteConfirmation || config.skipDeleteConfirmation) {
deleteConfirmed()
} else {
askConfirmDelete()
@@ -737,7 +736,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun askConfirmDelete() {
DeleteWithRememberDialog(this, getString(R.string.proceed_with_deletion)) {
- mSkipConfirmationDialog = it
+ config.tempSkipDeleteConfirmation = it
deleteConfirmed()
}
}
@@ -833,7 +832,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
tryDeleteFileDirItem(fileDirItem, true)
}
- scanPath(mDirectory)
+ scanPathRecursively(mDirectory)
}
private fun checkOrientation() {
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 06d14443c..66c7e08fa 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt
@@ -61,8 +61,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList
+ val dir = dirs.getOrNull(position) ?: return
+ val view = holder.bindView(dir, !isPickIntent) { itemView, adapterPosition ->
setupView(itemView, dir)
}
bindViewHolder(holder, position, view)
@@ -169,7 +169,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList
notifyDataSetChanged()
finishActMode()
+ fastScroller?.measureRecyclerView()
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt
index b8579ebea..e27d56887 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt
@@ -43,7 +43,7 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList<
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val folder = folders[position]
- val view = holder.bindView(folder) { itemView, layoutPosition ->
+ val view = holder.bindView(folder) { itemView, adapterPosition ->
setupView(itemView, folder)
}
bindViewHolder(holder, position, view)
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 3d42824be..931348420 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt
@@ -45,7 +45,7 @@ class ManageHiddenFoldersAdapter(activity: BaseSimpleActivity, var folders: Arra
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val folder = folders[position]
- val view = holder.bindView(folder) { itemView, layoutPosition ->
+ val view = holder.bindView(folder) { itemView, adapterPosition ->
setupView(itemView, folder)
}
bindViewHolder(holder, position, view)
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 a20c58a82..d1ed183ec 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt
@@ -31,7 +31,6 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList,
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())
@@ -64,9 +63,9 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList,
}
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
- val medium = media[position]
+ val medium = media.getOrNull(position) ?: return
visibleItemPaths.add(medium.path)
- val view = holder.bindView(medium, !allowMultiplePicks) { itemView, layoutPosition ->
+ val view = holder.bindView(medium, !allowMultiplePicks) { itemView, adapterPosition ->
setupView(itemView, medium)
}
bindViewHolder(holder, position, view)
@@ -152,12 +151,13 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList,
RenameItemDialog(activity, oldPath) {
Thread {
activity.updateDBMediaPath(oldPath, it)
- }.start()
- activity.runOnUiThread {
- listener?.refreshItems()
- finishActMode()
- }
+ activity.runOnUiThread {
+ enableInstantLoad()
+ listener?.refreshItems()
+ finishActMode()
+ }
+ }.start()
}
}
@@ -201,7 +201,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList,
}
private fun checkDeleteConfirmation() {
- if (skipConfirmationDialog || config.skipDeleteConfirmation) {
+ if (config.tempSkipDeleteConfirmation || config.skipDeleteConfirmation) {
deleteFiles()
} else {
askConfirmDelete()
@@ -212,7 +212,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList,
val items = resources.getQuantityString(R.plurals.delete_items, selectedPositions.size, selectedPositions.size)
val question = String.format(resources.getString(R.string.deletion_confirmation), items)
DeleteWithRememberDialog(activity, question) {
- skipConfirmationDialog = it
+ config.tempSkipDeleteConfirmation = it
deleteFiles()
}
}
@@ -260,6 +260,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList,
enableInstantLoad()
notifyDataSetChanged()
finishActMode()
+ fastScroller?.measureRecyclerView()
}, 100L)
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MyPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MyPagerAdapter.kt
index 2068a7c55..d4f3d0be1 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MyPagerAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MyPagerAdapter.kt
@@ -57,7 +57,7 @@ class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val m
// try fixing TransactionTooLargeException crash on Android Nougat, tip from https://stackoverflow.com/a/43193425/1967672
override fun saveState(): Parcelable? {
val bundle = super.saveState() as Bundle?
- bundle!!.putParcelableArray("states", null)
+ bundle?.putParcelableArray("states", null)
return bundle
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt
index 8f82b4c00..1f03be404 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt
@@ -2,6 +2,8 @@ package com.simplemobiletools.gallery.asynctasks
import android.content.Context
import android.os.AsyncTask
+import com.simplemobiletools.commons.helpers.SORT_BY_DATE_TAKEN
+import com.simplemobiletools.commons.models.FileDirItem.Companion.sorting
import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.helpers.MediaFetcher
import com.simplemobiletools.gallery.models.Medium
@@ -13,19 +15,19 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage
private val mediaFetcher = MediaFetcher(context)
override fun doInBackground(vararg params: Void): ArrayList {
+ val getProperDateTaken = sorting and SORT_BY_DATE_TAKEN != 0
return if (showAll) {
- val foldersToScan = mediaFetcher.getFoldersToScan("")
+ val foldersToScan = mediaFetcher.getFoldersToScan()
val media = ArrayList()
- for (folder in foldersToScan) {
- val newMedia = mediaFetcher.getFilesFrom(folder, isPickImage, isPickVideo)
+ foldersToScan.forEach {
+ val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken)
media.addAll(newMedia)
}
- Medium.sorting = context.config.getFileSorting("")
- media.sort()
+ MediaFetcher(context).sortMedia(media, context.config.getFileSorting(""))
media
} else {
- mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo)
+ mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken)
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDataBase.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDatabase.kt
similarity index 55%
rename from app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDataBase.kt
rename to app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDatabase.kt
index cd3d82570..b8bd5f47c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDataBase.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDatabase.kt
@@ -10,28 +10,30 @@ import com.simplemobiletools.gallery.models.Directory
import com.simplemobiletools.gallery.models.Medium
@Database(entities = [(Directory::class), (Medium::class)], version = 2)
-abstract class GalleryDataBase : RoomDatabase() {
+abstract class GalleryDatabase : RoomDatabase() {
abstract fun DirectoryDao(): DirectoryDao
abstract fun MediumDao(): MediumDao
companion object {
- private var INSTANCE: GalleryDataBase? = null
+ private var db: GalleryDatabase? = null
- fun getInstance(context: Context): GalleryDataBase {
- if (INSTANCE == null) {
- synchronized(GalleryDataBase::class) {
- INSTANCE = Room.databaseBuilder(context.applicationContext, GalleryDataBase::class.java, "gallery.db")
- .fallbackToDestructiveMigration()
- .build()
+ fun getInstance(context: Context): GalleryDatabase {
+ if (db == null) {
+ synchronized(GalleryDatabase::class) {
+ if (db == null) {
+ db = Room.databaseBuilder(context.applicationContext, GalleryDatabase::class.java, "gallery.db")
+ .fallbackToDestructiveMigration()
+ .build()
+ }
}
}
- return INSTANCE!!
+ return db!!
}
fun destroyInstance() {
- INSTANCE = null
+ db = null
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ChangeSortingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ChangeSortingDialog.kt
index 5d4395988..fffac4f25 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ChangeSortingDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ChangeSortingDialog.kt
@@ -44,6 +44,7 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti
currSorting and SORT_BY_PATH != 0 -> sortingRadio.sorting_dialog_radio_path
currSorting and SORT_BY_SIZE != 0 -> sortingRadio.sorting_dialog_radio_size
currSorting and SORT_BY_DATE_MODIFIED != 0 -> sortingRadio.sorting_dialog_radio_last_modified
+ currSorting and SORT_BY_DATE_TAKEN != 0 -> sortingRadio.sorting_dialog_radio_date_taken
else -> sortingRadio.sorting_dialog_radio_name
}
sortBtn.isChecked = true
@@ -65,7 +66,8 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti
R.id.sorting_dialog_radio_name -> SORT_BY_NAME
R.id.sorting_dialog_radio_path -> SORT_BY_PATH
R.id.sorting_dialog_radio_size -> SORT_BY_SIZE
- else -> SORT_BY_DATE_MODIFIED
+ R.id.sorting_dialog_radio_last_modified -> SORT_BY_DATE_MODIFIED
+ else -> SORT_BY_DATE_TAKEN
}
if (view.sorting_dialog_radio_order.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickDirectoryDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickDirectoryDialog.kt
index 372a0483c..80a0a53f7 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickDirectoryDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickDirectoryDialog.kt
@@ -72,6 +72,7 @@ class PickDirectoryDialog(val activity: BaseSimpleActivity, val sourcePath: Stri
}
val scrollHorizontally = activity.config.scrollHorizontally && isGridViewType
+ val sorting = activity.config.directorySorting
view.apply {
directories_grid.adapter = adapter
@@ -84,12 +85,12 @@ class PickDirectoryDialog(val activity: BaseSimpleActivity, val sourcePath: Stri
if (scrollHorizontally) {
directories_horizontal_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
directories_horizontal_fastscroller.setViews(directories_grid) {
- directories_horizontal_fastscroller.updateBubbleText(dirs[it].getBubbleText())
+ directories_horizontal_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting))
}
} else {
directories_vertical_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
directories_vertical_fastscroller.setViews(directories_grid) {
- directories_vertical_fastscroller.updateBubbleText(dirs[it].getBubbleText())
+ directories_vertical_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting))
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickMediumDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickMediumDialog.kt
index a717c3cfa..3998ec75d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickMediumDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickMediumDialog.kt
@@ -68,6 +68,7 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
}
val scrollHorizontally = activity.config.scrollHorizontally && isGridViewType
+ val sorting = activity.config.getFileSorting(path)
view.apply {
media_grid.adapter = adapter
@@ -80,12 +81,12 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
if (scrollHorizontally) {
media_horizontal_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid) {
- media_horizontal_fastscroller.updateBubbleText(media[it].getBubbleText())
+ media_horizontal_fastscroller.updateBubbleText(media[it].getBubbleText(sorting))
}
} else {
media_vertical_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid) {
- media_vertical_fastscroller.updateBubbleText(media[it].getBubbleText())
+ media_vertical_fastscroller.updateBubbleText(media[it].getBubbleText(sorting))
}
}
}
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 a311c9a22..e9ae79e4e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt
@@ -106,7 +106,7 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
val fileDocument = getDocumentFile(path)
if (fileDocument?.exists() == true && fileDocument.isDirectory) {
fileDocument.createFile("", NOMEDIA)
- applicationContext.scanFile(file) {
+ applicationContext.scanFileRecursively(file) {
callback()
}
} else {
@@ -117,7 +117,7 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
} else {
try {
file.createNewFile()
- applicationContext.scanFile(file) {
+ applicationContext.scanFileRecursively(file) {
callback()
}
} catch (e: Exception) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt
index c465a9c5e..9ed2214b5 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt
@@ -16,11 +16,11 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.OTG_PATH
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.activities.SettingsActivity
import com.simplemobiletools.gallery.asynctasks.GetMediaAsynctask
-import com.simplemobiletools.gallery.databases.GalleryDataBase
+import com.simplemobiletools.gallery.databases.GalleryDatabase
import com.simplemobiletools.gallery.helpers.*
import com.simplemobiletools.gallery.interfaces.DirectoryDao
import com.simplemobiletools.gallery.models.Directory
@@ -70,7 +70,7 @@ fun Context.launchSettings() {
val Context.config: Config get() = Config.newInstance(applicationContext)
-val Context.galleryDB: GalleryDataBase get() = GalleryDataBase.getInstance(applicationContext)
+val Context.galleryDB: GalleryDatabase get() = GalleryDatabase.getInstance(applicationContext)
fun Context.movePinnedDirectoriesToFront(dirs: ArrayList): ArrayList {
val foundFolders = ArrayList()
@@ -96,9 +96,26 @@ fun Context.movePinnedDirectoriesToFront(dirs: ArrayList): ArrayList<
@Suppress("UNCHECKED_CAST")
fun Context.getSortedDirectories(source: ArrayList): ArrayList {
- Directory.sorting = config.directorySorting
+ val sorting = config.directorySorting
val dirs = source.clone() as ArrayList
- dirs.sort()
+
+ dirs.sortWith(Comparator { o1, o2 ->
+ o1 as Directory
+ o2 as Directory
+ var result = when {
+ sorting and SORT_BY_NAME != 0 -> AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase())
+ sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
+ sorting and SORT_BY_SIZE != 0 -> o1.size.compareTo(o2.size)
+ sorting and SORT_BY_DATE_MODIFIED != 0 -> o1.modified.compareTo(o2.modified)
+ else -> o1.taken.compareTo(o2.taken)
+ }
+
+ if (sorting and SORT_DESCENDING != 0) {
+ result *= -1
+ }
+ result
+ })
+
return movePinnedDirectoriesToFront(dirs)
}
@@ -276,34 +293,51 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
}
}) as ArrayList
- callback(filteredDirectories.distinctBy { it.path.getDistinctPath() } as ArrayList)
+ val hiddenString = resources.getString(R.string.hidden)
+ filteredDirectories.forEach {
+ it.name = if (File(it.path).doesThisOrParentHaveNoMedia() && !it.path.isThisOrParentIncluded(includedPaths)) {
+ "${it.name.removeSuffix(hiddenString).trim()} $hiddenString"
+ } else {
+ it.name
+ }
+ }
- removeInvalidDBDirectories(directories, directoryDao)
+ val clone = filteredDirectories.clone() as ArrayList
+ callback(clone.distinctBy { it.path.getDistinctPath() } as ArrayList)
+
+ removeInvalidDBDirectories(filteredDirectories, directoryDao)
}.start()
}
fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList) -> Unit) {
Thread {
val mediumDao = galleryDB.MediumDao()
- val media = (if (path == "/") mediumDao.getAll() else mediumDao.getMediaFromPath(path)) as ArrayList
+ val foldersToScan = if (path == "/") MediaFetcher(this).getFoldersToScan() else arrayListOf(path)
+ var media = ArrayList()
val shouldShowHidden = config.shouldShowHidden
- var filteredMedia = media
+ foldersToScan.forEach {
+ val currMedia = mediumDao.getMediaFromPath(it)
+ media.addAll(currMedia)
+ }
+
if (!shouldShowHidden) {
- filteredMedia = media.filter { !it.name.startsWith('.') } as ArrayList
+ media = media.filter { !it.path.contains("/.") } as ArrayList
}
val filterMedia = config.filterMedia
- filteredMedia = (when {
- getVideosOnly -> filteredMedia.filter { it.type == TYPE_VIDEOS }
- getImagesOnly -> filteredMedia.filter { it.type == TYPE_IMAGES }
- else -> filteredMedia.filter {
+ media = (when {
+ getVideosOnly -> media.filter { it.type == TYPE_VIDEOS }
+ getImagesOnly -> media.filter { it.type == TYPE_IMAGES }
+ else -> media.filter {
(filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES) ||
(filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS) ||
(filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS)
}
}) as ArrayList
- callback(filteredMedia)
+ MediaFetcher(this).sortMedia(media, config.getFileSorting(path))
+ callback(media.clone() as ArrayList)
+
media.filter { !getDoesFilePathExist(it.path) }.forEach {
mediumDao.deleteMediumPath(it.path)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt
index 596a672ab..f52fc5215 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt
@@ -6,7 +6,6 @@ import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.helpers.BaseConfig
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
-import com.simplemobiletools.commons.helpers.SORT_BY_DATE_TAKEN
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
import com.simplemobiletools.gallery.R
import com.simplemobiletools.gallery.models.AlbumCover
@@ -18,13 +17,7 @@ class Config(context: Context) : BaseConfig(context) {
}
var directorySorting: Int
- get(): Int {
- var sort = prefs.getInt(DIRECTORY_SORT_ORDER, SORT_BY_DATE_MODIFIED or SORT_DESCENDING)
- if (sort and SORT_BY_DATE_TAKEN != 0) {
- sort = sort - SORT_BY_DATE_TAKEN + SORT_BY_DATE_MODIFIED
- }
- return sort
- }
+ get(): Int = prefs.getInt(DIRECTORY_SORT_ORDER, SORT_BY_DATE_MODIFIED or SORT_DESCENDING)
set(order) = prefs.edit().putInt(DIRECTORY_SORT_ORDER, order).apply()
fun saveFileSorting(path: String, value: Int) {
@@ -35,13 +28,7 @@ class Config(context: Context) : BaseConfig(context) {
}
}
- fun getFileSorting(path: String): Int {
- var sort = prefs.getInt(SORT_FOLDER_PREFIX + path.toLowerCase(), sorting)
- if (sort and SORT_BY_DATE_TAKEN != 0) {
- sort = sort - SORT_BY_DATE_TAKEN + SORT_BY_DATE_MODIFIED
- }
- return sort
- }
+ fun getFileSorting(path: String) = prefs.getInt(SORT_FOLDER_PREFIX + path.toLowerCase(), sorting)
fun removeFileSorting(path: String) {
prefs.edit().remove(SORT_FOLDER_PREFIX + path.toLowerCase()).apply()
@@ -331,4 +318,8 @@ class Config(context: Context) : BaseConfig(context) {
var wasOTGHandled: Boolean
get() = prefs.getBoolean(WAS_OTG_HANDLED, false)
set(wasOTGHandled) = prefs.edit().putBoolean(WAS_OTG_HANDLED, wasOTGHandled).apply()
+
+ var tempSkipDeleteConfirmation: Boolean
+ get() = prefs.getBoolean(TEMP_SKIP_DELETE_CONFIRMATION, false)
+ set(tempSkipDeleteConfirmation) = prefs.edit().putBoolean(TEMP_SKIP_DELETE_CONFIRMATION, tempSkipDeleteConfirmation).apply()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt
index 23d190fab..9d73f8dfe 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt
@@ -48,6 +48,7 @@ const val DO_EXTRA_CHECK = "do_extra_check"
const val WAS_NEW_APP_SHOWN = "was_new_app_shown_clock"
const val LAST_FILEPICKER_PATH = "last_filepicker_path"
const val WAS_OTG_HANDLED = "was_otg_handled"
+const val TEMP_SKIP_DELETE_CONFIRMATION = "temp_skip_delete_confirmation"
// slideshow
const val SLIDESHOW_INTERVAL = "slideshow_interval"
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt
index 3b04c9598..bb577941c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt
@@ -5,9 +5,7 @@ import android.database.Cursor
import android.net.Uri
import android.provider.MediaStore
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.OTG_PATH
-import com.simplemobiletools.commons.helpers.photoExtensions
-import com.simplemobiletools.commons.helpers.videoExtensions
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.extensions.config
import com.simplemobiletools.gallery.extensions.getDistinctPath
import com.simplemobiletools.gallery.extensions.getOTGFolderChildren
@@ -18,7 +16,7 @@ import java.io.File
class MediaFetcher(val context: Context) {
var shouldStop = false
- fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean): ArrayList {
+ fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean): ArrayList {
val filterMedia = context.config.filterMedia
if (filterMedia == 0) {
return ArrayList()
@@ -29,37 +27,32 @@ class MediaFetcher(val context: Context) {
val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia)
curMedia.addAll(newMedia)
} else {
- val newMedia = fetchFolderContent(curPath, isPickImage, isPickVideo, filterMedia)
+ val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken)
curMedia.addAll(newMedia)
}
- Medium.sorting = context.config.getFileSorting(curPath)
- curMedia.sort()
+ sortMedia(curMedia, context.config.getFileSorting(curPath))
return curMedia
}
- fun getFoldersToScan(path: String): ArrayList {
+ fun getFoldersToScan(): ArrayList {
val filterMedia = context.config.filterMedia
val projection = arrayOf(MediaStore.Images.Media.DATA)
val uri = MediaStore.Files.getContentUri("external")
- val selection = "${getSelectionQuery(path, filterMedia)} ${MediaStore.Images.ImageColumns.BUCKET_ID} IS NOT NULL) GROUP BY (${MediaStore.Images.ImageColumns.BUCKET_ID}"
- val selectionArgs = getSelectionArgsQuery(path, filterMedia).toTypedArray()
+ val selection = "${getSelectionQuery(filterMedia)} ${MediaStore.Images.ImageColumns.BUCKET_ID} IS NOT NULL) GROUP BY (${MediaStore.Images.ImageColumns.BUCKET_ID}"
+ val selectionArgs = getSelectionArgsQuery(filterMedia).toTypedArray()
return try {
val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
- parseCursor(cursor, path)
+ parseCursor(cursor)
} catch (e: Exception) {
ArrayList()
}
}
- private fun getSelectionQuery(path: String, filterMedia: Int): String {
+ private fun getSelectionQuery(filterMedia: Int): String {
val query = StringBuilder()
- if (path.isNotEmpty()) {
- query.append("${MediaStore.Images.Media.DATA} LIKE ? AND ${MediaStore.Images.Media.DATA} NOT LIKE ? AND ")
- }
-
query.append("(")
if (filterMedia and TYPE_IMAGES != 0) {
photoExtensions.forEach {
@@ -82,13 +75,8 @@ class MediaFetcher(val context: Context) {
return selectionQuery
}
- private fun getSelectionArgsQuery(path: String, filterMedia: Int): ArrayList {
+ private fun getSelectionArgsQuery(filterMedia: Int): ArrayList {
val args = ArrayList()
- if (path.isNotEmpty()) {
- args.add("$path/%")
- args.add("$path/%/%")
- }
-
if (filterMedia and TYPE_IMAGES != 0) {
photoExtensions.forEach {
args.add("%$it")
@@ -108,7 +96,7 @@ class MediaFetcher(val context: Context) {
return args
}
- private fun parseCursor(cursor: Cursor, curPath: String): ArrayList {
+ private fun parseCursor(cursor: Cursor): ArrayList {
val config = context.config
val includedFolders = config.includedFolders
var foldersToScan = ArrayList()
@@ -126,20 +114,12 @@ class MediaFetcher(val context: Context) {
}
includedFolders.forEach {
- if (curPath.isEmpty()) {
- addFolder(foldersToScan, it)
- } else if (curPath == it) {
- foldersToScan.add(it)
- }
+ addFolder(foldersToScan, it)
}
val showHidden = config.shouldShowHidden
val excludedFolders = config.excludedFolders
foldersToScan = foldersToScan.filter { it.shouldFolderBeVisible(excludedFolders, includedFolders, showHidden) } as ArrayList
- if (config.isThirdPartyIntent && curPath.isNotEmpty()) {
- foldersToScan.add(curPath)
- }
-
return foldersToScan.distinctBy { it.getDistinctPath() } as ArrayList
}
@@ -163,19 +143,12 @@ class MediaFetcher(val context: Context) {
}
}
- private fun fetchFolderContent(path: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int): ArrayList {
- return if (path.startsWith(OTG_PATH)) {
- getMediaOnOTG(path, isPickImage, isPickVideo, filterMedia)
- } else {
- getMediaInFolder(path, isPickImage, isPickVideo, filterMedia)
- }
- }
-
- private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int): ArrayList {
+ private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean): ArrayList {
val media = ArrayList()
val files = File(folder).listFiles() ?: return media
val doExtraCheck = context.config.doExtraCheck
val showHidden = context.config.shouldShowHidden
+ val dateTakens = if (getProperDateTaken) getFolderDateTakens(folder) else HashMap()
for (file in files) {
if (shouldStop) {
@@ -206,8 +179,12 @@ class MediaFetcher(val context: Context) {
if (size <= 0L || (doExtraCheck && !file.exists()))
continue
- val dateTaken = file.lastModified()
- val dateModified = file.lastModified()
+ val lastModified = file.lastModified()
+ var dateTaken = lastModified
+
+ if (getProperDateTaken) {
+ dateTaken = dateTakens.remove(filename) ?: lastModified
+ }
val type = when {
isImage -> TYPE_IMAGES
@@ -215,7 +192,7 @@ class MediaFetcher(val context: Context) {
else -> TYPE_GIFS
}
- val medium = Medium(null, filename, file.absolutePath, folder, dateModified, dateTaken, size, type)
+ val medium = Medium(null, filename, file.absolutePath, folder, lastModified, dateTaken, size, type)
media.add(medium)
}
return media
@@ -272,4 +249,51 @@ class MediaFetcher(val context: Context) {
return media
}
+
+ private fun getFolderDateTakens(folder: String): HashMap {
+ val projection = arrayOf(
+ MediaStore.Images.Media.DISPLAY_NAME,
+ MediaStore.Images.Media.DATE_TAKEN
+ )
+
+ val uri = MediaStore.Files.getContentUri("external")
+ val selection = "${MediaStore.Images.Media.DATA} LIKE ? AND ${MediaStore.Images.Media.DATA} NOT LIKE ?"
+ val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
+
+ val dateTakens = HashMap()
+ val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
+ cursor.use {
+ if (cursor.moveToFirst()) {
+ do {
+ try {
+ val path = cursor.getStringValue(MediaStore.Images.Media.DISPLAY_NAME)
+ val dateTaken = cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN)
+ dateTakens[path] = dateTaken
+ } catch (e: Exception) {
+ }
+ } while (cursor.moveToNext())
+ }
+ }
+
+ return dateTakens
+ }
+
+ fun sortMedia(media: ArrayList, sorting: Int) {
+ media.sortWith(Comparator { o1, o2 ->
+ o1 as Medium
+ o2 as Medium
+ var result = when {
+ sorting and SORT_BY_NAME != 0 -> AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase())
+ sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase())
+ sorting and SORT_BY_SIZE != 0 -> o1.size.compareTo(o2.size)
+ sorting and SORT_BY_DATE_MODIFIED != 0 -> o1.modified.compareTo(o2.modified)
+ else -> o1.taken.compareTo(o2.taken)
+ }
+
+ if (sorting and SORT_DESCENDING != 0) {
+ result *= -1
+ }
+ result
+ })
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/DirectoryDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/DirectoryDao.kt
index 62bef007a..c61717d95 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/DirectoryDao.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/DirectoryDao.kt
@@ -20,6 +20,9 @@ interface DirectoryDao {
@Query("DELETE FROM directories WHERE path = :path")
fun deleteDirPath(path: String)
- @Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes WHERE path = :path")
+ @Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes WHERE path = :path")
fun updateDirectory(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int)
+
+ @Query("UPDATE directories SET thumbnail = :thumbnail, filename = :name, path = :newPath WHERE path = :oldPath")
+ fun updateDirectoryAfterRename(thumbnail: String, name: String, newPath: String, oldPath: String)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt
index eee0430c4..1c076f768 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt
@@ -8,9 +8,6 @@ import com.simplemobiletools.gallery.models.Medium
@Dao
interface MediumDao {
- @Query("SELECT * FROM media")
- fun getAll(): List
-
@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type FROM media WHERE parent_path = :path")
fun getMediaFromPath(path: String): List
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Directory.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Directory.kt
index 6d8c217a1..3c4dd01a0 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Directory.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Directory.kt
@@ -6,7 +6,10 @@ import android.arch.persistence.room.Index
import android.arch.persistence.room.PrimaryKey
import com.simplemobiletools.commons.extensions.formatDate
import com.simplemobiletools.commons.extensions.formatSize
-import com.simplemobiletools.commons.helpers.*
+import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
+import com.simplemobiletools.commons.helpers.SORT_BY_NAME
+import com.simplemobiletools.commons.helpers.SORT_BY_PATH
+import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import java.io.Serializable
@Entity(tableName = "directories", indices = [Index(value = "path", unique = true)])
@@ -20,42 +23,13 @@ data class Directory(
@ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "size") var size: Long,
@ColumnInfo(name = "location") val location: Int,
- @ColumnInfo(name = "media_types") var types: Int) : Serializable, Comparable {
+ @ColumnInfo(name = "media_types") var types: Int) : Serializable {
companion object {
private const val serialVersionUID = -6553345863555455L
- var sorting: Int = 0
}
- override fun compareTo(other: Directory): Int {
- var result: Int
- when {
- sorting and SORT_BY_NAME != 0 -> result = AlphanumericComparator().compare(name.toLowerCase(), other.name.toLowerCase())
- sorting and SORT_BY_PATH != 0 -> result = AlphanumericComparator().compare(path.toLowerCase(), other.path.toLowerCase())
- sorting and SORT_BY_SIZE != 0 -> result = when {
- size == other.size -> 0
- size > other.size -> 1
- else -> -1
- }
- sorting and SORT_BY_DATE_MODIFIED != 0 -> result = when {
- modified == other.modified -> 0
- modified > other.modified -> 1
- else -> -1
- }
- else -> result = when {
- taken == other.taken -> 0
- taken > other.taken -> 1
- else -> -1
- }
- }
-
- if (sorting and SORT_DESCENDING != 0) {
- result *= -1
- }
- return result
- }
-
- fun getBubbleText() = when {
+ fun getBubbleText(sorting: Int) = when {
sorting and SORT_BY_NAME != 0 -> name
sorting and SORT_BY_PATH != 0 -> path
sorting and SORT_BY_SIZE != 0 -> size.formatSize()
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt
index 2327feadb..9203db306 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt
@@ -7,7 +7,10 @@ import android.arch.persistence.room.PrimaryKey
import com.simplemobiletools.commons.extensions.formatDate
import com.simplemobiletools.commons.extensions.formatSize
import com.simplemobiletools.commons.extensions.isDng
-import com.simplemobiletools.commons.helpers.*
+import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
+import com.simplemobiletools.commons.helpers.SORT_BY_NAME
+import com.simplemobiletools.commons.helpers.SORT_BY_PATH
+import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
import com.simplemobiletools.gallery.helpers.TYPE_GIFS
import com.simplemobiletools.gallery.helpers.TYPE_IMAGES
import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS
@@ -20,13 +23,12 @@ data class Medium(
@ColumnInfo(name = "full_path") var path: String,
@ColumnInfo(name = "parent_path") var parentPath: String,
@ColumnInfo(name = "last_modified") val modified: Long,
- @ColumnInfo(name = "date_taken") val taken: Long,
+ @ColumnInfo(name = "date_taken") var taken: Long,
@ColumnInfo(name = "size") val size: Long,
- @ColumnInfo(name = "type") val type: Int) : Serializable, Comparable {
+ @ColumnInfo(name = "type") val type: Int) : Serializable {
companion object {
private const val serialVersionUID = -6553149366975455L
- var sorting: Int = 0
}
fun isGif() = type == TYPE_GIFS
@@ -37,35 +39,7 @@ data class Medium(
fun isDng() = path.isDng()
- override fun compareTo(other: Medium): Int {
- var result: Int
- when {
- sorting and SORT_BY_NAME != 0 -> result = AlphanumericComparator().compare(name.toLowerCase(), other.name.toLowerCase())
- sorting and SORT_BY_PATH != 0 -> result = AlphanumericComparator().compare(path.toLowerCase(), other.path.toLowerCase())
- sorting and SORT_BY_SIZE != 0 -> result = when {
- size == other.size -> 0
- size > other.size -> 1
- else -> -1
- }
- sorting and SORT_BY_DATE_MODIFIED != 0 -> result = when {
- modified == other.modified -> 0
- modified > other.modified -> 1
- else -> -1
- }
- else -> result = when {
- taken == other.taken -> 0
- taken > other.taken -> 1
- else -> -1
- }
- }
-
- if (sorting and SORT_DESCENDING != 0) {
- result *= -1
- }
- return result
- }
-
- fun getBubbleText() = when {
+ fun getBubbleText(sorting: Int) = when {
sorting and SORT_BY_NAME != 0 -> name
sorting and SORT_BY_PATH != 0 -> path
sorting and SORT_BY_SIZE != 0 -> size.formatSize()
diff --git a/app/src/main/res/drawable-v26/ic_launcher_foreground.xml b/app/src/main/res/drawable-v26/ic_launcher_foreground.xml
deleted file mode 100644
index 5f01b3af0..000000000
--- a/app/src/main/res/drawable-v26/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
diff --git a/app/src/main/res/layout/dialog_change_sorting.xml b/app/src/main/res/layout/dialog_change_sorting.xml
index 812840f40..e0e642acc 100644
--- a/app/src/main/res/layout/dialog_change_sorting.xml
+++ b/app/src/main/res/layout/dialog_change_sorting.xml
@@ -52,6 +52,14 @@
android:paddingTop="@dimen/medium_margin"
android:text="@string/last_modified"/>
+
+
-
-
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml
new file mode 100644
index 000000000..dab4c0c59
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml
new file mode 100644
index 000000000..37bf057fa
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml
new file mode 100644
index 000000000..3e4d0696b
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml
new file mode 100644
index 000000000..9786d7bf0
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml
new file mode 100644
index 000000000..afb3d0d36
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml
new file mode 100644
index 000000000..1846b81de
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml
new file mode 100644
index 000000000..4152801a0
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml
new file mode 100644
index 000000000..e55d10929
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml
new file mode 100644
index 000000000..40d074503
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml
new file mode 100644
index 000000000..601d81701
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml
new file mode 100644
index 000000000..01f2fead9
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml
new file mode 100644
index 000000000..d37b24c44
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml
new file mode 100644
index 000000000..9fd7bc5b2
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml
new file mode 100644
index 000000000..d2adf9a07
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml
new file mode 100644
index 000000000..32c838cdd
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml
new file mode 100644
index 000000000..a6e935994
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml
new file mode 100644
index 000000000..18492d282
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml
new file mode 100644
index 000000000..854427e06
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 0b4c426d6..b284d1c4d 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png
new file mode 100644
index 000000000..d6aa3f323
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png
new file mode 100644
index 000000000..127e37d37
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png
new file mode 100644
index 000000000..473400bc0
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png
new file mode 100644
index 000000000..c74a80c87
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png
new file mode 100644
index 000000000..ec0979f15
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png
new file mode 100644
index 000000000..895d2fab7
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png
new file mode 100644
index 000000000..3b7f015e5
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..ad7d954a9
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_green.png b/app/src/main/res/mipmap-hdpi/ic_launcher_green.png
new file mode 100644
index 000000000..433cde253
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png
new file mode 100644
index 000000000..a83fa0af3
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png
new file mode 100644
index 000000000..c52966808
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png
new file mode 100644
index 000000000..928e47ee1
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png
new file mode 100644
index 000000000..00a1ea985
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png
new file mode 100644
index 000000000..3c5f0148b
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png
new file mode 100644
index 000000000..e3d98241f
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png
new file mode 100644
index 000000000..6eae4fb39
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_red.png b/app/src/main/res/mipmap-hdpi/ic_launcher_red.png
new file mode 100644
index 000000000..f3a0161fe
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png
new file mode 100644
index 000000000..9b392844d
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png
new file mode 100644
index 000000000..5475ffe4c
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..3135a1846
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png
new file mode 100644
index 000000000..f1dd2566b
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png
new file mode 100644
index 000000000..ca5342cfa
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png
new file mode 100644
index 000000000..629938a75
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png
new file mode 100644
index 000000000..70b20a547
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png
new file mode 100644
index 000000000..b4f0c9a44
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png
new file mode 100644
index 000000000..fc7d6f31d
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png
new file mode 100644
index 000000000..a5b19ee3b
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..4be3d2926
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_green.png b/app/src/main/res/mipmap-mdpi/ic_launcher_green.png
new file mode 100644
index 000000000..72109060c
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png
new file mode 100644
index 000000000..bf90ade75
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png
new file mode 100644
index 000000000..8192b480b
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png
new file mode 100644
index 000000000..b70f88f36
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png
new file mode 100644
index 000000000..2119deb97
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png
new file mode 100644
index 000000000..6ad1bad8d
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png
new file mode 100644
index 000000000..1c447244a
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png
new file mode 100644
index 000000000..4ec77155f
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_red.png b/app/src/main/res/mipmap-mdpi/ic_launcher_red.png
new file mode 100644
index 000000000..0161c4f10
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png
new file mode 100644
index 000000000..e271b1993
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png
new file mode 100644
index 000000000..67c6be12f
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 7ec4a7615..99017670f 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png
new file mode 100644
index 000000000..dfff1b939
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png
new file mode 100644
index 000000000..501d29e21
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png
new file mode 100644
index 000000000..10101e7e8
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png
new file mode 100644
index 000000000..0ad858fa5
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png
new file mode 100644
index 000000000..58c6ebd81
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png
new file mode 100644
index 000000000..d98d0aa96
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png
new file mode 100644
index 000000000..8ae82a7e3
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..4648c335c
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png
new file mode 100644
index 000000000..c4a247955
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png
new file mode 100644
index 000000000..2e95a75f5
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png
new file mode 100644
index 000000000..27e1bb8f0
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png
new file mode 100644
index 000000000..a261aecd5
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png
new file mode 100644
index 000000000..1cb9abe2c
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png
new file mode 100644
index 000000000..9a90e56bb
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png
new file mode 100644
index 000000000..9df1e5f2d
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png
new file mode 100644
index 000000000..810de58d8
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png
new file mode 100644
index 000000000..8de0fb064
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png
new file mode 100644
index 000000000..22e6269b4
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png
new file mode 100644
index 000000000..77d25aa22
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index ba318920c..98c18b66d 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png
new file mode 100644
index 000000000..7fdb61068
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png
new file mode 100644
index 000000000..a0bf57559
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png
new file mode 100644
index 000000000..3a0383642
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png
new file mode 100644
index 000000000..0a27d625a
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png
new file mode 100644
index 000000000..fc247a08a
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png
new file mode 100644
index 000000000..bbcfa0235
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png
new file mode 100644
index 000000000..a30512892
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..56a5af235
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png
new file mode 100644
index 000000000..2ec7ce353
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png
new file mode 100644
index 000000000..6872df0a6
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png
new file mode 100644
index 000000000..7463e54c0
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png
new file mode 100644
index 000000000..49122cd01
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png
new file mode 100644
index 000000000..a7614e913
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png
new file mode 100644
index 000000000..3b3a3b564
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png
new file mode 100644
index 000000000..b49c6822d
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png
new file mode 100644
index 000000000..049d8f53e
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png
new file mode 100644
index 000000000..50d16eb14
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png
new file mode 100644
index 000000000..9642c6098
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png
new file mode 100644
index 000000000..75ca1c532
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index d2c8cf11f..a1e18106d 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png
new file mode 100644
index 000000000..8b0388201
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png
new file mode 100644
index 000000000..8454f5828
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png
new file mode 100644
index 000000000..f3658ed18
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png
new file mode 100644
index 000000000..c8c572de0
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png
new file mode 100644
index 000000000..666b77ddb
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png
new file mode 100644
index 000000000..b40a51218
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png
new file mode 100644
index 000000000..fd5a836e4
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..3bff06d84
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png
new file mode 100644
index 000000000..64c77f639
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png
new file mode 100644
index 000000000..66a4f4198
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png
new file mode 100644
index 000000000..d990c5c6d
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png
new file mode 100644
index 000000000..5a9155abd
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png
new file mode 100644
index 000000000..59020780a
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png
new file mode 100644
index 000000000..9057961da
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png
new file mode 100644
index 000000000..b281365e6
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png
new file mode 100644
index 000000000..bbfb8ba63
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png
new file mode 100644
index 000000000..f1b0bf2af
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png
new file mode 100644
index 000000000..09fced1b9
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png
new file mode 100644
index 000000000..382dc6271
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 965000782..fd58452e7 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -114,6 +114,16 @@
تغيير طريقة العرض
الشبكة
القائمة
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
تشغيل الفديوهات تلقائيا
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index eb1756150..f6db484e3 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -110,6 +110,16 @@
Canviar el tipus de vista
Reixeta
Llista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Reproduir vídeos automàticament
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 769bdabd8..6b121b7ff 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -110,6 +110,16 @@
Change view type
Grid
List
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Automaticky přehrávat videa
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 5281e91a3..1d83821bb 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -110,6 +110,16 @@
Skift visning
Gitter
Liste
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Afspil automatisk videoer
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 69bc1d42d..7686ee191 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -110,6 +110,16 @@
Darstellung ändern
Gitter
Liste
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Videos automatisch abspielen
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index af46dc636..f3349bef4 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -5,7 +5,7 @@
Επεξεργασία
Άνοιγμα κάμερας
(κρυμμένο)
- (excluded)
+ (εξαιρεθέν)
Καρφίτσωμα φακέλου
Ξεκαρφίτσωμα φακέλου
Καρφίτσωμα στην κορυφή
@@ -13,7 +13,7 @@
Όλοι οι φάκελοι
Αλλαγή στην εμφάνιση των φακέλων
Άλλος φάκελος
- Εμφάνιση στον χάρτη
+ Εμφάνιση στο χάρτη
Άγνωστη τοποθεσία
Αύξηση αριθμού στηλών
Μείωση αριθμού στηλών
@@ -98,9 +98,9 @@
Χρόνος επανάληψης (δευτερόλεπτα):
Συμπερίληψη φωτογραφιών
Συμπερίληψη βίντεο
- Include GIFs6
+ Συμπερίληψη GIFs6
Τυχαία σειρά
- Use fade animations
+ Εφέ σταδιακής αλλαγής
Κίνηση προς τα πίσω
Επανάληψη εμφάνισης διαφανιών
Η εμφάνιση διαφανειών τελείωσε
@@ -110,6 +110,16 @@
Αλλαγή τύπου εμφάνισης
Πλέγμα
Λίστα
+ Ομαδοποίηση υποφακέλων
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Αυτόματη αναπαραγωγή βίντεο
@@ -145,38 +155,38 @@
Περισσότερες λεπτομέρειες
- Πως μπορώ να κάνω το Simple Gallery προκαθορισμένη εφαρμογή συλλογής πολυμέσων;
- Αρχικά πρέπει να βρείτε την τρέχουσα προεπιλεγμένη εφαρμογή γκάλερι στις Ρυθμίσεις(τμήμα Εφαρμογών) της συσκευής, αναζητήστε για ένα κουμπί που αναφέρει κάτι σαν \"Άνοιγμα με προεπιλογή\", πατήστε το, μετά επιλέξτε \"Καθαρισμός προεπιλεγμένων\".
+ Πώς μπορώ να κάνω το Simple Gallery προκαθορισμένη εφαρμογή συλλογής πολυμέσων;
+ Αρχικά πρέπει να βρείτε την τρέχουσα προεπιλεγμένη εφαρμογή γκάλερι στις Ρυθμίσεις (τμήμα Εφαρμογών) της συσκευής. Αναζητήστε για ένα κουμπί που αναφέρει κάτι σαν \"Άνοιγμα με προεπιλογή\", πατήστε το, μετά επιλέξτε \"Καθαρισμός προεπιλεγμένων\".
Την επόμενη φορά που θα προσπαθήσετε να ανοίξετε μία εικόνα ή ένα βίντεο θα πρέπει να δείτε έναν διάλογο επιλογής εφαρμογών, όπου μπορείτε να επιλέξετε Simple Gallery να το κάνετε προεπιλεγμένη εφαρμογή.
Κλείδωσα την εφαρμογή με κωδικό, αλλά τον ξέχασα. Τι μπορώ να κάνω;
Υπάρχουν 2 λύσεις. Είτε επανεγκατάσταση της εφαρμογής, ή να εντοπίσετε την εφαρμογή στις ρυθμίσεις της συσκευής και να επιλέξετε \"Καθαρισμό δεδομένων\". Θα επαναφέρει όλες τις ρυθμίσεις και δεν θα σβήσει κάποιο αρχείο πολυμέσου.
- Πως μπορώ να κάνω ένα άλμπυμ να φαίνεται στην κορυφή;
+ Πώς μπορώ να κάνω ένα άλμπουμ να φαίνεται στην κορυφή;
Μπορείτε να πατήσετε παρατεταμένα στο άλμπουμ και να επιλέξετε το εικονίδιο καρφιτσώματος στο μενού, αυτό θα το καρφιτσώσει στην κορυφή. Επίσης μπορείτε να καρφιτσώσετε πολλαπλούς φακέλους, τα καρφιτσωμένα αντικείμενα θα είναι ταξινομημένα με την προεπιλεγμένη μέθοδο.
- Πως μπορώ να τρέξω μπροστά (fast-forward) τα βίντεο;
- Μπορείτε να αγγίξετε στο τρέχον ή στο κείμενο μέγιστης διάρκειας κοντά στην μπάρα αναζήτησης, αυτό θα μετακινήσει το βίντεο μπροστά ή πίσω.
+ Πώς μπορώ να τρέξω μπροστά (fast-forward) τα βίντεο;
+ Μπορείτε να αγγίξετε στο τρέχον ή στο κείμενο μέγιστης διάρκειας κοντά στην μπάρα αναζήτησης. Αυτό θα μετακινήσει το βίντεο μπροστά ή πίσω.
Ποια είναι διαφορά μεταξύ απόκρυψης και εξαίρεσης ενός φακέλου;
Η εξαίρεση δεν επιτρέπει την εμφάνιση του φακέλου μόνο στο Simple Gallery, ενώ η απόκρυψη λειτουργεί σε επίπεδο συστήματος και θα αποκρύψει τον φάκελο και από άλλες εφαρμογές γκάλερι. Λειτουργεί δημιουργώντας ένα άδειο \".nomedia\" αρχείο στον επιλεγμένο φάκελο, το οποίο μπορείτε να το διαγράψετε και με οποιονδήποτε διαχειριστή αρχείων.
- Γιατί εμφανίζονται φάκελοι με εξώφυλλο μουσικής ή αυτόκολλητα ;
- Είναι πιθανόν να δείτε κάποια περίεργα άλμπουμ να εμφανίζονται. Μπορείτε να τα εξαιρέσετε εύκολα με παρατεταμένο άγγιγμα και επιλογή του Εξαίρεση. Στον επόμενο διάλογο μπορείτε να επιλέξετε επάνω φάκελο, είναι πιθανό να μην επιτρέψει την εμφάνιση και άλλων σχετικών άλμπουμ.
- Ένας φάκελος με εικόνες δεν εμφανίζεται, τι μπορώ να κάνω;
- Υπάρχει διάφοροι λόγοι, αλλά είναι εύκολη η λύση. Επιλέξτε Ρυθμίσεις -> Διαχείριση Συμπεριβαλομένων Φακέλων, επιλέξτε Προσθήκη και πλοηγηθείτε στον ζητούμενο φάκελο.
- Πως μπορώ να επιλέξω μόνο κάποιους φακέλους να εμφανίζονται;
+ Γιατί εμφανίζονται φάκελοι με εξώφυλλο μουσικής ή αυτόκολλητα;
+ Είναι πιθανόν να δείτε κάποια περίεργα άλμπουμ να εμφανίζονται. Μπορείτε να τα εξαιρέσετε εύκολα με παρατεταμένο άγγιγμα και επιλογή του Εξαίρεση. Στον επόμενο διάλογο μπορείτε να επιλέξετε επάνω φάκελο. Είναι πιθανό να μην επιτρέψει την εμφάνιση και άλλων σχετικών άλμπουμ.
+ Ένας φάκελος με εικόνες δεν εμφανίζεται. Τι μπορώ να κάνω;
+ Υπάρχουν διάφοροι λόγοι, αλλά είναι εύκολη η λύση. Επιλέξτε Ρυθμίσεις -> Διαχείριση Συμπεριβαλομένων Φακέλων, επιλέξτε Προσθήκη και πλοηγηθείτε στον ζητούμενο φάκελο.
+ Πώς μπορώ να επιλέξω μόνο κάποιους φακέλους να εμφανίζονται;
Η προσθήκη ενός φακέλου στους Συμπεριλαμβανόμενους Φακέλους δεν εξαιρεί αυτόματα τίποτα. Μπορείτε να πάτε στις Ρυμίσεις-> Διαχείριση Εξαιρεμένων Φακέλων, εξαιρέστε τον ριζικό φάκελο \"/\", έπειτα προσθέστε τους φακέλους στο Ρυθμίσεις -> Διαχείριση Συμπεριλαμβανομένων Φακέλων.
- Αυτό θα κάνει ορατούς μόνο τους επιλεγμένους φακέλους, καθώς η εξαίρεση και η συμπερίληψη λειτουργούν αναδρομικά και αν ενας φάκελος ανήκει και στα 2, θα εμφανιστεί.
- Οι εικόνες πλήρους οθόνης έχουν κάποια περίεργα σημάδια, μπορώ κάπως να βελτιώσω την ποιότητα;
- Ναι υπάρχει ένας διακόπτης στις Ρυθμίσεις με το κείμενο \"Αντικατάσταση των φωτογραφιών που απαιτούν ζούμ με άλλες καλύτερης ποιότητας\", μπορείτε να χρησιμοποιήσετε αυτό. Θα βελτιώσει την ποιότητα των φωτογραφιών, αλλά θα θολώσουν στο μεγάλο ζουμ.
+ Αυτό θα κάνει ορατούς μόνο τους επιλεγμένους φακέλους, καθώς η εξαίρεση και η συμπερίληψη λειτουργούν αναδρομικά και αν ενας φάκελος ανήκει και στα δύο, θα εμφανιστεί.
+ Οι εικόνες πλήρους οθόνης έχουν κάποια περίεργα σημάδια. Μπορώ κάπως να βελτιώσω την ποιότητα;
+ Ναι. Υπάρχει ένας διακόπτης στις Ρυθμίσεις με το κείμενο \"Αντικατάσταση των φωτογραφιών που απαιτούν ζούμ με άλλες καλύτερης ποιότητας\". Μπορείτε να χρησιμοποιήσετε αυτό. Θα βελτιώσει την ποιότητα των φωτογραφιών, αλλά θα θολώσουν στο μεγάλο ζουμ.
Μία γκάλερι για την προβολή φωτογραφιών και βίντεο χωρίς διαφημίσεις.
- Μία απλή εφαρμογή για την εμφάνιση φωτογραφιών και βίντεο. Τα αντικείμενα μπορούνα να ταξινομηθούν με βάση την ημερ/νία, το μέγεθος και το όνομα με αύξουσα ή φθίσουσα σειρά, οι φωτογραφίες μπορούν να μεγενθυθούν. Τα αρχεία πολυμέσων εμφανίζονται σε πολλαπλές στήλες ανάλογα με τον μέγεθος της οθόνης, μπορείτε να αλλάξετε το πλήθος των στηλών με τα 2 δάχτυλα(pintch). Μπορούν να μετονομαστούν, να μοιραστούν, να διαγραφούν, να αντιγραφούν και να μετακινηθούν. Οι εικόνας επίσης μπορούν να κοπούν, να γυριστούν, να αντιστραφούν ή να μπούν σαν Wallpaper κατευθείαν από την εφαρμογή.
+ Μία απλή εφαρμογή για την εμφάνιση φωτογραφιών και βίντεο. Τα αντικείμενα μπορούνα να ταξινομηθούν με βάση την ημερ/νία, το μέγεθος και το όνομα με αύξουσα ή φθήνουσα σειρά, οι φωτογραφίες μπορούν να μεγεθυνθούν. Τα αρχεία πολυμέσων εμφανίζονται σε πολλαπλές στήλες ανάλογα με τον μέγεθος της οθόνης και μπορείτε να αλλάξετε το πλήθος των στηλών με τα 2 δάχτυλα (pintch). Μπορούν να μετονομαστούν, να μοιραστούν, να διαγραφούν, να αντιγραφούν και να μετακινηθούν. Οι εικόνες επίσης μπορούν να κοπούν, να περιστραφούν, να αντιστραφούν ή να οριστούν ως ταπετσαρίες κατευθείαν από την εφαρμογή.
Η γκάλερι επίσης μπορεί να χρησιμοποιηθεί από άλλες εφαρμογές για προεμφάνιση φωτογραφιών / βίντεο, να μπουν ως επισυνάψεις σε εφαρμογές email κλπ. Είναι τέλεια για καθημερινή χρήση.
Το δικαίωμα δαχτυλικού αποτυπώματος χρειάζεται για το κλείδωμα των κρυφών αντικειμένων ή ολόκληρης της εφαρμογής.
- Δεν περιέχει διαφημίσεις ή περιττά δικαιώματα. Έιναι όλη ανοιχτού κώδικα, και δίνει την δυνατότητα επιλογής των χρωμάτων της εφαρμογής.
+ Δεν περιέχει διαφημίσεις ή περιττά δικαιώματα. Έιναι όλη ανοιχτού κώδικα και δίνει την δυνατότητα επιλογής των χρωμάτων της εφαρμογής.
Αυτή η εφαργμογή είναι κομμάτι μιας σειρά εφαρμογών. Μπορείτε να βρείτε τις υπόλοιπες στο https://www.simplemobiletools.com
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 69842efbe..8011439d0 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -110,6 +110,16 @@
Cambiar tipo de vista
Cuadrícula
Lista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Reproducir vídeos automáticamente
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index ea76e0650..0fbd55c3c 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -110,6 +110,16 @@
Vaihda näkymää
Ruudukko
Lista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Toista videot automaattisesti
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index a2121afea..6a7c63a9e 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -5,7 +5,7 @@
Édition
Ouvrir appareil photo
(caché)
- (excluded)
+ (exclu)
Épingler le dossier
Désépingler le dossier
Épingler en haut
@@ -110,6 +110,16 @@
Changer le type de vue
Grille
Liste
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Lecture automatique des vidéos
@@ -163,8 +173,8 @@
Ajouter un répértoire dans les dossiers inclus n\'exclut rien automatiquement. Pour ce faire, il faut aller dans « Paramètres » puis « Gérer les dossiers exclus », exclure le répertoire racine \"/\", puis ajouter les répertoires souhaités dans « Paramètres » puis « Gérer les répertoires inclus ». Seuls les répertoires selectionnés seront visibles, du fait que les exclusions et inclusions sont récursives, et si un répertoire est à la fois exclus et inclus, il sera affiché.
Les images en plein écran contiennent des artéfacts, est-ce possible d\'améliorer la qualité ?
Oui, il existe dans « Paramètres » une option « Remplacer les images zoomables profondes par des images de meilleure qualité », mais les images seront alors floues si vous zoomez trop.
- Can I crop images with this app?
- Yes, you can crop images in the editor, by dragging the image corners. You can get to the editor either by long pressing an image thumbnail and selecting Edit, or selecting Edit from the fullscreen view.
+ Puis-je recadrer des images avec cette application?
+ Oui, vous pouvez recadrer les images dans l\'éditeur en faisant glisser les coins de l\'image. Vous pouvez accéder à l\'éditeur en appuyant longuement sur une vignette d\'image et en sélectionnant Modifier, ou en sélectionnant Modifier en mode plein écran.
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 00bf4bc32..78d103389 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -110,6 +110,16 @@
Cambiar o tipo de vista
Grella
Lista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Reproducir vídeos automticamente
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index c6ff31962..8f9fba4bf 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -110,6 +110,16 @@
Promijeni vrstu prikaza
Mreža
Lista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Automatsko pokretanje videa
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 752dd209f..dfccccaec 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -110,6 +110,16 @@
Change view type
Grid
List
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Play videos automatically
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index eeeb3ccba..3c97e5a73 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -110,6 +110,16 @@
Cambia modalità visualizzazione
Griglia
Elenco
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Riproduci i video automaticamente
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 11ef7438c..8ed3387ef 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -110,6 +110,16 @@
表示形式の変更
グリッド
リスト
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
ビデオを自動再生する
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 4663c25ad..214230c6a 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -110,6 +110,16 @@
보기방식 변경
그리드
목록
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
비디오 자동재생
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index aa9a2c9f4..31bad5186 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -29,7 +29,7 @@
Filtruoti mediją
Atvaizdai
Vaizdo įrašai
- GIF'ai
+ GIF\'ai
Su pasirinktais filtrais nerasta medijos bylų.
Pakeisti filtrus
@@ -98,7 +98,7 @@
Intervalas (sekundėmis):
Įtraukti nuotraukas
Įtraukti vaizdo įrašus
- Itraukti GIF'us
+ Itraukti GIF\'us
Atsitiktinė tvarka
Naudoti išblukimo animacijas
Sukti atgal
@@ -110,12 +110,22 @@
Keisti peržiūros tipą
Tinklelis
Sąrašas
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Groti vaizdo įrašus automatiškai
Perjungti bylos pavadinimo matomumą
Klipuoti vaizdo įrašus
- Animuoti GIF'us miniatiūrose
+ Animuoti GIF\'us miniatiūrose
Maksimalus ryškumas, kai medija peržiūrima viso ekrano rėžimu
Apkirpti miniatiūras kvadratu
Sukti viso ekrano mediją pagal
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index eacb6094d..9a71c89dc 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -110,6 +110,16 @@
Endre visningstype
Rutenett
Liste
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Avspill videoer automatisk
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 87e10fd6c..5baae93d3 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -110,6 +110,16 @@
Weergave
Raster
Lijst
+ Directe submappen groeperen
+
+
+ Groeperen op
+ Bestanden niet groeperen
+ Map
+ Laatst gewijzigd
+ Datum opname
+ Bestandstype
+ Extensie
Video\'s automatisch afspelen
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index c850ea9e7..7e27a6fe9 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -110,6 +110,16 @@
Zmień typ widoku
Siatka
Lista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Odtwarzaj filmy automatycznie
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 864fad67e..418287be2 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -110,6 +110,16 @@
Alterar modo de visualização
Grade
Lista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Reproduzir vídeos automaticamente
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index de1924bed..e89ed8d41 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -110,6 +110,16 @@
Tipo de exibição
Grelha
Lista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Reproduzir vídeos automaticamente
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 9ed7b09a2..b1eb1ce50 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -110,6 +110,16 @@
Режим отображения
Сетка
Список
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Воспроизводить видео автоматически
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 48b2d4c74..e20e1788e 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -110,6 +110,16 @@
Zmeniť typ zobrazenia
Mriežka
Zoznam
+ Zlúčiť priame podpriečinky
+
+
+ Zoskupiť podľa
+ Nezoskupovať súbory
+ Priečinka
+ Dátumu poslednej úpravy
+ Dátumu vytvorenia
+ Typu súboru
+ Prípony
Spúšťať videá automaticky
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 118ae9cae..067406436 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -110,6 +110,16 @@
Ändra vy
Rutnät
Lista
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Spela upp videor automatiskt
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index eb8b74849..62b88f9c5 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -110,6 +110,16 @@
Change view type
Grid
List
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Videoları otomatik olarak oynat
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 0db0f7a8b..7ad76f03c 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -110,6 +110,16 @@
更改视图类型
网格
列表
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
自动播放
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 654c2475b..4f8a69048 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -110,6 +110,16 @@
改變瀏覽類型
格狀
列表
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
自動播放影片
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
index 09fed2594..585eaa0e8 100644
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -2,6 +2,8 @@
+ Added sorting by Date Taken
+ Allow customizing the app launcher icon color
Added toggles for disabling Pull-to-refresh and permanent Delete dialog confirmation skipping
Added a toggle for replacing deep zoomable images with better quality ones\n
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6e5d7fecb..b2fd79fae 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -110,6 +110,16 @@
Change view type
Grid
List
+ Group direct subfolders
+
+
+ Group by
+ Do not group files
+ Folder
+ Last modified
+ Date taken
+ File type
+ Extension
Play videos automatically
diff --git a/build.gradle b/build.gradle
index 1a38f0b61..0a7f22883 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.2.40'
+ ext.kotlin_version = '1.2.41'
repositories {
jcenter()
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
index 5357a274f..2056c1e20 100644
Binary files a/fastlane/metadata/android/en-US/images/icon.png and b/fastlane/metadata/android/en-US/images/icon.png differ