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