diff --git a/CHANGELOG.md b/CHANGELOG.md index 717c71b10..1d017dc06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,55 @@ Changelog ========== +Version 6.14.8 *(2020-05-05)* +---------------------------- + + * Added some crashfixes + +Version 6.14.7 *(2020-05-04)* +---------------------------- + + * Fixed a glitch with some favorite items disappearing + * Improve folder hiding, add the new .nomedia file into MediaStore + * Improve the performance of getting video file duration + * A few other improvements here and there + +Version 6.14.6 *(2020-04-26)* +---------------------------- + + * Added a few more stability and performance improvements + +Version 6.14.5 *(2020-04-26)* +---------------------------- + + * Disable Portrait photo showing by default, until it gets improved + * Added a couple other performance improvements here and there + +Version 6.14.4 *(2020-04-24)* +---------------------------- + + * Improved the performance on multiple places + * Removed some unnecessary permissions added recently + * Fixed some photo editor glitches + * Show Portrait images by default only on Android 9+ + +Version 6.14.3 *(2020-04-21)* +---------------------------- + + * Use the selected date format grouped thumbnail section titles too + * Fixed a glitch related to locked folders asking authentication too often + * Refresh the UI here and there a bit + +Version 6.14.2 *(2020-04-18)* +---------------------------- + + * Fixed some Photo Editor bugs + * Properly handle locked folders at opening from widgets and shortcuts + * Open the map at clicking the coordinates at the Properties window + * Properly sort items at the Other Folder dialog at copy/move + * Fixed some folder un/hiding related glitches + * A couple other translation and UX improvements + Version 6.14.1 *(2020-04-14)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index da738680a..f76bd1d69 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.simplemobiletools.gallery.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 301 - versionName "6.14.1" + versionCode 309 + versionName "6.14.8" multiDexEnabled true setProperty("archivesBaseName", "gallery-$versionCode") vectorDrawables.useSupportLibrary = true @@ -58,8 +58,8 @@ android { flavorDimensions "licensing" productFlavors { - proprietary { } - foss { } + proprietary {} + foss {} } lintOptions { @@ -78,7 +78,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.25.25' + implementation 'com.simplemobiletools:commons:5.28.4' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1' @@ -111,8 +111,6 @@ if (is_proprietary) { licencePath 'pesdk_license' } - supportLibVersion "28.0.0" - modules { include 'ui:core' include 'ui:text' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b871b2d77..de8fca45c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + @@ -285,6 +286,15 @@ android:resource="@xml/widget_info"/> + + + + + + + 100 && config.appRunCount % 50 != 0 && !isPackageInstalled(NEW_APP_PACKAGE)) { - config.wasNewAppShown = true - NewAppDialog(this, NEW_APP_PACKAGE, "Simple Clock") - }*/ - if (!config.wereFavoritesPinned) { config.addPinnedFolders(hashSetOf(FAVORITES)) config.wereFavoritesPinned = true @@ -151,6 +147,20 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { directories_switch_searching.setOnClickListener { launchSearchActivity() } + + // just request the permission, tryLoadGallery will then trigger in onResume + handlePermission(PERMISSION_WRITE_STORAGE) { + if (!it) { + toast(R.string.no_storage_permissions) + finish() + } + } + + // notify some users about the Dialer, SMS Messenger and Voice Recorder apps + if (!config.wasMessengerRecorderShown && config.appRunCount > 35) { + NewAppsIconsDialog(this) + config.wasMessengerRecorderShown = true + } } override fun onStart() { @@ -161,6 +171,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { override fun onResume() { super.onResume() config.isThirdPartyIntent = false + mDateFormat = config.dateFormat + mTimeFormat = getTimeFormat() if (mStoredAnimateGifs != config.animateGifs) { getRecyclerAdapter()?.updateAnimateGifs(config.animateGifs) @@ -413,7 +425,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun checkDefaultSpamFolders() { if (!config.spamFoldersChecked) { val spamFolders = arrayListOf( - "/storage/emulated/0/Android/data/com.facebook.orca/files/stickers" + "/storage/emulated/0/Android/data/com.facebook.orca/files/stickers" ) val OTGPath = config.OTGPath @@ -427,27 +439,22 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } private fun tryLoadGallery() { - handlePermission(PERMISSION_WRITE_STORAGE) { - if (it) { - if (!config.wasUpgradedFromFreeShown && isPackageInstalled("com.simplemobiletools.gallery")) { - ConfirmationDialog(this, "", R.string.upgraded_from_free, R.string.ok, 0) {} - config.wasUpgradedFromFreeShown = true - } - - checkOTGPath() - checkDefaultSpamFolders() - - if (config.showAll) { - showAllMedia() - } else { - getDirectories() - } - - setupLayoutManager() - } else { - toast(R.string.no_storage_permissions) - finish() + if (hasPermission(PERMISSION_WRITE_STORAGE)) { + if (!config.wasUpgradedFromFreeShown && isPackageInstalled("com.simplemobiletools.gallery")) { + ConfirmationDialog(this, "", R.string.upgraded_from_free, R.string.ok, 0) {} + config.wasUpgradedFromFreeShown = true } + + checkOTGPath() + checkDefaultSpamFolders() + + if (config.showAll) { + showAllMedia() + } else { + getDirectories() + } + + setupLayoutManager() } } @@ -539,7 +546,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val fileDirItems = folders.asSequence().filter { it.isDirectory }.map { FileDirItem(it.absolutePath, it.name, true) }.toMutableList() as ArrayList when { fileDirItems.isEmpty() -> return - fileDirItems.size == 1 -> toast(String.format(getString(R.string.deleting_folder), fileDirItems.first().name)) + fileDirItems.size == 1 -> { + try { + toast(String.format(getString(R.string.deleting_folder), fileDirItems.first().name)) + } catch (e: Exception) { + showErrorToast(e) + } + } else -> { val baseString = if (config.useRecycleBin) R.plurals.moving_items_into_bin else R.plurals.delete_items val deletingItems = resources.getQuantityString(baseString, fileDirItems.size, fileDirItems.size) @@ -835,6 +848,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { handleLockedFolderOpening(path) { success -> if (success) { Intent(this, MediaActivity::class.java).apply { + putExtra(SKIP_AUTHENTICATION, true) putExtra(DIRECTORY, path) handleMediaIntent(this) } @@ -944,11 +958,17 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { setupAdapter(dirs) - // update directories and media files in the local db, delete invalid items + // update directories and media files in the local db, delete invalid items. Intentionally creating a new thread updateDBDirectory(directory) if (!directory.isRecycleBin()) { - mediaDB.insertAll(curMedia) + Thread { + try { + mediaDB.insertAll(curMedia) + } catch (ignored: Exception) { + } + }.start() } + getCachedMedia(directory.path, getVideosOnly, getImagesOnly) { it.forEach { if (!curMedia.contains(it)) { @@ -1019,13 +1039,17 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize) dirs.add(newDir) setupAdapter(dirs) - try { - directoryDao.insert(newDir) - if (folder != RECYCLE_BIN) { - mediaDB.insertAll(newMedia) + + // make sure to create a new thread for these operations, dont just use the common bg thread + Thread { + try { + directoryDao.insert(newDir) + if (folder != RECYCLE_BIN) { + mediaDB.insertAll(newMedia) + } + } catch (ignored: Exception) { } - } catch (ignored: Exception) { - } + }.start() } mLoadedInitialPhotos = true @@ -1035,21 +1059,31 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { directories_refresh_layout.isRefreshing = false checkPlaceholderVisibility(dirs) } - checkInvalidDirectories(dirs) - val everShownFolders = config.everShownFolders as HashSet - dirs.mapTo(everShownFolders) { it.path } + checkInvalidDirectories(dirs) + if (mDirs.size > 50) { + excludeSpamFolders() + } + + val excludedFolders = config.excludedFolders + val everShownFolders = config.everShownFolders.toMutableSet() as HashSet + + // do not add excluded folders and their subfolders at everShownFolders + dirs.filter { dir -> + if (excludedFolders.any { dir.path.startsWith(it) }) { + return@filter false + } + return@filter true + }.mapTo(everShownFolders) { it.path } try { + // catch some extreme exceptions like too many everShownFolders for storing, shouldnt really happen config.everShownFolders = everShownFolders } catch (e: Exception) { config.everShownFolders = HashSet() } - mDirs = dirs.clone() as ArrayList - if (mDirs.size > 55) { - excludeSpamFolders() - } + mDirs = dirs.clone() as ArrayList } private fun checkPlaceholderVisibility(dirs: ArrayList) { @@ -1059,7 +1093,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { if (mIsSearchOpen) { directories_empty_placeholder.text = getString(R.string.no_items_found) directories_empty_placeholder_2.beGone() - } else if (dirs.isEmpty() && config.filterMedia == TYPE_DEFAULT_FILTER) { + } else if (dirs.isEmpty() && config.filterMedia == getDefaultFileFilter()) { directories_empty_placeholder.text = getString(R.string.no_media_add_included) directories_empty_placeholder_2.text = getString(R.string.add_folder) @@ -1158,7 +1192,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } else if (it.path != config.tempFolderPath) { val children = if (isPathOnOTG(it.path)) getOTGFolderChildrenNames(it.path) else File(it.path).list()?.asList() val hasMediaFile = children?.any { - it != null && (it.isMediaFile() || (File(it).isDirectory && it.startsWith("img_", true))) + it != null && (it.isMediaFile() || (it.startsWith("img_", true) && File(it).isDirectory)) } ?: false if (!hasMediaFile) { @@ -1198,8 +1232,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun getCurrentlyDisplayedDirs() = getRecyclerAdapter()?.dirs ?: ArrayList() - private fun getBubbleTextItem(index: Int) = getRecyclerAdapter()?.dirs?.getOrNull(index)?.getBubbleText(config.directorySorting, this) - ?: "" + private fun getBubbleTextItem(index: Int) = getRecyclerAdapter()?.dirs?.getOrNull(index)?.getBubbleText(config.directorySorting, this, mDateFormat, mTimeFormat) + ?: "" private fun setupLatestMediaId() { ensureBackgroundThread { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt index 5f16757b6..5ac44db95 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt @@ -22,7 +22,6 @@ import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition -import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE @@ -36,7 +35,10 @@ import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.adapters.MediaAdapter import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask import com.simplemobiletools.gallery.pro.databases.GalleryDatabase -import com.simplemobiletools.gallery.pro.dialogs.* +import com.simplemobiletools.gallery.pro.dialogs.ChangeGroupingDialog +import com.simplemobiletools.gallery.pro.dialogs.ChangeSortingDialog +import com.simplemobiletools.gallery.pro.dialogs.ChangeViewTypeDialog +import com.simplemobiletools.gallery.pro.dialogs.FilterMediaDialog import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.helpers.* import com.simplemobiletools.gallery.pro.interfaces.MediaOperationsListener @@ -61,6 +63,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private var mLoadedInitialPhotos = false private var mIsSearchOpen = false private var mLastSearchedText = "" + private var mDateFormat = "" + private var mTimeFormat = "" private var mLatestMediaId = 0L private var mLatestMediaDateId = 0L private var mLastMediaHandler = Handler() @@ -122,6 +126,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { override fun onResume() { super.onResume() + mDateFormat = config.dateFormat + mTimeFormat = getTimeFormat() + if (mStoredAnimateGifs != config.animateGifs) { getMediaAdapter()?.updateAnimateGifs(config.animateGifs) } @@ -160,11 +167,15 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { media_empty_text_placeholder_2.setTextColor(getAdjustedPrimaryColor()) if (mMedia.isEmpty() || config.getFolderSorting(mPath) and SORT_BY_RANDOM == 0) { - handleLockedFolderOpening(mPath) { success -> - if (success) { - tryLoadGallery() - } else { - finish() + if (shouldSkipAuthentication()) { + tryLoadGallery() + } else { + handleLockedFolderOpening(mPath) { success -> + if (success) { + tryLoadGallery() + } else { + finish() + } } } } @@ -212,14 +223,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_media, menu) - val isFolderHidden = mPath.containsNoMedia() menu.apply { findItem(R.id.group).isVisible = !config.scrollHorizontally - findItem(R.id.hide_folder).isVisible = !isFolderHidden && !mShowAll && mPath != FAVORITES && mPath != RECYCLE_BIN - findItem(R.id.unhide_folder).isVisible = isFolderHidden && !mShowAll && mPath != FAVORITES && mPath != RECYCLE_BIN - findItem(R.id.exclude_folder).isVisible = !mShowAll && mPath != FAVORITES && mPath != RECYCLE_BIN - findItem(R.id.empty_recycle_bin).isVisible = mPath == RECYCLE_BIN findItem(R.id.empty_disable_recycle_bin).isVisible = mPath == RECYCLE_BIN findItem(R.id.restore_all_files).isVisible = mPath == RECYCLE_BIN @@ -255,9 +261,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { R.id.folder_view -> switchToFolderView() R.id.change_view_type -> changeViewType() R.id.group -> showGroupByDialog() - R.id.hide_folder -> tryHideFolder() - R.id.unhide_folder -> unhideFolder() - R.id.exclude_folder -> tryExcludeFolder() R.id.create_new_folder -> createNewFolder() R.id.temporarily_show_hidden -> tryToggleTemporarilyShowHidden() R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden() @@ -274,8 +277,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private fun startSlideshow() { if (mMedia.isNotEmpty()) { Intent(this, ViewPagerActivity::class.java).apply { - val item = mMedia.firstOrNull { it is Medium } as? Medium - ?: return + val item = mMedia.firstOrNull { it is Medium } as? Medium ?: return + putExtra(SKIP_AUTHENTICATION, shouldSkipAuthentication()) putExtra(PATH, item.path) putExtra(SHOW_ALL, mShowAll) putExtra(SLIDESHOW_START_ON_ENTER, true) @@ -439,7 +442,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { if (mediaAdapter?.isASectionTitle(index) == true) { realIndex++ } - return mediaAdapter?.getItemBubbleText(realIndex, sorting) ?: "" + return mediaAdapter?.getItemBubbleText(realIndex, sorting, mDateFormat, mTimeFormat) ?: "" } private fun checkLastMediaChanged() { @@ -536,43 +539,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } } - private fun tryHideFolder() { - if (config.wasHideFolderTooltipShown) { - hideFolder() - } else { - ConfirmationDialog(this, getString(R.string.hide_folder_description)) { - config.wasHideFolderTooltipShown = true - hideFolder() - } - } - } - - private fun hideFolder() { - addNoMedia(mPath) { - runOnUiThread { - if (!config.shouldShowHidden) { - finish() - } else { - invalidateOptionsMenu() - } - } - } - } - - private fun unhideFolder() { - removeNoMedia(mPath) { - runOnUiThread { - invalidateOptionsMenu() - } - } - } - - private fun tryExcludeFolder() { - ExcludeFolderDialog(this, arrayListOf(mPath)) { - finish() - } - } - private fun deleteDirectoryIfEmpty() { val fileDirItem = FileDirItem(mPath, mPath.getFilenameFromPath(), true) if (config.deleteEmptyFolders && !fileDirItem.isDownloadsFolder() && fileDirItem.isDirectory && fileDirItem.getProperFileCount(this, true) == 0) { @@ -862,9 +828,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { if (isVideo) { val extras = HashMap() extras[SHOW_FAVORITES] = mPath == FAVORITES + + if (shouldSkipAuthentication()) { + extras[SKIP_AUTHENTICATION] = true + } openPath(path, false, extras) } else { Intent(this, ViewPagerActivity::class.java).apply { + putExtra(SKIP_AUTHENTICATION, shouldSkipAuthentication()) putExtra(PATH, path) putExtra(SHOW_ALL, mShowAll) putExtra(SHOW_FAVORITES, mPath == FAVORITES) @@ -902,7 +873,9 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { if (!isFromCache) { val mediaToInsert = (mMedia).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium } try { - mediaDB.insertAll(mediaToInsert) + Thread { + mediaDB.insertAll(mediaToInsert) + }.start() } catch (e: Exception) { } } @@ -932,6 +905,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } } + private fun shouldSkipAuthentication() = intent.getBooleanExtra(SKIP_AUTHENTICATION, false) + private fun deleteFilteredFiles(filtered: ArrayList) { deleteFiles(filtered) { if (!it) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PanoramaVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PanoramaVideoActivity.kt index b9a7976c3..7098e3e4a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PanoramaVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PanoramaVideoActivity.kt @@ -130,7 +130,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList mIsPlaying = true resumeVideo() } else { - video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector) } video_toggle_play_pause.beVisible() } @@ -190,7 +190,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList } private fun resumeVideo() { - video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) + video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline_vector) if (mCurrTime == mDuration) { setVideoProgress(0) mPlayOnReady = true @@ -203,7 +203,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList private fun pauseVideo() { vr_video_view.pauseVideo() - video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector) window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } @@ -247,7 +247,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList } explore.requestLayout() } - video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector) cardboard.setOnClickListener { vr_video_view.displayMode = CARDBOARD_DISPLAY_MODE diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt index 50600c6b0..ff328654b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt @@ -103,12 +103,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList if (realPath.getFilenameFromPath().contains('.') || filename.contains('.')) { if (isFileTypeVisible(realPath)) { bottom_actions.beGone() - handleLockedFolderOpening(realPath.getParentPath()) { success -> - if (success) { - sendViewPagerIntent(realPath) - } - finish() - } + sendViewPagerIntent(realPath) + finish() return } } else { @@ -120,13 +116,9 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList if (mUri!!.scheme == "file") { if (filename.contains('.')) { bottom_actions.beGone() - handleLockedFolderOpening(mUri!!.path!!.getParentPath()) { success -> - if (success) { - rescanPaths(arrayListOf(mUri!!.path!!)) - sendViewPagerIntent(mUri!!.path!!) - } - finish() - } + rescanPaths(arrayListOf(mUri!!.path!!)) + sendViewPagerIntent(mUri!!.path!!) + finish() } return } else { @@ -134,13 +126,9 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList if (path != mUri.toString() && path.isNotEmpty() && mUri!!.authority != "mms" && filename.contains('.') && getDoesFilePathExist(path)) { if (isFileTypeVisible(path)) { bottom_actions.beGone() - handleLockedFolderOpening(path.getParentPath()) { success -> - if (success) { - rescanPaths(arrayListOf(mUri!!.path!!)) - sendViewPagerIntent(path) - } - finish() - } + rescanPaths(arrayListOf(mUri!!.path!!)) + sendViewPagerIntent(path) + finish() return } } @@ -237,6 +225,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList private fun sendViewPagerIntent(path: String) { Intent(this, ViewPagerActivity::class.java).apply { + putExtra(SKIP_AUTHENTICATION, intent.getBooleanExtra(SKIP_AUTHENTICATION, false)) putExtra(SHOW_FAVORITES, intent.getBooleanExtra(SHOW_FAVORITES, false)) putExtra(IS_VIEW_INTENT, true) putExtra(IS_FROM_GALLERY, mIsFromGallery) @@ -293,8 +282,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } private fun initBottomActions() { - initBottomActionsLayout() initBottomActionButtons() + initBottomActionsLayout() } private fun initBottomActionsLayout() { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt index ced82efa0..4eea261ac 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt @@ -31,6 +31,8 @@ import java.io.File class SearchActivity : SimpleActivity(), MediaOperationsListener { private var mIsSearchOpen = false private var mLastSearchedText = "" + private var mDateFormat = "" + private var mTimeFormat = "" private var mSearchMenuItem: MenuItem? = null private var mCurrAsyncTask: GetMediaAsynctask? = null @@ -40,6 +42,8 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener { super.onCreate(savedInstanceState) setContentView(R.layout.activity_search) media_empty_text_placeholder.setTextColor(config.textColor) + mDateFormat = config.dateFormat + mTimeFormat = getTimeFormat() getAllMedia() } @@ -232,7 +236,7 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener { if (mediaAdapter?.isASectionTitle(index) == true) { realIndex++ } - return mediaAdapter?.getItemBubbleText(realIndex, sorting) ?: "" + return mediaAdapter?.getItemBubbleText(realIndex, sorting, mDateFormat, mTimeFormat) ?: "" } private fun measureRecyclerViewContent(media: ArrayList) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt index 6f994024d..b1c319a1e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt @@ -290,7 +290,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen if (config.autoplayVideos) { resumeVideo() } else { - video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector) } } } @@ -305,7 +305,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } private fun resumeVideo() { - video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) + video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline_vector) if (mExoPlayer == null) { return } @@ -322,7 +322,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } private fun pauseVideo() { - video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline_vector) if (mExoPlayer == null) { return } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt index 712f45fe6..a29be1226 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt @@ -308,11 +308,15 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View showSystemUI(true) - handleLockedFolderOpening(mPath.getParentPath()) { success -> - if (success) { - initContinue() - } else { - finish() + if (intent.getBooleanExtra(SKIP_AUTHENTICATION, false)) { + initContinue() + } else { + handleLockedFolderOpening(mPath.getParentPath()) { success -> + if (success) { + initContinue() + } else { + finish() + } } } } @@ -385,7 +389,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } val isFavorite = favoritesDB.isFavorite(mPath) - val duration = if (type == TYPE_VIDEOS) mPath.getVideoDuration() else 0 + val duration = if (type == TYPE_VIDEOS) getDuration(mPath) ?: 0 else 0 val ts = System.currentTimeMillis() val medium = Medium(null, mPath.getFilenameFromPath(), mPath, mPath.getParentPath(), ts, ts, File(mPath).length(), type, duration, isFavorite, 0) mediaDB.insert(medium) @@ -395,8 +399,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } private fun initBottomActions() { - initBottomActionsLayout() initBottomActionButtons() + initBottomActionsLayout() } private fun initFavorites() { @@ -1165,6 +1169,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } } + @SuppressLint("SourceLockedOrientationActivity") private fun checkOrientation() { if (!mIsOrientationLocked && config.screenRotation == ROTATE_BY_ASPECT_RATIO) { var flipSides = false diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt index 5dcf75275..eb9564979 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/MediaAdapter.kt @@ -493,14 +493,16 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList Unit) { } } else { try { - file.createNewFile() + if (file.createNewFile()) { + rescanFolderMedia(file.absolutePath) + } else { + toast(R.string.unknown_error_occurred) + } } catch (e: Exception) { showErrorToast(e) } @@ -419,7 +423,7 @@ fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, hasResc for (path in paths) { val dateTime = ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL) - ?: ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME) ?: continue + ?: ExifInterface(path).getAttribute(ExifInterface.TAG_DATETIME) ?: continue // some formats contain a "T" in the middle, some don't // sample dates: 2015-07-26T14:55:23, 2018:09:05 15:09:05 @@ -611,18 +615,18 @@ fun saveFile(path: String, bitmap: Bitmap, out: FileOutputStream, degrees: Int) fun Activity.getShortcutImage(tmb: String, drawable: Drawable, callback: () -> Unit) { ensureBackgroundThread { val options = RequestOptions() - .format(DecodeFormat.PREFER_ARGB_8888) - .skipMemoryCache(true) - .diskCacheStrategy(DiskCacheStrategy.NONE) - .fitCenter() + .format(DecodeFormat.PREFER_ARGB_8888) + .skipMemoryCache(true) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .fitCenter() val size = resources.getDimension(R.dimen.shortcut_size).toInt() val builder = Glide.with(this) - .asDrawable() - .load(tmb) - .apply(options) - .centerCrop() - .into(size, size) + .asDrawable() + .load(tmb) + .apply(options) + .centerCrop() + .into(size, size) try { (drawable as LayerDrawable).setDrawableByLayerId(R.id.shortcut_image, builder.get()) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt index b205d09c9..f5fb3572d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt @@ -216,16 +216,16 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList, currentPathPre } val directory = Directory(newDirId++, - parent, - subDirs.first().tmb, - getFolderNameFromPath(parent), - subDirs.sumBy { it.mediaCnt }, - lastModified, - dateTaken, - subDirs.sumByLong { it.size }, - getPathLocation(parent), - mediaTypes, - "") + parent, + subDirs.first().tmb, + getFolderNameFromPath(parent), + subDirs.sumBy { it.mediaCnt }, + lastModified, + dateTaken, + subDirs.sumByLong { it.size }, + getPathLocation(parent), + mediaTypes, + "") directory.containsMediaFilesDirectly = false dirs.add(directory) @@ -442,15 +442,15 @@ fun Context.getPathLocation(path: String): Int { fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList? = null) { val options = RequestOptions() - .signature(path.getFileSignature()) - .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) - .priority(Priority.LOW) - .format(DecodeFormat.PREFER_ARGB_8888) + .signature(path.getFileSignature()) + .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .priority(Priority.LOW) + .format(DecodeFormat.PREFER_ARGB_8888) val builder = Glide.with(applicationContext) - .asBitmap() - .load(path) + .asBitmap() + .load(path) if (cropThumbnails) options.centerCrop() else options.fitCenter() builder.apply(options).into(target) @@ -458,34 +458,34 @@ fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boo fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList? = null) { val options = RequestOptions() - .signature(path.getFileSignature()) - .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) - .priority(Priority.LOW) - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .signature(path.getFileSignature()) + .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) + .priority(Priority.LOW) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) val builder = Glide.with(applicationContext) - .load(path) + .load(path) if (cropThumbnails) options.centerCrop() else options.fitCenter() builder.apply(options) - .transition(DrawableTransitionOptions.withCrossFade()) - .into(target) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(target) } fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList? = null) { val options = RequestOptions() - .signature(path.getFileSignature()) - .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) - .priority(Priority.LOW) - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .signature(path.getFileSignature()) + .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) + .priority(Priority.LOW) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) val builder = Glide.with(applicationContext) - .asBitmap() // make sure the GIF wont animate - .load(path) + .asBitmap() // make sure the GIF wont animate + .load(path) if (cropThumbnails) options.centerCrop() else options.fitCenter() builder.apply(options) - .into(target) + .into(target) } fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean) { @@ -493,12 +493,12 @@ fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boo val options = RequestOptions().signature(path.getFileSignature()) Glide.with(applicationContext) - .`as`(PictureDrawable::class.java) - .listener(SvgSoftwareLayerSetter()) - .load(path) - .apply(options) - .transition(DrawableTransitionOptions.withCrossFade()) - .into(target) + .`as`(PictureDrawable::class.java) + .listener(SvgSoftwareLayerSetter()) + .load(path) + .apply(options) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(target) } fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, callback: (ArrayList) -> Unit) { @@ -516,7 +516,7 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: val shouldShowHidden = config.shouldShowHidden || forceShowHidden val excludedPaths = config.excludedFolders val includedPaths = config.includedFolders - var filteredDirectories = directories.filter { it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden) } as ArrayList + var filteredDirectories = directories.filter { it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, this) } as ArrayList val filterMedia = config.filterMedia filteredDirectories = (when { @@ -543,7 +543,6 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: val clone = filteredDirectories.clone() as ArrayList callback(clone.distinctBy { it.path.getDistinctPath() } as ArrayList) - removeInvalidDBDirectories(filteredDirectories) } } @@ -565,7 +564,7 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag val foldersToAdd = ArrayList() for (folder in foldersToScan) { val allFiles = File(folder).listFiles() ?: continue - allFiles.filter { it.isDirectory && it.name.startsWith("img_", true) }.forEach { + allFiles.filter { it.name.startsWith("img_", true) && it.isDirectory }.forEach { foldersToAdd.add(it.absolutePath) } } @@ -605,23 +604,26 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag callback(grouped.clone() as ArrayList) val OTGPath = config.OTGPath - val mediaToDelete = ArrayList() - media.filter { !getDoesFilePathExist(it.path, OTGPath) }.forEach { - if (it.path.startsWith(recycleBinPath)) { - deleteDBPath(it.path) - } else { - mediaToDelete.add(it) - } - } - try { - if (mediaToDelete.isNotEmpty()) { - mediaDB.deleteMedia(*mediaToDelete.toTypedArray()) - - mediaToDelete.filter { it.isFavorite }.forEach { - favoritesDB.deleteFavoritePath(it.path) + val mediaToDelete = ArrayList() + // creating a new thread intentionally, do not reuse the common background thread + Thread { + media.filter { !getDoesFilePathExist(it.path, OTGPath) }.forEach { + if (it.path.startsWith(recycleBinPath)) { + deleteDBPath(it.path) + } else { + mediaToDelete.add(it) + } } - } + + if (mediaToDelete.isNotEmpty()) { + mediaDB.deleteMedia(*mediaToDelete.toTypedArray()) + + mediaToDelete.filter { it.isFavorite }.forEach { + favoritesDB.deleteFavoritePath(it.path) + } + } + }.start() } catch (ignored: Exception) { } } @@ -698,7 +700,6 @@ fun Context.deleteDBPath(path: String) { fun Context.deleteMediumWithPath(path: String) { try { mediaDB.deleteMediumPath(path) - favoritesDB.deleteFavoritePath(path) } catch (ignored: Exception) { } } @@ -788,9 +789,9 @@ fun Context.addPathToDB(path: String) { try { val isFavorite = favoritesDB.isFavorite(path) - val videoDuration = if (type == TYPE_VIDEOS) path.getVideoDuration() else 0 + val videoDuration = if (type == TYPE_VIDEOS) getDuration(path) ?: 0 else 0 val medium = Medium(null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(), - File(path).length(), type, videoDuration, isFavorite, 0L) + File(path).length(), type, videoDuration, isFavorite, 0L) mediaDB.insert(medium) } catch (ignored: Exception) { @@ -887,23 +888,21 @@ fun Context.updateDirectoryPath(path: String) { fun Context.getFileDateTaken(path: String): Long { val projection = arrayOf( - Images.Media.DATE_TAKEN + Images.Media.DATE_TAKEN ) val uri = Files.getContentUri("external") val selection = "${Images.Media.DATA} = ?" val selectionArgs = arrayOf(path) - val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) - cursor?.use { - if (cursor.moveToFirst()) { - do { - try { - return cursor.getLongValue(Images.Media.DATE_TAKEN) - } catch (ignored: Exception) { - } - } while (cursor.moveToNext()) + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getLongValue(Images.Media.DATE_TAKEN) + } } + } catch (ignored: Exception) { } return 0L diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt index 2c0420b9a..3f36fa99e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt @@ -1,9 +1,9 @@ package com.simplemobiletools.gallery.pro.extensions -import android.media.MediaMetadataRetriever +import android.content.Context import android.os.Environment -import com.simplemobiletools.commons.extensions.doesThisOrParentHaveNoMedia -import com.simplemobiletools.commons.helpers.NOMEDIA +import com.simplemobiletools.commons.extensions.containsNoMedia +import com.simplemobiletools.commons.extensions.doesParentHaveNoMedia import java.io.File import java.io.IOException @@ -11,7 +11,7 @@ fun String.isThisOrParentIncluded(includedPaths: MutableSet) = includedP fun String.isThisOrParentExcluded(excludedPaths: MutableSet) = excludedPaths.any { equals(it, true) } || excludedPaths.any { "$this/".startsWith("$it/", true) } -fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPaths: MutableSet, showHidden: Boolean): Boolean { +fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPaths: MutableSet, showHidden: Boolean, context: Context): Boolean { if (isEmpty()) { return false } @@ -35,7 +35,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath val containsNoMedia = if (showHidden) { false } else { - File(this, NOMEDIA).exists() + file.containsNoMedia() } return if (!showHidden && containsNoMedia) { @@ -49,7 +49,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath } else if (!showHidden && file.isDirectory && file.canonicalFile == file.absoluteFile) { var containsNoMediaOrDot = containsNoMedia || contains("/.") if (!containsNoMediaOrDot) { - containsNoMediaOrDot = file.doesThisOrParentHaveNoMedia() + containsNoMediaOrDot = file.doesParentHaveNoMedia() } !containsNoMediaOrDot } else { @@ -66,15 +66,4 @@ fun String.getDistinctPath(): String { } } -fun String.getVideoDuration(): Int { - var seconds = 0 - try { - val retriever = MediaMetadataRetriever() - retriever.setDataSource(this) - seconds = Math.round(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION).toInt() / 1000f) - } catch (e: Exception) { - } - return seconds -} - fun String.isDownloadsFolder() = equals(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString(), true) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt index 76da0d990..35c1b8913 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt @@ -28,7 +28,9 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.activities.PanoramaVideoActivity import com.simplemobiletools.gallery.pro.activities.VideoActivity -import com.simplemobiletools.gallery.pro.extensions.* +import com.simplemobiletools.gallery.pro.extensions.config +import com.simplemobiletools.gallery.pro.extensions.hasNavBar +import com.simplemobiletools.gallery.pro.extensions.parseFileChannel import com.simplemobiletools.gallery.pro.helpers.* import com.simplemobiletools.gallery.pro.models.Medium import com.simplemobiletools.gallery.pro.views.MediaSideScroll @@ -327,7 +329,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } private fun setupTimer() { - activity!!.runOnUiThread(object : Runnable { + activity?.runOnUiThread(object : Runnable { override fun run() { if (mExoPlayer != null && !mIsDragged && mIsPlaying) { mCurrTime = (mExoPlayer!!.currentPosition / 1000).toInt() @@ -476,8 +478,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S private fun checkIfPanorama() { try { val fis = FileInputStream(File(mMedium.path)) - fis.use { fis -> - context!!.parseFileChannel(mMedium.path, fis.channel, 0, 0, 0) { + fis.use { + context!!.parseFileChannel(mMedium.path, it.channel, 0, 0, 0) { mIsPanorama = true } } @@ -501,7 +503,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } mSeekBar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this) - arrayOf(mView.video_curr_time, mView.video_duration).forEach { + arrayOf(mView.video_curr_time, mView.video_duration, mView.video_toggle_play_pause).forEach { it.isClickable = !mIsFullscreen } @@ -588,8 +590,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S return } - if (mExoPlayer == null) + if (mExoPlayer == null) { return + } if (mIsPlaying) { mExoPlayer!!.playWhenReady = true @@ -634,7 +637,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } if (!wasEnded || !mConfig.loopVideos) { - mPlayPauseButton.setImageResource(R.drawable.ic_pause_outline) + mPlayPauseButton.setImageResource(R.drawable.ic_pause_outline_vector) } if (!mWasVideoStarted) { @@ -660,7 +663,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mExoPlayer?.playWhenReady = false } - mPlayPauseButton.setImageResource(R.drawable.ic_play_outline) + mPlayPauseButton.setImageResource(R.drawable.ic_play_outline_vector) activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) mPositionAtPause = mExoPlayer?.currentPosition ?: 0L releaseExoPlayer() @@ -683,9 +686,14 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } private fun setupVideoDuration() { - mDuration = mMedium.path.getVideoDuration() - setupTimeHolder() - setPosition(0) + ensureBackgroundThread { + mDuration = context?.getDuration(mMedium.path) ?: 0 + + activity?.runOnUiThread { + setupTimeHolder() + setPosition(0) + } + } } private fun videoPrepared() { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt index 06663d8f1..9d70eb98c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt @@ -191,7 +191,7 @@ class Config(context: Context) : BaseConfig(context) { set(blackBackground) = prefs.edit().putBoolean(BLACK_BACKGROUND, blackBackground).apply() var filterMedia: Int - get() = prefs.getInt(FILTER_MEDIA, TYPE_DEFAULT_FILTER) + get() = prefs.getInt(FILTER_MEDIA, getDefaultFileFilter()) set(filterMedia) = prefs.edit().putInt(FILTER_MEDIA, filterMedia).apply() var dirColumnCnt: Int @@ -400,11 +400,13 @@ class Config(context: Context) : BaseConfig(context) { set(everShownFolders) = prefs.edit().putStringSet(EVER_SHOWN_FOLDERS, everShownFolders).apply() private fun getEverShownFolders() = hashSetOf( - internalStoragePath, - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).absolutePath, - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath, - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath, - "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath}/Screenshots" + internalStoragePath, + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).absolutePath, + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath, + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath, + "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath}/Screenshots", + "internalStoragePath/WhatsApp/Media/WhatsApp Images", + "internalStoragePath/WhatsApp/Media/WhatsApp Video" ) var showRecycleBinAtFolders: Boolean diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt index d6d6abef0..35933b7df 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.gallery.pro.helpers import com.simplemobiletools.commons.helpers.MONTH_SECONDS +import com.simplemobiletools.commons.helpers.isPiePlus // shared preferences const val DIRECTORY_SORT_ORDER = "directory_sort_order" @@ -132,6 +133,7 @@ const val IS_VIEW_INTENT = "is_view_intent" const val PICKED_PATHS = "picked_paths" const val SHOULD_INIT_FRAGMENT = "should_init_fragment" const val PORTRAIT_PATH = "portrait_path" +const val SKIP_AUTHENTICATION = "skip_authentication" // rotations const val ROTATE_BY_SYSTEM_SETTING = 0 @@ -168,7 +170,8 @@ const val TYPE_GIFS = 4 const val TYPE_RAWS = 8 const val TYPE_SVGS = 16 const val TYPE_PORTRAITS = 32 -const val TYPE_DEFAULT_FILTER = TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS or TYPE_SVGS or TYPE_PORTRAITS + +fun getDefaultFileFilter() = TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS or TYPE_SVGS const val LOCATION_INTERNAL = 1 const val LOCATION_SD = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt index 27c61a640..9e66b62b8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt @@ -49,9 +49,9 @@ class MediaFetcher(val context: Context) { val OTGPath = context.config.OTGPath val folders = getLatestFileFolders() folders.addAll(arrayListOf( - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString(), - "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)}/Camera", - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString(), + "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)}/Camera", + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() ).filter { context.getDoesFilePathExist(it, OTGPath) }) val filterMedia = context.config.filterMedia @@ -66,7 +66,7 @@ class MediaFetcher(val context: Context) { val shouldShowHidden = config.shouldShowHidden val excludedPaths = config.excludedFolders val includedPaths = config.includedFolders - folders.filter { it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden) }.toMutableList() as ArrayList + folders.filter { it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, context) }.toMutableList() as ArrayList } catch (e: Exception) { ArrayList() } @@ -172,7 +172,7 @@ class MediaFetcher(val context: Context) { val config = context.config val includedFolders = config.includedFolders val OTGPath = config.OTGPath - var foldersToScan = config.everShownFolders.filter { it == FAVORITES || it == RECYCLE_BIN || context.getDoesFilePathExist(it, OTGPath) }.toHashSet() + val foldersToScan = config.everShownFolders.filter { it == FAVORITES || it == RECYCLE_BIN || context.getDoesFilePathExist(it, OTGPath) }.toHashSet() cursor.use { if (cursor.moveToFirst()) { @@ -192,8 +192,8 @@ class MediaFetcher(val context: Context) { val showHidden = config.shouldShowHidden val excludedFolders = config.excludedFolders - foldersToScan = foldersToScan.filter { it.shouldFolderBeVisible(excludedFolders, includedFolders, showHidden) }.toHashSet() - return foldersToScan.distinctBy { it.getDistinctPath() }.toMutableSet() as LinkedHashSet + return foldersToScan.distinctBy { it.getDistinctPath() } + .filter { it.shouldFolderBeVisible(excludedFolders, includedFolders, showHidden, context) }.toMutableSet() as LinkedHashSet } private fun addFolder(curFolders: HashSet, folder: String) { @@ -244,7 +244,7 @@ class MediaFetcher(val context: Context) { val isSvg = if (isImage || isVideo || isGif || isRaw) false else path.isSvg() if (!isImage && !isVideo && !isGif && !isRaw && !isSvg) { - if (showPortraits && file.isDirectory && file.name.startsWith("img_", true)) { + if (showPortraits && file.name.startsWith("img_", true) && file.isDirectory) { val portraitFiles = file.listFiles() ?: continue val cover = portraitFiles.firstOrNull { it.name.contains("cover", true) } ?: portraitFiles.firstOrNull() if (cover != null && !files.contains(cover)) { @@ -294,7 +294,7 @@ class MediaFetcher(val context: Context) { } else { val lastModified = if (getProperLastModified) file.lastModified() else 0L var dateTaken = lastModified - val videoDuration = if (getVideoDurations && isVideo) path.getVideoDuration() else 0 + val videoDuration = if (getVideoDurations && isVideo) context.getDuration(path) ?: 0 else 0 if (getProperDateTaken) { var newDateTaken = dateTakens.remove(path) @@ -383,7 +383,7 @@ class MediaFetcher(val context: Context) { } val path = Uri.decode(file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", "${context.config.OTGPath}/")) - val videoDuration = if (getVideoDurations) path.getVideoDuration() else 0 + val videoDuration = if (getVideoDurations) context.getDuration(path) ?: 0 else 0 val isFavorite = favoritePaths.contains(path) val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type, videoDuration, isFavorite, 0L) media.add(medium) @@ -396,8 +396,8 @@ class MediaFetcher(val context: Context) { val dateTakens = HashMap() if (folder != FAVORITES) { val projection = arrayOf( - Images.Media.DISPLAY_NAME, - Images.Media.DATE_TAKEN + Images.Media.DISPLAY_NAME, + Images.Media.DATE_TAKEN ) val uri = Files.getContentUri("external") @@ -494,7 +494,7 @@ class MediaFetcher(val context: Context) { val sortDescending = currentGrouping and GROUP_DESCENDING != 0 val sorted = if (currentGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || currentGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 || - currentGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || currentGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0) { + currentGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || currentGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0) { mediumGroups.toSortedMap(if (sortDescending) compareByDescending { it.toLongOrNull() ?: 0L } else { @@ -549,7 +549,7 @@ class MediaFetcher(val context: Context) { return if (timestamp.areDigitsOnly()) { val cal = Calendar.getInstance(Locale.ENGLISH) cal.timeInMillis = timestamp.toLong() - val format = if (showDay) "dd MMM yyyy" else "MMM yyyy" + val format = if (showDay) context.config.dateFormat else "MMMM yyyy" DateFormat.format(format, cal).toString() } else { "" diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt index f68ae3171..4f37ea010 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt @@ -32,11 +32,11 @@ data class Directory( constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, "", 0, 0) - fun getBubbleText(sorting: Int, context: Context) = when { + fun getBubbleText(sorting: Int, context: Context, dateFormat: String? = null, timeFormat: String? = null) = when { sorting and SORT_BY_NAME != 0 -> name sorting and SORT_BY_PATH != 0 -> path sorting and SORT_BY_SIZE != 0 -> size.formatSize() - sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate(context) + sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate(context, dateFormat, timeFormat) else -> taken.formatDate(context) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt index 04c685229..894feae17 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt @@ -48,11 +48,11 @@ data class Medium( fun isHidden() = name.startsWith('.') - fun getBubbleText(sorting: Int, context: Context) = when { + fun getBubbleText(sorting: Int, context: Context, dateFormat: String, timeFormat: String) = when { sorting and SORT_BY_NAME != 0 -> name sorting and SORT_BY_PATH != 0 -> path sorting and SORT_BY_SIZE != 0 -> size.formatSize() - sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate(context) + sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate(context, dateFormat, timeFormat) else -> taken.formatDate(context) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/receivers/BootCompletedReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/receivers/BootCompletedReceiver.kt new file mode 100644 index 000000000..f8aae1326 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/receivers/BootCompletedReceiver.kt @@ -0,0 +1,18 @@ +package com.simplemobiletools.gallery.pro.receivers + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.gallery.pro.extensions.updateDirectoryPath +import com.simplemobiletools.gallery.pro.helpers.MediaFetcher + +class BootCompletedReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + ensureBackgroundThread { + MediaFetcher(context).getFoldersToScan().forEach { + context.updateDirectoryPath(it) + } + } + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_next_outline.png b/app/src/main/res/drawable-hdpi/ic_next_outline.png deleted file mode 100644 index 88c0a34aa..000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_next_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_pause_outline.png b/app/src/main/res/drawable-hdpi/ic_pause_outline.png deleted file mode 100644 index d6d51bfc9..000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_pause_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_prev_outline.png b/app/src/main/res/drawable-hdpi/ic_prev_outline.png deleted file mode 100644 index 898c74d78..000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_prev_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/img_play_outline.png b/app/src/main/res/drawable-hdpi/img_play_outline.png deleted file mode 100644 index 0aeace079..000000000 Binary files a/app/src/main/res/drawable-hdpi/img_play_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/img_play_outline_empty.png b/app/src/main/res/drawable-hdpi/img_play_outline_empty.png deleted file mode 100644 index 6212066d5..000000000 Binary files a/app/src/main/res/drawable-hdpi/img_play_outline_empty.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_next_outline.png b/app/src/main/res/drawable-xhdpi/ic_next_outline.png deleted file mode 100644 index e92ce5556..000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_next_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_pause_outline.png b/app/src/main/res/drawable-xhdpi/ic_pause_outline.png deleted file mode 100644 index 11d8d1698..000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_pause_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_prev_outline.png b/app/src/main/res/drawable-xhdpi/ic_prev_outline.png deleted file mode 100644 index 8c2c6774b..000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_prev_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/img_play_outline.png b/app/src/main/res/drawable-xhdpi/img_play_outline.png deleted file mode 100644 index d61aa4371..000000000 Binary files a/app/src/main/res/drawable-xhdpi/img_play_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/img_play_outline_empty.png b/app/src/main/res/drawable-xhdpi/img_play_outline_empty.png deleted file mode 100644 index 2753608b6..000000000 Binary files a/app/src/main/res/drawable-xhdpi/img_play_outline_empty.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_next_outline.png b/app/src/main/res/drawable-xxhdpi/ic_next_outline.png deleted file mode 100644 index f88b8d317..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_next_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_pause_outline.png b/app/src/main/res/drawable-xxhdpi/ic_pause_outline.png deleted file mode 100644 index d6f0c72ce..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_pause_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_prev_outline.png b/app/src/main/res/drawable-xxhdpi/ic_prev_outline.png deleted file mode 100644 index b92feff7d..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_prev_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/img_play_outline.png b/app/src/main/res/drawable-xxhdpi/img_play_outline.png deleted file mode 100644 index a3ffa45fb..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/img_play_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/img_play_outline_empty.png b/app/src/main/res/drawable-xxhdpi/img_play_outline_empty.png deleted file mode 100644 index 95a4f7d28..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/img_play_outline_empty.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_next_outline.png b/app/src/main/res/drawable-xxxhdpi/ic_next_outline.png deleted file mode 100644 index 34fe17702..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_next_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pause_outline.png b/app/src/main/res/drawable-xxxhdpi/ic_pause_outline.png deleted file mode 100644 index 162ed84d1..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_pause_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_prev_outline.png b/app/src/main/res/drawable-xxxhdpi/ic_prev_outline.png deleted file mode 100644 index 2e0a23b8b..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_prev_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/img_play_outline.png b/app/src/main/res/drawable-xxxhdpi/img_play_outline.png deleted file mode 100644 index dafb99e23..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/img_play_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/img_play_outline_empty.png b/app/src/main/res/drawable-xxxhdpi/img_play_outline_empty.png deleted file mode 100644 index df8727abd..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/img_play_outline_empty.png and /dev/null differ diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index b7d436f28..75ea7b056 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -1,6 +1,5 @@ - + android:text="@string/customize_colors" /> @@ -40,9 +39,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -63,9 +62,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + android:text="@string/change_date_and_time_format" /> @@ -84,9 +83,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/bigger_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/bigger_margin"> + android:paddingStart="@dimen/medium_margin" + android:paddingEnd="@dimen/medium_margin" + android:text="@string/file_loading_priority" /> + tools:text="@string/compromise" /> - - + android:textSize="@dimen/smaller_text_size" /> + android:text="@string/manage_included_folders" /> @@ -157,9 +149,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + android:text="@string/manage_excluded_folders" /> @@ -178,9 +170,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + android:text="@string/manage_hidden_folders" /> @@ -199,9 +191,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -262,9 +247,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -285,9 +270,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -308,9 +293,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -331,9 +316,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -394,9 +372,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -417,9 +395,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -440,9 +418,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -463,9 +441,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -526,9 +497,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -549,9 +520,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -612,9 +576,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -635,9 +599,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -658,9 +622,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -681,9 +645,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -704,9 +668,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -727,9 +691,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -750,9 +714,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/bigger_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/bigger_margin"> + android:paddingStart="@dimen/medium_margin" + android:paddingEnd="@dimen/medium_margin" + android:text="@string/screen_rotation_by" /> + android:clickable="false" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -822,9 +779,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -845,9 +802,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -868,9 +825,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> + app:switchPadding="@dimen/medium_margin" /> + android:text="@string/manage_extended_details" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -1013,9 +956,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -1036,9 +979,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -1099,9 +1035,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -1122,9 +1058,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -1185,9 +1114,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + android:text="@string/manage_bottom_actions" /> - - + android:textSize="@dimen/smaller_text_size" /> + app:switchPadding="@dimen/medium_margin" /> @@ -1246,9 +1168,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -1269,9 +1191,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + app:switchPadding="@dimen/medium_margin" /> @@ -1292,9 +1214,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/bigger_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/bigger_margin"> + android:paddingStart="@dimen/medium_margin" + android:paddingEnd="@dimen/medium_margin" + android:text="@string/empty_recycle_bin" /> + android:clickable="false" /> - - + android:textSize="@dimen/smaller_text_size" /> + android:text="@string/export_settings" /> @@ -1362,9 +1277,9 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/medium_margin" android:background="?attr/selectableItemBackground" - android:paddingLeft="@dimen/normal_margin" + android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/activity_margin" - android:paddingRight="@dimen/normal_margin" + android:paddingEnd="@dimen/normal_margin" android:paddingBottom="@dimen/activity_margin"> + android:text="@string/import_settings" /> diff --git a/app/src/main/res/layout/bottom_video_time_holder.xml b/app/src/main/res/layout/bottom_video_time_holder.xml index 53701119c..3a7b6a477 100644 --- a/app/src/main/res/layout/bottom_video_time_holder.xml +++ b/app/src/main/res/layout/bottom_video_time_holder.xml @@ -16,7 +16,7 @@ android:layout_marginTop="@dimen/activity_margin" android:background="?attr/selectableItemBackgroundBorderless" android:padding="@dimen/normal_margin" - android:src="@drawable/ic_prev_outline" + android:src="@drawable/ic_prev_outline_vector" android:visibility="invisible"/> - @@ -8,17 +7,18 @@ + android:layout_height="match_parent" /> + android:background="@drawable/gradient_background_flipped" + android:contentDescription="@null" /> + layout="@layout/bottom_actions" + android:visibility="gone" /> diff --git a/app/src/main/res/layout/pager_video_item.xml b/app/src/main/res/layout/pager_video_item.xml index 405f15026..144e53972 100644 --- a/app/src/main/res/layout/pager_video_item.xml +++ b/app/src/main/res/layout/pager_video_item.xml @@ -41,7 +41,7 @@ android:layout_height="@dimen/play_outline_size_big" android:layout_centerInParent="true" android:padding="20dp" - android:src="@drawable/ic_play_outline"/> + android:src="@drawable/ic_play_outline_vector"/> - - - إلغاء تثبيت المجلد تثبيت في الأعلى إظهار كل محتويات المجلدات - كل المحلات + كل المجلدات التبديل إلى عرض المجلد مجلد آخر عرض علي الخريطة موقع غير معروف - ذيادة عدد الأعمدة + زيادة عدد الأعمدة تقليل عدد الأعمدة تغيير صورة الغلاف تحديد صورة الصوت - السبوع + السطوع قفل الاتجاه فتح الاتجاه تغيير الاتجاه @@ -30,7 +30,7 @@ إصلاح تاريخ إلتقاط القيمة جارٍ الإصلاح… تم إصلاح التواريخ بنجاح - No Date Taken values have been found + لم يتم العثور على تاريخ التقاط القيم مشاركة الصورة الذي تم تغيير حجمها مرحباً,\n\nيبدو أنك قمت بترقية التطبيق المجاني القديم. يمكنك الآن إلغاء تثبيت الإصدار القديم، الذي يحتوي على زر \'الترقية إلى Pro\' في أعلي إعدادات التطبيق.\n\nسيتم حذف عناصر سلة المحذوفات فقط، كما سيتم حذف العناصر المفضلة، كما سيتعين عليك إعادة ضبط إعدادات التطبيق .\n\nشكراً! التبديل إلي البحث فى الملفات عبر كافة المجلدات المرئية @@ -80,8 +80,8 @@ تدوير مسار الصورة غير صحيح فشل تعديل الصورة - Image editing cancelled - File edited successfully + تم إلغاء تعديل الصورة + تم تعديل الملف بنجاح تعديل الصورة باستخدام: لم يتم العثور على أي محرر للصور موقع الملف غير معروف @@ -189,6 +189,7 @@ إختيار وسط تجنب إظهار الملفات غير الصالحة إظهار أنواع ملفات الصور + Allow zooming videos with double tapping them الصور المصغرة @@ -202,85 +203,85 @@ تبديل رؤية الملف - Custom - Reset - Square - Transform - Filter - None - Adjust - Shadows - Exposure - Highlights - Brightness - Contrast - Saturation - Clarity - Gamma - Blacks - Whites - Temperature - Sharpness - Reset - Focus - None - Radial - Linear - Mirrored - Gaussian - Text - Text Options - Text Color - Font - Add - Edit - Straighten - Font - Color - BG Color - Alignment - To Front - Delete - Your text - Brush - Color - Size - Hardness - To Front - Delete - Brush Color - Editor - Close Editor? - Do you really want to discard the image? - Yes - No - Cancel - Accept - Save - Exporting image… - Exporting image %s. - Flip H - Flip V - Undo - Redo - Color Picker - Transparent - White - Gray - Black - Light blue - Blue - Purple - Orchid - Pink - Red - Orange - Gold - Yellow - Olive - Green - Aquamarin - Pipettable color + مخصص + إعادة تعيين + مربع + تحويل + فلتر + لا شيء + ضبط + ظلال + التعرض + أكثر وضوحاً + السطوع + التباين + التشبع + الوضوح + جاما + دراجات الأسود + دراجات الأبيض + درجة الحرارة + الحدة + إعادة تعيين + تركيز + لا شيء + قطري + خطي + مرآة + جاوس + النص + خيارات النص + لون الخط + الخط + إضافة + تعديل + الصلابة + الخط + اللون + لون الخلفية + محاذاة + إلي الأمام + حذف + النص الخاص بك + الفرشاة + اللون + الحجم + الصلابة + إلي الأمام + حذف + لون الفرشاة + المحرر + هل تريد إغلاق المحرر؟ + هل تريد فعلاً تجاهل الصورة؟ + نعم + لا + إلغاء + موافق + حفظ + جارٍ تصدير الصورة… + جارٍ تصدير الصورة %s. + أنعكاس أفقي + أنعكاس رأسي + تراجع + إعادة + لاقط اللون + شفاف + أبيض + رمادي + أسود + أزرق فاتح + أزرق + بنفسجي + أرجواني + وردي + أحمر + برتقالي + ذهبي + أصفر + زيتوني + أخضر + زبرجد + Pipettable لون كيف يمكنني جعل تطبيق الاستديو معرض الجهاز الإفتراضي ؟ @@ -290,9 +291,9 @@ كيف يمكنني جعل ألبوماً يظهر دائماً في الأعلى ؟ يمكنك الضغط مطولاً علي الألبوم المطلوب وحدد أيقونة "التثبيت" في قائمة الإجراءات، التي ستقوم بتثبيته في الأعلي. يمكنك تثبيت مجلدات متعددة أيضا، سيتم فرز العناصر المثبتة حسب طريقة الفرز الإفتراضية. كيف يمكنني تسريع مقاطع الفيديو؟ - You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. + يمكنك القيام بذلك عن طريق النقر المزدوج على جانب الشاشة, أو النقر على نصوص المدة الحالية أو القصوى بالقرب من شريط التمرير. إذا قمت بتمكين فتح مقاطع الفيديو على شاشة منفصلة في إعدادات التطبيق، يمكنك استخدام الإيماءات الأفقية أيضاً. ما هو الفرق بين إخفاء المجلد وإستبعاده ؟ - Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. الإستبعاد يمنع عرض المجلد فقط في الاستديو، بينما الإخفاء يعمل على مستوى النظام ويخفي المجلد من المعارض الأخرى أيضاً. يعمل عن طريق إنشاء ملف فارغ \ ".nomedia \" في المجلد المحدد ، والذي يمكنك إزالته بعد ذلك بواسطة أي مدير ملفات أيضًا. + لاحظ أن بعض الأجهزة لا تسمح بإخفاء المجلدات مثل الكاميرا ولقطات الشاشة والتنزيلات. الإستبعاد يمنع عرض المجلد فقط في الاستديو، بينما الإخفاء يعمل على مستوى النظام ويخفي المجلد من المعارض الأخرى أيضاً. يعمل عن طريق إنشاء ملف فارغ \ ".nomedia \" في المجلد المحدد ، والذي يمكنك إزالته بعد ذلك بواسطة أي مدير ملفات أيضًا. لماذا تظهر المجلدات مع صورة غلاف الموسيقى أو الملصقات؟ قد يحدث أن ترى بعض الألبومات غير العادية تظهر. يمكنك بسهولة إستبعادهم بالضغط مطولاً عليهم وأختر إستبعاد. في مربع الحوار التالي يمكنك بعد ذلك تحديد المجلد الاصل، من المحتمل ان يمنع ظهور الألبومات الأخري ذات الصلة أيضاً. المجلد الذي به صور لا يظهر، أو لا يظهر كل العناصر. ماذا يمكنني أن أفعل؟ @@ -316,7 +317,7 @@ المعرض البسيط الـ Pro - محرر ومدير الصور - Browse your memories without any interruptions with this photo and video gallery + أستعرض ذكرياتك دون أي انقطاع مع معرض الصور والفيديو هذا (تطبيق المعرض البسيط الـ Pro) هو معرض بدون إنترنت قابل للتخصيص بدرجة كبيرة يتمتع بتنظيم الصور وتحريرها وإستعادة الملفات المحذوفة من خلال "سلة المحذوفات" وحماية الملفات وإخفاؤها وعرض مجموعة كبيرة من تنسيقات الصور والفيديو المختلفة بما في ذلك تنسيقات RAW و SVG وغير ذلك الكثير. @@ -326,7 +327,7 @@ المعرض البسيط الـ Pro - الميزات ------------------------------------------------- - معرض بدون إنترنت بدون إعلانات أو نوافذ منبثقة + معرض بدون إنترنت بدون إعلانات أو نوافذ منبثقة • محرر صور (معرض البسيط) - قص، تدوير، تغيير حجم، رسم، فلاتر وغير ذلك • لا حاجة للوصول إلى الإنترنت، مما يمنحك المزيد من الخصوصية والأمان @@ -362,7 +363,7 @@ حماية وإخفاء الصور والفيديوهات والملفات باستخدام رمز الـ PIN أو النمط أو الماسح الضوئي لبصمة الاصبع لجهازك يمكنك حماية الصور ومقاطع الفيديو والألبومات بأكملها وإخفائها. يمكنك حماية التطبيق نفسه أو وضع قفل الأمان علي وظائف معينة للتطبيق علي سبيل المثال، لا يمكنك حذف ملف دون إجراء مسح ضوئي لبصمة الاصبع، مما يساعد علي حماية ملفاتك من الحذف غير المقصود. - أطلع على المجموعة الكاملة من الأدوات البسيطة هنا: + أطلع على المجموعة الكاملة من تطبيقات البسيط هنا: https://www.simplemobiletools.com موقع مستقل لتطبيق المعرض البسيط الـ Pro : diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 0ff9c2c27..0345c3ee3 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -189,6 +189,7 @@ Compromise Avoid showing invalid files Show image file types + Allow zooming videos with double tapping them Thumbnails diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index fc8d6ee71..e76b84883 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -189,6 +189,7 @@ Compromès Eviteu mostrar fitxers no vàlids Mostra els tipus de fitxers d\’imatges + Allow zooming videos with double tapping them Miniatures @@ -293,7 +294,7 @@ Com puc fer avançar els vídeos? Podeu fer-ho tocant dues vegades el costat de la pantalla o tocant els textos de durada actual o màxima a prop de la barra de cerca. Si activeu l\’obertura de vídeos en una pantalla diferent a la configuració de l\’aplicació, també podeu fer servir gestos horitzontals. Quina és la diferència entre ocultar i excloure una carpeta? - Excloure impedeix mostrar la carpeta només a Simple Galery, mentre que Ocultar també amaga la carpeta a altres galeries. Funciona creant un fitxer \". Nomedia \" buit a la carpeta donada, que podeu eliminar amb qualsevol gestor de fitxers. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + Excloure impedeix mostrar la carpeta només a Simple Galery, mentre que Ocultar també amaga la carpeta a altres galeries. Funciona creant un fitxer \". Nomedia \" buit a la carpeta donada, que podeu eliminar amb qualsevol gestor de fitxers. Tingueu en compte que alguns dispositius no permeten amagar carpetes com Càmera, Captures de pantalla i Descàrregues. Per què apareixen les carpetes amb les portades de la música o adhesius? Pot passar que veuràs que apareixen alguns àlbums inusuals. Podeu excloure’ls fàcilment prement-los i seleccionant Excloure. Al següent diàleg, podeu seleccionar la carpeta principal, és probable que impedeixi que apareguin altres àlbums relacionats. Una carpeta amb imatges no apareix, què puc fer? diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d54ebc69d..abfab3d00 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -189,6 +189,7 @@ Kompromis Nezobrazovat neplatné soubory Zobrazit typ obrázkových souborů + Allow zooming videos with double tapping them Náhledy diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 06669b295..e36395aaa 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -189,6 +189,7 @@ Kompromis Undgå at vise ugyldige filer Vis billeders filtyper + Allow zooming videos with double tapping them Miniaturer diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c9306ce0c..83e28096f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -189,6 +189,7 @@ Kompromiss Das Anzeigen von ungültigen Dateien vermeiden Bilddateitypen anzeigen + Allow zooming videos with double tapping them Thumbnails diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index eb980f61b..c0e6b3725 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -189,6 +189,7 @@ Συμβιβασμός Αποφυγή εμφάνισης μη έγκυρων αρχείων Εμφάνιση τύπου αρχείου εικόνας + Allow zooming videos with double tapping them Εικονίδια @@ -294,7 +295,7 @@ Πώς μπορώ να τρέξω μπροστά (fast forward) τα βίντεο; Μπορείτε να το κάνετε πατώντας δύο φορές την πλευρά της οθόνης ή πατώντας το κείμενο τρέχοντος ή μέγιστης διάρκειας κοντά στη γραμμή αναζήτησης. Αν ενεργοποιήσετε το άνοιγμα βίντεο σε ξεχωριστή οθόνη στις ρυθμίσεις εφαρμογής, μπορείτε επίσης να χρησιμοποιήσετε και τις οριζόντιες κινήσεις. Ποια είναι διαφορά μεταξύ απόκρυψης και εξαίρεσης ενός φακέλου; - Η εξαίρεση δεν επιτρέπει την εμφάνιση του φακέλου μόνο στην Απλή Συλλογή, ενώ η απόκρυψη λειτουργεί σε επίπεδο συστήματος και θα αποκρύψει τον φάκελο και από άλλες εφαρμογές γκάλερι. Λειτουργεί δημιουργώντας ένα άδειο \".nomedia\" αρχείο στον επιλεγμένο φάκελο, το οποίο μπορείτε να το διαγράψετε και με οποιονδήποτε διαχειριστή αρχείων. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + Η εξαίρεση δεν επιτρέπει την εμφάνιση του φακέλου μόνο στην Απλή Συλλογή, ενώ η απόκρυψη λειτουργεί σε επίπεδο συστήματος και θα αποκρύψει τον φάκελο και από άλλες εφαρμογές γκάλερι. Λειτουργεί δημιουργώντας ένα άδειο \".nomedia\" αρχείο στον επιλεγμένο φάκελο, το οποίο μπορείτε να το διαγράψετε και με οποιονδήποτε διαχειριστή αρχείων. Σημειώστε ότι μερικές συσκευές δεν αποδέχονται την απόκρυψη φακέλων όπως Κάμερας, Στιγμιοτύπων, και Λήψεων. Γιατί εμφανίζονται φάκελοι με εξώφυλλο μουσικής ή αυτόκολλητα; Είναι πιθανόν να δείτε κάποια περίεργα άλμπουμ να εμφανίζονται. Μπορείτε να τα εξαιρέσετε εύκολα με παρατεταμένο άγγιγμα και επιλογή του Εξαίρεση. Στον επόμενο διάλογο μπορείτε να επιλέξετε επάνω φάκελο. Είναι πιθανό να μην επιτρέψει την εμφάνιση και άλλων σχετικών άλμπουμ. Ένας φάκελος με εικόνες δεν εμφανίζεται. Τι μπορώ να κάνω; diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5ecfbf3a4..edcbc545c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -189,6 +189,7 @@ Compromiso Evita mostrar archivos inválidos Mostrar tipos de archivo de imagen + Allow zooming videos with double tapping them Miniaturas @@ -293,7 +294,7 @@ ¿Cómo puedo avanzar videos? Puede hacerlo tocando dos veces el costado de la pantalla o tocando los textos de duración actual o máxima cerca de la barra de búsqueda. Si habilita la apertura de videos en una pantalla separada en la configuración de la aplicación, también puede usar gestos horizontales. ¿Cuál es la diferencia entre ocultar y excluir una carpeta? - Excluir evita mostrar la carpeta solo en Simple Gallery, mientras que Ocultar funciona en el sistema y oculta la carpeta de otras galerías también. Funciona al crear un archivo \".nomedia \" vacío en la carpeta determinada, que luego puede eliminar también con cualquier administrador de archivos. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + Excluir evita mostrar la carpeta solo en Simple Gallery, mientras que Ocultar funciona en el sistema y oculta la carpeta de otras galerías también. Funciona al crear un archivo \".nomedia \" vacío en la carpeta determinada, que luego puede eliminar también con cualquier administrador de archivos. Tenga en cuenta que algunos dispositivos no permiten ocultar carpetas como Cámara, Capturas de pantalla y Descargas. ¿Por qué aparecen las carpetas con la portada de la música o las pegatinas? Puede suceder que veas aparecer algunos álbumes inusuales. Puede excluirlos fácilmente presionándolos durante mucho tiempo y seleccionando Excluir. En el siguiente cuadro de diálogo, puede seleccionar la carpeta principal, lo más probable es que evite que aparezcan otros álbumes relacionados. Una carpeta con imágenes no aparece, ¿qué puedo hacer? diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 4d41db449..a534d0937 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -189,6 +189,7 @@ Compromise Avoid showing invalid files Show image file types + Allow zooming videos with double tapping them Esikatselukuvat diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index fd39efd95..abfc0a3cd 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -80,9 +80,9 @@ Pivoter Emplacement invalide L\'édition de l\'image a échoué - L\'édition de l\'image a été annulé + L\'édition de l\'image a été annulée L\'image a été éditée avec succès - Modifier l\'image avec: + Modifier l\'image avec : Aucun éditeur d\'image trouvé Emplacement du fichier inconnu Impossible de remplacer le fichier source @@ -99,7 +99,7 @@ Fond d\'écran simple Définir comme fond d\'écran Échec de la définition en tant que fond d\'écran - Définir comme fond d\'écran avec: + Définir comme fond d\'écran avec : Définition du fond d\'écran en cours… Fond d\'écran défini Rapport d\'affichage portrait @@ -110,7 +110,7 @@ Diaporama - Intervalle (secondes): + Intervalle (secondes) : Inclure les images Inclure les vidéos Inclure les GIFs @@ -145,7 +145,7 @@ \'Grouper par\' et \'Trier par\' sont 2 modes indépendants - Dossier affiché sur le widget: + Dossier affiché sur le widget : Afficher le nom du dossier @@ -189,6 +189,7 @@ Compromis Éviter l\'affichage de fichiers invalides Afficher les types d\'image + Allow zooming videos with double tapping them Miniatures @@ -222,7 +223,7 @@ Température Netteté Réinitialiser - Focus + Floutage Aucun Radial Linéaire @@ -288,11 +289,11 @@ J\'ai verrouillé l\'application avec un mot de passe et je ne m\'en rappelle plus. Que faire ? Il y a deux façons de procéder. Soit vous réinstallez l\'application, soit vous recherchez l\'application dans les paramètres de l\'appareil et appuyez sur \"Effacer les données\". Cela va seulement réinitialiser les paramètres de l\'application et ne supprimera pas vos fichiers. Comment faire pour qu\'un album soit toujours affiché tout en haut ? - Vous devez simplement à effectuer un appui prolongé sur l\'album en question et choisir l\'icône \"Épingler\" dans le menu d\'actions. Vous pouvez en épingler plusieurs. Les éléments épinglés seront alors triés selon l\'ordre par défaut. + Vous devez simplement effectuer un appui prolongé sur l\'album en question et choisir l\'icône \"Épingler\" dans le menu d\'actions. Vous pouvez en épingler plusieurs. Les éléments épinglés seront alors triés selon l\'ordre par défaut. Comment avancer rapidement dans les vidéos ? - You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. + Appuyez deux fois sur le côté de l\'écran, ou appuyez sur la valeur de durée actuelle ou maximale près de la barre de recherche. Si vous activez l\'ouverture des vidéos sur un écran séparé dans les paramètres de l\'application, vous pouvez également utiliser des gestes horizontaux. Quelle est la différence entre cacher et exclure un dossier ? - \"Exclure un dossier\" permet de ne pas l\'afficher uniquement dans Simple Gallery, alors que \"Cacher un dossier\" rend le dossier invisible sur l\'ensemble de l\'appareil, y compris les autres applications de galerie. Dans le dernier cas, un fichier \".nomedia\" est créé dans le dossier caché, et peut être supprimé avec n\'importe quel explorateur de fichiers. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + \"Exclure un dossier\" permet de ne pas l\'afficher uniquement dans Simple Gallery, alors que \"Cacher un dossier\" rend le dossier invisible sur l\'ensemble de l\'appareil, y compris pour les autres applications de galerie. Dans le dernier cas, un fichier \".nomedia\" est créé dans le dossier caché, et peut être supprimé avec n\'importe quel explorateur de fichiers. Notez que certains appareils ne permettent pas de masquer certains dossiers tels qu\'Appareil photo, Captures d\'écran et Téléchargements. Pourquoi des dossiers avec des pochettes d\'albums musicaux ou des miniatures d\'images sont affichés ? Il est possible que des albums qui ne devraient pas être affichés le soient. Vous pouvez les exclure facilement en les sélectionnant par un appui prolongé, puis en choisissant l\'option \"Exclure\", après quoi vous pouvez aussi sélectionner le dossier parent, ce qui devrait éviter l\'apparition d\'albums similaires. Un dossier avec des images n\'apparaît pas. Que faire ? diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 7b030b01e..2e29b592e 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -23,26 +23,26 @@ Brillo Fixar orientación Desbloquear orientación - Change orientation - Force portrait - Force landscape - Use default orientation - Fix Date Taken value - Fixing… - Dates fixed successfully - No Date Taken values have been found - Share a resized version - Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! - Switch to file search across all visible folders + Cambiar orientación + Forzar retrato + Forzar paisaxe + Usar a orientación predeterminada + Arranxar o valor da Data de Captura + Arranxando… + Datas arranxadas con éxito + Non se atoparon valores de Datas de Captura + Comparta unha versión reducida + Ola,\n\nsemella que actualizou desde a vella aplicación gratuita. Pode desinstalar a versión vella, que ten un botón \'Upgrade to Pro\' enriba da pantalla de configuración.\n\nSo terá os elementos borrados da Papeleira de reciclaxe, os elementos favoritos sen marcar e tamén terá que reiniciar os Axustes.\n\nGrazas! + Cambiar á procura de ficheiros en todolos cartafoles visibles. Filtrar medios Imaxes Vídeos GIFs - RAW images + Imaxes RAW SVGs - Portraits + Retratos Non se atoparon medios dos indicados polo filtro. Cambiar filtro @@ -65,7 +65,7 @@ Xestionar cartafoles incluídos Engadir cartafol Si ten algún cartafol con medios, mais non foi recoñecido polo aplicativo, pódeo engadir manualmente.\n\nEngadindo aquí elementos non eliminará outros. - No media files have been found. You can solve it by adding the folders containing media files manually. + Non se atopou ningún ficheiro audiovisual. Pode solucionalo engadindo manualmente algúns cartafoles con eses ficheiros. Redimensionar @@ -80,8 +80,8 @@ Rotar Ruta a imaxe non válida Fallo na edición da imaxe - Image editing cancelled - File edited successfully + Cancelouse a edición da imaxe + Ficheiro editado con éxito Editar imaxe con: Non se atopou ningún editor Localización do ficheiro descoñecida @@ -92,8 +92,8 @@ Voltear Voltear horizontalmente Voltear verticalmente - Free - Other + Libre + Outro Fondo de pantalla @@ -117,10 +117,10 @@ Orde aleatoria Mover atrás Reproducir en bucle - Animation - None - Fade - Slide + Animación + Nengún + Esvaecemento + Deslizamento Rematou a presentación Non se atoparon medios para a presentación @@ -135,28 +135,28 @@ Non agrupar ficheiros Cartafol Último modificado - Last modified (daily) - Last modified (monthly) + Último modificado (diario) + Último modificado (mensual) Data de captura - Date taken (daily) - Date taken (monthly) - Tipo de ficheior + Data de captura (diaria) + Data de captura (mensual) + Tipo de ficheiro Extensión - Please note that grouping and sorting are 2 independent fields + Por favor, teña en conta que agrupar e ordenar son dous campos diferentes - Folder shown on the widget: - Show folder name + Cartafol a mostrar no widget: + Amosar nome de cartafol Reproducir vídeos automticamente - Remember last video playback position + Lembrar a posición do vídeo na última vez Mudar a visibilidade do ficheiro videos en bucle Animar os GIFs na icona Brillo ao máximo cando mire medios Recortar iconas a cadrados - Show video durations + Amosar a duración dos vídeos Rotar medios a pantalla completa a Axuste do sistema Rotación do dispositivo @@ -172,113 +172,114 @@ Xestionar información polo miúdo Permitir zoom con un dedo a pantalla completa Permitir o cambio instantáneo de medios pulsando nos lados da pantalla - Allow deep zooming images + Permitir ampliar moito as imaxes Agochar detalles extendidos cando a barra de estado está oculta - Show some action buttons at the bottom of the screen - Show the Recycle Bin at the folders screen - Deep zoomable images - Show images in the highest possible quality - Show the Recycle Bin as the last item on the main screen - Allow closing the fullscreen view with a down gesture - Allow 1:1 zooming in with two double taps - Always open videos on a separate screen with new horizontal gestures - Show a notch if available - Allow rotating images with gestures - File loading priority - Speed - Compromise - Avoid showing invalid files - Show image file types + Mostrar botóns para accións na parte baixa da pantalla + Mostrar a Papeleira de Reciclaxe na pantalla de cartafoles + Imaxes con moita ampliación + Mostrar imaxes na súa máxima calidade + Mostrar a Papeleira de Reciclaxe como no derradeiro posto da pantalla principal + Permitir pechar a visualización en pantalla completa deslizando cara abaixo + Permitir ampliar a 1:1 con dous toques + Abrir sempre os vídeos nunha pantalla diferente con novos xestos horizontais + Mostrar unha marca se a houbera + Permitir rotar unha imaxe con xestos + Prioridade de carga de ficheiro + Velocidade + Compromiso + Non mostrar ficheiros inválidos + Mostrar tipos de ficheiros de imaxe + Allow zooming videos with double tapping them Iconas Medios a pantalla completa Detalles ampliados - Bottom actions + Actions do fondo - Manage visible bottom actions - Toggle favorite - Toggle file visibility + Xestionar accións visibles do fondo + Alternar favorito + Alternar visibilidade do ficheiro - Custom - Reset - Square - Transform - Filter - None - Adjust - Shadows - Exposure - Highlights - Brightness - Contrast - Saturation - Clarity + Personalizado + Reiniciar + Cadrado + Transformar + Filtrar + Nengún + Axustar + Sombras + Exposición + Resalte + Brillo + Contraste + Saturación + Claridade Gamma - Blacks - Whites - Temperature - Sharpness - Reset - Focus - None + Negros + Brancos + Temperatura + Nitidez + Reiniciar + Foco + Nengún Radial - Linear - Mirrored - Gaussian - Text - Text Options - Text Color - Font - Add - Edit - Straighten - Font - Color - BG Color - Alignment - To Front - Delete - Your text - Brush - Color - Size - Hardness - To Front - Delete - Brush Color + Lineal + Reflectir + Gaussiano + Texto + Opcións de Texto + Cor de Texto + Fonte + Engadir + Editar + Endereitar + Fonte + Cor + Color Fondo + Aliñamento + Á Front + Borrar + Seu texto + Pincel + Cor + Tamaño + Dureza + Á Front + Borrar + Cor do Pincel Editor - Close Editor? - Do you really want to discard the image? - Yes - No - Cancel - Accept - Save - Exporting image… - Exporting image %s. - Flip H - Flip V - Undo - Redo - Color Picker - Transparent - White - Gray - Black - Light blue - Blue - Purple - Orchid - Pink - Red - Orange - Gold - Yellow - Olive - Green + Pechar o Editor? + Ten a certeza de desbotar a imaxe? + Si + Non + Cancelar + Aceptar + Gardar + Exportando imaxe… + Exportando imaxe %s. + Volteo H + Volteo V + Desfacer + Refacer + Escolla de Cor + Transparente + Branco + Gris + Negro + Azul claro + Azul + Púrpura + Rosa brillante + Rosa + Vermello + Laranxa + Dourado + Amarelo + Verde oliva + Verde Aquamarin Pipettable color @@ -291,7 +292,7 @@ Cómo podo facer que un álbume apareza sempre arriba de todo? Pode manter premido o álbume e escoller a icona de Fixar no menú de accións, esto fixarao arriba. Pode fixar varios cartafoles tambén, os elementos fixados estarán ordenados polo criterio por omisión. Cómo podo aumentar a velocidade de reprodución de vídeo? - You can do it by double tapping the side of the screen, or tapping the current or max duration texts near the seekbar. If you enable opening videos on a separate screen in the app settings, you can use horizontal gestures too. + Pode facelo tocando dúas veces o lateral da pantalla, ou tocando os textos de duración máxima ou actual preto da barra de avance. Se activa abrir os vídeos nunha pantalla separada, tamén pode usar xestos horizontais. Cal é a diferenza entre agochar e excluír un cartafol? A Exclusión prevén que se mostre o cartafol só en Simple Gallery, mentras Agochar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Esto funciona creando un ficheiro baldeiro de nome \".nomedia\" no cartafol, que tamén pode quitar con calquer xestor de ficheiros. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. Por qué aparecen cartafoles de música con portadas ou pegatinas? @@ -301,18 +302,18 @@ E qué pasa si só quero que sexan visibles certos cartafoles Engadir un cartafol a Cartafoles incluídos non exclúe nada de xeito automático. O que pode facer é ir a Axustes -> Xestionar cartafoles incluídos, excluír o cartafol root \"/\", e despóis engadir os cartafoles desexados con Axustes -> Xestionar Cartafoles Incluídos. Esto fará visibles só aos cartafoles escollidos, como tanto excluír e incluír son recursivos e si está excluído e logo incluído, será mostrado. - 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. - Can I somehow group media file thumbnails? - Sure, just use the \"Group by\" menu item while at the thumbnails view. You can group files by multiple criteria, including Date Taken. If you use the \"Show all folders content\" function you can group them by folders too. - Sorting by Date Taken doesn\'t seem to work properly, how can I fix it? - It is most likely caused by the files being copied from somewhere. You can fix it by selecting the file thumbnails and selecting \"Fix Date Taken value\". - I see some color banding on the images. How can I improve the quality? - The current solution for displaying images works fine in the vast majority of cases, but if you want even better image quality, you can enable the \"Show images in the highest possible quality\" at the app settings, in the \"Deep zoomable images\" section. - I have hidden a file/folder. How can I unhide it? - You can either press the \"Temporarily show hidden items\" menu item at the main screen, or toggle \"Show hidden items\" in the app settings to see the hidden item. If you want to unhide it, just long press it and select \"Unhide\". Folders are hidden by adding a hidden \".nomedia\" file into them, you can delete the file with any file manager too. - Why does the app take up so much space? - App cache can take up to 250MB, it ensures quicker image loading. If the app is taking up even more space, it is most likely caused by you having items in the Recycle Bin. Those files count to the app size. You can clear the Recycle bin by opening it and deleting all files, or from the app settings. Every file in the Bin is deleted automatically after 30 days. + Podo recortar imaxes con esta aplicación? + Si, pode recortar imaxes no editor, arrastrando as esquinas das imaxes. Pode chegar ao editor tanto presionando na imaxe durante un anaco e seleccionando Editar, ou seleccionando Editar dende a vista de pantalla completa. + Podo agrupar as iconas de algún xeito? + Claro, use no menu \"Agrupar por\" na vista de iconas. Pode facelo por múltiples criterios, incluindo a data de captura. Se usa a función \"Mostrar o contido dos cartafoles\", tamén pode agruparlos por cartafoles. + Semella que Ordenar por Data non está a funcionar, como o amaño? + Seguramente foi causa de copiar os ficheiros de algures. Pode amañalo seleccionando as iconas e \"Arranxar o valor da Data de Captura\". + Vexo bandas de cor nas imaxes. Como podo mellorar a súa calidade? + A solución actual de mostra das imaxes funciona ben na maioría dos casos, pero se desexa unha calidade maior, active \"Mostrar imaxes na máxima calidade posible\" na configuración, na sección \"Imaxes con moita ampliación\". + Teño un ficheiro ou cartafol oculto. Como o amoso? + Pode ou ben activar \"Mostrar temporalmente ficheiros agochados\" no menu principal, ou activar \"Amosar obxectos ocultos\" na configuración. Se quere amosalo sempre, pode presionar uns intres e seleccionar \"Amosar\". Os cartafoles agóchanse engadindo un ficheiro oculto \".nomedia\" no seu interior; tamén pode borrar ese ficheiro con calquera xestor de ficheiros. + Por que consume tanto espacio esta aplicación? + Os ficheiros temporais poden chegar aos 250MB e server para cargar máis rápido. Se a aplicación está a consumir máis espazo, o máis probable é que teña ficheiros nam Papeleira de Reciclaxe. Estes ficheiros contan no tamaño da aplicación. Pode baleirala abríndoa e borrando os ficheiros, ou dende a configuración. Cada ficheiro da Papeleira bórrase automáticamente tras 30 días. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 268b17aba..791ccca05 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -189,6 +189,7 @@ Compromise Avoid showing invalid files Show image file types + Allow zooming videos with double tapping them Sličice diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index a19a97886..6f58b1bbf 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,4 +1,4 @@ - + Simple Gallery Galéria @@ -20,7 +20,7 @@ Borítókép változtatása Válasszon fotót Hangerő - Fényerő + Fényesség Tájolás zárolása Tájolás feloldása Tájolás változtatása @@ -80,7 +80,7 @@ Forgatás Érvénytelen kép elérési útvonal Sikertelen kép szerkesztés - Image editing cancelled + A képszerkesztés megszakítva A fájl szerkesztése sikerült Kép szerkesztés ezzel: Nem található kép szerkesztő @@ -92,12 +92,9 @@ Tükrözés Tükrözés vízszintesen Tükrözés függőlegesen - Szabad + Szabad + Egyéb - - Egyéb - - Simple Wallpaper Beállítás háttérképként @@ -192,6 +189,7 @@ Kiegyensúlyozott Kerülje az érvénytelen fájlok mutatását Mutassa a kép fájl típusokat + Allow zooming videos with double tapping them Miniatűrök @@ -207,7 +205,7 @@ Egyéni Alaphelyzetbe - Square + Négyzet Transform Szűrő Nincs @@ -215,7 +213,7 @@ Árnyékok Exposure Highlights - Fényesség + Fényerő Kontraszt Színtelítettség Világosság @@ -378,6 +376,7 @@ Ezzel csak a kiválasztott mappák láthatók, mivel a kizárás és a befoglal Reddit: https://www.reddit.com/r/SimpleMobileTools + Thumbnail diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 551518bb2..78a0371b9 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -189,6 +189,7 @@ Kompromi Hindari menampilkan berkas yang tidak valid Tampilkan tipe berkas gambar + Allow zooming videos with double tapping them Thumbnail diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a256242d3..4ff38eea8 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -189,6 +189,7 @@ Compromesso Evita di mostrare file non validi Mostra i tipi di file immagine + Allow zooming videos with double tapping them Anteprime diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0c3136efb..3e23a8359 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -189,6 +189,7 @@ Compromise Avoid showing invalid files Show image file types + Allow zooming videos with double tapping them サムネイル設定 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index d89965a64..e5d6b2bcc 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -189,6 +189,7 @@ 균형 잘못된 파일 보이지 않기 사진 파일 종류 표시 + Allow zooming videos with double tapping them 섬네일 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index aea953c84..3af9c6ee8 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -189,6 +189,7 @@ Compromise Avoid showing invalid files Show image file types + Allow zooming videos with double tapping them Miniatiūros diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 2bde23e73..fc2b8a968 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -189,6 +189,7 @@ Kompromiss Unngå visning av ugyldige filer Vis bildefiltyper + Allow zooming videos with double tapping them Minibilder diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 9316bd49f..bbe309c2c 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -189,6 +189,7 @@ Compromise Avoid showing invalid files तस्बिरको फाईल किसिम देखाउनुहोस + Allow zooming videos with double tapping them Thumbnails diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e2673cd7d..212416f44 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -189,6 +189,7 @@ Compromis Ongeldige bestanden verbergen Bestandstypen tonen + Allow zooming videos with double tapping them Miniatuurvoorbeelden @@ -293,7 +294,7 @@ Hoe kan ik terug- of vooruitspoelen in video’s? Dubbelklik op de zijkant van het scherm, of tik op de cijfers die de voortgang of de lengte van de video weergeven om resp. terug of vooruit te springen. Als de instelling om video\'s in een apart scherm te openen is ingeschakeld, dan kunnen ook horizontale veeggebaren worden gebruikt. Wat is het verschil tussen het verbergen en het uitsluiten van mappen? - Met \"Uitsluiten\" wordt het tonen van de map alleen binnen deze app voorkomen, terwijl \"Verbergen\" de map ook zal verbergen voor andere galerij-apps. Met \"Verbergen\" wordt een bestand genaamd \".nomedia\" in de te verbergen map aangemaakt (het verwijderen van dit bestand uit de map maakt het verbergen ongedaan). Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + Met \"Uitsluiten\" wordt het tonen van de map alleen binnen deze app voorkomen, terwijl \"Verbergen\" de map ook zal verbergen voor andere galerij-apps. Met \"Verbergen\" wordt een bestand genaamd \".nomedia\" in de te verbergen map aangemaakt (het verwijderen van dit bestand uit de map maakt het verbergen ongedaan). Op sommige apparaten is het echter niet mogelijk om specifieke mappen, zoals Camera, Screenshots en Downloads, te verbergen. Waarom zie ik mappen met stickers of covers van muziekalbums? Soms worden er wat ongebruikelijke afbeeldingen van andere apps getoond. Deze zijn gemakkelijk uit het overzicht te halen door lang te drukken op de map en vervolgens te kiezen voor \"Uitsluiten\". In het daaropvolgende venster is ook de bovenliggende map te kiezen; dit zou het tonen van soortgelijke ongewenste items kunnen voorkomen. Een bepaalde map met afbeeldingen wordt niet getoond. Wat kan ik doen? diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 1fdc0f456..53cf557e2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -189,6 +189,7 @@ Kompromis Unikaj pokazywania niewłaściwych plików Pokazuj rozszerzenia zdjęć + Allow zooming videos with double tapping them Miniatury diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index eedcd71f4..06c052feb 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -189,6 +189,7 @@ Meio termo Evitar a exibição de arquivos inválidos Exibir tipos de arquivo de imagem + Allow zooming videos with double tapping them Miniaturas diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index da94ecd5b..33f0306fd 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -189,6 +189,7 @@ Qualidade Não mostrar ficheiros inválidos Mostrar o tipo de imagem + Allow zooming videos with double tapping them Miniaturas diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 467d57d4d..a096930d9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -189,6 +189,7 @@ Компромисс Пропускать файлы с ошибками Показывать типы файлов изображений + Allow zooming videos with double tapping them Миниатюры diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e8a835b0f..f27104046 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -189,6 +189,7 @@ Kompromis Nezobrazovať neplatné súbory Zobraziť typ obrázkových súborov + Povoliť približovanie videí dvojitým ťuknutím Náhľady diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index a4a8f4c11..e8ce195da 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -189,6 +189,7 @@ Kompromis Izogni se prikazovanju napačnih datotek Show image file types + Allow zooming videos with double tapping them Sličice diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index f1313700f..83d4cbffd 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -189,6 +189,7 @@ Компромис Не приказуј оштећене датотеке Show image file types + Allow zooming videos with double tapping them Сличице diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 456a94d2d..885d15451 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -189,6 +189,7 @@ Compromise Avoid showing invalid files Show image file types + Allow zooming videos with double tapping them Miniatyrer diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index b5a5d49b8..4ec982e38 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -189,6 +189,7 @@ Ödünsüz Geçersiz dosyaları göstermekten kaçın Resim dosyası türlerini göster + Allow zooming videos with double tapping them Küçük resimler @@ -293,7 +294,7 @@ Videoları nasıl hızlıca ileri sarabilirim? Ekranın yan tarafına iki kez dokunarak veya arama çubuğunun yanındaki geçerli veya maksimum süre metinlerine dokunarak bunu yapabilirsiniz. Videoları uygulama ayarlarından ayrı bir ekranda açmayı etkinleştirirseniz yatay hareketleri de kullanabilirsiniz. Klasörün gizlenmesi ve hariç tutulması arasındaki fark nedir? - Hariç tut, klasörü yalnızca Basit Galeri\'de görüntülemeyi engellerken, Gizle sistem genelinde çalışır ve klasörü diğer galerilerden de gizler. Verilen klasörde boş bir \".nomedia\" dosyası oluşturarak çalışır, daha sonra herhangi bir dosya yöneticisi ile kaldırabilirsiniz. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + Hariç tut, klasörü yalnızca Basit Galeri\'de görüntülemeyi engellerken, Gizle sistem genelinde çalışır ve klasörü diğer galerilerden de gizler. Verilen klasörde boş bir \".nomedia\" dosyası oluşturarak çalışır, daha sonra herhangi bir dosya yöneticisi ile kaldırabilirsiniz. Bazı cihazların Kamera, Ekran Görüntüleri ve İndirilenler gibi klasörlerin gizlenmesine izin vermediğini unutmayın. Neden albüm resimlerini içeren klasörler görünüyor? Bazı olağandışı albümlerin ortaya çıktığını göreceksiniz. Onları uzun süre basarak ve Hariç tut\'u seçerek kolayca hariç tutabilirsiniz. Bir sonraki iletişim kutusunda, üst klasörü seçebilirsiniz, ancak diğer ilgili albümlerin de gösterilmesini önleyecektir. Resimler içeren bir klasör görünmüyor, ne yapabilirim? diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 759dbc849..4bddcc824 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -189,6 +189,7 @@ Компроміс Запобігати показу пошкоджених файлів Показувати типи файлів зображень + Allow zooming videos with double tapping them Ескізи diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index b03d4bc6f..a5355a365 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -189,6 +189,7 @@ Thỏa hiệp Tránh hiển thị các tệp không hợp lệ Hiển thị các loại tệp hình ảnh + Allow zooming videos with double tapping them Hình thu nhỏ diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4e4bfd448..2a995dc06 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -189,6 +189,7 @@ 折中 避免显示无效的文件 显示图片文件类型 + Allow zooming videos with double tapping them 缩略图 @@ -292,7 +293,7 @@ 如何快进/快退视频? 您可以双击屏幕边缘或点击搜索栏附近的当前或总时长的文字。 如果您在应用设置中启用了在独立页面播放视频,则也可以使用水平手势。 文件夹的隐藏和排除有什么区别? - 排除功能只是防止其在简约图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,你可以使用任何文件管理器删除它。Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads. + 排除功能只是防止其在简约图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,你可以使用任何文件管理器删除它。请注意,某些设备不允许隐藏\"Camera\",\"Screenshots\"和\"Downloads\"等文件夹。 为什么会出现音乐艺术家封面或贴纸文件夹? 你可能会看到一些不寻常的相册出现。你可以通过长按它们并选择“排除”来排除它们。在之后的对话框中,你可以选择父文件夹,这样也许就会阻止其他相关的相册出现。 有的图片文件夹没有显示,怎么回事? @@ -364,7 +365,7 @@ 查看简约系列的所有应用: https://www.simplemobiletools.com - 简约图库 Pro的独立网站: + 简约图库 Pro 的独立网站: https://www.simplemobiletools.com/gallery Facebook: diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index b759be2e0..0e322d4d2 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -189,6 +189,7 @@ 折衷 避免顯示無效的檔案 Show image file types + Allow zooming videos with double tapping them 縮圖 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 8b212341e..c3d2593a0 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -189,6 +189,7 @@ 妥協 避免顯示無效的檔案 顯示圖片檔案類型 + Allow zooming videos with double tapping them 縮圖 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ddf7f34e1..6b9af0098 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -189,6 +189,7 @@ Compromise Avoid showing invalid files Show image file types + Allow zooming videos with double tapping them Thumbnails diff --git a/build.gradle b/build.gradle index 7c3d47b8e..bdcacf2cc 100644 --- a/build.gradle +++ b/build.gradle @@ -13,10 +13,10 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.6.2' + classpath 'com.android.tools.build:gradle:3.6.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" if (is_proprietary) { - classpath 'ly.img.android.pesdk:plugin:7.2.0' + classpath 'ly.img.android.pesdk:plugin:7.2.2' } // NOTE: Do not place your application dependencies here; they belong diff --git a/fastlane/metadata/android/en-US/changelogs/302.txt b/fastlane/metadata/android/en-US/changelogs/302.txt new file mode 100644 index 000000000..7e687a795 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/302.txt @@ -0,0 +1,6 @@ + * Fixed some Photo Editor bugs + * Properly handle locked folders at opening from widgets and shortcuts + * Open the map at clicking the coordinates at the Properties window + * Properly sort items at the Other Folder dialog at copy/move + * Fixed some folder un/hiding related glitches + * A couple other translation and UX improvements diff --git a/fastlane/metadata/android/en-US/changelogs/303.txt b/fastlane/metadata/android/en-US/changelogs/303.txt new file mode 100644 index 000000000..c18baadc7 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/303.txt @@ -0,0 +1,3 @@ + * Use the selected date format grouped thumbnail section titles too + * Fixed a glitch related to locked folders asking authentication too often + * Refresh the UI here and there a bit diff --git a/fastlane/metadata/android/en-US/changelogs/305.txt b/fastlane/metadata/android/en-US/changelogs/305.txt new file mode 100644 index 000000000..f0b9651e1 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/305.txt @@ -0,0 +1,4 @@ + * Improved the performance on multiple places + * Removed some unnecessary permissions added recently + * Fixed some photo editor glitches + * Show Portrait images by default only on Android 9+ diff --git a/fastlane/metadata/android/en-US/changelogs/306.txt b/fastlane/metadata/android/en-US/changelogs/306.txt new file mode 100644 index 000000000..777329cff --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/306.txt @@ -0,0 +1,2 @@ + * Disable Portrait photo showing by default, until it gets improved + * Added a couple other performance improvements here and there diff --git a/fastlane/metadata/android/en-US/changelogs/307.txt b/fastlane/metadata/android/en-US/changelogs/307.txt new file mode 100644 index 000000000..c04bf610a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/307.txt @@ -0,0 +1 @@ + * Added a few more stability and performance improvements diff --git a/fastlane/metadata/android/en-US/changelogs/308.txt b/fastlane/metadata/android/en-US/changelogs/308.txt new file mode 100644 index 000000000..50ef5a7fd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/308.txt @@ -0,0 +1,4 @@ + * Fixed a glitch with some favorite items disappearing + * Improve folder hiding, add the new .nomedia file into MediaStore + * Improve the performance of getting video file duration + * A few other improvements here and there diff --git a/fastlane/metadata/android/en-US/changelogs/309.txt b/fastlane/metadata/android/en-US/changelogs/309.txt new file mode 100644 index 000000000..4e56a31f9 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/309.txt @@ -0,0 +1 @@ + * Added some crashfixes