From 6fec5422f3ed932cbc55f6b4692287a636f370ab Mon Sep 17 00:00:00 2001 From: chreddy Date: Wed, 19 Dec 2018 22:51:07 +0100 Subject: [PATCH 01/69] Update Danish translation --- app/src/main/res/values-da/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 0557e2732..3de96a5b8 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -30,15 +30,15 @@ Brug standard orientering Fiks Dato Taget værdi Fikser… - Dates fixed successfully + Datoer fikset med succes - Filtrer medier + Filtrér medier Billeder Videoer GIF\'er - RAW images - SVGs + RAW billeder + SVG\'er Der blev ikke fundet nogen filer med det valgte filter. Skift filter @@ -67,7 +67,7 @@ Skalér valgte elementer og gem Bredde Højde - Bevar billedeforhold + Bevar billedforhold Indtast en gyldig opløsning @@ -88,8 +88,8 @@ Spejlvend vandret Spejlvend lodret Rediger med - Free - Other + Fri + Andet Simple Wallpaper @@ -111,7 +111,7 @@ Inkluder videoer Inkluder GIF\'er Tilfældig rækkefølge - Use fade animations + Brug udtonende animationer Kør baglæns Endeløs kørsel Slideshowet endte From 293d8a73904cb2eda487bc2932671af8c10b9b27 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 21 Dec 2018 10:39:54 +0100 Subject: [PATCH 02/69] scan OTG paths only if there is an OTG device connected --- .../simplemobiletools/gallery/pro/helpers/MediaFetcher.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 b57e37c70..df6ef77c7 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 @@ -26,9 +26,11 @@ class MediaFetcher(val context: Context) { } val curMedia = ArrayList() - if (curPath.startsWith(OTG_PATH)) { - val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia, favoritePaths, getVideoDurations) - curMedia.addAll(newMedia) + if (curPath.startsWith(OTG_PATH, true)) { + if (context.hasOTGConnected()) { + val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia, favoritePaths, getVideoDurations) + curMedia.addAll(newMedia) + } } else { val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, favoritePaths, getVideoDurations) curMedia.addAll(newMedia) From 93907c54b49e0d48bd7ad637a9d588c3e87c4c8d Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 21 Dec 2018 14:56:38 +0100 Subject: [PATCH 03/69] removing the extra compare step at sorting --- .../com/simplemobiletools/gallery/pro/extensions/Context.kt | 4 ---- .../com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt | 4 ---- 2 files changed, 8 deletions(-) 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 c8a7f5b58..96ae9ab89 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 @@ -170,10 +170,6 @@ fun Context.getSortedDirectories(source: ArrayList): ArrayList o1.taken.compareTo(o2.taken) } - if (result == 0) { - result = AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase()) - } - if (sorting and SORT_DESCENDING != 0) { result *= -1 } 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 df6ef77c7..258cc2934 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 @@ -366,10 +366,6 @@ class MediaFetcher(val context: Context) { else -> o1.taken.compareTo(o2.taken) } - if (result == 0) { - result = AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase()) - } - if (sorting and SORT_DESCENDING != 0) { result *= -1 } From 73698398a5376b205e5875dfeea1c3c737c0464d Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 21 Dec 2018 22:01:11 +0100 Subject: [PATCH 04/69] retrieve file name a bit later at fetching files --- .../gallery/pro/helpers/MediaFetcher.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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 258cc2934..aeec7fda0 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 @@ -194,12 +194,12 @@ class MediaFetcher(val context: Context) { break } - val filename = file.name - val isImage = filename.isImageFast() - val isVideo = if (isImage) false else filename.isVideoFast() - val isGif = if (isImage || isVideo) false else filename.isGif() - val isRaw = if (isImage || isVideo || isGif) false else filename.isRawFast() - val isSvg = if (isImage || isVideo || isGif || isRaw) false else filename.isSvg() + val path = file.absolutePath + val isImage = path.isImageFast() + val isVideo = if (isImage) false else path.isVideoFast() + val isGif = if (isImage || isVideo) false else path.isGif() + val isRaw = if (isImage || isVideo || isGif) false else path.isRawFast() + val isSvg = if (isImage || isVideo || isGif || isRaw) false else path.isSvg() if (!isImage && !isVideo && !isGif && !isRaw && !isSvg) continue @@ -219,6 +219,7 @@ class MediaFetcher(val context: Context) { if (isSvg && filterMedia and TYPE_SVGS == 0) continue + val filename = file.name if (!showHidden && filename.startsWith('.')) continue @@ -226,7 +227,6 @@ class MediaFetcher(val context: Context) { if (size <= 0L || (doExtraCheck && !file.exists())) continue - val path = file.absolutePath if (folder == RECYCLE_BIN) { deletedMedia.firstOrNull { it.path == path }?.apply { media.add(this) From cc0b47c1db996b9e71186a95862ab5df93dd263f Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 22 Dec 2018 16:41:30 +0100 Subject: [PATCH 05/69] load zoomable fullscreen image earlier --- .../simplemobiletools/gallery/pro/fragments/PhotoFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt index 372bc7b0c..90be78b7c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt @@ -55,7 +55,7 @@ import java.util.* class PhotoFragment : ViewPagerFragment() { private val DEFAULT_DOUBLE_TAP_ZOOM = 2f - private val ZOOMABLE_VIEW_LOAD_DELAY = 300L + private val ZOOMABLE_VIEW_LOAD_DELAY = 150L // devices with good displays, but the rest of the hardware not good enough for them private val WEIRD_DEVICES = arrayListOf( From af40590e71318955f3c37d5f832349bcced7c28d Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 12:16:16 +0100 Subject: [PATCH 06/69] update commons to 5.5.19 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d3c104ce3..9ec08fe9f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.5.18' + implementation 'com.simplemobiletools:commons:5.5.19' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation 'androidx.multidex:multidex:2.0.0' implementation 'it.sephiroth.android.exif:library:1.0.1' From 702699e061c8449717fe4739ceffbb3eadc7a7ce Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 12:18:49 +0100 Subject: [PATCH 07/69] updating subsampling-scale-image-view to 4.0.1 and multidex to 2.0.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9ec08fe9f..72697651a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ android { dependencies { implementation 'com.simplemobiletools:commons:5.5.19' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' - implementation 'androidx.multidex:multidex:2.0.0' + implementation 'androidx.multidex:multidex:2.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' @@ -78,7 +78,7 @@ dependencies { //implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0' //implementation 'com.github.tibbi:subsampling-scale-image-view:v3.10.1-fork' - implementation 'com.github.tibbi:subsampling-scale-image-view:fcb724fb0a' + implementation 'com.github.tibbi:subsampling-scale-image-view:4.0.1' // implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.github.tibbi:PhotoView:2.3.0-fork' From c2178d467e7d1af4fc3e4579ac799dd6676cfc0e Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 12:33:44 +0100 Subject: [PATCH 08/69] reuse the same ChangeViewType dialog at media view too --- .../gallery/pro/activities/MainActivity.kt | 2 +- .../gallery/pro/activities/MediaActivity.kt | 14 ++------- .../pro/dialogs/ChangeViewTypeDialog.kt | 30 +++++++++++++++---- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt index ad9ef43f1..f1f33fd10 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt @@ -459,7 +459,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } private fun changeViewType() { - ChangeViewTypeDialog(this) { + ChangeViewTypeDialog(this, true) { invalidateOptionsMenu() setupLayoutManager() directories_grid.adapter = null 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 536e05245..8eaa3ccf4 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,23 +22,18 @@ 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.RadioGroupDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.OTG_PATH import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.REQUEST_EDIT_IMAGE import com.simplemobiletools.commons.models.FileDirItem -import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.MyGridLayoutManager import com.simplemobiletools.commons.views.MyRecyclerView 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.ChangeGroupingDialog -import com.simplemobiletools.gallery.pro.dialogs.ChangeSortingDialog -import com.simplemobiletools.gallery.pro.dialogs.ExcludeFolderDialog -import com.simplemobiletools.gallery.pro.dialogs.FilterMediaDialog +import com.simplemobiletools.gallery.pro.dialogs.* import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.helpers.* import com.simplemobiletools.gallery.pro.interfaces.DirectoryDao @@ -493,12 +488,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } private fun changeViewType() { - val items = arrayListOf( - RadioItem(VIEW_TYPE_GRID, getString(R.string.grid)), - RadioItem(VIEW_TYPE_LIST, getString(R.string.list))) - - RadioGroupDialog(this, items, config.viewTypeFiles) { - config.viewTypeFiles = it as Int + ChangeViewTypeDialog(this, false) { invalidateOptionsMenu() setupLayoutManager() media_grid.adapter = null diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt index b534b5c3e..858101b04 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.gallery.pro.dialogs import android.view.View import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.config @@ -10,15 +11,29 @@ import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_GRID import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_LIST import kotlinx.android.synthetic.main.dialog_change_view_type.view.* -class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) { +class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView: Boolean, val callback: () -> Unit) { private var view: View private var config = activity.config init { view = activity.layoutInflater.inflate(R.layout.dialog_change_view_type, null).apply { - val viewToCheck = if (config.viewTypeFolders == VIEW_TYPE_GRID) change_view_type_dialog_radio_grid.id else change_view_type_dialog_radio_list.id + val viewToCheck = if (fromFoldersView) { + if (config.viewTypeFolders == VIEW_TYPE_GRID) { + change_view_type_dialog_radio_grid.id + } else { + change_view_type_dialog_radio_list.id + } + } else if (config.viewTypeFiles == VIEW_TYPE_GRID) { + change_view_type_dialog_radio_grid.id + } else { + change_view_type_dialog_radio_list.id + } + change_view_type_dialog_radio.check(viewToCheck) - change_view_type_dialog_group_direct_subfolders.isChecked = config.groupDirectSubfolders + change_view_type_dialog_group_direct_subfolders.apply { + beVisibleIf(fromFoldersView) + isChecked = config.groupDirectSubfolders + } } AlertDialog.Builder(activity) @@ -31,8 +46,13 @@ class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val callback: () -> private fun dialogConfirmed() { val viewType = if (view.change_view_type_dialog_radio.checkedRadioButtonId == view.change_view_type_dialog_radio_grid.id) VIEW_TYPE_GRID else VIEW_TYPE_LIST - config.viewTypeFolders = viewType - config.groupDirectSubfolders = view.change_view_type_dialog_group_direct_subfolders.isChecked + if (fromFoldersView) { + config.viewTypeFolders = viewType + config.groupDirectSubfolders = view.change_view_type_dialog_group_direct_subfolders.isChecked + } else { + config.viewTypeFiles = viewType + } + callback() } } From 8758b3c9fcdbe31be31b17708aebd29afb578a60 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 13:35:32 +0100 Subject: [PATCH 09/69] fix #1146, allow setting view type per-folder --- .../gallery/pro/activities/MainActivity.kt | 2 +- .../gallery/pro/activities/MediaActivity.kt | 24 ++++++++++-------- .../gallery/pro/adapters/MediaAdapter.kt | 6 +++-- .../pro/dialogs/ChangeViewTypeDialog.kt | 25 +++++++++++++++---- .../gallery/pro/dialogs/PickMediumDialog.kt | 5 ++-- .../gallery/pro/helpers/Config.kt | 16 ++++++++++++ .../gallery/pro/helpers/Constants.kt | 1 + .../res/layout/dialog_change_view_type.xml | 8 ++++++ 8 files changed, 67 insertions(+), 20 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt index f1f33fd10..fd2d67c33 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt @@ -787,7 +787,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { runOnUiThread { checkPlaceholderVisibility(dirs) - val allowHorizontalScroll = config.scrollHorizontally && config.viewTypeFiles == VIEW_TYPE_GRID + val allowHorizontalScroll = config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID directories_vertical_fastscroller.beVisibleIf(directories_grid.isVisible() && !allowHorizontalScroll) directories_horizontal_fastscroller.beVisibleIf(directories_grid.isVisible() && allowHorizontalScroll) setupAdapter(dirs) 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 8eaa3ccf4..fdca85100 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 @@ -219,10 +219,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden - findItem(R.id.increase_column_count).isVisible = config.viewTypeFiles == VIEW_TYPE_GRID && config.mediaColumnCnt < MAX_COLUMN_COUNT - findItem(R.id.reduce_column_count).isVisible = config.viewTypeFiles == VIEW_TYPE_GRID && config.mediaColumnCnt > 1 - - findItem(R.id.toggle_filename).isVisible = config.viewTypeFiles == VIEW_TYPE_GRID + val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) + findItem(R.id.increase_column_count).isVisible = viewType == VIEW_TYPE_GRID && config.mediaColumnCnt < MAX_COLUMN_COUNT + findItem(R.id.reduce_column_count).isVisible = viewType == VIEW_TYPE_GRID && config.mediaColumnCnt > 1 + findItem(R.id.toggle_filename).isVisible = viewType == VIEW_TYPE_GRID } setupSearch(menu) @@ -362,7 +362,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { initZoomListener() val fastscroller = if (config.scrollHorizontally) media_horizontal_fastscroller else media_vertical_fastscroller MediaAdapter(this, mMedia.clone() as ArrayList, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent, - mAllowPickingMultiple, media_grid, fastscroller) { + mAllowPickingMultiple, mPath, media_grid, fastscroller) { if (it is Medium) { itemClicked(it.path) } @@ -380,7 +380,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } private fun setupScrollDirection() { - val allowHorizontalScroll = config.scrollHorizontally && config.viewTypeFiles == VIEW_TYPE_GRID + val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) + val allowHorizontalScroll = config.scrollHorizontally && viewType == VIEW_TYPE_GRID media_vertical_fastscroller.isHorizontal = false media_vertical_fastscroller.beGoneIf(allowHorizontalScroll) @@ -488,7 +489,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } private fun changeViewType() { - ChangeViewTypeDialog(this, false) { + ChangeViewTypeDialog(this, false, mPath) { invalidateOptionsMenu() setupLayoutManager() media_grid.adapter = null @@ -636,7 +637,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } private fun setupLayoutManager() { - if (config.viewTypeFiles == VIEW_TYPE_GRID) { + val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) + if (viewType == VIEW_TYPE_GRID) { setupGridLayoutManager() } else { setupListLayoutManager() @@ -712,7 +714,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { } private fun initZoomListener() { - if (config.viewTypeFiles == VIEW_TYPE_GRID) { + val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) + if (viewType == VIEW_TYPE_GRID) { val layoutManager = media_grid.layoutManager as MyGridLayoutManager mZoomListener = object : MyRecyclerView.MyZoomListener { override fun zoomIn() { @@ -830,7 +833,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { media_empty_text.beVisibleIf(media.isEmpty() && !isFromCache) media_grid.beVisibleIf(media_empty_text_label.isGone()) - val allowHorizontalScroll = config.scrollHorizontally && config.viewTypeFiles == VIEW_TYPE_GRID + val viewType = config.getFolderViewType(if (mShowAll) SHOW_ALL else mPath) + val allowHorizontalScroll = config.scrollHorizontally && viewType == VIEW_TYPE_GRID media_vertical_fastscroller.beVisibleIf(media_grid.isVisible() && !allowHorizontalScroll) media_horizontal_fastscroller.beVisibleIf(media_grid.isVisible() && allowHorizontalScroll) setupAdapter() 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 e20ea1351..6d1a1b3bb 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 @@ -24,6 +24,7 @@ import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.dialogs.DeleteWithRememberDialog import com.simplemobiletools.gallery.pro.extensions.* +import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_LIST import com.simplemobiletools.gallery.pro.interfaces.MediaOperationsListener import com.simplemobiletools.gallery.pro.models.Medium @@ -35,7 +36,7 @@ import java.text.SimpleDateFormat import java.util.* class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, val listener: MediaOperationsListener?, val isAGetIntent: Boolean, - val allowMultiplePicks: Boolean, recyclerView: MyRecyclerView, fastScroller: FastScroller? = null, itemClick: (Any) -> Unit) : + val allowMultiplePicks: Boolean, val path: String, recyclerView: MyRecyclerView, fastScroller: FastScroller? = null, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private val INSTANT_LOAD_DURATION = 2000L @@ -45,7 +46,8 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList() private var loadImageInstantly = false private var delayHandler = Handler(Looper.getMainLooper()) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt index 858101b04..78537069a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt @@ -7,13 +7,15 @@ import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.config +import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_GRID import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_LIST import kotlinx.android.synthetic.main.dialog_change_view_type.view.* -class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView: Boolean, val callback: () -> Unit) { +class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView: Boolean, val path: String = "", val callback: () -> Unit) { private var view: View private var config = activity.config + private var pathToUse = if (path.isEmpty()) SHOW_ALL else path init { view = activity.layoutInflater.inflate(R.layout.dialog_change_view_type, null).apply { @@ -23,10 +25,13 @@ class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView } else { change_view_type_dialog_radio_list.id } - } else if (config.viewTypeFiles == VIEW_TYPE_GRID) { - change_view_type_dialog_radio_grid.id } else { - change_view_type_dialog_radio_list.id + val currViewType = config.getFolderViewType(pathToUse) + if (currViewType == VIEW_TYPE_GRID) { + change_view_type_dialog_radio_grid.id + } else { + change_view_type_dialog_radio_list.id + } } change_view_type_dialog_radio.check(viewToCheck) @@ -34,6 +39,11 @@ class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView beVisibleIf(fromFoldersView) isChecked = config.groupDirectSubfolders } + + change_view_type_dialog_use_for_this_folder.apply { + beVisibleIf(!fromFoldersView) + isChecked = config.hasCustomViewType(pathToUse) + } } AlertDialog.Builder(activity) @@ -50,7 +60,12 @@ class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView config.viewTypeFolders = viewType config.groupDirectSubfolders = view.change_view_type_dialog_group_direct_subfolders.isChecked } else { - config.viewTypeFiles = viewType + if (view.change_view_type_dialog_use_for_this_folder.isChecked) { + config.saveFolderViewType(pathToUse, viewType) + } else { + config.removeFolderViewType(pathToUse) + config.viewTypeFiles = viewType + } } callback() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickMediumDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickMediumDialog.kt index b1f83527b..f75a8f301 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickMediumDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickMediumDialog.kt @@ -22,7 +22,8 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c var dialog: AlertDialog var shownMedia = ArrayList() val view = activity.layoutInflater.inflate(R.layout.dialog_medium_picker, null) - var isGridViewType = activity.config.viewTypeFiles == VIEW_TYPE_GRID + val viewType = activity.config.getFolderViewType(if (activity.config.showAll) SHOW_ALL else path) + var isGridViewType = viewType == VIEW_TYPE_GRID init { (view.media_grid.layoutManager as MyGridLayoutManager).apply { @@ -64,7 +65,7 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c return shownMedia = media - val adapter = MediaAdapter(activity, shownMedia.clone() as ArrayList, null, true, false, view.media_grid, null) { + val adapter = MediaAdapter(activity, shownMedia.clone() as ArrayList, null, true, false, path, view.media_grid, null) { if (it is Medium) { callback(it.path) dialog.dismiss() 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 cdb7ef840..5956bf22f 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 @@ -59,6 +59,22 @@ class Config(context: Context) : BaseConfig(context) { fun hasCustomGrouping(path: String) = prefs.contains(GROUP_FOLDER_PREFIX + path.toLowerCase()) + fun saveFolderViewType(path: String, value: Int) { + if (path.isEmpty()) { + viewTypeFiles = value + } else { + prefs.edit().putInt(VIEW_TYPE_PREFIX + path.toLowerCase(), value).apply() + } + } + + fun getFolderViewType(path: String) = prefs.getInt(VIEW_TYPE_PREFIX + path.toLowerCase(), viewTypeFiles) + + fun removeFolderViewType(path: String) { + prefs.edit().remove(VIEW_TYPE_PREFIX + path.toLowerCase()).apply() + } + + fun hasCustomViewType(path: String) = prefs.contains(VIEW_TYPE_PREFIX + path.toLowerCase()) + var wasHideFolderTooltipShown: Boolean get() = prefs.getBoolean(HIDE_FOLDER_TOOLTIP_SHOWN, false) set(wasShown) = prefs.edit().putBoolean(HIDE_FOLDER_TOOLTIP_SHOWN, wasShown).apply() 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 95a068eb0..5514193b4 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 @@ -6,6 +6,7 @@ import com.simplemobiletools.commons.helpers.MONTH_SECONDS const val DIRECTORY_SORT_ORDER = "directory_sort_order" const val SORT_FOLDER_PREFIX = "sort_folder_" const val GROUP_FOLDER_PREFIX = "group_folder_" +const val VIEW_TYPE_PREFIX = "view_type_folder_" const val SHOW_HIDDEN_MEDIA = "show_hidden_media" const val TEMPORARILY_SHOW_HIDDEN = "temporarily_show_hidden" const val IS_THIRD_PARTY_INTENT = "is_third_party_intent" diff --git a/app/src/main/res/layout/dialog_change_view_type.xml b/app/src/main/res/layout/dialog_change_view_type.xml index 003692bb9..b6e1f342c 100644 --- a/app/src/main/res/layout/dialog_change_view_type.xml +++ b/app/src/main/res/layout/dialog_change_view_type.xml @@ -50,5 +50,13 @@ android:paddingBottom="@dimen/activity_margin" android:text="@string/group_direct_subfolders"/> + + From b041d45f80bd58e38e8b93290e469622055a887c Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 14:05:31 +0100 Subject: [PATCH 10/69] improve file sorting if sorting by original field is equal --- .../gallery/pro/asynctasks/GetMediaAsynctask.kt | 2 +- .../gallery/pro/helpers/MediaFetcher.kt | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt index c9516cb43..7801c40e5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/asynctasks/GetMediaAsynctask.kt @@ -27,7 +27,7 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES } val media = ArrayList() foldersToScan.forEach { - val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, favoritePaths, getVideoDurations) + val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, favoritePaths, getVideoDurations, false) media.addAll(newMedia) } 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 aeec7fda0..baf207b96 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 @@ -19,7 +19,7 @@ class MediaFetcher(val context: Context) { var shouldStop = false fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, favoritePaths: ArrayList, - getVideoDurations: Boolean): ArrayList { + getVideoDurations: Boolean, sortMedia: Boolean = true): ArrayList { val filterMedia = context.config.filterMedia if (filterMedia == 0) { return ArrayList() @@ -36,7 +36,10 @@ class MediaFetcher(val context: Context) { curMedia.addAll(newMedia) } - sortMedia(curMedia, context.config.getFileSorting(curPath)) + if (sortMedia) { + sortMedia(curMedia, context.config.getFileSorting(curPath)) + } + return curMedia } @@ -366,6 +369,11 @@ class MediaFetcher(val context: Context) { else -> o1.taken.compareTo(o2.taken) } + // do just a quick extra sorting if the original sorting is equal, does not need to be accurate in all cases + if (result == 0 && sorting and SORT_BY_NAME == 0 && sorting and SORT_BY_PATH == 0) { + result = o1.name.compareTo(o2.name) + } + if (sorting and SORT_DESCENDING != 0) { result *= -1 } From b6818a106c59b2d86e830b122ecf3fdf273fcc66 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 14:46:00 +0100 Subject: [PATCH 11/69] update commons to 5.5.20 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 72697651a..696e51f41 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.5.19' + implementation 'com.simplemobiletools:commons:5.5.20' 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' From d397134f2e4162f60f758f75f4cc74f676767e35 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 16:28:55 +0100 Subject: [PATCH 12/69] update version to 6.1.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 696e51f41..aeb4ade9c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.simplemobiletools.gallery.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 214 - versionName "6.1.1" + versionCode 215 + versionName "6.1.2" multiDexEnabled true setProperty("archivesBaseName", "gallery") } From a222b7a4f9e25ebdc90eba3151264559971545cc Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 16:29:00 +0100 Subject: [PATCH 13/69] updating changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58136d1a8..780fcc203 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 6.1.2 *(2018-12-24)* +---------------------------- + + * Done a few performance improvements here and there + * Allow changing view type individually per folder + * Merry Christmas! + Version 6.1.1 *(2018-12-18)* ---------------------------- From 704a675601c8b2cb602121b9c4adbf09d88fd7d9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 16:29:12 +0100 Subject: [PATCH 14/69] adding a faq item related to icon disappearing --- .../com/simplemobiletools/gallery/pro/extensions/Activity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt index 0c8458d92..663637b28 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt @@ -79,7 +79,8 @@ fun SimpleActivity.launchAbout() { FAQItem(R.string.faq_12_title, R.string.faq_12_text), FAQItem(R.string.faq_13_title, R.string.faq_13_text), FAQItem(R.string.faq_14_title, R.string.faq_14_text), - FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons)) + FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons), + FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons)) startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true) } From 37dcc8eae2e7c29b832f396c48383441b2dcdc02 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Dec 2018 20:59:54 +0100 Subject: [PATCH 15/69] updating the editor screenshot --- .../en-US/images/phoneScreenshots/app_6.jpg | Bin 142960 -> 175487 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg index a0f0752fef14cbb196a6889b12439522703d3df9..db4b6640832d125439539cd8dab2f88fd6688680 100644 GIT binary patch literal 175487 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

0aRfU5Ze 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�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 z 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 f&rX8#2v Date: Mon, 24 Dec 2018 21:14:55 +0100 Subject: [PATCH 16/69] update commons to 5.6.0 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index aeb4ade9c..9241e70e8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.5.20' + implementation 'com.simplemobiletools:commons:5.6.0' 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' From 6aa2ed9db79fe67172a76514aa877bad1918cc8f Mon Sep 17 00:00:00 2001 From: Pzqqt <821026875@qq.com> Date: Tue, 25 Dec 2018 17:53:01 +0800 Subject: [PATCH 17/69] Update strings.xml --- app/src/main/res/values-zh-rCN/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e77503681..33d3c38b8 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -133,8 +133,8 @@ 扩展 - Folder shown on the widget: - Show folder name + 要在小部件上显示的文件夹: + 显示文件夹名称 自动播放 From fd0971cc827b4c7b26a05e74de1a4092fdea4c4e Mon Sep 17 00:00:00 2001 From: Lukas Novotny <36963682+novas78@users.noreply.github.com> Date: Wed, 26 Dec 2018 10:56:59 +0100 Subject: [PATCH 18/69] Update czech translation --- app/src/main/res/values-cs/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index e8706c85b..4ad6a09e7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -133,8 +133,8 @@ Přípony - Folder shown on the widget: - Show folder name + Složka zobrazená na widgetu: + Zobrazit název složky Automaticky přehrávat videa @@ -144,7 +144,7 @@ Animovat náhledy souborů GIF Nastavit jas obrazovky na max při zobrazení médií Oříznout náhledy na čtverce - Show video durations + Zobrazit dobu trvání videí Otočit média podle Systémového nastavení Otočení zařízení @@ -175,7 +175,7 @@ Náhledy Celoobrazovkový režim Rozšířené vlastnosti - Spodní skční tlačítka + Spodní akční tlačítka Upravit viditelné spodní akční tlačítka @@ -227,7 +227,7 @@ 2. Prezentace 3. Podpora pro výřez v displeji 4. Připínání složek na vrch - 5. Filtování médií podle typu + 5. Filtrování médií podle typu 6. Odpadkový koš pro snadnou obnovu souborů 7. Uzamykání orientace celoobrazovkového režimu 8. Označování oblíbených položek pro snadný přístup From aa946ad173217544591fc9cde4cf7b9b3ea9758c Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Dec 2018 15:48:55 +0100 Subject: [PATCH 19/69] updating subsampling to 4.0.2 and commons to 5.6.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9241e70e8..ed2285664 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.6.0' + implementation 'com.simplemobiletools:commons:5.6.1' 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' @@ -78,7 +78,7 @@ dependencies { //implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0' //implementation 'com.github.tibbi:subsampling-scale-image-view:v3.10.1-fork' - implementation 'com.github.tibbi:subsampling-scale-image-view:4.0.1' + implementation 'com.github.tibbi:subsampling-scale-image-view:4.0.2' // implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.github.tibbi:PhotoView:2.3.0-fork' From a608ce2d6ec423bea9c1057e6258859899c8a695 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Dec 2018 19:56:11 +0100 Subject: [PATCH 20/69] try fixing a ConcurrentModificationException at loading directories --- .../simplemobiletools/gallery/pro/activities/MainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt index fd2d67c33..58701c6ce 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt @@ -790,7 +790,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val allowHorizontalScroll = config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID directories_vertical_fastscroller.beVisibleIf(directories_grid.isVisible() && !allowHorizontalScroll) directories_horizontal_fastscroller.beVisibleIf(directories_grid.isVisible() && allowHorizontalScroll) - setupAdapter(dirs) + setupAdapter(dirs.clone() as ArrayList) } // cached folders have been loaded, recheck folders one by one starting with the first displayed From 5abb3ae53897a7670b6a62b527fef28e8da0327b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Dec 2018 20:12:55 +0100 Subject: [PATCH 21/69] fix #1153, do not show favorite items from hidden folders, when shouldnt --- .../gallery/pro/helpers/MediaFetcher.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 baf207b96..d5978ba84 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 @@ -182,16 +182,16 @@ class MediaFetcher(val context: Context) { ArrayList() } - val files = when (folder) { - FAVORITES -> favoritePaths.map { File(it) }.toTypedArray() - RECYCLE_BIN -> deletedMedia.map { File(it.path) }.toTypedArray() - else -> File(folder).listFiles() ?: return media - } - val doExtraCheck = context.config.doExtraCheck val showHidden = context.config.shouldShowHidden val dateTakens = if (getProperDateTaken) getFolderDateTakens(folder) else HashMap() + val files = when (folder) { + FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toTypedArray() + RECYCLE_BIN -> deletedMedia.map { File(it.path) }.toTypedArray() + else -> File(folder).listFiles() ?: return media + } + for (file in files) { if (shouldStop) { break From f74302d88934c972305919ac3515a57e4ab0ff6b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Dec 2018 20:28:28 +0100 Subject: [PATCH 22/69] avoid trying to fetch contentresolver values from favorites and recycle bin --- .../com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d5978ba84..3978d0a49 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 @@ -184,7 +184,7 @@ class MediaFetcher(val context: Context) { val doExtraCheck = context.config.doExtraCheck val showHidden = context.config.shouldShowHidden - val dateTakens = if (getProperDateTaken) getFolderDateTakens(folder) else HashMap() + val dateTakens = if (getProperDateTaken && folder != FAVORITES && folder != RECYCLE_BIN) getFolderDateTakens(folder) else HashMap() val files = when (folder) { FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toTypedArray() From ca450e8f1822e9e31b6fba3a73c26ba276297f1a Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Dec 2018 20:54:46 +0100 Subject: [PATCH 23/69] try adding files in the mediastore if updating Date Taken fails --- .../simplemobiletools/gallery/pro/adapters/MediaAdapter.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 6d1a1b3bb..0206d451e 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 @@ -349,7 +349,12 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList Date: Wed, 26 Dec 2018 21:17:08 +0100 Subject: [PATCH 24/69] update version to 6.1.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ed2285664..a6838a220 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.simplemobiletools.gallery.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 215 - versionName "6.1.2" + versionCode 216 + versionName "6.1.3" multiDexEnabled true setProperty("archivesBaseName", "gallery") } From 66b673c297ab0aa80a44c3b52453d875e703a6f4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Dec 2018 21:17:14 +0100 Subject: [PATCH 25/69] updating changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 780fcc203..feff7768b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========== +Version 6.1.3 *(2018-12-26)* +---------------------------- + + * Fixed a glitch at zooming fullscreen images with double tap + * Hide favorite items from hidden folders, if showing hidden items is disabled + Version 6.1.2 *(2018-12-24)* ---------------------------- From 990ac8ee2c82786aa21cf31651e886a66cd27076 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Dec 2018 12:01:04 +0100 Subject: [PATCH 26/69] updating a polish string --- app/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 42ba52f06..f97466b73 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -89,7 +89,7 @@ Przewróć w pionie Edytuj w: Wolne - Other + Inny Tapeta From f9d5dcad6c473ff5c2b2a5c77058645de4f62a44 Mon Sep 17 00:00:00 2001 From: "ONLAN.PL" Date: Fri, 28 Dec 2018 16:32:03 +0100 Subject: [PATCH 27/69] Update added translation for the widget --- app/src/main/res/values-pl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f97466b73..b7ad4a389 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -133,8 +133,8 @@ Rozszerzenia - Folder shown on the widget: - Show folder name + Folder wyświetlany na widżecie: + Pokaż nazwę folderu Odtwarzaj filmy automatycznie From 8c0799e1f16ca13180da1d615acd2dedc5082677 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Dec 2018 22:04:33 +0100 Subject: [PATCH 28/69] ensure we have proper screen resolution when loading fullscreen images --- .../gallery/pro/fragments/PhotoFragment.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt index 90be78b7c..847d5f95a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt @@ -18,12 +18,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.bumptech.glide.Glide -import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.DecodeFormat import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target import com.davemorrissey.labs.subscaleview.ImageSource import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.davemorrissey.labs.subscaleview.decoder.DecoderFactory @@ -119,10 +119,7 @@ class PhotoFragment : ViewPagerFragment() { } } - if (ViewPagerActivity.screenWidth == 0 || ViewPagerActivity.screenHeight == 0) { - measureScreen() - } - + checkScreenDimensions() storeStateVariables() if (!isFragmentVisible && activity is PhotoActivity) { isFragmentVisible = true @@ -227,6 +224,12 @@ class PhotoFragment : ViewPagerFragment() { } } + private fun checkScreenDimensions() { + if (ViewPagerActivity.screenWidth == 0 || ViewPagerActivity.screenHeight == 0) { + measureScreen() + } + } + private fun measureScreen() { val metrics = DisplayMetrics() activity!!.windowManager.defaultDisplay.getRealMetrics(metrics) @@ -297,6 +300,7 @@ class PhotoFragment : ViewPagerFragment() { } private fun loadBitmap(degrees: Int = 0) { + checkScreenDimensions() var pathToLoad = if (medium.path.startsWith("content://")) medium.path else "file://${medium.path}" pathToLoad = pathToLoad.replace("%", "%25").replace("#", "%23") @@ -350,7 +354,7 @@ class PhotoFragment : ViewPagerFragment() { .listener(object : RequestListener { override fun onLoadFailed(e: GlideException?, model: Any?, target: com.bumptech.glide.request.target.Target?, isFirstResource: Boolean) = false - override fun onResourceReady(resource: Bitmap?, model: Any?, target: com.bumptech.glide.request.target.Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { + override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: com.bumptech.glide.load.DataSource?, isFirstResource: Boolean): Boolean { if (isFragmentVisible) { scheduleZoomableView() } From f854a8c265514ac9c4d61fbbe7ecce195141034c Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 29 Dec 2018 22:44:01 +0100 Subject: [PATCH 29/69] updating the app short description --- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-da/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-id/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-ko-rKR/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-nb/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 4f9e5a2c7..2f15a3572 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -218,7 +218,7 @@ - استوديو لعرض الصور والفيديو بدون اعلانات. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 372505031..1a92fc124 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -216,7 +216,7 @@ - Şəkil və videolara baxmaq üçün reklamsız qalereya. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index df1bbe48b..555fd7dbd 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -216,7 +216,7 @@ - Una galeria per veure imatges i vídeos sense publicitat. + An offline gallery for managing your files without ads, respecting your privacy. Una galeria molt personalitzable capaç de mostrar molts tipus d\'imatge i de vídeo diferents, inclosos SVGs, RAWs, fotos panoràmiques i vídeos. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4ad6a09e7..47124f75a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -216,7 +216,7 @@ - Galerie na prohlížení obrázků a videí bez reklam. + An offline gallery for managing your files without ads, respecting your privacy. Přizpůsobitelná galerie na zobrazování množství rozličných druhů obrázků a videí, včetně SVG, RAW souborů, panoramatických fotek a videí. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 3de96a5b8..059977161 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -216,7 +216,7 @@ - Et galleri til visning af billeder og videoer uden reklamer. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0237128fb..ddae898bf 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -215,7 +215,7 @@ - Eine schlichte Galerie zum Betrachten von Bildern und Videos, ganz ohne Werbung. + An offline gallery for managing your files without ads, respecting your privacy. Eine stark anpassbare Galerie fähig zur Anzeige von diversen Bild- und Videoarten u. a. SVG, RAW, Panoramafotos und -videos. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 3c29ab646..bec488bcf 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -216,7 +216,7 @@ - Μία Gallery για την προβολή φωτογραφιών και βίντεο χωρίς διαφημίσεις. + An offline gallery for managing your files without ads, respecting your privacy. Μια εξαιρετικά προσαρμόσιμη Gallery ικανή να εμφανίζει πολλούς διαφορετικούς τύπους εικόνας και βίντεο, όπως SVGs, RAWs, πανοραμικές φωτογραφίες και βίντεο. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b10955ebc..16787f52d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -216,7 +216,7 @@ - Una galería para ver fotos y vídeos sin publicidad. + An offline gallery for managing your files without ads, respecting your privacy. Una galería altamente personalizable capaz de mostrar diferentes tipos de imágenes y videos, incluyendo SVG, RAW, fotos panorámicas y videos. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 0ebaef866..5575db260 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -216,7 +216,7 @@ - Galleria kuvien ja videoiden katsomiseen ilman mainoksia. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5af44b0a6..6f116a5cc 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -214,7 +214,7 @@ - Une galerie pour visionner photos et vidéos sans publicité. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 79e7592bc..919d02c66 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -216,7 +216,7 @@ - Unha galería para ver fotos e videos, pero non publicidade. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 8fee29889..b7452023b 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -216,7 +216,7 @@ - Galerija za gledanje fotografija i videozapisa bez oglasa. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index bdfeb0610..6734e0eb2 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -217,7 +217,7 @@ Ezzel csak a kiválasztott mappák láthatók, mivel a kizárás és a befoglal - Galéria a fotók és videók hirdetések nélküli megtekintéséhez. + An offline gallery for managing your files without ads, respecting your privacy. Nagyon testreszabható galéria, amely alkalmas számos különböző kép- és videotípus megjelenítésére, beleértve az SVG-ket, RAW-t, panorámaképeket és videókat. diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 319a68155..9bf419404 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -216,7 +216,7 @@ - Aplikasi galeri untuk melihat foto dan video tanpa iklan. + An offline gallery for managing your files without ads, respecting your privacy. Aplikasi galeri dengan banyak kustomisasi dan mampu menampilkan banyak jenis gambar dan video termasuk SVG, RAW, panorama foto dan video. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index fc126811d..f0baaa606 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -216,7 +216,7 @@ - Una galleria per visualizzare foto e video senza pubblicità. + An offline gallery for managing your files without ads, respecting your privacy. Una galleria altamente personalizzabile e capace di visualizzare tipi di file immagini e video differenti, fra cui SVG, RAW, foto panoramiche e video. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 397e4e88f..635c0759c 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -216,7 +216,7 @@ - 写真やビデオを見るためのギャラリー。広告はありません。 + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index aef49c472..440a533b6 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -216,7 +216,7 @@ - 광고없이 사진과 동영상을 볼 수 있는 갤러리. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index d791865cf..bdaefa6bb 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -216,7 +216,7 @@ - Galerija, skirta peržiūrėti nuotraukas ir vaizdo įrašus be reklamų. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 6b42ebde8..04ff031ca 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -216,7 +216,7 @@ - A gallery for viewing photos and videos without ads. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index df6819783..fa2c344d2 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -216,7 +216,7 @@ - Een galerij voor afbeeldingen en video\'s, zonder advertenties. + An offline gallery for managing your files without ads, respecting your privacy. Een zeer goed aan te passen galerij voor afbeeldingen en video\'s in vele bestandsformaten, waaronder SVG, RAW, panoramafoto\'s en -video\'s. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b7ad4a389..fa1b6654f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -214,7 +214,7 @@ - Prosta galeria bez reklam do przeglądania obrazów i filmów. + An offline gallery for managing your files without ads, respecting your privacy. Wysoce konfigurowalna galeria obsługująca wiele formatów obrazów i filmów, w tym SVG, RAW oraz multimedia panoramiczne. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index cb971ca18..cb3587889 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -216,7 +216,7 @@ - Um aplicativo para visualizar fotos e vídeos. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index bff249a51..c3932e292 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -216,7 +216,7 @@ - Uma aplicação para ver fotografias e vídeos. + An offline gallery for managing your files without ads, respecting your privacy. Um aplicação capaz de mostrar diversos tipos de imagens e vídeos incluíndo SVG, RAW, fotos panorâmicas e vídeos. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b2f1c0ec2..3541f561f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -216,7 +216,7 @@ - Галерея для просмотра изображений и видео. Без рекламы. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index f6592eb1d..4dd2727b4 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -216,7 +216,7 @@ - Galéria na prezeranie obrázkov a videí bez reklám. + Offline galéria na správu vašich súborov, rešpektujúca vaše súkromie. Nastaviteľná galéria na zobrazovanie množstva rozličných druhov obrázkov a videí, vrátane SVG, RAW súborov, panoramatických fotiek a videí. diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index e8b8941e8..fe0e6a3f4 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -215,7 +215,7 @@ Lahko uporabite funkcijo \"Začasno prikaži skrite elemente\", ki se nahaja v meniju na glavnem zaslonu ali preklopite \"Prikaži skrite elemente\" v Nastavitvah aplikacije. Če želite element označiti kot viden, z dolgim pritiskom nanj prikličite meni in izberite \"Prikaži\". Skrivanje map deluje tako, da se kreira prazno \".nomedia\" datoteko v izbrani mapi, ki jo lahko odstranite tudi s katerimkoli urejevalnikom datotek. - Galerija za ogled fotografij in videoposnetkov brez reklam. + An offline gallery for managing your files without ads, respecting your privacy. Visoko prilagodljiva galerija, zmožna prikazovanja različnih tipov fotografij in videoposnetkov, vključno s SVGji, RAWi, panoramskimi fotografijami in videoposnetki. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 45da7bafb..bfa6dc3dc 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -216,7 +216,7 @@ - Ett galleri för att visa foton och videor utan reklam. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 33bdcfecb..bbd08e2fe 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -216,7 +216,7 @@ - Reklamsız fotoğrafları ve videoları görüntülemek için bir galeri. + An offline gallery for managing your files without ads, respecting your privacy. SVG\'ler, RAW\'lar, panoramik fotoğraflar ve videolar dahil olmak üzere birçok farklı resim ve video türünü gösterebilen son derece özelleştirilebilir bir galeri. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 24bd7ead0..75fa7f8a1 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -216,7 +216,7 @@ - Галерея для перегляду фото та відео без реклами. + An offline gallery for managing your files without ads, respecting your privacy. Тонко налаштовувана галерея, здатна відображати зображення та відео різноманітних типів, включаючи SVG-зображення, RAW-зображення,панорамні фото і відео. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 33d3c38b8..a266a88de 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -214,7 +214,7 @@ - 一个没有广告,用来观看照片及视频的相册。 + An offline gallery for managing your files without ads, respecting your privacy. 一个高度可定制的图库,支持很多的图像和视频类型,包括SVG,RAW,全景照片和视频。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d6304564d..38c167249 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -216,7 +216,7 @@ - 一個用來瀏覽相片和影片,且沒有廣告的相簿。 + An offline gallery for managing your files without ads, respecting your privacy. 一個高自訂性的相簿,能夠顯示許多不同的圖片和影片類型,包含SVGs、RAWs、全景相片和影片。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 808d89d8b..158b684ee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -216,7 +216,7 @@ - A gallery for viewing photos and videos without ads. + An offline gallery for managing your files without ads, respecting your privacy. A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. From 2e4e40747067a5e3090be2b75509c5419facb1db Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 30 Dec 2018 00:11:52 +0100 Subject: [PATCH 30/69] fix the predefined list of folders to scan --- .../com/simplemobiletools/gallery/pro/helpers/Config.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 5956bf22f..6613ad70c 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 @@ -400,8 +400,10 @@ class Config(context: Context) : BaseConfig(context) { fun getEverShownFolders() = hashSetOf( internalStoragePath, - Environment.DIRECTORY_DCIM, - Environment.DIRECTORY_PICTURES + 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" ) var showRecycleBinAtFolders: Boolean From d7cbcc11d7f48c5b18c6e3e915b6003dcda3c749 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Sun, 30 Dec 2018 03:47:41 +0100 Subject: [PATCH 31/69] Dutch --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fa2c344d2..7c16e56d8 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -216,7 +216,7 @@ - An offline gallery for managing your files without ads, respecting your privacy. + Een offline galerij voor afbeeldingen en video\'s, zonder advertenties, die uw privacy waarborgt. Een zeer goed aan te passen galerij voor afbeeldingen en video\'s in vele bestandsformaten, waaronder SVG, RAW, panoramafoto\'s en -video\'s. From b03025dd0e5e049be8a72bce67eae629d8b8edb7 Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Sun, 30 Dec 2018 15:31:11 +0000 Subject: [PATCH 32/69] Improve italian translation (1) --- app/src/main/res/values-it/strings.xml | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f0baaa606..d04acc9fa 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,6 +1,6 @@ - Simple Gallery + Semplice Galleria Galleria Modifica Apri fotocamera @@ -29,38 +29,38 @@ Forza orizzontale Usa l\'orientamento predefinito Correggi valore Data acquisizione - Correzione… + Correzione in corso… Date aggiornate correttamente - Filtra i media + Filtra i file Immagini Video GIF Immagini RAW SVG - Nessun file trovato per il filtro selezionato. + Nessun file trovato con il filtro selezionato. Cambia filtro - Questa funzione nasconde la cartella aggiungendo un file \'.nomedia\' all\'interno, nasconderà anche tutte le sottocartelle. Puoi vederle attivando l\'opzione \'Mostra cartelle nascoste\' nelle impostazioni. Continuare? + Questa funzione nasconde la cartella aggiungendo un file \'.nomedia\' all\'interno, nasconderà anche tutte le sottocartelle. Si possono vedere attivando l\'opzione \'Mostra cartelle nascoste\' nelle impostazioni. Continuare? Escludi Cartelle escluse Gestisci le cartelle escluse - Questo escluderà la selezione e le relative sottocartelle solo da Simple Gallery. Puoi gestire le cartelle escluse nelle impostazioni. + Questo escluderà la selezione e le relative sottocartelle solo da Semplice Galleria. Si possono gestire le cartelle escluse nelle impostazioni. Vuoi invece escluderne una superiore? - L\'esclusione delle cartelle e delle sottocartelle le renderà nascoste solo in Simple Gallery, saranno ancora visibili in altre applicazioni.\\n\\nSe desideri nasconderle anche nelle altre app, usa la funzione Nascondi. + L\'esclusione delle cartelle e delle sottocartelle le renderà nascoste solo in Semplice Galleria, saranno ancora visibili in altre applicazioni.\\n\\nSe si desidera nasconderle anche nelle altre app, usa la funzione Nascondi. Rimuovi tutte Rimuovere tutte le cartelle dalla lista delle esclusioni? Ciò non eliminerà le cartelle. Cartelle nascoste Gestisci le cartelle nascoste - Pare che tu non abbia alcuna cartella nascosta con un file \".nomedia\". + Non si ha alcuna cartella nascosta con un file \".nomedia\". Includi cartelle Gestisci le cartelle incluse Aggiungi cartella - Se hai alcune cartelle che contengono media, ma non sono state riconosciute dall\'app, puoi aggiungerle manualmente qui. + Se si hanno alcune cartelle che contengono media, ma non sono state riconosciute dall\'app, si possono aggiungerle manualmente qui. Ridimensiona @@ -75,11 +75,11 @@ Salva Ruota Percorso - Percorso immagine non valido - Modifica immagine fallita + Percorso dell\'immagine non valido + Modifica dell\'immagine fallita Modifica immagine con: - Editor immagini non trovato - Posizione file sconosciuta + Editor delle immagini non trovato + Posizione del file sconosciuta Impossibile sovrascrivere il file originale Ruota a sinistra Ruota a destra @@ -137,7 +137,7 @@ Mostra il nome della cartella - Riproduci i video automaticamente + Riproduci automaticamente i video Ricorda l\'ultimo stato di riproduzione dei video Visibilità nome del file Ripeti i video @@ -149,9 +149,9 @@ Impostazione di sistema Rotazione dispositivo Proporzioni - Sfondo e barra di stato neri con media a schermo intero + Sfondo e barra di stato neri con i file a schermo intero Scorri le miniature orizzontalmente - Nascondi UI di sistema con media a schermo intero + Nascondi l\'interfaccia utente di sistema con i file a schermo intero Elimina cartelle vuote dopo averne eliminato il contenuto Controlla la luminosità delle foto con gesti verticali Gestisci il volume e la luminosità dei video con gesti verticali @@ -183,19 +183,19 @@ Attiva / disattiva la visibilità dei file - Come posso impostare Simple Gallery come galleria predefinita del dispositivo? - Prima devi trovare l\'attuale galleria predefinita nella sezione App delle impostazioni di sistema, cerca un pulsante che dice qualcosa come \"App predefinite\", cliccalo, poi seleziona \"Ripristina predefiniti\". - La prossima volta che proverai ad aprire un\'immagine o video dovresti vedere un selettore di app, dove puoi scegliere Simple Gallery e renderla l\'app predefinita. + Come posso impostare Semplice Galleria come la galleria predefinita del dispositivo? + Si deve prima trovare l\'attuale galleria predefinita nella sezione App delle impostazioni di sistema, cercare un pulsante che dice qualcosa come \"App predefinite\", cliccarlo e poi selezionare \"Ripristina predefiniti\". + La prossima volta che proverai ad aprire un\'immagine o video si dovrebbe vedere un selettore di app, dove si può scegliere Semplice Galleria e renderla l\'app predefinita. Ho bloccato l\'app con una password, ma l\'ho dimenticata. Cosa posso fare? - Puoi risolvere in 2 modi. Puoi reinstallare l\'app, oppure trova l\'app nelle impostazioni del dispositivo e seleziona \"Cancella dati\". Tutte le impostazioni verranno ripristinate, nessun file multimediale verrà rimosso. + Si può risolvere in 2 modi: reinstallare l\'app, oppure trovare l\'app nelle impostazioni del dispositivo e seleziona \"Cancella dati\". Tutte le impostazioni verranno ripristinate, nessun file verrà rimosso. Come posso fare apparire un album sempre in cima? - Puoi toccare a lungo l\'album desiderato e selezionare l\'icona puntina nel menù azioni, ciò lo fisserà in cima. Puoi anche fissare varie cartelle, gli elementi fissati verranno ordinati dal metodo di ordinamento predefinito. + Si può toccare a lungo l\'album desiderato e selezionare l\'icona puntina nel menù azioni, ciò lo fisserà in cima. Si possono anche fissare varie cartelle, gli elementi fissati saranno ordinati dal metodo di ordinamento predefinito. Come avanzo velocemente nei video? - Puoi cliccare sui testi di durata attuale o massima vicino alla barra di avanzamento, ciò avanzerà o riavvolgerà il video. + Si può cliccare sui testi di durata attuale o massima vicino alla barra di avanzamento, ciò avanzerà o riavvolgerà il video. Che differenza c\'è tra nascondere ed escludere una cartella? - Escludere impedisce la visualizzazione della cartella solo in Simple Gallery, mentre nascondere ha effetto in tutto il sistema e nasconde la cartella anche alle altre gallerie. Funziona creando un file vuoto \".nomedia\" nella cartella in questione, che puoi anche rimuovere successivamente con qualsiasi gestore di file. + Escludere impedisce la visualizzazione della cartella solo in Semplice Galleria, mentre nascondere ha effetto in tutto il sistema e nasconde la cartella anche alle altre gallerie. Funziona creando un file vuoto \".nomedia\" nella cartella in questione, si possono anche rimuovere successivamente con qualsiasi gestore dei file. Perchè vengono mostrate cartelle con copertine o adesivi di musica? - Può succedere che tu veda apparire alcuni album insoliti. Puoi escluderli facilmente toccandoli a lungo e selezionando Escludi. Nella finestra successiva puoi quindi selezionare la cartella superiore, con la possibilità di impedire la visualizzazione anche di altri album correlati. + Può succedere che si vedano apparire alcuni album insoliti. Si possono escluderli facilmente toccandoli a lungo e selezionando Escludi. Nella finestra successiva si possono quindi selezionare la cartella superiore, con la possibilità di impedire la visualizzazione anche di altri album correlati. Una cartella con immagini non viene mostrata, cosa posso fare? Può succedere per vari motivi, ma la soluzione è semplice. Vai in Impostazioni -> Gestisci le cartelle incluse, tocca il tasto Più e naviga verso la cartella desiderata. Che fare se voglio rendere visibili solo poche particolari cartelle? From 88dd85833b87bd1ed0785f76cb44ea52912fdac3 Mon Sep 17 00:00:00 2001 From: fricyo <30796677+fricyo@users.noreply.github.com> Date: Mon, 31 Dec 2018 00:06:51 +0800 Subject: [PATCH 33/69] Update Translation --- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 38c167249..08c7be32b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -216,7 +216,7 @@ - An offline gallery for managing your files without ads, respecting your privacy. + 一個沒有廣告的離線相簿,用來管理你的檔案,並且尊重您的隱私。 一個高自訂性的相簿,能夠顯示許多不同的圖片和影片類型,包含SVGs、RAWs、全景相片和影片。 From 85281421f1abaec2c93fc8b6a5fd519c8916821e Mon Sep 17 00:00:00 2001 From: Guillaume Date: Sun, 30 Dec 2018 17:21:46 +0100 Subject: [PATCH 34/69] Dutch --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7c16e56d8..efab9aca5 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -216,7 +216,7 @@ - Een offline galerij voor afbeeldingen en video\'s, zonder advertenties, die uw privacy waarborgt. + Een privacyvriendelijke advertentievrije galerij voor afbeeldingen en video\'s. Een zeer goed aan te passen galerij voor afbeeldingen en video\'s in vele bestandsformaten, waaronder SVG, RAW, panoramafoto\'s en -video\'s. From dedad92a2ceae4cfb630b67b2d5b93d07d951036 Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Sun, 30 Dec 2018 20:10:19 +0000 Subject: [PATCH 35/69] Improve italian translation (2) --- app/src/main/res/values-it/strings.xml | 39 +++++++++++++------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d04acc9fa..67fdd4611 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -172,7 +172,7 @@ Chiudi la visuale a schermo intero con un gesto verso il basso - Miniature + Anteprime Media a schermo intero Dettagli estesi Azioni inferiori @@ -199,52 +199,53 @@ Una cartella con immagini non viene mostrata, cosa posso fare? Può succedere per vari motivi, ma la soluzione è semplice. Vai in Impostazioni -> Gestisci le cartelle incluse, tocca il tasto Più e naviga verso la cartella desiderata. Che fare se voglio rendere visibili solo poche particolari cartelle? - Aggiungere una cartella nelle Cartelle Incluse non esclude automaticamente nulla. Quello che puoi fare è andare in Impostazioni -> Gestisci le cartelle escluse, escludi la cartella root \"/\", poi aggiungi le cartelle desiderate in Impostazioni -> Gestisci le cartelle incluse. + Aggiungere una cartella nelle Cartelle Incluse non esclude automaticamente nulla. Quello che puoi fare è andare in Impostazioni → Gestisci le cartelle escluse, escludi la cartella root \"/\", poi aggiungi le cartelle desiderate in Impostazioni → Gestisci le cartelle incluse. Ciò renderà visibili solo le cartelle selezionate, dato che sia l\'esclusione che l\'inclusione sono ricorsive e se una cartella è sia esclusa che inclusa, verrà mostrata. Le immagini a schermo intero hanno strani artefatti, posso migliorarne la qualità in qualche modo? - Sì, c\'è un\'opzione nelle impostazioni che dice \"Sostituisci le immagini ingrandibili a fondo con altre di migliore qualità\", puoi usare quella. Ciò migliorerà la qualità delle immagini, ma saranno sfuocate quando proverai a ingrandirle troppo. + Sì, c\'è un\'opzione nelle impostazioni che dice \"Sostituisci le immagini ingrandibili a fondo con altre di migliore qualità\". Ciò migliorerà la qualità delle immagini, ma saranno sfuocate quando si proverà a ingrandirle troppo. Posso ritagliare le immagini con questa app? - Sì, puoi ritagliare le immagini nell\'editor, trascinando gli angoli dell\'immagine. Puoi usare l\'editor sia premendo a lungo la miniatura di un\'immagine e selezionando Modifica, o selezionando Modifica mentre la vedi a schermo intero. + Sì, si possono ritagliare le immagini nell\'editor, trascinando gli angoli dell\'immagine. Si può accedere all\'editor sia premendo a lungo la miniatura di un\'immagine e selezionando Modifica, oppure selezionando Modifica mentre si vede una foto a schermo intero. Posso raggruppare in qualche modo le miniature dei file? - Certo, usa il menu \"Raggruppa per\" mentre visualizzi le miniature. Puoi raggruppare i file con diversi criteri, incluso la data di creazione. Se utilizzi la funzione \"Mostra tutti i contenuti\" puoi anche raggrupparli per cartelle. + Certo, si può usare il menu \"Raggruppa per\" mentre si visualizzano le miniature. Il raggruppamento può avvenire per diversi criteri, incluso la data di creazione. Se si utilizza la funzione \"Mostra tutti i contenuti\" si può anche raggrupparli per cartelle. L\'ordinamento per data acquisizione sembra non funzionare bene, come posso risolvere? - Probabilmente è causato dai file copiati da altre parti. Puoi risolvere selezionando le miniature dei file e scegliendo \"Correggi valore Data acquisizione\". + Probabilmente è causato dai file copiati da altre parti. Si può risolvere selezionando le miniature dei file e scegliendo \"Correggi valore Data acquisizione\". Vedo curvature di colore nelle immagini. Come posso migliorarne la qualità? - L\'attuale soluzione per visualizzare immagini funziona bene nella maggior parte dei casi, ma se vuoi una qualità ancora maggiore, puoi attivare \"Mostra le immagini alla massima qualità possibile\" nelle impostazioni dell\'app, nella sezione \"Immagini ingrandibili a fondo\". + L\'attuale soluzione per visualizzare immagini funziona bene nella maggior parte dei casi, ma se si vuole una qualità ancora maggiore, si può attivare \"Mostra le immagini alla massima qualità possibile\" nelle impostazioni dell\'app, nella sezione \"Immagini ingrandibili a fondo\". Ho nascosto un file/una cartella. Come posso mostrarlo/a di nuovo? - Puoi premere \"Mostra temporaneamente nascosti\" nel menu della schermata principale, oppure attivare \"Mostra gli elementi nascosti\" nelle impostazioni dell\'app per vedere l\'elemento nascosto. Se vuoi che resti visibile, premilo a lungo e seleziona \"Non nascondere\". Le cartelle vengono nascoste aggiungendo un file nascosto \".nomedia\" all\'interno di esse, puoi anche eliminare il file con qualsiasi gestore di file. + Si può premere \"Mostra temporaneamente nascosti\" nel menu della schermata principale, oppure attivare \"Mostra gli elementi nascosti\" nelle impostazioni dell\'app per vedere l\'elemento nascosto. Per farla rimanere visibile, premere a lungo e selezionare \"Non nascondere\". Le cartelle vengono nascoste aggiungendo un file nascosto \".nomedia\" all\'interno di esse, si può eliminare il file con qualsiasi gestore di file. An offline gallery for managing your files without ads, respecting your privacy. + Una galleria per gestire i propri file senza pubblicità che rispetta la privacy. Una galleria altamente personalizzabile e capace di visualizzare tipi di file immagini e video differenti, fra cui SVG, RAW, foto panoramiche e video. - È open source, non contiene pubblicità e autorizzazioni superflue. + L\'applicazione non contiene pubblicità o permessi non necessari; è completamente opensource e la si può personalizzare con i propri colori preferiti. + Alcune funzionalità che vale la pena accennare: 1. Ricerca 2. Presentazione 3. Supporto al notch 4. Fissare le cartelle in alto - 5. Filtro dei file per tipo + 5. Filtro dei file per tipologia 6. Cestino per un recupero facile dei file 7. Blocco dell\'orientamento nella vista a schermo intero - 8. Selezionare file preferiti per un accesso facile - 9. Chisura rapida della vista schermo intero con un movimento verso il basso - 10. Un editor per modificare le immagini ed applicare filtri + 8. Selezione dei file preferiti per un accesso immediato + 9. Chisura rapida della vista a schermo intero con un movimento verso il basso + 10. Un editor per modificare le immagini e applicare filtri 11. Protezione con password per proteggere elementi nascosti o l\'intera applicazione 12. Cambio delle colonne delle anteprime con un movimento o tramite dei pulsanti nel menu - 13. Pulsanti rapidi per azioni personalizzabili nella vista schermo intero + 13. Pulsanti rapidi per azioni personalizzabili nella vista a schermo intero 14. Visualizzazione di determinati dettagli aggiuntivi nella vista a schermo intero 15. Molti modi per ordinare o raggruppare gli elementi, sia in ordine crescente che decrescente - 16. Cartelle nascoste (anche per altre applicazioni), cartelle escluse (solo per Simple Gallery) + 16. Cartelle nascoste (anche per altre applicazioni), cartelle escluse (solo per Semplice Galleria) - L\'autorizzazione per leggere le impronte digitali è necessaria per il blocco della visibilità degli elementi, dell\'intera applicazione o per proteggere alcuni file dalla loro eliminazione. - - Questa applicazione è solamente una di una serie più grande. Si possono trovare le altre su https://www.simplemobiletools.com + L\'autorizzazione per leggere le impronte digitali è necessaria per il blocco della visibilità, dell\'intera applicazione o per proteggere alcuni file dalla loro eliminazione. + + Questa è solamente una delle tante applicazioni della serie Simple Mobile Tools. Si possono trovare le altre su https://www.simplemobiletools.com - - An offline gallery for managing your files without ads, respecting your privacy. + Галерея для керування вашими файлами: без реклами, не потребує доступу в інтернет та поважає вашу приватність. Тонко налаштовувана галерея, здатна відображати зображення та відео різноманітних типів, включаючи SVG-зображення, RAW-зображення,панорамні фото і відео. From d40cb9d03024373f29922bda46934259f0d65822 Mon Sep 17 00:00:00 2001 From: sawka6630 Date: Mon, 31 Dec 2018 16:36:42 +0200 Subject: [PATCH 37/69] Update strings.xml --- app/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0fc6a8bd5..e8d0a3f17 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -216,7 +216,7 @@ - Галерея для керування вашими файлами: без реклами, не потребує доступу в інтернет та поважає вашу приватність. + Офлайн-галерея для керування файлами: без реклами та з повагою до приватності. Тонко налаштовувана галерея, здатна відображати зображення та відео різноманітних типів, включаючи SVG-зображення, RAW-зображення,панорамні фото і відео. From d126c05eb33f79ff3c58819c6699004984d7a2c0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 1 Jan 2019 11:42:16 +0100 Subject: [PATCH 38/69] updating a french string --- app/src/main/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6f116a5cc..89d4c2a6c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -144,7 +144,7 @@ GIFs animés sur les miniatures Luminosité maximale Recadrer les miniatures en carrés - Show video durations + Montrer la durée de la vidéo Pivoter l\'affichage selon Paramètres système Rotation de l\'appareil From d98b25e362502a8aff021dcbdc7217d753120f11 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 1 Jan 2019 12:11:07 +0100 Subject: [PATCH 39/69] update commons and constraintLayout --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a6838a220..b94058c33 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,12 +57,12 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.6.1' + implementation 'com.simplemobiletools:commons:5.6.2' 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' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3' implementation 'com.google.android.exoplayer:exoplayer-core:2.9.2' implementation 'com.google.vr:sdk-panowidget:1.180.0' implementation 'com.google.vr:sdk-videowidget:1.180.0' From 3277b95da32123f5d66e9839be158c2c94327488 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 1 Jan 2019 12:26:35 +0100 Subject: [PATCH 40/69] removing an extra italian string --- app/src/main/res/values-it/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 67fdd4611..ba7f48e3b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -216,7 +216,6 @@ - An offline gallery for managing your files without ads, respecting your privacy. Una galleria per gestire i propri file senza pubblicità che rispetta la privacy. Una galleria altamente personalizzabile e capace di visualizzare tipi di file immagini e video differenti, fra cui SVG, RAW, foto panoramiche e video. From 50dd2766c84a84ecab63cb61ade512410ed00c6a Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 13:24:23 +0100 Subject: [PATCH 41/69] adding the initial code for VideoPlayerActivity used for video playing --- app/src/main/AndroidManifest.xml | 4 + .../pro/activities/VideoPlayerActivity.kt | 131 ++++++++++++++++++ .../pro/activities/ViewPagerActivity.kt | 4 - .../main/res/layout/activity_video_player.xml | 19 +++ app/src/main/res/menu/menu_video_player.xml | 23 +++ 5 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt create mode 100644 app/src/main/res/layout/activity_video_player.xml create mode 100644 app/src/main/res/menu/menu_video_player.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b00e56d71..796be4754 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -122,6 +122,10 @@ android:name=".activities.PhotoVideoActivity" android:configChanges="orientation|keyboardHidden|screenSize"/> + + + val isFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0 + mFragment?.fullscreenToggled(isFullscreen) + } + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_video_player, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (mMedium == null || mUri == null) { + return true + } + + when (item.itemId) { + R.id.menu_force_portrait -> forceOrientation(true) + R.id.menu_force_landscape -> forceOrientation(false) + else -> return super.onOptionsItemSelected(item) + } + return true + } + + private fun forceOrientation(portrait: Boolean) { + + } + + override fun fragmentClicked() { + mIsFullScreen = !mIsFullScreen + if (mIsFullScreen) { + hideSystemUI(true) + } else { + showSystemUI(true) + } + + val newAlpha = if (mIsFullScreen) 0f else 1f + top_shadow.animate().alpha(newAlpha).start() + } + + override fun videoEnded() = false + + override fun goToPrevItem() {} + + override fun goToNextItem() {} +} 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 9c96ec30e..882a086cf 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 @@ -129,10 +129,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View setupRotation() invalidateOptionsMenu() - if (config.blackBackground) { - updateStatusbarColor(Color.BLACK) - } - supportActionBar?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) window.statusBarColor = Color.TRANSPARENT } diff --git a/app/src/main/res/layout/activity_video_player.xml b/app/src/main/res/layout/activity_video_player.xml new file mode 100644 index 000000000..8b5d7507e --- /dev/null +++ b/app/src/main/res/layout/activity_video_player.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/app/src/main/res/menu/menu_video_player.xml b/app/src/main/res/menu/menu_video_player.xml new file mode 100644 index 000000000..38daa699e --- /dev/null +++ b/app/src/main/res/menu/menu_video_player.xml @@ -0,0 +1,23 @@ + +

+ + + + + From 528dc06a1018cbe7acb1bbe1b7ed9aa1f6974b74 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 15:47:24 +0100 Subject: [PATCH 42/69] use just 1 orientation button at toggling orientation --- app/src/main/AndroidManifest.xml | 3 ++- .../gallery/pro/activities/VideoPlayerActivity.kt | 13 +++++++------ app/src/main/res/menu/menu_video_player.xml | 11 +++-------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 796be4754..8b41fb872 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -124,7 +124,8 @@ + android:configChanges="orientation|keyboardHidden|screenSize" + android:parentActivityName=".activities.MediaActivity"/> forceOrientation(true) - R.id.menu_force_landscape -> forceOrientation(false) + R.id.menu_change_orientation -> changeOrientation() else -> return super.onOptionsItemSelected(item) } return true } - private fun forceOrientation(portrait: Boolean) { - + private fun changeOrientation() { + requestedOrientation = if (resources.configuration.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + } else { + ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } } override fun fragmentClicked() { diff --git a/app/src/main/res/menu/menu_video_player.xml b/app/src/main/res/menu/menu_video_player.xml index 38daa699e..00e818ca3 100644 --- a/app/src/main/res/menu/menu_video_player.xml +++ b/app/src/main/res/menu/menu_video_player.xml @@ -2,14 +2,9 @@ - Date: Wed, 2 Jan 2019 15:50:44 +0100 Subject: [PATCH 43/69] correcting a settings string at some languages --- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 1a92fc124..e12e2ee27 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -149,7 +149,7 @@ System setting Device rotation Aspect ratio - Black background and status bar at fullscreen media + Black background and at fullscreen media Scroll thumbnails horizontally Automatically hide system UI at fullscreen media Delete empty folders after deleting their content diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 47124f75a..b27b77b50 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -149,7 +149,7 @@ Systémového nastavení Otočení zařízení Poměru stran - Černé pozadí a stavová lišta při médiích na celou obrazovku + Černé pozadí při médiích na celou obrazovku Prohlížet miniatury vodorovně Automaticky skrývat systémové lišty při celoobrazovkových médiích Odstranit prázdné složky po smazání jejich obsahu diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6734e0eb2..0d2833293 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -150,7 +150,7 @@ Rendszer beállítások Eszköz elforgatás Képarány - Fekete háttérszín és állapotsáv teljes képernyős médiánál + Fekete háttérszín teljes képernyős médiánál Miniatűrök görgetése vízszintesen Automatikusan elrejti a rendszer UI-t teljes képernyőn Az üres mappák törlése a tartalom törlése után diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 4dd2727b4..604d715f8 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -149,7 +149,7 @@ Systémového nastavenia Otočenia zariadenia Pomeru strán - Čierne pozadie a stavová lišta pri médiách na celú obrazovku + Čierne pozadie pri médiách na celú obrazovku Prehliadať miniatúry vodorovne Automaticky skrývať systémové lišty pri celoobrazovkových médiách Odstrániť prázdne priečinky po vymazaní ich obsahu diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 158b684ee..6fa8f41a3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -149,7 +149,7 @@ System setting Device rotation Aspect ratio - Black background and status bar at fullscreen media + Black background and at fullscreen media Scroll thumbnails horizontally Automatically hide system UI at fullscreen media Delete empty folders after deleting their content From 5b14e0dd08daca9d0b23348624541b63ee56a00c Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 16:26:28 +0100 Subject: [PATCH 44/69] adding a couple new things to VideoPlayerActivity --- .../pro/activities/VideoPlayerActivity.kt | 114 +++++++++++------- .../main/res/layout/activity_video_player.xml | 44 ++++++- .../res/layout/bottom_video_time_holder.xml | 3 +- 3 files changed, 112 insertions(+), 49 deletions(-) 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 19ccea60f..f90599354 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 @@ -1,33 +1,30 @@ package com.simplemobiletools.gallery.pro.activities import android.content.pm.ActivityInfo +import android.content.res.Configuration import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Bundle +import android.util.DisplayMetrics import android.view.Menu import android.view.MenuItem import android.view.View import android.view.WindowManager +import android.widget.SeekBar +import com.simplemobiletools.commons.extensions.beInvisibleIf import com.simplemobiletools.commons.extensions.getFilenameFromUri -import com.simplemobiletools.commons.extensions.getParentPath import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.isPiePlus import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.* -import com.simplemobiletools.gallery.pro.fragments.VideoFragment -import com.simplemobiletools.gallery.pro.fragments.ViewPagerFragment -import com.simplemobiletools.gallery.pro.helpers.MEDIUM -import com.simplemobiletools.gallery.pro.helpers.TYPE_VIDEOS -import com.simplemobiletools.gallery.pro.models.Medium import kotlinx.android.synthetic.main.activity_video_player.* -import java.io.File +import kotlinx.android.synthetic.main.bottom_video_time_holder.* -open class VideoPlayerActivity : SimpleActivity(), ViewPagerFragment.FragmentListener { - private var mMedium: Medium? = null - private var mIsFullScreen = false - private var mFragment: ViewPagerFragment? = null +open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener { + private var mIsFullscreen = false private var mUri: Uri? = null public override fun onCreate(savedInstanceState: Bundle?) { @@ -36,7 +33,7 @@ open class VideoPlayerActivity : SimpleActivity(), ViewPagerFragment.FragmentLis handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { - checkIntent(savedInstanceState) + initPlayer() } else { toast(R.string.no_storage_permissions) finish() @@ -50,11 +47,16 @@ open class VideoPlayerActivity : SimpleActivity(), ViewPagerFragment.FragmentLis supportActionBar?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) window.statusBarColor = Color.TRANSPARENT window.navigationBarColor = Color.TRANSPARENT + if (config.blackBackground) { + video_player_holder.background = ColorDrawable(Color.BLACK) + } + initTimeHolder() + updateTextColors(video_player_holder) } - private fun checkIntent(savedInstanceState: Bundle? = null) { + private fun initPlayer() { mUri = intent.data ?: return - val filename = getFilenameFromUri(mUri!!) + supportActionBar?.title = getFilenameFromUri(mUri!!) if (isPiePlus()) { window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES @@ -62,28 +64,16 @@ open class VideoPlayerActivity : SimpleActivity(), ViewPagerFragment.FragmentLis } showSystemUI(true) - val bundle = Bundle() - val file = File(mUri.toString()) - val type = TYPE_VIDEOS - - mMedium = Medium(null, filename, mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type, 0, false, 0L) - supportActionBar?.title = mMedium!!.name - bundle.putSerializable(MEDIUM, mMedium) - - if (savedInstanceState == null) { - mFragment = VideoFragment() - mFragment!!.listener = this - mFragment!!.arguments = bundle - supportFragmentManager.beginTransaction().replace(R.id.fragment_placeholder, mFragment!!).commit() - } - - if (config.blackBackground) { - fragment_holder.background = ColorDrawable(Color.BLACK) - } - window.decorView.setOnSystemUiVisibilityChangeListener { visibility -> val isFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0 - mFragment?.fullscreenToggled(isFullscreen) + fullscreenToggled(isFullscreen) + } + + video_curr_time.setOnClickListener { skip(false) } + video_duration.setOnClickListener { skip(true) } + video_seekbar.setOnClickListener { } + video_player_holder.setOnClickListener { + fullscreenToggled(!mIsFullscreen) } } @@ -93,7 +83,7 @@ open class VideoPlayerActivity : SimpleActivity(), ViewPagerFragment.FragmentLis } override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (mMedium == null || mUri == null) { + if (mUri == null) { return true } @@ -112,21 +102,61 @@ open class VideoPlayerActivity : SimpleActivity(), ViewPagerFragment.FragmentLis } } - override fun fragmentClicked() { - mIsFullScreen = !mIsFullScreen - if (mIsFullScreen) { + private fun fullscreenToggled(isFullScreen: Boolean) { + mIsFullscreen = isFullScreen + if (isFullScreen) { hideSystemUI(true) } else { showSystemUI(true) } - val newAlpha = if (mIsFullScreen) 0f else 1f + val newAlpha = if (isFullScreen) 0f else 1f top_shadow.animate().alpha(newAlpha).start() + video_time_holder.animate().alpha(newAlpha).start() } - override fun videoEnded() = false + private fun initTimeHolder() { + val left = 0 + val top = 0 + var right = 0 + var bottom = 0 - override fun goToPrevItem() {} + if (hasNavBar()) { + if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { + bottom += navigationBarHeight + } else { + right += navigationBarWidth + bottom += navigationBarHeight + } + } - override fun goToNextItem() {} + video_time_holder.setPadding(left, top, right, bottom) + video_seekbar.setOnSeekBarChangeListener(this) + video_time_holder.beInvisibleIf(mIsFullscreen) + } + + private fun hasNavBar(): Boolean { + val display = windowManager.defaultDisplay + + val realDisplayMetrics = DisplayMetrics() + display.getRealMetrics(realDisplayMetrics) + + val displayMetrics = DisplayMetrics() + display.getMetrics(displayMetrics) + + return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels > 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels > 0) + } + + private fun skip(forward: Boolean) { + + } + + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + } } diff --git a/app/src/main/res/layout/activity_video_player.xml b/app/src/main/res/layout/activity_video_player.xml index 8b5d7507e..8a0efeeb3 100644 --- a/app/src/main/res/layout/activity_video_player.xml +++ b/app/src/main/res/layout/activity_video_player.xml @@ -1,19 +1,51 @@ - - + + + + + + + + + + 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 cdf1e0c53..5862ced48 100644 --- a/app/src/main/res/layout/bottom_video_time_holder.xml +++ b/app/src/main/res/layout/bottom_video_time_holder.xml @@ -5,7 +5,8 @@ android:id="@+id/video_time_holder" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentBottom="true"> + android:layout_alignParentBottom="true" + android:background="@drawable/gradient_background"> Date: Wed, 2 Jan 2019 16:34:03 +0100 Subject: [PATCH 45/69] allow closing VideoPlayerActivity with Down gestures --- .../pro/activities/VideoPlayerActivity.kt | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) 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 f90599354..41285d25b 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 @@ -7,10 +7,7 @@ import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Bundle import android.util.DisplayMetrics -import android.view.Menu -import android.view.MenuItem -import android.view.View -import android.view.WindowManager +import android.view.* import android.widget.SeekBar import com.simplemobiletools.commons.extensions.beInvisibleIf import com.simplemobiletools.commons.extensions.getFilenameFromUri @@ -27,6 +24,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen private var mIsFullscreen = false private var mUri: Uri? = null + private var mTouchDownX = 0f + private var mTouchDownY = 0f + private var mCloseDownThreshold = 100f + private var mIgnoreCloseDown = false + public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_video_player) @@ -75,6 +77,13 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_player_holder.setOnClickListener { fullscreenToggled(!mIsFullscreen) } + + if (config.allowDownGesture) { + video_player_holder.setOnTouchListener { v, event -> + handleEvent(event) + false + } + } } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -151,6 +160,25 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } + private fun handleEvent(event: MotionEvent) { + when (event.actionMasked) { + MotionEvent.ACTION_DOWN -> { + mTouchDownX = event.x + mTouchDownY = event.y + } + MotionEvent.ACTION_POINTER_DOWN -> mIgnoreCloseDown = true + MotionEvent.ACTION_UP -> { + val diffX = mTouchDownX - event.x + val diffY = mTouchDownY - event.y + + if (!mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold) { + supportFinishAfterTransition() + } + mIgnoreCloseDown = false + } + } + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { } From 8e3c0b23e267c19f1cd38b5eb12afeed7f84074b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 16:47:30 +0100 Subject: [PATCH 46/69] adding some video duration related things --- .../pro/activities/VideoPlayerActivity.kt | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) 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 41285d25b..0523cd742 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 @@ -9,10 +9,7 @@ import android.os.Bundle import android.util.DisplayMetrics import android.view.* import android.widget.SeekBar -import com.simplemobiletools.commons.extensions.beInvisibleIf -import com.simplemobiletools.commons.extensions.getFilenameFromUri -import com.simplemobiletools.commons.extensions.toast -import com.simplemobiletools.commons.extensions.updateTextColors +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.isPiePlus import com.simplemobiletools.gallery.pro.R @@ -22,6 +19,9 @@ import kotlinx.android.synthetic.main.bottom_video_time_holder.* open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener { private var mIsFullscreen = false + private var mCurrTime = 0 + private var mDuration = 0 + private var mUri: Uri? = null private var mTouchDownX = 0f @@ -52,13 +52,13 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen if (config.blackBackground) { video_player_holder.background = ColorDrawable(Color.BLACK) } - initTimeHolder() updateTextColors(video_player_holder) } private fun initPlayer() { mUri = intent.data ?: return supportActionBar?.title = getFilenameFromUri(mUri!!) + initTimeHolder() if (isPiePlus()) { window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES @@ -71,9 +71,10 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen fullscreenToggled(isFullscreen) } + // adding an empty click listener just to avoid ripple animation at toggling fullscreen + video_seekbar.setOnClickListener { } video_curr_time.setOnClickListener { skip(false) } video_duration.setOnClickListener { skip(true) } - video_seekbar.setOnClickListener { } video_player_holder.setOnClickListener { fullscreenToggled(!mIsFullscreen) } @@ -125,8 +126,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } private fun initTimeHolder() { - val left = 0 - val top = 0 var right = 0 var bottom = 0 @@ -139,9 +138,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } } - video_time_holder.setPadding(left, top, right, bottom) + video_time_holder.setPadding(0, 0, right, bottom) video_seekbar.setOnSeekBarChangeListener(this) + video_seekbar!!.max = mDuration video_time_holder.beInvisibleIf(mIsFullscreen) + video_duration.text = mDuration.getFormattedDuration() + video_curr_time.text = mCurrTime.getFormattedDuration() } private fun hasNavBar(): Boolean { From 00b470b01238651f9ed5dc4041437900a8cc7ab1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 17:08:20 +0100 Subject: [PATCH 47/69] adding some video player initialization code --- .../pro/activities/VideoPlayerActivity.kt | 151 ++++++++++++++++-- .../gallery/pro/fragments/VideoFragment.kt | 4 - 2 files changed, 139 insertions(+), 16 deletions(-) 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 0523cd742..ca5f3f129 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 @@ -3,12 +3,23 @@ package com.simplemobiletools.gallery.pro.activities import android.content.pm.ActivityInfo import android.content.res.Configuration import android.graphics.Color +import android.graphics.Point +import android.graphics.SurfaceTexture import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Bundle import android.util.DisplayMetrics import android.view.* import android.widget.SeekBar +import com.google.android.exoplayer2.* +import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory +import com.google.android.exoplayer2.source.ExtractorMediaSource +import com.google.android.exoplayer2.source.TrackGroupArray +import com.google.android.exoplayer2.trackselection.TrackSelectionArray +import com.google.android.exoplayer2.upstream.ContentDataSource +import com.google.android.exoplayer2.upstream.DataSource +import com.google.android.exoplayer2.upstream.DataSpec +import com.google.android.exoplayer2.video.VideoListener import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.isPiePlus @@ -17,12 +28,14 @@ import com.simplemobiletools.gallery.pro.extensions.* import kotlinx.android.synthetic.main.activity_video_player.* import kotlinx.android.synthetic.main.bottom_video_time_holder.* -open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener { +open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener, TextureView.SurfaceTextureListener { private var mIsFullscreen = false private var mCurrTime = 0 private var mDuration = 0 + private var mVideoSize = Point(0, 0) private var mUri: Uri? = null + private var mExoPlayer: SimpleExoPlayer? = null private var mTouchDownX = 0f private var mTouchDownY = 0f @@ -55,6 +68,19 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen updateTextColors(video_player_holder) } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_video_player, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.menu_change_orientation -> changeOrientation() + else -> return super.onOptionsItemSelected(item) + } + return true + } + private fun initPlayer() { mUri = intent.data ?: return supportActionBar?.title = getFilenameFromUri(mUri!!) @@ -85,23 +111,110 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen false } } + + initExoPlayer() + video_surface.surfaceTextureListener = this + video_surface.setOnClickListener { + fullscreenToggled(!mIsFullscreen) + } } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_video_player, menu) - return true + private fun initExoPlayer() { + val dataSpec = DataSpec(mUri) + val fileDataSource = ContentDataSource(applicationContext) + try { + fileDataSource.open(dataSpec) + } catch (e: Exception) { + showErrorToast(e) + } + + val factory = DataSource.Factory { fileDataSource } + val audioSource = ExtractorMediaSource(fileDataSource.uri, factory, DefaultExtractorsFactory(), null, null) + mExoPlayer = ExoPlayerFactory.newSimpleInstance(applicationContext) + mExoPlayer!!.seekParameters = SeekParameters.CLOSEST_SYNC + mExoPlayer!!.audioStreamType = C.STREAM_TYPE_MUSIC + mExoPlayer!!.prepare(audioSource) + initExoPlayerListeners() } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (mUri == null) { - return true - } + private fun initExoPlayerListeners() { + mExoPlayer!!.addListener(object : Player.EventListener { + override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {} - when (item.itemId) { - R.id.menu_change_orientation -> changeOrientation() - else -> return super.onOptionsItemSelected(item) + override fun onSeekProcessed() {} + + override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {} + + override fun onPlayerError(error: ExoPlaybackException?) {} + + override fun onLoadingChanged(isLoading: Boolean) {} + + override fun onPositionDiscontinuity(reason: Int) {} + + override fun onRepeatModeChanged(repeatMode: Int) {} + + override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {} + + override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {} + + override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { + when (playbackState) { + Player.STATE_READY -> videoPrepared() + Player.STATE_ENDED -> videoCompleted() + } + } + }) + + mExoPlayer!!.addVideoListener(object : VideoListener { + override fun onVideoSizeChanged(width: Int, height: Int, unappliedRotationDegrees: Int, pixelWidthHeightRatio: Float) { + mVideoSize.x = width + mVideoSize.y = height + setVideoSize() + } + + override fun onRenderedFirstFrame() {} + }) + } + + private fun videoPrepared() { + mDuration = (mExoPlayer!!.duration / 1000).toInt() + video_duration.text = mDuration.getFormattedDuration() + setPosition(mCurrTime) + } + + private fun setPosition(seconds: Int) { + mExoPlayer?.seekTo(seconds * 1000L) + video_seekbar.progress = seconds + video_curr_time.text = seconds.getFormattedDuration() + } + + private fun videoCompleted() { + + } + + private fun setVideoSize() { + val videoProportion = mVideoSize.x.toFloat() / mVideoSize.y.toFloat() + val display = windowManager.defaultDisplay + val screenWidth: Int + val screenHeight: Int + + val realMetrics = DisplayMetrics() + display.getRealMetrics(realMetrics) + screenWidth = realMetrics.widthPixels + screenHeight = realMetrics.heightPixels + + val screenProportion = screenWidth.toFloat() / screenHeight.toFloat() + + video_surface.layoutParams.apply { + if (videoProportion > screenProportion) { + width = screenWidth + height = (screenWidth.toFloat() / videoProportion).toInt() + } else { + width = (videoProportion * screenHeight.toFloat()).toInt() + height = screenHeight + } + video_surface.layoutParams = this } - return true } private fun changeOrientation() { @@ -189,4 +302,18 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen override fun onStopTrackingTouch(seekBar: SeekBar?) { } + + override fun onSurfaceTextureUpdated(surface: SurfaceTexture?) { + } + + override fun onSurfaceTextureDestroyed(surface: SurfaceTexture?) = false + + override fun onSurfaceTextureAvailable(surface: SurfaceTexture?, width: Int, height: Int) { + Thread { + mExoPlayer?.setVideoSurface(Surface(video_surface!!.surfaceTexture)) + }.start() + } + + override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) { + } } 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 5d28ff477..e79ea6774 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 @@ -17,7 +17,6 @@ import com.google.android.exoplayer2.* import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory import com.google.android.exoplayer2.source.ExtractorMediaSource import com.google.android.exoplayer2.source.TrackGroupArray -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.trackselection.TrackSelectionArray import com.google.android.exoplayer2.upstream.ContentDataSource import com.google.android.exoplayer2.upstream.DataSource @@ -56,7 +55,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S private var mIsFullscreen = false private var mIsFragmentVisible = false private var mWasFragmentInit = false - private var mIsExoPlayerInitialized = false private var mIsPanorama = false private var mWasVideoStarted = false private var mCurrTime = 0 @@ -305,7 +303,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {} override fun onPlayerError(error: ExoPlaybackException?) { - mIsExoPlayerInitialized = false } override fun onLoadingChanged(isLoading: Boolean) {} @@ -319,7 +316,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {} override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { - mIsExoPlayerInitialized = playbackState == Player.STATE_READY || playbackState == Player.STATE_ENDED when (playbackState) { Player.STATE_READY -> videoPrepared() Player.STATE_ENDED -> videoCompleted() From 08cf0a900527ec9702ddc13d4fb1d0f20b64f57f Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 17:38:58 +0100 Subject: [PATCH 48/69] implementing some exoplayer initialization --- .../pro/activities/VideoPlayerActivity.kt | 129 +++++++++++++++++- 1 file changed, 126 insertions(+), 3 deletions(-) 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 ca5f3f129..584b962b8 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 @@ -8,6 +8,7 @@ import android.graphics.SurfaceTexture import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Bundle +import android.os.Handler import android.util.DisplayMetrics import android.view.* import android.widget.SeekBar @@ -25,17 +26,22 @@ import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.isPiePlus import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.* +import com.simplemobiletools.gallery.pro.helpers.MIN_SKIP_LENGTH import kotlinx.android.synthetic.main.activity_video_player.* import kotlinx.android.synthetic.main.bottom_video_time_holder.* open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener, TextureView.SurfaceTextureListener { private var mIsFullscreen = false + private var mIsPlaying = false + private var mWasVideoStarted = false + private var mIsDragged = false private var mCurrTime = 0 private var mDuration = 0 private var mVideoSize = Point(0, 0) private var mUri: Uri? = null private var mExoPlayer: SimpleExoPlayer? = null + private var mTimerHandler = Handler() private var mTouchDownX = 0f private var mTouchDownY = 0f @@ -68,6 +74,18 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen updateTextColors(video_player_holder) } + override fun onPause() { + super.onPause() + pauseVideo() + } + + override fun onDestroy() { + super.onDestroy() + if (!isChangingConfigurations) { + cleanup() + } + } + override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_video_player, menu) return true @@ -177,9 +195,51 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } private fun videoPrepared() { - mDuration = (mExoPlayer!!.duration / 1000).toInt() - video_duration.text = mDuration.getFormattedDuration() - setPosition(mCurrTime) + if (!mWasVideoStarted) { + mDuration = (mExoPlayer!!.duration / 1000).toInt() + video_seekbar.max = mDuration + video_duration.text = mDuration.getFormattedDuration() + setPosition(mCurrTime) + playVideo() + } + } + + private fun playVideo() { + if (mExoPlayer == null) { + return + } + + val wasEnded = videoEnded() + if (wasEnded) { + setPosition(0) + } + + mWasVideoStarted = true + mIsPlaying = true + mExoPlayer?.playWhenReady = true + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + + private fun pauseVideo() { + if (mExoPlayer == null) { + return + } + + mIsPlaying = false + if (!videoEnded()) { + mExoPlayer?.playWhenReady = false + } + + window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + + private fun togglePlayPause() { + mIsPlaying = !mIsPlaying + if (mIsPlaying) { + playVideo() + } else { + pauseVideo() + } } private fun setPosition(seconds: Int) { @@ -192,6 +252,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } + private fun videoEnded(): Boolean { + val currentPos = mExoPlayer?.currentPosition ?: 0 + val duration = mExoPlayer?.duration ?: 0 + return currentPos != 0L && currentPos >= duration + } + private fun setVideoSize() { val videoProportion = mVideoSize.x.toFloat() / mVideoSize.y.toFloat() val display = windowManager.defaultDisplay @@ -257,6 +323,21 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_time_holder.beInvisibleIf(mIsFullscreen) video_duration.text = mDuration.getFormattedDuration() video_curr_time.text = mCurrTime.getFormattedDuration() + setupTimer() + } + + private fun setupTimer() { + runOnUiThread(object : Runnable { + override fun run() { + if (mExoPlayer != null && !mIsDragged && mIsPlaying) { + mCurrTime = (mExoPlayer!!.currentPosition / 1000).toInt() + video_seekbar.progress = mCurrTime + video_curr_time.text = mCurrTime.getFormattedDuration() + } + + mTimerHandler.postDelayed(this, 1000) + } + }) } private fun hasNavBar(): Boolean { @@ -272,7 +353,19 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } private fun skip(forward: Boolean) { + if (mExoPlayer == null) { + return + } + val curr = mExoPlayer!!.currentPosition + val twoPercents = Math.max((mExoPlayer!!.duration / 50).toInt(), MIN_SKIP_LENGTH) + val newProgress = if (forward) curr + twoPercents else curr - twoPercents + val roundProgress = Math.round(newProgress / 1000f) + val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt(), roundProgress), 0) + setPosition(limitedProgress) + if (!mIsPlaying) { + togglePlayPause() + } } private fun handleEvent(event: MotionEvent) { @@ -294,13 +387,43 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } } + private fun cleanup() { + pauseVideo() + video_curr_time.text = 0.getFormattedDuration() + releaseExoPlayer() + video_seekbar.progress = 0 + mTimerHandler.removeCallbacksAndMessages(null) + } + + private fun releaseExoPlayer() { + mExoPlayer?.stop() + Thread { + mExoPlayer?.release() + mExoPlayer = null + }.start() + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + if (mExoPlayer != null && fromUser) { + setPosition(progress) + } } override fun onStartTrackingTouch(seekBar: SeekBar?) { + mIsDragged = true } override fun onStopTrackingTouch(seekBar: SeekBar?) { + if (mExoPlayer == null) + return + + if (mIsPlaying) { + mExoPlayer!!.playWhenReady = true + } else { + togglePlayPause() + } + + mIsDragged = false } override fun onSurfaceTextureUpdated(surface: SurfaceTexture?) { From 67c3339d7daba6a5d1f6a5eca768eb01f976f022 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 17:53:49 +0100 Subject: [PATCH 49/69] implementing the video brightness and volume controllers --- .../gallery/pro/activities/VideoPlayerActivity.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 584b962b8..c7b1da6e7 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 @@ -135,6 +135,19 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_surface.setOnClickListener { fullscreenToggled(!mIsFullscreen) } + + if (config.allowVideoGestures) { + video_brightness_controller.initialize(this, slide_info, true, video_player_holder) { x, y -> + video_player_holder.performClick() + } + + video_volume_controller.initialize(this, slide_info, false, video_player_holder) { x, y -> + video_player_holder.performClick() + } + } else { + video_brightness_controller.beGone() + video_volume_controller.beGone() + } } private fun initExoPlayer() { From 76c859a0416c849385e8ef4cbc2dd4f4576e813c Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 18:16:53 +0100 Subject: [PATCH 50/69] remeasure the video player on device rotation --- .../gallery/pro/activities/VideoPlayerActivity.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 c7b1da6e7..9d565482a 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 @@ -99,6 +99,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen return true } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + setVideoSize() + initTimeHolder() + } + private fun initPlayer() { mUri = intent.data ?: return supportActionBar?.title = getFilenameFromUri(mUri!!) @@ -128,6 +134,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen handleEvent(event) false } + + video_surface.setOnTouchListener { v, event -> + handleEvent(event) + false + } } initExoPlayer() From 677e68332ca29eeb9568a36207b4adfdb889482f Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 18:25:17 +0100 Subject: [PATCH 51/69] remember last video playback position if set so --- .../pro/activities/VideoPlayerActivity.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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 9d565482a..56d2e4a30 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 @@ -77,6 +77,10 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen override fun onPause() { super.onPause() pauseVideo() + + if (config.rememberLastVideoPosition && mWasVideoStarted) { + saveVideoProgress() + } } override fun onDestroy() { @@ -224,6 +228,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_seekbar.max = mDuration video_duration.text = mDuration.getFormattedDuration() setPosition(mCurrTime) + + if (config.rememberLastVideoPosition) { + setLastVideoSavedPosition() + } + playVideo() } } @@ -272,6 +281,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_curr_time.text = seconds.getFormattedDuration() } + private fun setLastVideoSavedPosition() { + if (config.lastVideoPath == mUri.toString() && config.lastVideoPosition > 0) { + setPosition(config.lastVideoPosition) + } + } + private fun videoCompleted() { } @@ -282,6 +297,15 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen return currentPos != 0L && currentPos >= duration } + private fun saveVideoProgress() { + if (!videoEnded()) { + config.apply { + lastVideoPosition = mExoPlayer!!.currentPosition.toInt() / 1000 + lastVideoPath = mUri.toString() + } + } + } + private fun setVideoSize() { val videoProportion = mVideoSize.x.toFloat() / mVideoSize.y.toFloat() val display = windowManager.defaultDisplay From 7d758178d570ece81741a56ce729f56ae5b3e9b7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 18:32:03 +0100 Subject: [PATCH 52/69] loop videos after ending if desired --- .../pro/activities/VideoPlayerActivity.kt | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) 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 56d2e4a30..a6117563a 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 @@ -242,7 +242,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen return } - val wasEnded = videoEnded() + val wasEnded = didVideoEnd() if (wasEnded) { setPosition(0) } @@ -259,7 +259,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } mIsPlaying = false - if (!videoEnded()) { + if (!didVideoEnd()) { mExoPlayer?.playWhenReady = false } @@ -288,17 +288,29 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } private fun videoCompleted() { + if (mExoPlayer == null) { + return + } + clearLastVideoSavedProgress() + mCurrTime = (mExoPlayer!!.duration / 1000).toInt() + if (config.loopVideos) { + playVideo() + } else { + video_seekbar.progress = video_seekbar.max + video_curr_time.text = mDuration.getFormattedDuration() + pauseVideo() + } } - private fun videoEnded(): Boolean { + private fun didVideoEnd(): Boolean { val currentPos = mExoPlayer?.currentPosition ?: 0 val duration = mExoPlayer?.duration ?: 0 return currentPos != 0L && currentPos >= duration } private fun saveVideoProgress() { - if (!videoEnded()) { + if (!didVideoEnd()) { config.apply { lastVideoPosition = mExoPlayer!!.currentPosition.toInt() / 1000 lastVideoPath = mUri.toString() @@ -306,6 +318,13 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } } + private fun clearLastVideoSavedProgress() { + config.apply { + lastVideoPosition = 0 + lastVideoPath = "" + } + } + private fun setVideoSize() { val videoProportion = mVideoSize.x.toFloat() / mVideoSize.y.toFloat() val display = windowManager.defaultDisplay From 1e39784324f012b661f5a014d129c2eaed3213c5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 18:41:04 +0100 Subject: [PATCH 53/69] do not allow including videos in slideshows --- .../pro/activities/ViewPagerActivity.kt | 16 +++++-------- .../gallery/pro/dialogs/SlideshowDialog.kt | 9 +------- .../gallery/pro/helpers/Config.kt | 4 ---- .../gallery/pro/helpers/Constants.kt | 1 - app/src/main/res/layout/dialog_slideshow.xml | 23 +------------------ 5 files changed, 8 insertions(+), 45 deletions(-) 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 882a086cf..7a8d9608a 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 @@ -20,6 +20,7 @@ import android.os.Bundle import android.os.Handler import android.provider.MediaStore import android.util.DisplayMetrics +import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.View @@ -507,17 +508,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } private fun getMediaForSlideshow(): Boolean { - mSlideshowMedia = mMediaFiles.toMutableList() - if (!config.slideshowIncludePhotos) { - mSlideshowMedia = mSlideshowMedia.filter { !it.isImage() } as MutableList - } + mSlideshowMedia = mMediaFiles.filter { + (config.slideshowIncludePhotos && it.isImage()) || (config.slideshowIncludeGIFs && it.isGIF()) + }.toMutableList() - if (!config.slideshowIncludeVideos) { - mSlideshowMedia = mSlideshowMedia.filter { it.isImage() || it.isGIF() } as MutableList - } - - if (!config.slideshowIncludeGIFs) { - mSlideshowMedia = mSlideshowMedia.filter { !it.isGIF() } as MutableList + mSlideshowMedia.forEach { + Log.e("DEBUG", "got ${it.name}") } if (config.slideshowRandomOrder) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SlideshowDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SlideshowDialog.kt index 486b8886d..ea8aa079e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SlideshowDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SlideshowDialog.kt @@ -34,11 +34,6 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit include_photos.toggle() } - include_videos_holder.setOnClickListener { - interval_value.clearFocus() - include_videos.toggle() - } - include_gifs_holder.setOnClickListener { interval_value.clearFocus() include_gifs.toggle() @@ -73,7 +68,7 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit activity.setupDialogStuff(view, this) { hideKeyboard() getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - if (!view.include_photos.isChecked && !view.include_videos.isChecked && !view.include_gifs.isChecked) { + if (!view.include_photos.isChecked && !view.include_gifs.isChecked) { activity.toast(R.string.no_media_for_slideshow) return@setOnClickListener } @@ -91,7 +86,6 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit view.apply { interval_value.setText(config.slideshowInterval.toString()) include_photos.isChecked = config.slideshowIncludePhotos - include_videos.isChecked = config.slideshowIncludeVideos include_gifs.isChecked = config.slideshowIncludeGIFs random_order.isChecked = config.slideshowRandomOrder use_fade.isChecked = config.slideshowUseFade @@ -108,7 +102,6 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit activity.config.apply { slideshowInterval = interval.toInt() slideshowIncludePhotos = view.include_photos.isChecked - slideshowIncludeVideos = view.include_videos.isChecked slideshowIncludeGIFs = view.include_gifs.isChecked slideshowRandomOrder = view.random_order.isChecked slideshowUseFade = view.use_fade.isChecked 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 6613ad70c..0f9f2ffda 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 @@ -285,10 +285,6 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getBoolean(SLIDESHOW_INCLUDE_PHOTOS, true) set(slideshowIncludePhotos) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_PHOTOS, slideshowIncludePhotos).apply() - var slideshowIncludeVideos: Boolean - get() = prefs.getBoolean(SLIDESHOW_INCLUDE_VIDEOS, false) - set(slideshowIncludeVideos) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_VIDEOS, slideshowIncludeVideos).apply() - var slideshowIncludeGIFs: Boolean get() = prefs.getBoolean(SLIDESHOW_INCLUDE_GIFS, false) set(slideshowIncludeGIFs) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_GIFS, slideshowIncludeGIFs).apply() 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 5514193b4..36df31e26 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 @@ -78,7 +78,6 @@ const val SHOW_WIDGET_FOLDER_NAME = "show_widget_folder_name" // slideshow const val SLIDESHOW_INTERVAL = "slideshow_interval" const val SLIDESHOW_INCLUDE_PHOTOS = "slideshow_include_photos" -const val SLIDESHOW_INCLUDE_VIDEOS = "slideshow_include_videos" const val SLIDESHOW_INCLUDE_GIFS = "slideshow_include_gifs" const val SLIDESHOW_RANDOM_ORDER = "slideshow_random_order" const val SLIDESHOW_USE_FADE = "slideshow_use_fade" diff --git a/app/src/main/res/layout/dialog_slideshow.xml b/app/src/main/res/layout/dialog_slideshow.xml index 48da05572..15f396b36 100644 --- a/app/src/main/res/layout/dialog_slideshow.xml +++ b/app/src/main/res/layout/dialog_slideshow.xml @@ -57,32 +57,11 @@ - - - - - - Date: Wed, 2 Jan 2019 19:00:16 +0100 Subject: [PATCH 54/69] remove ExoPlayer related things from the VideoFragment --- .../pro/activities/ViewPagerActivity.kt | 8 - .../gallery/pro/fragments/VideoFragment.kt | 554 +----------------- app/src/main/res/layout/pager_video_item.xml | 7 - 3 files changed, 30 insertions(+), 539 deletions(-) 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 7a8d9608a..778cb4f59 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 @@ -20,7 +20,6 @@ import android.os.Bundle import android.os.Handler import android.provider.MediaStore import android.util.DisplayMetrics -import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.View @@ -42,7 +41,6 @@ import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog import com.simplemobiletools.gallery.pro.dialogs.SlideshowDialog import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.fragments.PhotoFragment -import com.simplemobiletools.gallery.pro.fragments.VideoFragment import com.simplemobiletools.gallery.pro.fragments.ViewPagerFragment import com.simplemobiletools.gallery.pro.helpers.* import com.simplemobiletools.gallery.pro.models.Medium @@ -497,8 +495,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View swipeToNextMedium() } }, mSlideshowInterval * 1000L) - } else { - (getCurrentFragment() as? VideoFragment)!!.playVideo() } } } @@ -512,10 +508,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View (config.slideshowIncludePhotos && it.isImage()) || (config.slideshowIncludeGIFs && it.isGIF()) }.toMutableList() - mSlideshowMedia.forEach { - Log.e("DEBUG", "got ${it.name}") - } - if (config.slideshowRandomOrder) { mSlideshowMedia.shuffle() mPos = 0 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 e79ea6774..b3169a277 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 @@ -2,73 +2,43 @@ package com.simplemobiletools.gallery.pro.fragments import android.content.Intent import android.content.res.Configuration -import android.graphics.Point -import android.graphics.SurfaceTexture -import android.net.Uri import android.os.Bundle -import android.os.Handler -import android.util.DisplayMetrics -import android.view.* -import android.view.animation.AnimationUtils -import android.widget.SeekBar -import android.widget.TextView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import com.bumptech.glide.Glide -import com.google.android.exoplayer2.* -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory -import com.google.android.exoplayer2.source.ExtractorMediaSource -import com.google.android.exoplayer2.source.TrackGroupArray -import com.google.android.exoplayer2.trackselection.TrackSelectionArray -import com.google.android.exoplayer2.upstream.ContentDataSource -import com.google.android.exoplayer2.upstream.DataSource -import com.google.android.exoplayer2.upstream.DataSpec -import com.google.android.exoplayer2.upstream.FileDataSource -import com.google.android.exoplayer2.video.VideoListener import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.gallery.pro.BuildConfig 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.helpers.* +import com.simplemobiletools.gallery.pro.activities.VideoPlayerActivity +import com.simplemobiletools.gallery.pro.extensions.config +import com.simplemobiletools.gallery.pro.extensions.navigationBarWidth +import com.simplemobiletools.gallery.pro.extensions.portrait +import com.simplemobiletools.gallery.pro.extensions.realScreenSize +import com.simplemobiletools.gallery.pro.helpers.IsoTypeReader +import com.simplemobiletools.gallery.pro.helpers.MEDIUM +import com.simplemobiletools.gallery.pro.helpers.PATH import com.simplemobiletools.gallery.pro.models.Medium import com.simplemobiletools.gallery.pro.views.MediaSideScroll -import kotlinx.android.synthetic.main.bottom_video_time_holder.view.* import kotlinx.android.synthetic.main.pager_video_item.view.* import java.io.File import java.io.FileInputStream import java.nio.ByteBuffer import java.nio.channels.FileChannel -class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, SeekBar.OnSeekBarChangeListener { - private val PROGRESS = "progress" +class VideoFragment : ViewPagerFragment() { private val FILE_CHANNEL_CONTAINERS = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl") - private var mTextureView: TextureView? = null - private var mCurrTimeView: TextView? = null - private var mSeekBar: SeekBar? = null - private var mExoPlayer: SimpleExoPlayer? = null - private var mVideoSize = Point(0, 0) - private var mTimerHandler = Handler() - private var mHidePlayPauseHandler = Handler() - - private var mIsPlaying = false - private var mIsDragged = false private var mIsFullscreen = false - private var mIsFragmentVisible = false private var mWasFragmentInit = false private var mIsPanorama = false - private var mWasVideoStarted = false - private var mCurrTime = 0 - private var mDuration = 0 private var mStoredShowExtendedDetails = false private var mStoredHideExtendedDetails = false private var mStoredBottomActions = true private var mStoredExtendedDetails = 0 - private var mStoredRememberLastVideoPosition = false - private var mStoredLastVideoPath = "" - private var mStoredLastVideoPosition = 0 - private lateinit var mTimeHolder: View private lateinit var mBrightnessSideScroll: MediaSideScroll private lateinit var mVolumeSideScroll: MediaSideScroll @@ -79,30 +49,19 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mView = inflater.inflate(R.layout.pager_video_item, container, false).apply { instant_prev_item.setOnClickListener { listener?.goToPrevItem() } instant_next_item.setOnClickListener { listener?.goToNextItem() } - video_curr_time.setOnClickListener { skip(false) } - video_duration.setOnClickListener { skip(true) } video_holder.setOnClickListener { toggleFullscreen() } video_preview.setOnClickListener { toggleFullscreen() } panorama_outline.setOnClickListener { openPanorama() } + video_play_outline.setOnClickListener { launchVideoPlayer() } - // adding an empty click listener just to avoid ripple animation at toggling fullscreen - video_seekbar.setOnClickListener { } - - mTimeHolder = video_time_holder mBrightnessSideScroll = video_brightness_controller mVolumeSideScroll = video_volume_controller - mCurrTimeView = video_curr_time if (context.config.allowDownGesture) { video_preview.setOnTouchListener { v, event -> handleEvent(event) false } - - video_surface.setOnTouchListener { v, event -> - handleEvent(event) - false - } } } @@ -110,46 +69,22 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S medium = arguments!!.getSerializable(MEDIUM) as Medium Glide.with(context!!).load(medium.path).into(mView.video_preview) - // setMenuVisibility is not called at VideoActivity (third party intent) - if (!mIsFragmentVisible && activity is VideoActivity) { - mIsFragmentVisible = true - } - mIsFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN - initTimeHolder() checkIfPanorama() - medium.path.getVideoResolution()?.apply { - mVideoSize.x = x - mVideoSize.y = y - if (mIsPanorama) { - mView.apply { - panorama_outline.beVisible() - video_play_outline.beGone() - mVolumeSideScroll.beGone() - mBrightnessSideScroll.beGone() - Glide.with(context!!).load(medium.path).into(video_preview) - } + if (mIsPanorama) { + mView.apply { + panorama_outline.beVisible() + video_play_outline.beGone() + mVolumeSideScroll.beGone() + mBrightnessSideScroll.beGone() + Glide.with(context!!).load(medium.path).into(video_preview) } } if (!mIsPanorama) { - setupPlayer() - if (savedInstanceState != null) { - mCurrTime = savedInstanceState.getInt(PROGRESS) - } - - checkFullscreen() mWasFragmentInit = true - mExoPlayer = ExoPlayerFactory.newSimpleInstance(context) - mExoPlayer!!.seekParameters = SeekParameters.CLOSEST_SYNC - initExoPlayerListeners() - - if (mVideoSize.x != 0 && mVideoSize.y != 0) { - setVideoSize() - } - mView.apply { mBrightnessSideScroll.initialize(activity!!, slide_info, true, container) { x, y -> video_holder.performClick() @@ -158,22 +93,10 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mVolumeSideScroll.initialize(activity!!, slide_info, false, container) { x, y -> video_holder.performClick() } - - video_surface.onGlobalLayout { - if (mIsFragmentVisible && context?.config?.autoplayVideos == true) { - playVideo() - } - } } } - setupVideoDuration() - if (mStoredRememberLastVideoPosition) { - setLastVideoSavedPosition() - } - updateInstantSwitchWidths() - return mView } @@ -195,47 +118,16 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S checkExtendedDetails() } - if (config.bottomActions != mStoredBottomActions) { - initTimeHolder() - } - - mTimeHolder.setBackgroundResource(if (config.bottomActions) 0 else R.drawable.gradient_background) storeStateVariables() } override fun onPause() { super.onPause() - pauseVideo() - if (mStoredRememberLastVideoPosition && mIsFragmentVisible && mWasVideoStarted) { - saveVideoProgress() - } - storeStateVariables() } - override fun onDestroy() { - super.onDestroy() - if (activity?.isChangingConfigurations == false) { - cleanup() - } - } - - override fun setMenuVisibility(menuVisible: Boolean) { - super.setMenuVisibility(menuVisible) - if (mIsFragmentVisible && !menuVisible) { - pauseVideo() - } - - mIsFragmentVisible = menuVisible - if (mWasFragmentInit && menuVisible && context?.config?.autoplayVideos == true) { - playVideo() - } - } - override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - setVideoSize() - initTimeHolder() checkExtendedDetails() updateInstantSwitchWidths() } @@ -246,363 +138,27 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mStoredHideExtendedDetails = hideExtendedDetails mStoredExtendedDetails = extendedDetails mStoredBottomActions = bottomActions - mStoredRememberLastVideoPosition = rememberLastVideoPosition - mStoredLastVideoPath = lastVideoPath - mStoredLastVideoPosition = lastVideoPosition } } - private fun setupPlayer() { - if (activity == null) + private fun launchVideoPlayer() { + val newUri = activity!!.getFinalUriFromPath(medium.path, BuildConfig.APPLICATION_ID) + if (newUri == null) { + context!!.toast(R.string.unknown_error_occurred) return - - mView.video_play_outline.setOnClickListener { togglePlayPause() } - - mTextureView = mView.video_surface - mTextureView!!.setOnClickListener { toggleFullscreen() } - mTextureView!!.surfaceTextureListener = this - - checkExtendedDetails() - } - - private fun saveVideoProgress() { - if (!videoEnded()) { - mStoredLastVideoPosition = mExoPlayer!!.currentPosition.toInt() / 1000 - mStoredLastVideoPath = medium.path } - context!!.config.apply { - lastVideoPosition = mStoredLastVideoPosition - lastVideoPath = mStoredLastVideoPath + val mimeType = activity!!.getUriMimeType(medium.path, newUri) + Intent(activity, VideoPlayerActivity::class.java).apply { + setDataAndType(newUri, mimeType) + context!!.startActivity(this) } } - private fun initExoPlayer() { - val isContentUri = medium.path.startsWith("content://") - val uri = if (isContentUri) Uri.parse(medium.path) else Uri.fromFile(File(medium.path)) - val dataSpec = DataSpec(uri) - val fileDataSource = if (isContentUri) ContentDataSource(context) else FileDataSource() - try { - fileDataSource.open(dataSpec) - } catch (e: Exception) { - activity?.showErrorToast(e) - } - - val factory = DataSource.Factory { fileDataSource } - val audioSource = ExtractorMediaSource(fileDataSource.uri, factory, DefaultExtractorsFactory(), null, null) - mExoPlayer!!.audioStreamType = C.STREAM_TYPE_MUSIC - mExoPlayer!!.prepare(audioSource) - } - - private fun initExoPlayerListeners() { - mExoPlayer!!.addListener(object : Player.EventListener { - override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {} - - override fun onSeekProcessed() {} - - override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {} - - override fun onPlayerError(error: ExoPlaybackException?) { - } - - override fun onLoadingChanged(isLoading: Boolean) {} - - override fun onPositionDiscontinuity(reason: Int) {} - - override fun onRepeatModeChanged(repeatMode: Int) {} - - override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {} - - override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {} - - override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { - when (playbackState) { - Player.STATE_READY -> videoPrepared() - Player.STATE_ENDED -> videoCompleted() - } - } - }) - - mExoPlayer!!.addVideoListener(object : VideoListener { - override fun onVideoSizeChanged(width: Int, height: Int, unappliedRotationDegrees: Int, pixelWidthHeightRatio: Float) { - mVideoSize.x = width - mVideoSize.y = height - setVideoSize() - } - - override fun onRenderedFirstFrame() {} - }) - } - private fun toggleFullscreen() { listener?.fragmentClicked() } - private fun setLastVideoSavedPosition() { - if (mStoredLastVideoPath == medium.path && mStoredLastVideoPosition > 0) { - setPosition(mStoredLastVideoPosition) - } - } - - private fun initTimeHolder() { - val left = 0 - val top = 0 - var right = 0 - var bottom = 0 - - if (hasNavBar()) { - if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { - bottom += context!!.navigationBarHeight - } else { - right += context!!.navigationBarWidth - bottom += context!!.navigationBarHeight - } - } - - if (context!!.config.bottomActions) { - bottom += resources.getDimension(R.dimen.bottom_actions_height).toInt() - } - - mTimeHolder.setPadding(left, top, right, bottom) - - mSeekBar = mView.video_seekbar - mSeekBar!!.setOnSeekBarChangeListener(this) - mTimeHolder.beInvisibleIf(mIsFullscreen) - } - - private fun hasNavBar(): Boolean { - val display = context!!.windowManager.defaultDisplay - - val realDisplayMetrics = DisplayMetrics() - display.getRealMetrics(realDisplayMetrics) - - val displayMetrics = DisplayMetrics() - display.getMetrics(displayMetrics) - - return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels > 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels > 0) - } - - private fun setupTimeHolder() { - mSeekBar!!.max = mDuration - mView.video_duration.text = mDuration.getFormattedDuration() - setupTimer() - } - - private fun setupTimer() { - activity!!.runOnUiThread(object : Runnable { - override fun run() { - if (mExoPlayer != null && !mIsDragged && mIsPlaying) { - mCurrTime = (mExoPlayer!!.currentPosition / 1000).toInt() - mSeekBar!!.progress = mCurrTime - mCurrTimeView!!.text = mCurrTime.getFormattedDuration() - } - - mTimerHandler.postDelayed(this, 1000) - } - }) - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putInt(PROGRESS, mCurrTime) - } - - private fun checkFullscreen() { - if (activity == null) { - return - } - - var anim = android.R.anim.fade_in - if (mIsFullscreen) { - anim = android.R.anim.fade_out - mSeekBar!!.setOnSeekBarChangeListener(null) - } else { - mSeekBar!!.setOnSeekBarChangeListener(this) - } - - AnimationUtils.loadAnimation(activity, anim).apply { - duration = 150 - fillAfter = true - mTimeHolder.startAnimation(this) - } - } - - private fun togglePlayPause() { - if (activity == null || !isAdded) - return - - mIsPlaying = !mIsPlaying - mHidePlayPauseHandler.removeCallbacksAndMessages(null) - if (mIsPlaying) { - playVideo() - } else { - pauseVideo() - } - } - - fun playVideo() { - if (mExoPlayer == null) { - return - } - - if (mView.video_preview.isVisible()) { - mView.video_preview.beGone() - initExoPlayer() - } - - val wasEnded = videoEnded() - if (wasEnded) { - setPosition(0) - } - - if (mStoredRememberLastVideoPosition) { - setLastVideoSavedPosition() - clearLastVideoSavedProgress() - } - - if (!wasEnded || context?.config?.loopVideos == false) { - mView.video_play_outline.setImageResource(R.drawable.ic_pause) - mView.video_play_outline.alpha = PLAY_PAUSE_VISIBLE_ALPHA - } - - schedulePlayPauseFadeOut() - mWasVideoStarted = true - mIsPlaying = true - mExoPlayer?.playWhenReady = true - activity!!.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - } - - private fun clearLastVideoSavedProgress() { - mStoredLastVideoPosition = 0 - mStoredLastVideoPath = "" - } - - private fun pauseVideo() { - if (mExoPlayer == null) { - return - } - - mIsPlaying = false - if (!videoEnded()) { - mExoPlayer?.playWhenReady = false - } - - mView.video_play_outline?.setImageResource(R.drawable.ic_play) - mView.video_play_outline?.alpha = PLAY_PAUSE_VISIBLE_ALPHA - schedulePlayPauseFadeOut() - activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - } - - private fun schedulePlayPauseFadeOut() { - mHidePlayPauseHandler.removeCallbacksAndMessages(null) - mHidePlayPauseHandler.postDelayed({ - mView.video_play_outline.animate().alpha(0f).start() - }, HIDE_PLAY_PAUSE_DELAY) - } - - private fun videoEnded(): Boolean { - val currentPos = mExoPlayer?.currentPosition ?: 0 - val duration = mExoPlayer?.duration ?: 0 - return currentPos != 0L && currentPos >= duration - } - - private fun setPosition(seconds: Int) { - mExoPlayer?.seekTo(seconds * 1000L) - mSeekBar!!.progress = seconds - mCurrTimeView!!.text = seconds.getFormattedDuration() - } - - private fun setupVideoDuration() { - mDuration = medium.path.getVideoDuration() - setupTimeHolder() - setPosition(0) - } - - private fun videoPrepared() { - if (mDuration == 0) { - mDuration = (mExoPlayer!!.duration / 1000).toInt() - setupTimeHolder() - setPosition(mCurrTime) - - if (mIsFragmentVisible && (context!!.config.autoplayVideos)) { - playVideo() - } - } - } - - private fun videoCompleted() { - if (!isAdded || mExoPlayer == null) { - return - } - - mCurrTime = (mExoPlayer!!.duration / 1000).toInt() - if (listener?.videoEnded() == false && context!!.config.loopVideos) { - playVideo() - } else { - mSeekBar!!.progress = mSeekBar!!.max - mCurrTimeView!!.text = mDuration.getFormattedDuration() - pauseVideo() - } - } - - private fun cleanup() { - pauseVideo() - mCurrTimeView?.text = 0.getFormattedDuration() - releaseExoPlayer() - mSeekBar?.progress = 0 - mTimerHandler.removeCallbacksAndMessages(null) - mHidePlayPauseHandler.removeCallbacksAndMessages(null) - mTextureView = null - } - - private fun releaseExoPlayer() { - mExoPlayer?.stop() - Thread { - mExoPlayer?.release() - mExoPlayer = null - }.start() - } - - override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) {} - - override fun onSurfaceTextureUpdated(surface: SurfaceTexture?) {} - - override fun onSurfaceTextureDestroyed(surface: SurfaceTexture?) = false - - override fun onSurfaceTextureAvailable(surface: SurfaceTexture?, width: Int, height: Int) { - Thread { - mExoPlayer?.setVideoSurface(Surface(mTextureView!!.surfaceTexture)) - }.start() - } - - private fun setVideoSize() { - if (activity == null || mTextureView == null) - return - - val videoProportion = mVideoSize.x.toFloat() / mVideoSize.y.toFloat() - val display = activity!!.windowManager.defaultDisplay - val screenWidth: Int - val screenHeight: Int - - val realMetrics = DisplayMetrics() - display.getRealMetrics(realMetrics) - screenWidth = realMetrics.widthPixels - screenHeight = realMetrics.heightPixels - - val screenProportion = screenWidth.toFloat() / screenHeight.toFloat() - - mTextureView!!.layoutParams.apply { - if (videoProportion > screenProportion) { - width = screenWidth - height = (screenWidth.toFloat() / videoProportion).toInt() - } else { - width = (videoProportion * screenHeight.toFloat()).toInt() - height = screenHeight - } - mTextureView!!.layoutParams = this - } - } - private fun checkExtendedDetails() { if (context!!.config.showExtendedDetails) { mView.video_details.apply { @@ -624,54 +180,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } } - private fun skip(forward: Boolean) { - if (mExoPlayer == null || mIsPanorama) { - return - } - - val curr = mExoPlayer!!.currentPosition - val twoPercents = Math.max((mExoPlayer!!.duration / 50).toInt(), MIN_SKIP_LENGTH) - val newProgress = if (forward) curr + twoPercents else curr - twoPercents - val roundProgress = Math.round(newProgress / 1000f) - val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt(), roundProgress), 0) - setPosition(limitedProgress) - if (!mIsPlaying) { - togglePlayPause() - } - } - - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - if (mExoPlayer != null && fromUser) { - setPosition(progress) - } - } - - override fun onStartTrackingTouch(seekBar: SeekBar) { - if (mExoPlayer == null) - return - - mExoPlayer!!.playWhenReady = false - mIsDragged = true - } - - override fun onStopTrackingTouch(seekBar: SeekBar) { - if (mIsPanorama) { - openPanorama() - return - } - - if (mExoPlayer == null) - return - - if (mIsPlaying) { - mExoPlayer!!.playWhenReady = true - } else { - togglePlayPause() - } - - mIsDragged = false - } - private fun checkIfPanorama() { try { val fis = FileInputStream(File(medium.path)) @@ -751,7 +259,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun fullscreenToggled(isFullscreen: Boolean) { mIsFullscreen = isFullscreen - checkFullscreen() mView.video_details.apply { if (mStoredShowExtendedDetails && isVisible()) { animate().y(getExtendedDetailsY(height)) @@ -765,7 +272,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S private fun getExtendedDetailsY(height: Int): Float { val smallMargin = resources.getDimension(R.dimen.small_margin) - val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else mTimeHolder.height - return context!!.realScreenSize.y.toFloat() - height - fullscreenOffset + return context!!.realScreenSize.y.toFloat() - height - smallMargin } } diff --git a/app/src/main/res/layout/pager_video_item.xml b/app/src/main/res/layout/pager_video_item.xml index 202ec800a..19a8636e6 100644 --- a/app/src/main/res/layout/pager_video_item.xml +++ b/app/src/main/res/layout/pager_video_item.xml @@ -11,12 +11,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> - - - From 62cbdaf9188c2227618f8a90f4fdf9e6888853df Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 19:07:42 +0100 Subject: [PATCH 55/69] remove the setting for toggling autoplaying videos --- .../pro/activities/SettingsActivity.kt | 9 ------- .../gallery/pro/helpers/Config.kt | 4 ---- .../gallery/pro/helpers/Constants.kt | 1 - app/src/main/res/layout/activity_settings.xml | 24 ------------------- 4 files changed, 38 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt index 8426bd8c4..c9018cb22 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt @@ -39,7 +39,6 @@ class SettingsActivity : SimpleActivity() { setupManageHiddenFolders() setupShowHiddenItems() setupDoExtraCheck() - setupAutoplayVideos() setupRememberLastVideo() setupLoopVideos() setupAnimateGifs() @@ -149,14 +148,6 @@ class SettingsActivity : SimpleActivity() { } } - private fun setupAutoplayVideos() { - settings_autoplay_videos.isChecked = config.autoplayVideos - settings_autoplay_videos_holder.setOnClickListener { - settings_autoplay_videos.toggle() - config.autoplayVideos = settings_autoplay_videos.isChecked - } - } - private fun setupRememberLastVideo() { settings_remember_last_video_position.isChecked = config.rememberLastVideoPosition settings_remember_last_video_position_holder.setOnClickListener { 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 0f9f2ffda..b42f1843b 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 @@ -152,10 +152,6 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getStringSet(INCLUDED_FOLDERS, HashSet()) set(includedFolders) = prefs.edit().remove(INCLUDED_FOLDERS).putStringSet(INCLUDED_FOLDERS, includedFolders).apply() - var autoplayVideos: Boolean - get() = prefs.getBoolean(AUTOPLAY_VIDEOS, false) - set(autoplay) = prefs.edit().putBoolean(AUTOPLAY_VIDEOS, autoplay).apply() - var animateGifs: Boolean get() = prefs.getBoolean(ANIMATE_GIFS, false) set(animateGifs) = prefs.edit().putBoolean(ANIMATE_GIFS, animateGifs).apply() 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 36df31e26..bac660159 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 @@ -10,7 +10,6 @@ const val VIEW_TYPE_PREFIX = "view_type_folder_" const val SHOW_HIDDEN_MEDIA = "show_hidden_media" const val TEMPORARILY_SHOW_HIDDEN = "temporarily_show_hidden" const val IS_THIRD_PARTY_INTENT = "is_third_party_intent" -const val AUTOPLAY_VIDEOS = "autoplay_videos" const val REMEMBER_LAST_VIDEO_POSITION = "remember_last_video_position" const val LOOP_VIDEOS = "loop_videos" const val ANIMATE_GIFS = "animate_gifs" diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 75d86d798..fcf352d62 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -208,30 +208,6 @@ android:textAllCaps="true" android:textSize="@dimen/smaller_text_size"/> - - - - - - Date: Wed, 2 Jan 2019 19:13:52 +0100 Subject: [PATCH 56/69] always include photos in slideshows --- .../pro/activities/ViewPagerActivity.kt | 2 +- .../gallery/pro/dialogs/SlideshowDialog.kt | 13 ----------- .../gallery/pro/helpers/Config.kt | 4 ---- .../gallery/pro/helpers/Constants.kt | 1 - app/src/main/res/layout/dialog_slideshow.xml | 23 +------------------ 5 files changed, 2 insertions(+), 41 deletions(-) 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 778cb4f59..7225ab6ab 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 @@ -505,7 +505,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun getMediaForSlideshow(): Boolean { mSlideshowMedia = mMediaFiles.filter { - (config.slideshowIncludePhotos && it.isImage()) || (config.slideshowIncludeGIFs && it.isGIF()) + it.isImage() || (config.slideshowIncludeGIFs && it.isGIF()) }.toMutableList() if (config.slideshowRandomOrder) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SlideshowDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SlideshowDialog.kt index ea8aa079e..5e3c5f198 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SlideshowDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/SlideshowDialog.kt @@ -5,7 +5,6 @@ import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.hideKeyboard import com.simplemobiletools.commons.extensions.setupDialogStuff -import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.config import com.simplemobiletools.gallery.pro.helpers.SLIDESHOW_DEFAULT_INTERVAL @@ -29,11 +28,6 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit activity.hideKeyboard(v) } - include_photos_holder.setOnClickListener { - interval_value.clearFocus() - include_photos.toggle() - } - include_gifs_holder.setOnClickListener { interval_value.clearFocus() include_gifs.toggle() @@ -68,11 +62,6 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit activity.setupDialogStuff(view, this) { hideKeyboard() getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - if (!view.include_photos.isChecked && !view.include_gifs.isChecked) { - activity.toast(R.string.no_media_for_slideshow) - return@setOnClickListener - } - storeValues() callback() dismiss() @@ -85,7 +74,6 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit val config = activity.config view.apply { interval_value.setText(config.slideshowInterval.toString()) - include_photos.isChecked = config.slideshowIncludePhotos include_gifs.isChecked = config.slideshowIncludeGIFs random_order.isChecked = config.slideshowRandomOrder use_fade.isChecked = config.slideshowUseFade @@ -101,7 +89,6 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit activity.config.apply { slideshowInterval = interval.toInt() - slideshowIncludePhotos = view.include_photos.isChecked slideshowIncludeGIFs = view.include_gifs.isChecked slideshowRandomOrder = view.random_order.isChecked slideshowUseFade = view.use_fade.isChecked 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 b42f1843b..a36fe8b1b 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 @@ -277,10 +277,6 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getInt(SLIDESHOW_INTERVAL, SLIDESHOW_DEFAULT_INTERVAL) set(slideshowInterval) = prefs.edit().putInt(SLIDESHOW_INTERVAL, slideshowInterval).apply() - var slideshowIncludePhotos: Boolean - get() = prefs.getBoolean(SLIDESHOW_INCLUDE_PHOTOS, true) - set(slideshowIncludePhotos) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_PHOTOS, slideshowIncludePhotos).apply() - var slideshowIncludeGIFs: Boolean get() = prefs.getBoolean(SLIDESHOW_INCLUDE_GIFS, false) set(slideshowIncludeGIFs) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_GIFS, slideshowIncludeGIFs).apply() 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 bac660159..b455298ad 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 @@ -76,7 +76,6 @@ const val SHOW_WIDGET_FOLDER_NAME = "show_widget_folder_name" // slideshow const val SLIDESHOW_INTERVAL = "slideshow_interval" -const val SLIDESHOW_INCLUDE_PHOTOS = "slideshow_include_photos" const val SLIDESHOW_INCLUDE_GIFS = "slideshow_include_gifs" const val SLIDESHOW_RANDOM_ORDER = "slideshow_random_order" const val SLIDESHOW_USE_FADE = "slideshow_use_fade" diff --git a/app/src/main/res/layout/dialog_slideshow.xml b/app/src/main/res/layout/dialog_slideshow.xml index 15f396b36..7915aa5dc 100644 --- a/app/src/main/res/layout/dialog_slideshow.xml +++ b/app/src/main/res/layout/dialog_slideshow.xml @@ -36,32 +36,11 @@ android:textCursorDrawable="@null" android:textSize="@dimen/normal_text_size"/> - - - - - - Date: Wed, 2 Jan 2019 19:25:30 +0100 Subject: [PATCH 57/69] automatically hide system UI at videoplayer activity, if desired --- .../gallery/pro/activities/VideoPlayerActivity.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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 a6117563a..d08fa5622 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 @@ -163,6 +163,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_brightness_controller.beGone() video_volume_controller.beGone() } + + if (config.hideSystemUI) { + Handler().postDelayed({ + fullscreenToggled(true) + }, 500) + } } private fun initExoPlayer() { @@ -176,10 +182,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen val factory = DataSource.Factory { fileDataSource } val audioSource = ExtractorMediaSource(fileDataSource.uri, factory, DefaultExtractorsFactory(), null, null) - mExoPlayer = ExoPlayerFactory.newSimpleInstance(applicationContext) - mExoPlayer!!.seekParameters = SeekParameters.CLOSEST_SYNC - mExoPlayer!!.audioStreamType = C.STREAM_TYPE_MUSIC - mExoPlayer!!.prepare(audioSource) + mExoPlayer = ExoPlayerFactory.newSimpleInstance(applicationContext).apply { + seekParameters = SeekParameters.CLOSEST_SYNC + audioStreamType = C.STREAM_TYPE_MUSIC + prepare(audioSource) + } initExoPlayerListeners() } From dad6fb6689b0c5d27846bc6d8fe675eacf11b8e0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 19:31:07 +0100 Subject: [PATCH 58/69] do not toggle video player bottom time holder visibility --- .../gallery/pro/activities/VideoPlayerActivity.kt | 1 - 1 file changed, 1 deletion(-) 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 d08fa5622..8f0b6b99d 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 @@ -394,7 +394,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_time_holder.setPadding(0, 0, right, bottom) video_seekbar.setOnSeekBarChangeListener(this) video_seekbar!!.max = mDuration - video_time_holder.beInvisibleIf(mIsFullscreen) video_duration.text = mDuration.getFormattedDuration() video_curr_time.text = mCurrTime.getFormattedDuration() setupTimer() From 1d1254b6e9881e87f44547b9d3578ae553de79ef Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 20:15:14 +0100 Subject: [PATCH 59/69] set the video player background drawable in code --- .../gallery/pro/activities/VideoPlayerActivity.kt | 1 + app/src/main/res/layout/bottom_video_time_holder.xml | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) 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 8f0b6b99d..67ca5b647 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 @@ -68,6 +68,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen supportActionBar?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) window.statusBarColor = Color.TRANSPARENT window.navigationBarColor = Color.TRANSPARENT + video_time_holder.background = resources.getDrawable(R.drawable.gradient_background) if (config.blackBackground) { video_player_holder.background = ColorDrawable(Color.BLACK) } 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 5862ced48..cdf1e0c53 100644 --- a/app/src/main/res/layout/bottom_video_time_holder.xml +++ b/app/src/main/res/layout/bottom_video_time_holder.xml @@ -5,8 +5,7 @@ android:id="@+id/video_time_holder" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:background="@drawable/gradient_background"> + android:layout_alignParentBottom="true"> Date: Wed, 2 Jan 2019 21:13:13 +0100 Subject: [PATCH 60/69] adding a toggle play/pause button at the video player --- .../pro/activities/VideoPlayerActivity.kt | 3 +++ .../main/res/drawable-hdpi/ic_pause_outline.png | Bin 0 -> 2931 bytes .../main/res/drawable-hdpi/ic_play_outline.png | Bin 0 -> 3388 bytes .../main/res/drawable-xhdpi/ic_pause_outline.png | Bin 0 -> 3053 bytes .../main/res/drawable-xhdpi/ic_play_outline.png | Bin 0 -> 3673 bytes .../res/drawable-xxhdpi/ic_pause_outline.png | Bin 0 -> 5994 bytes .../main/res/drawable-xxhdpi/ic_play_outline.png | Bin 0 -> 7288 bytes .../res/drawable-xxxhdpi/ic_pause_outline.png | Bin 0 -> 4724 bytes .../res/drawable-xxxhdpi/ic_play_outline.png | Bin 0 -> 6077 bytes .../main/res/layout/bottom_video_time_holder.xml | 13 +++++++++++++ 10 files changed, 16 insertions(+) create mode 100644 app/src/main/res/drawable-hdpi/ic_pause_outline.png create mode 100644 app/src/main/res/drawable-hdpi/ic_play_outline.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_pause_outline.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_play_outline.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_pause_outline.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_play_outline.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_pause_outline.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_play_outline.png 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 67ca5b647..77bc90f02 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 @@ -130,6 +130,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_seekbar.setOnClickListener { } video_curr_time.setOnClickListener { skip(false) } video_duration.setOnClickListener { skip(true) } + video_toggle_play_pause.setOnClickListener { togglePlayPause() } video_player_holder.setOnClickListener { fullscreenToggled(!mIsFullscreen) } @@ -258,6 +259,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen mWasVideoStarted = true mIsPlaying = true mExoPlayer?.playWhenReady = true + video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } @@ -271,6 +273,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen mExoPlayer?.playWhenReady = false } + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } diff --git a/app/src/main/res/drawable-hdpi/ic_pause_outline.png b/app/src/main/res/drawable-hdpi/ic_pause_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d51bfc986516fd3428946413a7dcbcb7163a5a GIT binary patch literal 2931 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_play_outline.png b/app/src/main/res/drawable-hdpi/ic_play_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..12be0724f7164a3df561fd7d2b00ec3d5a9d14b7 GIT binary patch literal 3388 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_pause_outline.png b/app/src/main/res/drawable-xxhdpi/ic_pause_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f0c72cedb9a74296799df3a2aaacc57f90bc92 GIT binary patch literal 5994 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_play_outline.png b/app/src/main/res/drawable-xxhdpi/ic_play_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..156d6ca625761422c36ac0fd13e4698fb14b92ec GIT binary patch literal 7288 zcmW+*1yodB7kz|ujDUo6BaI-SG)PGbf|AnRh;%3^3=E*8bO}nQAkD|n-Q8W%E&t`e zYrT1k_14UK_nv+B*?aRvT~!_*=P?chLHLRaFEzkD`u@Vg0G}Ij%fG=5+etyk6+EA~ zzfh#vzI#9r6}#d~sW%=ed#RppG$+nF&bye+=pnGh2H@b>KYCUDET47(EUvOo}dAa{ux+ z=0CX}CkGc9jANZ&Jw*Mr?hCU#-s#5au8`eisc~Bfegt~bbU+$px{C+34EUztK=hpR z>kwqN=@$TdF|d5vNA&9v4EYWf;+MLG6G4e%Qhb8xwC;a(%Fo=fGOIY}d+bVIpcum~ zKkEvcc#Q8PF6+3-#{IZ-e<+xmfk&(g<_R7ULC<9=2(G#Cuc&llS{I=&qgm{T38 z#2Gae4r^OdCy||U6{hm$POx>fv}9d$5J_L=iVP5#I~0I63FXRh zO_gh^s>D2xR=e7!r>Fn8xw%#01WQlN&T^I%6~$@2eJfE=SZK$|!C_kn?gd3f_L^)Y z@7PEf2nh-2Go%8ke0+UneXq~lP7V*Zm`NjK8DbQgH;x|^7Z<02%NP8ekeW(O2ni!S zFfJG?+miyrdZi`FS1K|{qe|8p$9G%FO_P+h{f^iBI1+f?H`2$w`c5P2G5AJZeNbIj zm)&xOMwEsSpW^9Dfe)MN8{)oKVf76SsdABzA1!Ze2*nO;oDX}jRS$Y)?Lg6?Fx}qe zDhg8#6zj)bNf{0s8xjQ;B+%^78XnggoHakzpfoS?^Efpm=8U&1`cpQ^v=~2NfIwt901Yzr(r@ zQ-x$1XP8ijPfBAaOEYV0FPC_lZemlve%18Zoh)P5^rF;2MMVvI`0$~_(9n>K9D;_L zi|9)|UOf{AM3FD{8WEl^{~(9o@mWvwHK^RP@v*VFT93nJHO)Nb=RNVhd6En6QmJ6>hjQ*xoY&E(6kPk1RyChHst^ogC;@cYZTUg#TI^KM$F{Psf>>;Eb!MxT&+ z%~gOs7#kYSA2xWOucwQ8md9(M^`X-sIw*u3^h;`8HwX~n;mIs8tl5)#5{y%(y@klV zFK});_@VTLsZsQh7$34ypS$D_z);-c;-c8Do@FDP>iMwsOtn4VzkmOh2nYxqns*Jh zR0l)IHD4kh@1h1+iV~uRWa65_IXF1{=c?^z;`vOGyF&4i>)mTT3F&Z3A#T%-C~CbN zjjaO#l^VYM;%i?^o9Q&U7Au<0=+d$I`FXFc;oR(>0DQwe@=d(fUd9YMrM~o;>;V<;xfBsHiAI zEP4?Ptt$G+Qzv9yfIu2+>QBPCvlwBqHS0~}TLz_ZmywZSML9;g zJt!sbpG>KQLjkTYCU(!J$xYSSjuet5FM++p%%zGlFRaN^%0D$=Px!=NJL%)2I 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pause_outline.png b/app/src/main/res/drawable-xxxhdpi/ic_pause_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..162ed84d1f497b59c708e06b510e56eae8006900 GIT binary patch literal 4724 zcmX|F2|SeB8~$c6Gxi}%gcha6mWrJU003GYZFLjSHlAMy82D@Q z(;W^PnEg#Hbh^L(H>T*zRca7IrfF96G# zU(r*3DTpmv<)W6xdN(nkZjITq5WQyQFRPfxQ|{~RoHCRpP+wneGJYQ|#>B!n6^`3< zQre3j;#{Uq@WpS>@*RYo4)e|K9bE6-2?5{qZqjU^YnPT*F#@lpUi}?fg^)65`z}fN95hVzrP|bZb0yv z>oAW}+hTNzkVIh6TA}!bgRQNtjg9fzz1^jO{If>2fX8ZEr$-xS12z6DQl=ue)zsD1 z`J5t<)EKnp$=kPY;bdfF)^TxhVnahi6R^&}+qZA;4n)A|=lS{ga>Z>MLYSQ*(DaQC z2X8}&qoa3w11CbAFAEF1Hu%gvQ~Z9X81&K9QZ)HECFNqAX3l7Pkz*4QDz4q~=D6Z| z@J{=JPj$n|{!Dyoglp~|>+7$%%E3E}zXk^fJ#_O-IM*v6tm~xSo}OUO@tPrgQj&ji zBpWR)t)-8zZ=h@CSlkpl)L@=;^VflZprG}gQmccI4PyP7Mspg8MB0stit<|8JrtW7 zW_%#UWc$q;9}^Rk<-5=`gt{KGF91==E-27;mP_4Zr-?3M?17b!@lQJn5FEvN!SUOp zs9Be(si;bC>_%PnnSI)jo9mcikpF{eS&V^onWPf3?_HFWGt+#@t8PoNU=76*%YQQ2 z6mjI>;6R(j4iz_@TL{7{r1z-s3kr^4?mhTeS-D1R2z|sorzq*j0FBa{%^%w~)YGG3 zW@0*qk_Na11s7twQ{^{SmX?+>mG*rMmGSI0(!g3e7k&X1y4@`=#>U2W2Jy(tDlBwe z!7D$ay7SJQ;l`~fOgFhzLA%P;t4qY%KrdGztLh|0VPRooF)=a1;L2`lgfh96Q2WG> zAF(znnEMf{tEP448-tPX1rN$nc5(C}b z-1wB0Pd3ME1M7{hymyiLQ#-ZWOn0dUGBD09esM0acKmU_iwpr5OltP5BD{I|a?43F z3e%(=h7vn?6dZgFO;GyU)pb0(JXGxLLff@nM|miVT?`GwFT`{^)jCREbj$iP>~KgdNcviR>!`tbVsGDk>5Y zj>Kv+Lklg@1}!K(u%b)Q5MKvR3V-uj(2!VMT3X6DO821rf@#O_f=+MzCqci0!a^PC z)b2KQqOtCY?iE4#14`}|rwZ%laQPh<7nkp(_1cZ(nA^{t5DFcn*s!z@`T6-|mg!ls zpQj`R1qEY+W?wBkBz+`9yX~|w6E_>@d`>DXO2YK%DgZ&&gZ#h#(oEF72iZZ;*V$~0 zCSAVsh2k1Hl`bi^#&K=yA3Nc$C0c64uw%J#52NszGS6150%;6BGTQ z?2+>I_4RW+TxCqmfJWwQ1|HAV+1Yu7oP!4i1)&TK4dW>}TUvh#FuZp#7PqN0pBNuk zjv+;?udjcNWtA9)PuI8pEJZ)uX=@eVR8qI$yD&&aF`f1BRYt~R*c{C8HE5%orOCg+ zFK?~UUBjDJ3_MNPhY-#IYFhAFtQ=1 z-J~0)hH!OvS9(H%QYvpfVwp6j$Sf<{D86G8GQfPW~RQXcFAi+rV3SU^2inX=%uYIgk?c8wh%Td*3mL(vKyl_ffy|%`TjqL11W6H+;eFe|QKv&ijXAW5bOYj7qLi2CUu6#YV^l5aW~` z9UX^PJIHc1Go5=^0b>swf?GX*ATJw?9+zNESwJMot>mj?vj+o4N>AXmS)NJBJqAE^ z1v@=GtuJ&Tfr=q)D~tlOcnvKkMhgL6arc!i{5l)7M5`fU;^PhVb#!9X3IPuj6O-)e znVG^;X=amz`!1h;Xj^px;xsE5YE`iU0>KynG;Q2fXD~aG&HUyGVXV3p+XbE z{hS8^V&o^)NTfZ;RI<|=ZGUY{*a~eD#0yWjBas3s9w3T-;sPm3ASz@NcdN%%0ZeuK z?xe}p(F)6KkfP*;p`tQ0kV@2viHWP9Q((y*pFDm<+Gtsj7JD6OH_6its=nHP$j$j^ zcSV%tW{p9-M*+c1c2!fkW zPHwnwc=*#LewajdNr^`l=3ulNuy=ys7rxGSr|$U&1YE~dH-$XcoGH2_?-}ytK{NY> z$6Al)r5k6WWL!Nx#Wky&24v*rS*a6kC8-#AsEG`^1_s2j!NJHUPK^_;Zf;|LrlpAv zQmW<<3RtxDE`h;0FfiZ%1}Nb?v#B3^P6fY9sCN8xU8uCB-PPu^>^`2xNU}^8AZ&Frv zC@?LmluIpPvWTPyjp-^|hW%WA4Q#W5IoRp1z9qlZ)qtZ%M!Y*8eynZ8)QxEQt?&-< znD@1+bu|+BhqPQ45)!)b}~hF1JA~GmN>x?VqVa?#jBnRGNPJy?`Q}r94(1SNhQVLJY_^vRfrCx2@CSnj|Y01gS#Bj5wf$du^ zkNEC~rchv=5IrDYCG}<97|D85=L*s$6C)!dfxv^iu*M8aewKgeAxP;7kxr!C%1VFM zxDo@kB{TS4ayz0ZW=@%Kdbl#-?Bo;%9iNRF_k3(Pt5J#)3(n&@c?-h^AV6ep2tL^z zx$jM8Jqgm$m*A`?elr&6niY)P+6H9Kgw8{J$~)~#$sjJTt}dh=TsHk}4wM;5Is@V& z{%pZ_ZLIPTq>~bvyq05QV*#;s85sxJcUT|^Jmd!X+nP2u#3v8Gm{{QUf9v`HtQ!R?Atdgx6cclPg43%g5!=|Cb$RVy%-*g5IyGwmlF z3cnSLx>jPRX4ojjRN%*M^6O zB|dM74@5^ti&a-w*M78E(-iI$%1;(7fHs2eBd2$R$ItnV63A(4huk>nZZGKzy#57h z*&m>mtrAYstsIVf1%-+N)QL{>S@UCE&yr|EnQ= zSX36FjXrWIyh5BP)ACLixU%*lRpVxzkWUG-rL#h%Ww~X>j~zY zb#@d8*1lZv&W&!Br_R>a;~8^)d7~~er6M9Chj-1)hI{?5Sr>hGfNQi%6kFpHKoRU5 zk^dIdt^u{e{j*FpLifIL|4 zAp^L`Ht}uSBcSA->hCumIj15K5fQwgq@FoBIiWv1I;sy14ZY=A^(X*j6j{9sybKHs zd;$XV{FN5_yT4&yfoj abBgkURinpwr)|#3`2GLqo_o)ob7tR}otZQ9z4biL8>6eONGj_Rt$VF@Ckf6uC0|!Jh;^>RQSKi!dBY5!xBtf}ap{^S-*$ zT|@t=&8$!p%JFwSoH4mpy0n^#m4zfTFgQ{w3Ly+w1$eikD0w!YYDb|}hP_@5}01h3SiNiTx3Bub5ye1JM zP%wE~-2Xah^M%itH`x#$OTJzd&u|M44xW(~78bUudBp$k-@j*IOD!+It)Z&gb6HbU zGwbf*!E~`+lGDw>!6E49=l3VwAv>KKiIfZ)&R6~ggTZu8&dy?s^wASNJ*pea%j}2y z`&0v&QWyvZB?zb4&3I?9-un!3#-DPZCd}{+O?EqJ&YZhOU5)=0mB=@4r z%eM~RzD0^HFd$zE!g6lyunwHOh>8ltU@&vA<6$mw@xz~gm-`H+r>E(3Nn0igh9nj= zaTTO7;fwXnXf&EbSop6)_+_S)PT(rf;;=SQS!Uz0dNde*NH-A$p9&F^eG| z1AW8RnedIXUGG&zF;?3OBE^+eR5&Vnaeayu#0_`q>gpt*^L|4^!=I~`q5qx=c^v&em~7dg^5vD4Efp)AS3H!u3^0E-Y|j&KZ?UtZ?N(B*O5-b=otBoS zAj*jLB z&1NKhCQlSXH-*l%JiD|J&)|ez+gjTgEoJ4@&ODxY*q^5vrdA~9FqF+76Bj3or{-y} zxw$EWgM(w?W5ly$2!E?t%mmI3VfZsfprA-&dU(}oP}_XRJ>A{zJv}{45nBXZz|hmt zHEOX?SIP825f8vNGBqVlJWJ;6=EhL|;RBCXcTI1hLWF9lxPY&Ek-oaWe|^tnwZkRx zT0V8JvalkWe3Js|@p7GQc-rNr}S{^N)l%*68=xN8aMItP%y&-5 z$H&t|#l?SFd#iqFY>d^{*B5njb92&1|0MgNT+rR!Epu>ipk#1Mu?G4`VP$32wx(#1 z?SA*}T@UjwPnN?$=E_|=&esD8fes6Uu_m!X^TVx8P3O_E2RC)tuH!Mt2JY8^iVg*L zQ4ng=zsC8jj2avqWU8*N7O1y*L5Pdv_2|)*$GeOS2|Rp!ITA#Yfv@jjy4f}N>}a;t1}Q$?E}zxlyEzq; zW)ZmF8WnS+|H7dz%d~u!V_+=GN&3FWo~pdEkCo zQPHyLT7#-6SNv*HX6E_bprA8+OH0d8M~d(Mfh>*5MG6F@^zUD|2bB@dz;SS{f3j?C zk&=?4(P!b@Rf>UuT3O!M*pOSR<<#J!Qb|rrTcwu`^pX19UGTu%eAYocLjdCjDOStJ z#l?~Qu*0NfWMt?#J8!5OmzzB#n=XCheK4Ucbf2ZI+`O?3!VRu)9M1pBYg}$yQdoG0 zVBjv9@i&qmpyA>Son99pQDPb1qo$_5GW%>DddLs~cBosH(+1W{X+pK=)!qlUg z8XCC!PJnTlJ7LthnXp>ku^shtgI~lAIenqs2)o6 zsI!)aMqjZ*&a>1#Zi@SZ$6R}t-m8OR@bcuC%Z_UTOP7j#PWLlQYSIaPBZ`zW#q#redls;bPtfB!lf3q){& z{}JyXHzM1bM?omrm2ZHHICMsl$e91zccz-TCDew+GP{OaWzPVN_~q>4au!#bZ4vie zh7BKyL<+(^`ZZ&+12@pjz#%&2{()jdTM0<)*hkYFR&ifAuzM$Rt(g|h!zs1K1z6G; znES7$NwQ3#R#C*YYX({Jp%=|dOSX}`Gvrr~&=TtHR&+k34AdX3;_W4ygo0?8H0$?JsLBmv#)>kb^ z4;z!!uE0eVbw%SkyEjL<>hIY=v0cJ2zDjBKMAu(UC$pu-pUNFD|L;|8o6~hA5bIc< z8z|4qAH&0y>v0mltd#FZT&=fa(iIgSdlj9k!a}yFp2Yyce|7m+tHQ;BB`ng?dbqon zBM1pkuJ?F#k3ap-yF5I$Y1&8|#iXR1PX1I69SS_GD*Wy$UTtH?gy*N$MjhL=WnUd| zUC^fJ4?rU`XJ=G{NJSE`6Wa;obl`6+Se&`n5FZyu0lHp`SZri+a`H>Sj!BIhgsxHqrN)*BIlTHA(Qb7dU!;*{RKGBghb2`f z67}0MTv%CIK^yW|^CZK#bqowJY4h{*UFD>$`smEXl@%3R1}HQUhO4BRtB+o4%h^+T zmN779sjpuJ2-QMgb~a<0{QFnT9>)T~1zKT(#GU#1`Bca#bKD#2#-X8?k^B4m0@^up z{~XF^_5_;V+z^I;TmFlOV%fY3pP`qfOyqx>6b4}S) z%Pal&{`c&mJYB9x#kV&mKN`6_wy{}gDJ$cH-=tGO8xB$sMe6gApeRqO`uqEDqIB+y z1#C`~>BZnW9Q%+cIC5}FOH0!ui!@~cxSasJO#$j=uYQIcSL$q(n0$l< z*(s>Wkratj@-32#j4UTMK3@J}vu>^GVO zk}u^x`vIu#f=(!6165X5X7@u2!86bjs>2S$MHE+vvycllHi3(pB~a8Pf$rn~s3-xzl-TXAMdp zjSH6~&ptanC018g52|yW{0kQ)cv8O8Ro1n&aOOQ^KU(2lCbN)DyUE?$0UG=bm zT}O}%XeAcHJQ*DFvBS;j$GOvtvOHIL zvGO*1FiR$FYkggP9~Tj3pwCR)S#c$Za?e6;g$ADk1ls*&St~I2{6>09M@I*jM#%|j z@Zh|t8c#|TU=w$Sb}y<;KaMet15~`s^857#l9VZ4?1^vP*xK4s7W_9~APiZfM>iy- zOxG8VXEA9tmd_4G#o8vlK0d7Gi2S}?G6OyN608jL)2r}jwms-2krIl-0F;Ucnia42c;DRQZsy93I9 z8({2H!M=MI0cd4LO?iqk}#4 z(dS9=wz09{$~pOBe22b=uo@+GT)$*q1Edib)k~aO-()p5VW1G()cvFFL}|ss!oqmh zMWJ-6Xiq8xF|pZ0J-zm+7xqxd{)hMPP1GgMZCN2Sm!P<~uM7{*27|vZlIkk4tptOm zUB>u48b}ms5ghb*_5<&h%?%8ysT-IKff=RQDG-FXdzb$%mkaaavJ_t}Vfo3)69@C0 z_%#{Cs$QwlNBz!JCwCqooKLPKqIxi%cB*xiSeyA|2pZ2Hb3T0ZY|y#pmmwF`cKX1I zdfRilL^U>dm4aRJn8&2sa$8)?dosF33a`%*zrrax`}+EHK8IOlol%Lcb}D@E6bO00@beD8!T^s5MKAArlCpKH8s69MA29Q z(A+Zi)hkWU8;=d?6cn)bTNog9sd(x7dqN?5<#(O0~n$*6cMH!=cNS6{8(sWQ_0OI!24Ou^MEq zzwBAG25K@u#&0X)h^*QKShEDcDqlb$-&LHuL+Ze>gM|g763&hIb1)4Fnwgoolm4CO zLu5ry%udvo)(NJb$}6!dvOy=iefcoXDt2HdeIJb@&DJ1k$#kzva1A9-&!qcUbA}% zOUMAa3(E zN2Lkvh_plBv{2UaIWnK!XB!r-1RaWxmOJIUlxjTV0E?Fo;Ud=IC2Z>*bk7NwzNhl^ zH1ItM`SPidkdQO(HB++Z@z&aMZ^O9pbHCyuqpaa@csD=~*2&4qosioE4?wNINlmTI zeqJq21Cz%PE2I+&{#kt*-qE3GuBZ2g@JC1!sDBPHlF}|(i+Aq19~;YFS-1_RV0~wus`s1x@^%IQ(3G+L_Y-GprLG zaj>)F2lF@6mEXVV?k^V6$Zu3nLP(WezTw9LuGLzAv2Fp4CGS`>rJ?!A$p~~TVG$9_ zXfR_;>$S~8yk=k{k}t3iFdK%nWAVwH!4z%CrV^>efq5Fia2&5h6zLv>wVBQP8iovI+a#8&kB-W`c9ZseK?R;^C1aVMg z_z){}Z1q15QR_%pzo-0uCM>5E-`|AOdz3gcl971FQ)Ghi*e^Tw-q2JRZ}O9rNI{+@ zo;NU+z-Xut!!`})z*ge=BbRUC=(0?+YPNY_UxV%-QN!K2I3W-N7+L4_dEaFggb-iZ a|H + + Date: Wed, 2 Jan 2019 21:49:25 +0100 Subject: [PATCH 61/69] adding a play/pause button at the bottom --- .../pro/activities/PanoramaVideoActivity.kt | 88 ++++++++----------- .../pro/activities/VideoPlayerActivity.kt | 21 ++--- .../gallery/pro/extensions/Activity.kt | 13 +++ .../res/layout/activity_panorama_video.xml | 18 +--- .../res/layout/bottom_video_time_holder.xml | 7 +- app/src/main/res/values/dimens.xml | 1 + 6 files changed, 60 insertions(+), 88 deletions(-) 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 7518add3c..cbfaec7c8 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 @@ -8,7 +8,6 @@ import android.os.Handler import android.view.View import android.view.Window import android.view.WindowManager -import android.view.animation.AnimationUtils import android.widget.RelativeLayout import android.widget.SeekBar import com.google.vr.sdk.widgets.video.VrVideoEventListener @@ -21,10 +20,8 @@ import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.isPiePlus import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.* -import com.simplemobiletools.gallery.pro.helpers.HIDE_PLAY_PAUSE_DELAY import com.simplemobiletools.gallery.pro.helpers.MIN_SKIP_LENGTH import com.simplemobiletools.gallery.pro.helpers.PATH -import com.simplemobiletools.gallery.pro.helpers.PLAY_PAUSE_VISIBLE_ALPHA import kotlinx.android.synthetic.main.activity_panorama_video.* import kotlinx.android.synthetic.main.bottom_video_time_holder.* import java.io.File @@ -41,7 +38,6 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList private var mDuration = 0 private var mCurrTime = 0 - private var mHidePlayPauseHandler = Handler() private var mTimerHandler = Handler() public override fun onCreate(savedInstanceState: Bundle?) { @@ -56,18 +52,6 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) } - setupButtons() - - cardboard.setOnClickListener { - vr_video_view.displayMode = CARDBOARD_DISPLAY_MODE - } - - explore.setOnClickListener { - mIsExploreEnabled = !mIsExploreEnabled - vr_video_view.setPureTouchTracking(mIsExploreEnabled) - explore.setImageResource(if (mIsExploreEnabled) R.drawable.ic_explore else R.drawable.ic_explore_off) - } - handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { checkIntent() @@ -102,7 +86,6 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList } if (!isChangingConfigurations) { - mHidePlayPauseHandler.removeCallbacksAndMessages(null) mTimerHandler.removeCallbacksAndMessages(null) } } @@ -115,6 +98,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList return } + setupButtons() intent.removeExtra(PATH) video_curr_time.setOnClickListener { skip(false) } @@ -164,7 +148,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList }) } - video_play_outline.setOnClickListener { + video_toggle_play_pause.setOnClickListener { togglePlayPause() } } catch (e: Exception) { @@ -205,18 +189,15 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList private fun togglePlayPause() { mIsPlaying = !mIsPlaying - video_play_outline.alpha = PLAY_PAUSE_VISIBLE_ALPHA - mHidePlayPauseHandler.removeCallbacksAndMessages(null) if (mIsPlaying) { playVideo() } else { pauseVideo() } - schedulePlayPauseFadeOut() } private fun playVideo() { - video_play_outline.setImageResource(R.drawable.ic_pause) + video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) if (mCurrTime == mDuration) { setVideoProgress(0) mPlayOnReady = true @@ -229,7 +210,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList private fun pauseVideo() { vr_video_view.pauseVideo() - video_play_outline.setImageResource(R.drawable.ic_play) + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } @@ -246,55 +227,57 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList video_seekbar.progress = video_seekbar.max video_curr_time.text = mDuration.getFormattedDuration() pauseVideo() - video_play_outline.alpha = PLAY_PAUSE_VISIBLE_ALPHA - } - - private fun schedulePlayPauseFadeOut() { - mHidePlayPauseHandler.removeCallbacksAndMessages(null) - mHidePlayPauseHandler.postDelayed({ - video_play_outline.animate().alpha(0f).start() - }, HIDE_PLAY_PAUSE_DELAY) } private fun setupButtons() { - val navBarHeight = navigationBarHeight - video_time_holder.apply { - (layoutParams as RelativeLayout.LayoutParams).bottomMargin = navBarHeight - setPadding(paddingLeft, paddingTop, navigationBarWidth, paddingBottom) + var right = 0 + var bottom = 0 + + if (hasNavBar()) { + if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { + bottom += navigationBarHeight + } else { + right += navigationBarWidth + bottom += navigationBarHeight + } } + video_time_holder.setPadding(0, 0, right, bottom) video_time_holder.onGlobalLayout { - (explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = navBarHeight + video_time_holder.height + val newBottomMargin = video_time_holder.height - resources.getDimension(R.dimen.video_player_play_pause_size).toInt() - resources.getDimension(R.dimen.activity_margin).toInt() + (explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = newBottomMargin (cardboard.layoutParams as RelativeLayout.LayoutParams).apply { - bottomMargin = navBarHeight + video_time_holder.height + bottomMargin = newBottomMargin rightMargin = navigationBarWidth } - vr_view_gradient_background.layoutParams.height = navBarHeight + video_time_holder.height + explore.height explore.requestLayout() } + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) + + cardboard.setOnClickListener { + vr_video_view.displayMode = CARDBOARD_DISPLAY_MODE + } + + explore.setOnClickListener { + mIsExploreEnabled = !mIsExploreEnabled + vr_video_view.setPureTouchTracking(mIsExploreEnabled) + explore.setImageResource(if (mIsExploreEnabled) R.drawable.ic_explore else R.drawable.ic_explore_off) + } } private fun toggleButtonVisibility() { val newAlpha = if (mIsFullscreen) 0f else 1f - arrayOf(cardboard, explore, vr_view_gradient_background).forEach { + arrayOf(cardboard, explore).forEach { it.animate().alpha(newAlpha) + } + + arrayOf(cardboard, explore, video_toggle_play_pause, video_curr_time, video_duration).forEach { it.isClickable = !mIsFullscreen } - var anim = android.R.anim.fade_in - if (mIsFullscreen) { - anim = android.R.anim.fade_out - video_seekbar.setOnSeekBarChangeListener(null) - } else { - video_seekbar.setOnSeekBarChangeListener(this) - } - - AnimationUtils.loadAnimation(this, anim).apply { - duration = 150 - fillAfter = true - video_time_holder.startAnimation(this) - } + video_seekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this) + video_time_holder.animate().alpha(newAlpha).start() } private fun handleClick() { @@ -338,6 +321,5 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList mIsPlaying = true playVideo() mIsDragged = false - schedulePlayPauseFadeOut() } } 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 77bc90f02..bc33713f3 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 @@ -68,7 +68,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen supportActionBar?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) window.statusBarColor = Color.TRANSPARENT window.navigationBarColor = Color.TRANSPARENT - video_time_holder.background = resources.getDrawable(R.drawable.gradient_background) if (config.blackBackground) { video_player_holder.background = ColorDrawable(Color.BLACK) } @@ -247,6 +246,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } private fun playVideo() { + video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) if (mExoPlayer == null) { return } @@ -259,11 +259,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen mWasVideoStarted = true mIsPlaying = true mExoPlayer?.playWhenReady = true - video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } private fun pauseVideo() { + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) if (mExoPlayer == null) { return } @@ -273,7 +273,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen mExoPlayer?.playWhenReady = false } - video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } @@ -380,6 +379,10 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen val newAlpha = if (isFullScreen) 0f else 1f top_shadow.animate().alpha(newAlpha).start() video_time_holder.animate().alpha(newAlpha).start() + video_seekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this) + arrayOf(video_toggle_play_pause, video_curr_time, video_duration).forEach { + it.isClickable = !mIsFullscreen + } } private fun initTimeHolder() { @@ -417,18 +420,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen }) } - private fun hasNavBar(): Boolean { - val display = windowManager.defaultDisplay - - val realDisplayMetrics = DisplayMetrics() - display.getRealMetrics(realDisplayMetrics) - - val displayMetrics = DisplayMetrics() - display.getMetrics(displayMetrics) - - return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels > 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels > 0) - } - private fun skip(forward: Boolean) { if (mExoPlayer == null) { return diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt index 663637b28..a8103b206 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.gallery.pro.extensions import android.app.Activity import android.content.Intent import android.provider.MediaStore +import android.util.DisplayMetrics import android.view.View import androidx.appcompat.app.AppCompatActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity @@ -292,3 +293,15 @@ fun BaseSimpleActivity.updateFavoritePaths(fileDirItems: ArrayList, } }.start() } + +fun Activity.hasNavBar(): Boolean { + val display = windowManager.defaultDisplay + + val realDisplayMetrics = DisplayMetrics() + display.getRealMetrics(realDisplayMetrics) + + val displayMetrics = DisplayMetrics() + display.getMetrics(displayMetrics) + + return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels > 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels > 0) +} diff --git a/app/src/main/res/layout/activity_panorama_video.xml b/app/src/main/res/layout/activity_panorama_video.xml index 7b7919887..343496d24 100644 --- a/app/src/main/res/layout/activity_panorama_video.xml +++ b/app/src/main/res/layout/activity_panorama_video.xml @@ -11,12 +11,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> - + - - - - 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 7e0422f00..94f5b147e 100644 --- a/app/src/main/res/layout/bottom_video_time_holder.xml +++ b/app/src/main/res/layout/bottom_video_time_holder.xml @@ -5,12 +5,13 @@ android:id="@+id/video_time_holder" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentBottom="true"> + android:layout_alignParentBottom="true" + android:background="@drawable/gradient_background"> 96dp 60dp 60dp + 60dp 50dp 72dp 64dp From 5f9ebf49200b2c18d0b9f42325ef85a2ffa08967 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 22:06:10 +0100 Subject: [PATCH 62/69] updating the fullscreen Panorama icons --- app/src/main/res/drawable-hdpi/ic_panorama.png | Bin 520 -> 0 bytes .../res/drawable-hdpi/ic_panorama_outline.png | Bin 0 -> 4498 bytes app/src/main/res/drawable-xhdpi/ic_panorama.png | Bin 622 -> 0 bytes .../res/drawable-xhdpi/ic_panorama_outline.png | Bin 0 -> 5085 bytes app/src/main/res/drawable-xxhdpi/ic_panorama.png | Bin 940 -> 0 bytes .../res/drawable-xxhdpi/ic_panorama_outline.png | Bin 0 -> 9975 bytes .../main/res/drawable-xxxhdpi/ic_panorama.png | Bin 1190 -> 0 bytes .../res/drawable-xxxhdpi/ic_panorama_outline.png | Bin 0 -> 6011 bytes .../circle_black_background_with_inset.xml | 7 ------- app/src/main/res/layout/pager_photo_item.xml | 5 ++--- app/src/main/res/layout/pager_video_item.xml | 10 ++++------ 11 files changed, 6 insertions(+), 16 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_panorama.png create mode 100644 app/src/main/res/drawable-hdpi/ic_panorama_outline.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_panorama.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_panorama_outline.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_panorama.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_panorama_outline.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_panorama.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_panorama_outline.png delete mode 100644 app/src/main/res/drawable/circle_black_background_with_inset.xml diff --git a/app/src/main/res/drawable-hdpi/ic_panorama.png b/app/src/main/res/drawable-hdpi/ic_panorama.png deleted file mode 100644 index 513420277b6ab165259b9ebf0e41c27c7ab896fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520 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 IM6N<$f`za+WdHyG diff --git a/app/src/main/res/drawable-xhdpi/ic_panorama_outline.png b/app/src/main/res/drawable-xhdpi/ic_panorama_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..70e0274ec3e334fcdf945de9f284627c671dbedb GIT binary patch literal 5085 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 GGW>ri>D|Hr literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_panorama.png b/app/src/main/res/drawable-xxhdpi/ic_panorama.png deleted file mode 100644 index 17e7cde47f66d1b7d02af81212f2a097e7dbca29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 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�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 Ef7li1EP)G000002VoOIv0RM-N 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/circle_black_background_with_inset.xml b/app/src/main/res/drawable/circle_black_background_with_inset.xml deleted file mode 100644 index 6bab48721..000000000 --- a/app/src/main/res/drawable/circle_black_background_with_inset.xml +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/app/src/main/res/layout/pager_photo_item.xml b/app/src/main/res/layout/pager_photo_item.xml index f99e39b8c..46ed641d6 100644 --- a/app/src/main/res/layout/pager_photo_item.xml +++ b/app/src/main/res/layout/pager_photo_item.xml @@ -28,9 +28,8 @@ android:layout_width="@dimen/play_outline_size_big" android:layout_height="@dimen/play_outline_size_big" android:layout_centerInParent="true" - android:background="@drawable/circle_black_background_with_inset" - android:padding="28dp" - android:src="@drawable/ic_panorama" + android:padding="20dp" + android:src="@drawable/ic_panorama_outline" android:visibility="gone"/> + android:padding="20dp" + android:src="@drawable/ic_play_outline"/> Date: Wed, 2 Jan 2019 23:07:53 +0100 Subject: [PATCH 63/69] fixing some third party video related intent handling --- app/build.gradle | 2 +- .../pro/activities/PhotoVideoActivity.kt | 23 ++++++++++++++++++- .../gallery/pro/fragments/VideoFragment.kt | 19 ++------------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b94058c33..b31ee9a6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.6.2' + implementation 'com.simplemobiletools:commons:5.6.3' 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' 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 6ab3b2478..ec1e4ebf1 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 @@ -16,6 +16,7 @@ import com.simplemobiletools.commons.helpers.IS_FROM_GALLERY import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.REAL_FILE_PATH import com.simplemobiletools.commons.helpers.isPiePlus +import com.simplemobiletools.gallery.pro.BuildConfig import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.fragments.PhotoFragment @@ -63,6 +64,12 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList private fun checkIntent(savedInstanceState: Bundle? = null) { mUri = intent.data ?: return var filename = getFilenameFromUri(mUri!!) + mIsFromGallery = intent.getBooleanExtra(IS_FROM_GALLERY, false) + if (mIsFromGallery && filename.isVideoFast()) { + launchVideoPlayer() + return + } + if (intent.extras?.containsKey(REAL_FILE_PATH) == true) { val realPath = intent.extras.getString(REAL_FILE_PATH) if (realPath != null) { @@ -76,7 +83,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } } - mIsFromGallery = intent.getBooleanExtra(IS_FROM_GALLERY, false) if (mUri!!.scheme == "file") { if (filename.contains('.')) { scanPathRecursively(mUri!!.path) @@ -134,6 +140,21 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList initBottomActions() } + private fun launchVideoPlayer() { + val newUri = getFinalUriFromPath(mUri.toString(), BuildConfig.APPLICATION_ID) + if (newUri == null) { + toast(R.string.unknown_error_occurred) + return + } + + val mimeType = getUriMimeType(mUri.toString(), newUri) + Intent(this, VideoPlayerActivity::class.java).apply { + setDataAndType(newUri, mimeType) + startActivity(this) + } + finish() + } + override fun onConfigurationChanged(newConfig: Configuration?) { super.onConfigurationChanged(newConfig) initBottomActionsLayout() 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 b3169a277..ec58f51d5 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 @@ -8,14 +8,9 @@ import android.view.View import android.view.ViewGroup import com.bumptech.glide.Glide import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.gallery.pro.BuildConfig import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.activities.PanoramaVideoActivity -import com.simplemobiletools.gallery.pro.activities.VideoPlayerActivity -import com.simplemobiletools.gallery.pro.extensions.config -import com.simplemobiletools.gallery.pro.extensions.navigationBarWidth -import com.simplemobiletools.gallery.pro.extensions.portrait -import com.simplemobiletools.gallery.pro.extensions.realScreenSize +import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.helpers.IsoTypeReader import com.simplemobiletools.gallery.pro.helpers.MEDIUM import com.simplemobiletools.gallery.pro.helpers.PATH @@ -142,17 +137,7 @@ class VideoFragment : ViewPagerFragment() { } private fun launchVideoPlayer() { - val newUri = activity!!.getFinalUriFromPath(medium.path, BuildConfig.APPLICATION_ID) - if (newUri == null) { - context!!.toast(R.string.unknown_error_occurred) - return - } - - val mimeType = activity!!.getUriMimeType(medium.path, newUri) - Intent(activity, VideoPlayerActivity::class.java).apply { - setDataAndType(newUri, mimeType) - context!!.startActivity(this) - } + activity!!.openPath(medium.path, false) } private fun toggleFullscreen() { From a3238a6b9564c5892e720a72bf9857d24e1448ae Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 23:09:18 +0100 Subject: [PATCH 64/69] Revert "remove the setting for toggling autoplaying videos" This reverts commit 62cbdaf9188c2227618f8a90f4fdf9e6888853df. --- .../pro/activities/SettingsActivity.kt | 9 +++++++ .../gallery/pro/helpers/Config.kt | 4 ++++ .../gallery/pro/helpers/Constants.kt | 1 + app/src/main/res/layout/activity_settings.xml | 24 +++++++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt index c9018cb22..8426bd8c4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt @@ -39,6 +39,7 @@ class SettingsActivity : SimpleActivity() { setupManageHiddenFolders() setupShowHiddenItems() setupDoExtraCheck() + setupAutoplayVideos() setupRememberLastVideo() setupLoopVideos() setupAnimateGifs() @@ -148,6 +149,14 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupAutoplayVideos() { + settings_autoplay_videos.isChecked = config.autoplayVideos + settings_autoplay_videos_holder.setOnClickListener { + settings_autoplay_videos.toggle() + config.autoplayVideos = settings_autoplay_videos.isChecked + } + } + private fun setupRememberLastVideo() { settings_remember_last_video_position.isChecked = config.rememberLastVideoPosition settings_remember_last_video_position_holder.setOnClickListener { 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 a36fe8b1b..405181b18 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 @@ -152,6 +152,10 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getStringSet(INCLUDED_FOLDERS, HashSet()) set(includedFolders) = prefs.edit().remove(INCLUDED_FOLDERS).putStringSet(INCLUDED_FOLDERS, includedFolders).apply() + var autoplayVideos: Boolean + get() = prefs.getBoolean(AUTOPLAY_VIDEOS, false) + set(autoplay) = prefs.edit().putBoolean(AUTOPLAY_VIDEOS, autoplay).apply() + var animateGifs: Boolean get() = prefs.getBoolean(ANIMATE_GIFS, false) set(animateGifs) = prefs.edit().putBoolean(ANIMATE_GIFS, animateGifs).apply() 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 b455298ad..16e61ddc8 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 @@ -10,6 +10,7 @@ const val VIEW_TYPE_PREFIX = "view_type_folder_" const val SHOW_HIDDEN_MEDIA = "show_hidden_media" const val TEMPORARILY_SHOW_HIDDEN = "temporarily_show_hidden" const val IS_THIRD_PARTY_INTENT = "is_third_party_intent" +const val AUTOPLAY_VIDEOS = "autoplay_videos" const val REMEMBER_LAST_VIDEO_POSITION = "remember_last_video_position" const val LOOP_VIDEOS = "loop_videos" const val ANIMATE_GIFS = "animate_gifs" diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index fcf352d62..75d86d798 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -208,6 +208,30 @@ android:textAllCaps="true" android:textSize="@dimen/smaller_text_size"/> + + + + + + Date: Wed, 2 Jan 2019 23:12:00 +0100 Subject: [PATCH 65/69] enable autoplay videos by default --- .../kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 405181b18..1b479de80 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 @@ -153,7 +153,7 @@ class Config(context: Context) : BaseConfig(context) { set(includedFolders) = prefs.edit().remove(INCLUDED_FOLDERS).putStringSet(INCLUDED_FOLDERS, includedFolders).apply() var autoplayVideos: Boolean - get() = prefs.getBoolean(AUTOPLAY_VIDEOS, false) + get() = prefs.getBoolean(AUTOPLAY_VIDEOS, true) set(autoplay) = prefs.edit().putBoolean(AUTOPLAY_VIDEOS, autoplay).apply() var animateGifs: Boolean From dd69bbea68a92baa94cc4e9b7c5a98a153f8f751 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 23:25:37 +0100 Subject: [PATCH 66/69] adding some video autoplay handling --- .../pro/activities/PanoramaVideoActivity.kt | 19 ++++++++++--------- .../pro/activities/VideoPlayerActivity.kt | 13 +++++++++---- .../res/layout/bottom_video_time_holder.xml | 3 ++- 3 files changed, 21 insertions(+), 14 deletions(-) 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 cbfaec7c8..8183613d4 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 @@ -12,10 +12,7 @@ import android.widget.RelativeLayout import android.widget.SeekBar import com.google.vr.sdk.widgets.video.VrVideoEventListener import com.google.vr.sdk.widgets.video.VrVideoView -import com.simplemobiletools.commons.extensions.getFormattedDuration -import com.simplemobiletools.commons.extensions.onGlobalLayout -import com.simplemobiletools.commons.extensions.showErrorToast -import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.isPiePlus import com.simplemobiletools.gallery.pro.R @@ -136,10 +133,14 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList setupTimer() } - if (mPlayOnReady) { + if (mPlayOnReady || config.autoplayVideos) { mPlayOnReady = false - playVideo() + mIsPlaying = true + resumeVideo() + } else { + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) } + video_toggle_play_pause.beVisible() } override fun onCompletion() { @@ -190,13 +191,13 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList private fun togglePlayPause() { mIsPlaying = !mIsPlaying if (mIsPlaying) { - playVideo() + resumeVideo() } else { pauseVideo() } } - private fun playVideo() { + private fun resumeVideo() { video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) if (mCurrTime == mDuration) { setVideoProgress(0) @@ -319,7 +320,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList override fun onStopTrackingTouch(seekBar: SeekBar?) { mIsPlaying = true - playVideo() + resumeVideo() mIsDragged = false } } 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 bc33713f3..a21c23d23 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 @@ -232,6 +232,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen private fun videoPrepared() { if (!mWasVideoStarted) { + video_toggle_play_pause.beVisible() mDuration = (mExoPlayer!!.duration / 1000).toInt() video_seekbar.max = mDuration video_duration.text = mDuration.getFormattedDuration() @@ -241,11 +242,15 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen setLastVideoSavedPosition() } - playVideo() + if (config.autoplayVideos) { + resumeVideo() + } else { + video_toggle_play_pause.setImageResource(R.drawable.ic_play_outline) + } } } - private fun playVideo() { + private fun resumeVideo() { video_toggle_play_pause.setImageResource(R.drawable.ic_pause_outline) if (mExoPlayer == null) { return @@ -279,7 +284,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen private fun togglePlayPause() { mIsPlaying = !mIsPlaying if (mIsPlaying) { - playVideo() + resumeVideo() } else { pauseVideo() } @@ -305,7 +310,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen clearLastVideoSavedProgress() mCurrTime = (mExoPlayer!!.duration / 1000).toInt() if (config.loopVideos) { - playVideo() + resumeVideo() } else { video_seekbar.progress = video_seekbar.max video_curr_time.text = mDuration.getFormattedDuration() 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 94f5b147e..69acead92 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,8 @@ android:layout_marginTop="@dimen/activity_margin" android:background="?attr/selectableItemBackgroundBorderless" android:padding="@dimen/small_margin" - android:src="@drawable/ic_pause_outline"/> + android:src="@drawable/ic_pause_outline" + android:visibility="invisible"/> Date: Wed, 2 Jan 2019 23:56:09 +0100 Subject: [PATCH 67/69] improve panorama video handling at third party intents --- .../pro/activities/PhotoVideoActivity.kt | 29 +++++++-- .../gallery/pro/extensions/Context.kt | 60 +++++++++++++++++ .../gallery/pro/fragments/VideoFragment.kt | 64 +------------------ 3 files changed, 88 insertions(+), 65 deletions(-) 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 ec1e4ebf1..b5b1c0fff 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 @@ -27,6 +27,7 @@ import com.simplemobiletools.gallery.pro.models.Medium import kotlinx.android.synthetic.main.bottom_actions.* import kotlinx.android.synthetic.main.fragment_holder.* import java.io.File +import java.io.FileInputStream open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentListener { @@ -147,10 +148,30 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList return } - val mimeType = getUriMimeType(mUri.toString(), newUri) - Intent(this, VideoPlayerActivity::class.java).apply { - setDataAndType(newUri, mimeType) - startActivity(this) + var isPanorama = false + val realPath = intent?.extras?.getString(REAL_FILE_PATH) ?: "" + try { + if (realPath.isNotEmpty()) { + val fis = FileInputStream(File(realPath)) + parseFileChannel(realPath, fis.channel, 0, 0, 0) { + isPanorama = true + } + } + } catch (ignored: Exception) { + } catch (ignored: OutOfMemoryError) { + } + + if (isPanorama) { + Intent(applicationContext, PanoramaVideoActivity::class.java).apply { + putExtra(PATH, realPath) + startActivity(this) + } + } else { + val mimeType = getUriMimeType(mUri.toString(), newUri) + Intent(applicationContext, VideoPlayerActivity::class.java).apply { + setDataAndType(newUri, mimeType) + startActivity(this) + } } finish() } 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 96ae9ab89..3f6b336de 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 @@ -35,6 +35,9 @@ import com.simplemobiletools.gallery.pro.svg.SvgSoftwareLayerSetter import com.simplemobiletools.gallery.pro.views.MySquareImageView import pl.droidsonroids.gif.GifDrawable import java.io.File +import java.io.FileInputStream +import java.nio.ByteBuffer +import java.nio.channels.FileChannel import java.util.HashSet import java.util.LinkedHashSet import kotlin.Comparator @@ -623,3 +626,60 @@ fun Context.updateWidgets() { } } } + +// based on https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/google/code/mp4parser/example/PrintStructure.java +fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -> Unit) { + val FILE_CHANNEL_CONTAINERS = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl") + try { + var iteration = 0 + var currEnd = end + fc.position(start) + if (currEnd <= 0) { + currEnd = start + fc.size() + } + + while (currEnd - fc.position() > 8) { + // just a check to avoid deadloop at some videos + if (iteration++ > 50) { + return + } + + val begin = fc.position() + val byteBuffer = ByteBuffer.allocate(8) + fc.read(byteBuffer) + byteBuffer.rewind() + val size = IsoTypeReader.readUInt32(byteBuffer) + val type = IsoTypeReader.read4cc(byteBuffer) + val newEnd = begin + size + + if (type == "uuid") { + val fis = FileInputStream(File(path)) + fis.skip(begin) + + val sb = StringBuilder() + val buffer = ByteArray(1024) + while (true) { + val n = fis.read(buffer) + if (n != -1) { + sb.append(String(buffer, 0, n)) + } else { + break + } + } + + val xmlString = sb.toString().toLowerCase() + if (xmlString.contains("gspherical:projectiontype>equirectangular") || xmlString.contains("gspherical:projectiontype=\"equirectangular\"")) { + callback.invoke() + } + return + } + + if (FILE_CHANNEL_CONTAINERS.contains(type)) { + parseFileChannel(path, fc, level + 1, begin + 8, newEnd, callback) + } + + fc.position(newEnd) + } + } catch (ignored: Exception) { + } +} 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 ec58f51d5..586edfaa4 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 @@ -11,7 +11,6 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.activities.PanoramaVideoActivity import com.simplemobiletools.gallery.pro.extensions.* -import com.simplemobiletools.gallery.pro.helpers.IsoTypeReader import com.simplemobiletools.gallery.pro.helpers.MEDIUM import com.simplemobiletools.gallery.pro.helpers.PATH import com.simplemobiletools.gallery.pro.models.Medium @@ -19,12 +18,8 @@ import com.simplemobiletools.gallery.pro.views.MediaSideScroll import kotlinx.android.synthetic.main.pager_video_item.view.* import java.io.File import java.io.FileInputStream -import java.nio.ByteBuffer -import java.nio.channels.FileChannel class VideoFragment : ViewPagerFragment() { - private val FILE_CHANNEL_CONTAINERS = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl") - private var mIsFullscreen = false private var mWasFragmentInit = false private var mIsPanorama = false @@ -168,67 +163,14 @@ class VideoFragment : ViewPagerFragment() { private fun checkIfPanorama() { try { val fis = FileInputStream(File(medium.path)) - parseFileChannel(fis.channel, 0, 0, 0) + context!!.parseFileChannel(medium.path, fis.channel, 0, 0, 0) { + mIsPanorama = true + } } catch (ignored: Exception) { } catch (ignored: OutOfMemoryError) { } } - // based on https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/google/code/mp4parser/example/PrintStructure.java - private fun parseFileChannel(fc: FileChannel, level: Int, start: Long, end: Long) { - try { - var iteration = 0 - var currEnd = end - fc.position(start) - if (currEnd <= 0) { - currEnd = start + fc.size() - } - - while (currEnd - fc.position() > 8) { - // just a check to avoid deadloop at some videos - if (iteration++ > 50) { - return - } - - val begin = fc.position() - val byteBuffer = ByteBuffer.allocate(8) - fc.read(byteBuffer) - byteBuffer.rewind() - val size = IsoTypeReader.readUInt32(byteBuffer) - val type = IsoTypeReader.read4cc(byteBuffer) - val newEnd = begin + size - - if (type == "uuid") { - val fis = FileInputStream(File(medium.path)) - fis.skip(begin) - - val sb = StringBuilder() - val buffer = ByteArray(1024) - while (true) { - val n = fis.read(buffer) - if (n != -1) { - sb.append(String(buffer, 0, n)) - } else { - break - } - } - - val xmlString = sb.toString().toLowerCase() - mIsPanorama = xmlString.contains("gspherical:projectiontype>equirectangular") || - xmlString.contains("gspherical:projectiontype=\"equirectangular\"") - return - } - - if (FILE_CHANNEL_CONTAINERS.contains(type)) { - parseFileChannel(fc, level + 1, begin + 8, newEnd) - } - - fc.position(newEnd) - } - } catch (ignored: Exception) { - } - } - private fun openPanorama() { Intent(context, PanoramaVideoActivity::class.java).apply { putExtra(PATH, medium.path) From 2dfbf32f1cd8ce616cda933a03ce67737d569269 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 3 Jan 2019 19:52:16 +0100 Subject: [PATCH 68/69] fix side volume/brightness gesture control at the video player --- .../gallery/pro/views/MediaSideScroll.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/views/MediaSideScroll.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/views/MediaSideScroll.kt index 916550f21..0c424b631 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/views/MediaSideScroll.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/views/MediaSideScroll.kt @@ -10,8 +10,8 @@ import android.view.MotionEvent import android.view.ViewGroup import android.widget.RelativeLayout import android.widget.TextView +import com.simplemobiletools.commons.extensions.onGlobalLayout import com.simplemobiletools.gallery.pro.R -import com.simplemobiletools.gallery.pro.activities.ViewPagerActivity import com.simplemobiletools.gallery.pro.extensions.audioManager import com.simplemobiletools.gallery.pro.helpers.CLICK_MAX_DURATION import com.simplemobiletools.gallery.pro.helpers.DRAG_THRESHOLD @@ -25,6 +25,7 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co private var mTouchDownValue = -1 private var mTempBrightness = 0 private var mLastTouchY = 0f + private var mViewHeight = 0 private var mIsBrightnessScroll = false private var mPassTouches = false private var dragThreshold = DRAG_THRESHOLD * context.resources.displayMetrics.density @@ -44,6 +45,9 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co mParentView = parentView mIsBrightnessScroll = isBrightness mSlideInfoText = activity.getString(if (isBrightness) R.string.brightness else R.string.volume) + onGlobalLayout { + mViewHeight = height + } } override fun dispatchTouchEvent(ev: MotionEvent): Boolean { @@ -80,7 +84,7 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co val diffY = mTouchDownY - event.y if (Math.abs(diffY) > dragThreshold && Math.abs(diffY) > Math.abs(diffX)) { - var percent = ((diffY / ViewPagerActivity.screenHeight) * 100).toInt() * 3 + var percent = ((diffY / mViewHeight) * 100).toInt() * 3 percent = Math.min(100, Math.max(-100, percent)) if ((percent == 100 && event.y > mLastTouchY) || (percent == -100 && event.y < mLastTouchY)) { From d0c00d433cf7f59567c474daa916234ca8c22853 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 3 Jan 2019 19:53:29 +0100 Subject: [PATCH 69/69] use max brightness at playing video if desired --- .../gallery/pro/activities/VideoPlayerActivity.kt | 7 +++++++ 1 file changed, 7 insertions(+) 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 a21c23d23..d4ea4fb25 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 @@ -71,6 +71,13 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen if (config.blackBackground) { video_player_holder.background = ColorDrawable(Color.BLACK) } + + if (config.maxBrightness) { + val attributes = window.attributes + attributes.screenBrightness = 1f + window.attributes = attributes + } + updateTextColors(video_player_holder) }