From 1d23100a5006e8826517396da08af92f7cee7636 Mon Sep 17 00:00:00 2001 From: joragua Date: Tue, 1 Oct 2024 13:07:52 +0200 Subject: [PATCH 01/15] feat: added snackbar when (un)setting av.offline --- .../android/ui/preview/PreviewImageFragment.kt | 12 ++++++++++++ .../android/ui/preview/PreviewTextFragment.kt | 9 ++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index 3872168a7ac..3fb93070cd8 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -46,6 +46,7 @@ import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import com.github.chrisbanes.photoview.PhotoView +import com.google.android.material.snackbar.Snackbar import com.owncloud.android.R import com.owncloud.android.databinding.PreviewImageFragmentBinding import com.owncloud.android.domain.files.model.MIME_SVG @@ -234,11 +235,13 @@ class PreviewImageFragment : FileFragment() { R.id.action_set_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.SetFilesAsAvailableOffline(listOf(file))) + showSnackbarMessage() true } R.id.action_unset_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.UnsetFilesAsAvailableOffline(listOf(file))) + showSnackbarMessage() true } @@ -332,6 +335,15 @@ class PreviewImageFragment : FileFragment() { return if (isSVGFile(file)) Color.WHITE else Color.BLACK } + private fun showSnackbarMessage(){ + val snackbar = Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG) + val snackbarView = snackbar.view + val params = snackbarView.layoutParams as ViewGroup.MarginLayoutParams + params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, 100) + snackbarView.layoutParams = params + snackbar.show() + } + /** * Finishes the preview */ diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt index f6b912b3e7c..330aa35184f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt @@ -37,6 +37,7 @@ import android.view.ViewGroup import android.widget.RelativeLayout import android.widget.TextView import androidx.viewpager2.widget.ViewPager2 +import com.google.android.material.snackbar.Snackbar import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import com.owncloud.android.R @@ -157,6 +158,7 @@ class PreviewTextFragment : FileFragment() { val fileToSetAsAvailableOffline = ArrayList() fileToSetAsAvailableOffline.add(file) fileOperationsViewModel.performOperation(FileOperation.SetFilesAsAvailableOffline(fileToSetAsAvailableOffline)) + Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() true } @@ -164,6 +166,7 @@ class PreviewTextFragment : FileFragment() { val fileToUnsetAsAvailableOffline = ArrayList() fileToUnsetAsAvailableOffline.add(file) fileOperationsViewModel.performOperation(FileOperation.UnsetFilesAsAvailableOffline(fileToUnsetAsAvailableOffline)) + Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() true } @@ -211,12 +214,12 @@ class PreviewTextFragment : FileFragment() { override fun onPrepareOptionsMenu(menu: Menu) { mContainerActivity.storageManager?.let { - val safeFile = file + val safeFile = previewTextViewModel.getCurrentFile() ?: return val accountName = it.account.name - previewTextViewModel.filterMenuOptions(safeFile, accountName) + previewTextViewModel.filterMenuOptions(safeFile.file, accountName) collectLatestLifecycleFlow(previewTextViewModel.menuOptions) { menuOptions -> - val hasWritePermission = safeFile.hasWritePermission + val hasWritePermission = safeFile.file.hasWritePermission menu.filterMenuOptions(menuOptions, hasWritePermission) } } From d39be71bd6928bacee8d7cbc278ce7b7da0f0ef9 Mon Sep 17 00:00:00 2001 From: joragua Date: Wed, 2 Oct 2024 12:40:44 +0200 Subject: [PATCH 02/15] feat: updated options menu in text preview --- .../previews/PreviewTextViewModel.kt | 8 +++++++ .../android/ui/preview/PreviewTextFragment.kt | 24 +++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt index bd8f6a8f85f..0fbeb730114 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt @@ -26,9 +26,11 @@ import androidx.lifecycle.viewModelScope import com.owncloud.android.R import com.owncloud.android.domain.files.model.FileMenuOption import com.owncloud.android.domain.files.model.OCFile +import com.owncloud.android.domain.files.usecases.GetFileByIdAsStreamUseCase import com.owncloud.android.providers.ContextProvider import com.owncloud.android.providers.CoroutinesDispatcherProvider import com.owncloud.android.usecases.files.FilterFileMenuOptionsUseCase +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -38,11 +40,17 @@ class PreviewTextViewModel( private val filterFileMenuOptionsUseCase: FilterFileMenuOptionsUseCase, private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, + getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, + idFile: Long ) : ViewModel() { private val _menuOptions: MutableStateFlow> = MutableStateFlow(emptyList()) val menuOptions: StateFlow> = _menuOptions + private val currentFile: Flow = getFileByIdAsStreamUseCase(GetFileByIdAsStreamUseCase.Params(idFile)) + + fun getCurrentFile(): Flow = currentFile + fun filterMenuOptions(file: OCFile, accountName: String) { val shareViaLinkAllowed = contextProvider.getBoolean(R.bool.share_via_link_feature) val shareWithUsersAllowed = contextProvider.getBoolean(R.bool.share_with_users_feature) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt index 330aa35184f..71937bf6003 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt @@ -56,6 +56,7 @@ import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.utils.PreferenceUtils import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.component.getScopeName +import org.koin.core.parameter.parametersOf import timber.log.Timber import java.io.BufferedWriter import java.io.FileInputStream @@ -67,7 +68,9 @@ class PreviewTextFragment : FileFragment() { private var account: Account? = null private lateinit var textLoadTask: TextLoadAsyncTask - private val previewTextViewModel by viewModel() + private val previewTextViewModel by viewModel { + parametersOf(file.id) + } private val fileOperationsViewModel by viewModel() private lateinit var binding: PreviewTextFragmentBinding @@ -112,6 +115,16 @@ class PreviewTextFragment : FileFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + collectLatestLifecycleFlow(previewTextViewModel.getCurrentFile()) { currentFile -> + if (currentFile != null) { + file = currentFile + requireActivity().invalidateOptionsMenu() + } else { + requireActivity().onBackPressed() + } + + } + loadAndShowTextPreview() } @@ -214,12 +227,15 @@ class PreviewTextFragment : FileFragment() { override fun onPrepareOptionsMenu(menu: Menu) { mContainerActivity.storageManager?.let { - val safeFile = previewTextViewModel.getCurrentFile() ?: return val accountName = it.account.name - previewTextViewModel.filterMenuOptions(safeFile.file, accountName) + collectLatestLifecycleFlow(previewTextViewModel.getCurrentFile()) { currentFile -> + if (currentFile != null) { + previewTextViewModel.filterMenuOptions(currentFile, accountName) + } + } collectLatestLifecycleFlow(previewTextViewModel.menuOptions) { menuOptions -> - val hasWritePermission = safeFile.file.hasWritePermission + val hasWritePermission = file.hasWritePermission menu.filterMenuOptions(menuOptions, hasWritePermission) } } From 6f7233ca344047a8622e6f60cbd4da31b23f636f Mon Sep 17 00:00:00 2001 From: joragua Date: Wed, 2 Oct 2024 13:12:40 +0200 Subject: [PATCH 03/15] feat: added snackbar when (un)setting av.offline from video and audio preview --- .../com/owncloud/android/ui/preview/PreviewAudioFragment.kt | 3 +++ .../com/owncloud/android/ui/preview/PreviewVideoActivity.kt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index f26847c9872..92547b13e29 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -42,6 +42,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.ImageView +import com.google.android.material.snackbar.Snackbar import com.owncloud.android.R import com.owncloud.android.domain.files.model.OCFile import com.owncloud.android.extensions.collectLatestLifecycleFlow @@ -285,11 +286,13 @@ class PreviewAudioFragment : FileFragment() { R.id.action_set_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.SetFilesAsAvailableOffline(listOf(file))) + Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() true } R.id.action_unset_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.UnsetFilesAsAvailableOffline(listOf(file))) + Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() true } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt index 03e2212dcc8..754f643ea6c 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt @@ -56,6 +56,7 @@ import androidx.media3.exoplayer.source.MediaSource import androidx.media3.exoplayer.trackselection.AdaptiveTrackSelection import androidx.media3.exoplayer.trackselection.DefaultTrackSelector import androidx.media3.ui.PlayerView +import com.google.android.material.snackbar.Snackbar import com.owncloud.android.R import com.owncloud.android.databinding.VideoPreviewBinding import com.owncloud.android.domain.files.model.OCFile @@ -384,6 +385,7 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay val fileToSetAsAvailableOffline = ArrayList() fileToSetAsAvailableOffline.add(file) fileOperationsViewModel.performOperation(SetFilesAsAvailableOffline(fileToSetAsAvailableOffline)) + Snackbar.make(binding.root, R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() true } @@ -391,6 +393,7 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay val fileToUnsetAsAvailableOffline = ArrayList() fileToUnsetAsAvailableOffline.add(file) fileOperationsViewModel.performOperation(UnsetFilesAsAvailableOffline(fileToUnsetAsAvailableOffline)) + Snackbar.make(binding.root, R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() true } From 08f09a54538d290d64b19c88aa368abae8d45f83 Mon Sep 17 00:00:00 2001 From: joragua Date: Wed, 2 Oct 2024 14:16:08 +0200 Subject: [PATCH 04/15] refactor: some changes in prepareOptionsMenu structure in text preview --- .../owncloud/android/ui/preview/PreviewTextFragment.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt index 71937bf6003..7be4610d580 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt @@ -227,15 +227,12 @@ class PreviewTextFragment : FileFragment() { override fun onPrepareOptionsMenu(menu: Menu) { mContainerActivity.storageManager?.let { + val safeFile = file val accountName = it.account.name - collectLatestLifecycleFlow(previewTextViewModel.getCurrentFile()) { currentFile -> - if (currentFile != null) { - previewTextViewModel.filterMenuOptions(currentFile, accountName) - } - } + previewTextViewModel.filterMenuOptions(safeFile,accountName) collectLatestLifecycleFlow(previewTextViewModel.menuOptions) { menuOptions -> - val hasWritePermission = file.hasWritePermission + val hasWritePermission = safeFile.hasWritePermission menu.filterMenuOptions(menuOptions, hasWritePermission) } } From 8358833c07162895b7488a24370e5d264294d882 Mon Sep 17 00:00:00 2001 From: joragua Date: Wed, 2 Oct 2024 14:35:24 +0200 Subject: [PATCH 05/15] feat: updated options menu in audio and video preview --- .../previews/PreviewAudioViewModel.kt | 8 ++++++++ .../previews/PreviewVideoViewModel.kt | 8 ++++++++ .../android/ui/preview/PreviewAudioFragment.kt | 18 ++++++++++++++++-- .../android/ui/preview/PreviewVideoActivity.kt | 18 +++++++++++++++++- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewAudioViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewAudioViewModel.kt index 968ecc438e1..686b827a193 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewAudioViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewAudioViewModel.kt @@ -25,9 +25,11 @@ import androidx.lifecycle.viewModelScope import com.owncloud.android.R import com.owncloud.android.domain.files.model.FileMenuOption import com.owncloud.android.domain.files.model.OCFile +import com.owncloud.android.domain.files.usecases.GetFileByIdAsStreamUseCase import com.owncloud.android.providers.ContextProvider import com.owncloud.android.providers.CoroutinesDispatcherProvider import com.owncloud.android.usecases.files.FilterFileMenuOptionsUseCase +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -37,11 +39,17 @@ class PreviewAudioViewModel( private val filterFileMenuOptionsUseCase: FilterFileMenuOptionsUseCase, private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, + getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, + ocFile: OCFile ) : ViewModel() { private val _menuOptions: MutableStateFlow> = MutableStateFlow(emptyList()) val menuOptions: StateFlow> = _menuOptions + private val currentFile: Flow = getFileByIdAsStreamUseCase(GetFileByIdAsStreamUseCase.Params(ocFile.id!!)) + + fun getCurrentFile(): Flow = currentFile + fun filterMenuOptions(file: OCFile, accountName: String) { val shareViaLinkAllowed = contextProvider.getBoolean(R.bool.share_via_link_feature) val shareWithUsersAllowed = contextProvider.getBoolean(R.bool.share_with_users_feature) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewVideoViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewVideoViewModel.kt index d332dc02724..9ce93154f08 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewVideoViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewVideoViewModel.kt @@ -25,9 +25,11 @@ import androidx.lifecycle.viewModelScope import com.owncloud.android.R import com.owncloud.android.domain.files.model.FileMenuOption import com.owncloud.android.domain.files.model.OCFile +import com.owncloud.android.domain.files.usecases.GetFileByIdAsStreamUseCase import com.owncloud.android.providers.ContextProvider import com.owncloud.android.providers.CoroutinesDispatcherProvider import com.owncloud.android.usecases.files.FilterFileMenuOptionsUseCase +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -37,11 +39,17 @@ class PreviewVideoViewModel( private val filterFileMenuOptionsUseCase: FilterFileMenuOptionsUseCase, private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, + getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, + ocFile: OCFile ) : ViewModel() { private val _menuOptions: MutableStateFlow> = MutableStateFlow(emptyList()) val menuOptions: StateFlow> = _menuOptions + private val currentFile: Flow = getFileByIdAsStreamUseCase(GetFileByIdAsStreamUseCase.Params(ocFile.id!!)) + + fun getCurrentFile(): Flow = currentFile + fun filterMenuOptions(file: OCFile, accountName: String) { val shareViaLinkAllowed = contextProvider.getBoolean(R.bool.share_via_link_feature) val shareWithUsersAllowed = contextProvider.getBoolean(R.bool.share_with_users_feature) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index 92547b13e29..8c430023b48 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -60,6 +60,7 @@ import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.utils.PreferenceUtils import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf import timber.log.Timber /** @@ -86,7 +87,10 @@ class PreviewAudioFragment : FileFragment() { private var mediaServiceConnection: MediaServiceConnection? = null private var autoplay = true - private val previewAudioViewModel by viewModel() + private val previewAudioViewModel by viewModel() { + parametersOf(requireArguments().getParcelable(EXTRA_FILE)) + } + private val fileOperationsViewModel: FileOperationsViewModel by inject() /** @@ -116,6 +120,16 @@ class PreviewAudioFragment : FileFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + collectLatestLifecycleFlow(previewAudioViewModel.getCurrentFile()) { currentFile -> + if (currentFile != null) { + file = currentFile + requireActivity().invalidateOptionsMenu() + } else { + requireActivity().onBackPressed() + } + + } + imagePreview = view.findViewById(R.id.image_preview) mediaController = view.findViewById(R.id.media_controller) } @@ -227,7 +241,7 @@ class PreviewAudioFragment : FileFragment() { super.onPrepareOptionsMenu(menu) val safeFile = file val accountName = account!!.name - previewAudioViewModel.filterMenuOptions(safeFile, accountName) + previewAudioViewModel.filterMenuOptions(safeFile,accountName) collectLatestLifecycleFlow(previewAudioViewModel.menuOptions) { menuOptions -> val hasWritePermission = safeFile.hasWritePermission diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt index 754f643ea6c..1046eb6a6df 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt @@ -37,6 +37,7 @@ import android.view.MenuItem import android.view.View import android.view.Window import androidx.annotation.OptIn +import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog import androidx.core.view.MenuProvider import androidx.core.view.WindowCompat @@ -61,6 +62,7 @@ import com.owncloud.android.R import com.owncloud.android.databinding.VideoPreviewBinding import com.owncloud.android.domain.files.model.OCFile import com.owncloud.android.domain.utils.Event +import com.owncloud.android.extensions.collectLatestLifecycleFlow import com.owncloud.android.extensions.filterMenuOptions import com.owncloud.android.extensions.sendDownloadedFilesByShareSheet import com.owncloud.android.extensions.showErrorInSnackbar @@ -81,8 +83,10 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf import timber.log.Timber +@RequiresApi(Build.VERSION_CODES.TIRAMISU) @OptIn(UnstableApi::class) class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlayerTaskListener, FileFragment.ContainerActivity, MenuProvider { private var account: Account? = null @@ -93,7 +97,7 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay private var playWhenReady = true private var playbackPosition: Long = 0 private var windowInsetsController: WindowInsetsControllerCompat? = null - private val previewVideoViewModel: PreviewVideoViewModel by viewModel() + private val previewVideoViewModel: PreviewVideoViewModel by viewModel() { parametersOf(intent.getParcelableExtra(EXTRA_FILE, OCFile::class.java)) } private val fileOperationsViewModel: FileOperationsViewModel by viewModel() private val transfersViewModel: TransfersViewModel by viewModel() @@ -128,6 +132,16 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay playbackPosition = savedInstanceState.getLong(EXTRA_PLAY_POSITION, 0) } + collectLatestLifecycleFlow(previewVideoViewModel.getCurrentFile()) { currentFile -> + if (currentFile != null) { + file = currentFile + this.invalidateOptionsMenu() + } else { + this.onBackPressed() + } + + } + checkNotNull(file) { "Instanced with a NULL OCFile" } checkNotNull(account) { "Instanced with a NULL ownCloud Account" } check(file.isVideo) { "Not a video file" } @@ -319,6 +333,8 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay } override fun onPrepareMenu(menu: Menu) { + + val safeFile = file val accountName = account!!.name previewVideoViewModel.filterMenuOptions(safeFile, accountName) From a9d2177f07704a00d1c13567aa14718acf22576a Mon Sep 17 00:00:00 2001 From: joragua Date: Wed, 2 Oct 2024 16:59:36 +0200 Subject: [PATCH 06/15] refactor: some changes in view model of text preview --- .../android/presentation/previews/PreviewTextViewModel.kt | 4 ++-- .../com/owncloud/android/ui/preview/PreviewTextFragment.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt index 0fbeb730114..57af51248c4 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt @@ -41,13 +41,13 @@ class PreviewTextViewModel( private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, - idFile: Long + ocFile: OCFile ) : ViewModel() { private val _menuOptions: MutableStateFlow> = MutableStateFlow(emptyList()) val menuOptions: StateFlow> = _menuOptions - private val currentFile: Flow = getFileByIdAsStreamUseCase(GetFileByIdAsStreamUseCase.Params(idFile)) + private val currentFile: Flow = getFileByIdAsStreamUseCase(GetFileByIdAsStreamUseCase.Params(ocFile.id!!)) fun getCurrentFile(): Flow = currentFile diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt index 7be4610d580..865e50af86a 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt @@ -69,7 +69,7 @@ class PreviewTextFragment : FileFragment() { private lateinit var textLoadTask: TextLoadAsyncTask private val previewTextViewModel by viewModel { - parametersOf(file.id) + parametersOf(requireArguments().getParcelable(EXTRA_FILE)) } private val fileOperationsViewModel by viewModel() From c2c86ba1bfa1cbda95940c24d00f3dea08a3acb4 Mon Sep 17 00:00:00 2001 From: joragua Date: Thu, 3 Oct 2024 09:24:29 +0200 Subject: [PATCH 07/15] feat: updated options menu in image preview --- .../android/ui/preview/PreviewImageActivity.kt | 5 ++++- .../android/ui/preview/PreviewImageFragment.kt | 14 +++++++++++++- .../android/ui/preview/PreviewImageViewModel.kt | 11 ++++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt index aaef496e7d2..124faf3c5b7 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt @@ -65,6 +65,7 @@ import com.owncloud.android.usecases.transfers.DOWNLOAD_FINISH_MESSAGE import com.owncloud.android.utils.PreferenceUtils import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf import timber.log.Timber /** @@ -74,7 +75,9 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnPageChangeListener { - private val previewImageViewModel: PreviewImageViewModel by viewModel() + private val previewImageViewModel by viewModel { + parametersOf(file) + } private val fileOperationsViewModel: FileOperationsViewModel by viewModel() private lateinit var viewPager: ViewPager diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index 3fb93070cd8..4c80889a6e1 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -62,6 +62,7 @@ import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.utils.PreferenceUtils import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf import timber.log.Timber import java.io.File @@ -88,7 +89,9 @@ class PreviewImageFragment : FileFragment() { private var _binding: PreviewImageFragmentBinding? = null private val binding get() = _binding!! - private val previewImageViewModel by viewModel() + private val previewImageViewModel by viewModel() { + parametersOf(requireArguments().getParcelable(ARG_FILE)) + } private val fileOperationsViewModel: FileOperationsViewModel by inject() /** @@ -144,6 +147,15 @@ class PreviewImageFragment : FileFragment() { } } + collectLatestLifecycleFlow(previewImageViewModel.getCurrentFile()) { currentFile -> + if (currentFile != null) { + file = currentFile + requireActivity().invalidateOptionsMenu() + } else { + requireActivity().onBackPressed() + } + } + account = requireArguments().getParcelable(PreviewAudioFragment.EXTRA_ACCOUNT) checkNotNull(account) { "Instanced with a NULL ownCloud Account" } checkNotNull(file) { "Instanced with a NULL OCFile" } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt index 8105a2b6dc9..18ee565ca42 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt @@ -30,11 +30,13 @@ import androidx.work.WorkInfo import com.owncloud.android.R import com.owncloud.android.domain.files.model.FileMenuOption import com.owncloud.android.domain.files.model.OCFile +import com.owncloud.android.domain.files.usecases.GetFileByIdAsStreamUseCase import com.owncloud.android.domain.files.usecases.GetFileByIdUseCase import com.owncloud.android.providers.ContextProvider import com.owncloud.android.providers.CoroutinesDispatcherProvider import com.owncloud.android.usecases.files.FilterFileMenuOptionsUseCase import com.owncloud.android.usecases.transfers.downloads.GetLiveDataForFinishedDownloadsFromAccountUseCase +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -45,15 +47,22 @@ class PreviewImageViewModel( private val getLiveDataForFinishedDownloadsFromAccountUseCase: GetLiveDataForFinishedDownloadsFromAccountUseCase, private val filterFileMenuOptionsUseCase: FilterFileMenuOptionsUseCase, private val contextProvider: ContextProvider, - private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider + private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, + getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, + ocFile:OCFile, ) : ViewModel() { + private val _downloads = MediatorLiveData>>() val downloads: LiveData>> = _downloads private val _menuOptions: MutableStateFlow> = MutableStateFlow(emptyList()) val menuOptions: StateFlow> = _menuOptions + private val currentFile: Flow = getFileByIdAsStreamUseCase(GetFileByIdAsStreamUseCase.Params(ocFile.id!!)) + + fun getCurrentFile(): Flow = currentFile + fun startListeningToDownloadsFromAccount(account: Account) { _downloads.addSource( getLiveDataForFinishedDownloadsFromAccountUseCase(GetLiveDataForFinishedDownloadsFromAccountUseCase.Params(account)) From e7b38545125f54645cc2541ed865561b4df613c3 Mon Sep 17 00:00:00 2001 From: joragua Date: Thu, 3 Oct 2024 09:26:01 +0200 Subject: [PATCH 08/15] refactor: changes in image preview snackbar --- .../com/owncloud/android/ui/preview/PreviewImageFragment.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index 4c80889a6e1..82a2bbe72ee 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -349,10 +349,9 @@ class PreviewImageFragment : FileFragment() { private fun showSnackbarMessage(){ val snackbar = Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG) - val snackbarView = snackbar.view - val params = snackbarView.layoutParams as ViewGroup.MarginLayoutParams + val params = snackbar.view.layoutParams as ViewGroup.MarginLayoutParams params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, 100) - snackbarView.layoutParams = params + snackbar.view.layoutParams = params snackbar.show() } From 61632b9168ad16d3badf90b418e6934d92fff555 Mon Sep 17 00:00:00 2001 From: joragua Date: Thu, 3 Oct 2024 10:24:10 +0200 Subject: [PATCH 09/15] chore: added calens file --- changelog/unreleased/4482 | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 changelog/unreleased/4482 diff --git a/changelog/unreleased/4482 b/changelog/unreleased/4482 new file mode 100644 index 00000000000..5ca06e49a17 --- /dev/null +++ b/changelog/unreleased/4482 @@ -0,0 +1,7 @@ +Enhancement: Add status message when (un)setting av. offline from preview + +A message has been added in all previews when the (un)setting av. offline buttons are clicked. +The options menu has been updated in all previews depending on the file status. + +https://github.com/owncloud/android/issues/4382 +https://github.com/owncloud/android/pull/4482 From 227e484f6f953bfc03a8d74a67a1b81208d3431a Mon Sep 17 00:00:00 2001 From: joragua Date: Thu, 3 Oct 2024 14:00:56 +0200 Subject: [PATCH 10/15] feat: added release note --- .../presentation/releasenotes/ReleaseNotesViewModel.kt | 5 +++++ owncloudApp/src/main/res/values/strings.xml | 2 ++ 2 files changed, 7 insertions(+) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/releasenotes/ReleaseNotesViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/releasenotes/ReleaseNotesViewModel.kt index a650293934d..df8f4367904 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/releasenotes/ReleaseNotesViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/releasenotes/ReleaseNotesViewModel.kt @@ -45,6 +45,11 @@ class ReleaseNotesViewModel( companion object { val releaseNotesList = listOf( + ReleaseNote( + title = R.string.release_notes_4_5_0_title_feedback_in_previews, + subtitle = R.string.release_notes_4_5_0_subtitle_feedback_in_previews, + type = ReleaseNoteType.ENHANCEMENT + ), ReleaseNote( title = R.string.release_notes_bugfixes_title, subtitle = R.string.release_notes_bugfixes_subtitle, diff --git a/owncloudApp/src/main/res/values/strings.xml b/owncloudApp/src/main/res/values/strings.xml index d10451ecf82..fec7bd88555 100644 --- a/owncloudApp/src/main/res/values/strings.xml +++ b/owncloudApp/src/main/res/values/strings.xml @@ -727,6 +727,8 @@ Release note icon Minor bugfixes Some bugs were fixed to improve experience in the app + Feedback when (un)setting av. offline in all previews + Added feedback when (un)setting av. offline in all previews and updated options menu depending on file status From f06b6b29485c555c6d67a234d4817941ce2f8c2c Mon Sep 17 00:00:00 2001 From: joragua Date: Thu, 3 Oct 2024 14:03:04 +0200 Subject: [PATCH 11/15] refactor: some ktlint changes --- .../com/owncloud/android/ui/preview/PreviewAudioFragment.kt | 2 +- .../com/owncloud/android/ui/preview/PreviewImageFragment.kt | 2 +- .../com/owncloud/android/ui/preview/PreviewImageViewModel.kt | 2 +- .../java/com/owncloud/android/ui/preview/PreviewTextFragment.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index 8c430023b48..bf56144feb0 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -241,7 +241,7 @@ class PreviewAudioFragment : FileFragment() { super.onPrepareOptionsMenu(menu) val safeFile = file val accountName = account!!.name - previewAudioViewModel.filterMenuOptions(safeFile,accountName) + previewAudioViewModel.filterMenuOptions(safeFile, accountName) collectLatestLifecycleFlow(previewAudioViewModel.menuOptions) { menuOptions -> val hasWritePermission = safeFile.hasWritePermission diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index 82a2bbe72ee..a04855a64e2 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -347,7 +347,7 @@ class PreviewImageFragment : FileFragment() { return if (isSVGFile(file)) Color.WHITE else Color.BLACK } - private fun showSnackbarMessage(){ + private fun showSnackbarMessage() { val snackbar = Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG) val params = snackbar.view.layoutParams as ViewGroup.MarginLayoutParams params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, 100) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt index 18ee565ca42..6a800d50fee 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt @@ -49,7 +49,7 @@ class PreviewImageViewModel( private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, - ocFile:OCFile, + ocFile: OCFile, ) : ViewModel() { diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt index 865e50af86a..eb93a2aceef 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt @@ -229,7 +229,7 @@ class PreviewTextFragment : FileFragment() { mContainerActivity.storageManager?.let { val safeFile = file val accountName = it.account.name - previewTextViewModel.filterMenuOptions(safeFile,accountName) + previewTextViewModel.filterMenuOptions(safeFile, accountName) collectLatestLifecycleFlow(previewTextViewModel.menuOptions) { menuOptions -> val hasWritePermission = safeFile.hasWritePermission From 585df154b525a45eb6c243ad949c2f1d0b49c011 Mon Sep 17 00:00:00 2001 From: joragua Date: Tue, 8 Oct 2024 11:19:30 +0200 Subject: [PATCH 12/15] refactor: some CR changes --- .../presentation/previews/PreviewAudioViewModel.kt | 7 ++++--- .../presentation/previews/PreviewTextViewModel.kt | 7 ++++--- .../presentation/previews/PreviewVideoViewModel.kt | 7 ++++--- .../android/ui/preview/PreviewAudioFragment.kt | 7 ++++--- .../android/ui/preview/PreviewImageFragment.kt | 14 ++++++++++---- .../android/ui/preview/PreviewImageViewModel.kt | 6 +++--- .../android/ui/preview/PreviewTextFragment.kt | 4 ++-- .../android/ui/preview/PreviewVideoActivity.kt | 12 ++++-------- owncloudApp/src/main/res/values/strings.xml | 2 ++ 9 files changed, 37 insertions(+), 29 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewAudioViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewAudioViewModel.kt index 686b827a193..4e799d1fb64 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewAudioViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewAudioViewModel.kt @@ -2,8 +2,9 @@ * ownCloud Android client application * * @author Juan Carlos Garrote Gascón + * @author Jorge Aguado Recio * - * Copyright (C) 2023 ownCloud GmbH. + * Copyright (C) 2024 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -37,10 +38,10 @@ import kotlinx.coroutines.launch class PreviewAudioViewModel( private val filterFileMenuOptionsUseCase: FilterFileMenuOptionsUseCase, + getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, - getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, - ocFile: OCFile + ocFile: OCFile, ) : ViewModel() { private val _menuOptions: MutableStateFlow> = MutableStateFlow(emptyList()) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt index 57af51248c4..0b635fffac4 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewTextViewModel.kt @@ -3,8 +3,9 @@ * * @author Juan Carlos Garrote Gascón * @author Parneet Singh + * @author Jorge Aguado Recio * - * Copyright (C) 2023 ownCloud GmbH. + * Copyright (C) 2024 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -38,10 +39,10 @@ import kotlinx.coroutines.launch class PreviewTextViewModel( private val filterFileMenuOptionsUseCase: FilterFileMenuOptionsUseCase, + getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, - getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, - ocFile: OCFile + ocFile: OCFile, ) : ViewModel() { private val _menuOptions: MutableStateFlow> = MutableStateFlow(emptyList()) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewVideoViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewVideoViewModel.kt index 9ce93154f08..eac7082f6ef 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewVideoViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/previews/PreviewVideoViewModel.kt @@ -2,8 +2,9 @@ * ownCloud Android client application * * @author Juan Carlos Garrote Gascón + * @author Jorge Aguado Recio * - * Copyright (C) 2023 ownCloud GmbH. + * Copyright (C) 2024 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -37,10 +38,10 @@ import kotlinx.coroutines.launch class PreviewVideoViewModel( private val filterFileMenuOptionsUseCase: FilterFileMenuOptionsUseCase, + getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, - getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, - ocFile: OCFile + ocFile: OCFile, ) : ViewModel() { private val _menuOptions: MutableStateFlow> = MutableStateFlow(emptyList()) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index bf56144feb0..8bbeb12c4d2 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -8,6 +8,7 @@ * @author Shashvat Kedia * @author Juan Carlos Garrote Gascón * @author Aitor Ballesteros Pavón + * @author Jorge Aguado Recio * * Copyright (C) 2024 ownCloud GmbH. * @@ -87,7 +88,7 @@ class PreviewAudioFragment : FileFragment() { private var mediaServiceConnection: MediaServiceConnection? = null private var autoplay = true - private val previewAudioViewModel by viewModel() { + private val previewAudioViewModel by viewModel { parametersOf(requireArguments().getParcelable(EXTRA_FILE)) } @@ -300,13 +301,13 @@ class PreviewAudioFragment : FileFragment() { R.id.action_set_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.SetFilesAsAvailableOffline(listOf(file))) - Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() + Snackbar.make(requireView(), R.string.confirmation_set_available_offline, Snackbar.LENGTH_LONG).show() true } R.id.action_unset_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.UnsetFilesAsAvailableOffline(listOf(file))) - Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() + Snackbar.make(requireView(), R.string.confirmation_unset_available_offline, Snackbar.LENGTH_LONG).show() true } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index a04855a64e2..f5191f36ab3 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -8,6 +8,7 @@ * @author Shashvat Kedia * @author Juan Carlos Garrote Gascón * @author Aitor Ballesteros Pavón + * @author Jorge Aguado Recio * * Copyright (C) 2024 ownCloud GmbH. * @@ -247,13 +248,13 @@ class PreviewImageFragment : FileFragment() { R.id.action_set_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.SetFilesAsAvailableOffline(listOf(file))) - showSnackbarMessage() + showSnackbarMessage(setAvailableOffline = true) true } R.id.action_unset_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.UnsetFilesAsAvailableOffline(listOf(file))) - showSnackbarMessage() + showSnackbarMessage(setAvailableOffline = false) true } @@ -347,8 +348,13 @@ class PreviewImageFragment : FileFragment() { return if (isSVGFile(file)) Color.WHITE else Color.BLACK } - private fun showSnackbarMessage() { - val snackbar = Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG) + private fun showSnackbarMessage(setAvailableOffline: Boolean) { + val snackbarString = if (setAvailableOffline) { + R.string.confirmation_set_available_offline + } else { + R.string.confirmation_unset_available_offline + } + val snackbar = Snackbar.make(requireView(), snackbarString, Snackbar.LENGTH_LONG) val params = snackbar.view.layoutParams as ViewGroup.MarginLayoutParams params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, 100) snackbar.view.layoutParams = params diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt index 6a800d50fee..af243d62b82 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageViewModel.kt @@ -3,8 +3,9 @@ * * @author Abel García de Prada * @author Juan Carlos Garrote Gascón + * @author Jorge Aguado Recio * - * Copyright (C) 2023 ownCloud GmbH. + * Copyright (C) 2024 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -46,13 +47,12 @@ class PreviewImageViewModel( private val getFileByIdUseCase: GetFileByIdUseCase, private val getLiveDataForFinishedDownloadsFromAccountUseCase: GetLiveDataForFinishedDownloadsFromAccountUseCase, private val filterFileMenuOptionsUseCase: FilterFileMenuOptionsUseCase, + getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, private val contextProvider: ContextProvider, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, - getFileByIdAsStreamUseCase: GetFileByIdAsStreamUseCase, ocFile: OCFile, ) : ViewModel() { - private val _downloads = MediatorLiveData>>() val downloads: LiveData>> = _downloads diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt index eb93a2aceef..18421282bc6 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt @@ -171,7 +171,7 @@ class PreviewTextFragment : FileFragment() { val fileToSetAsAvailableOffline = ArrayList() fileToSetAsAvailableOffline.add(file) fileOperationsViewModel.performOperation(FileOperation.SetFilesAsAvailableOffline(fileToSetAsAvailableOffline)) - Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() + Snackbar.make(requireView(), R.string.confirmation_set_available_offline, Snackbar.LENGTH_LONG).show() true } @@ -179,7 +179,7 @@ class PreviewTextFragment : FileFragment() { val fileToUnsetAsAvailableOffline = ArrayList() fileToUnsetAsAvailableOffline.add(file) fileOperationsViewModel.performOperation(FileOperation.UnsetFilesAsAvailableOffline(fileToUnsetAsAvailableOffline)) - Snackbar.make(requireView(), R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() + Snackbar.make(requireView(), R.string.confirmation_unset_available_offline, Snackbar.LENGTH_LONG).show() true } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt index 1046eb6a6df..88777672205 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.kt @@ -8,6 +8,7 @@ * @author Shashvat Kedia * @author Juan Carlos Garrote Gascón * @author Aitor Ballesteros Pavón + * @author Jorge Aguado Recio * * Copyright (C) 2024 ownCloud GmbH. * @@ -37,7 +38,6 @@ import android.view.MenuItem import android.view.View import android.view.Window import androidx.annotation.OptIn -import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog import androidx.core.view.MenuProvider import androidx.core.view.WindowCompat @@ -62,7 +62,6 @@ import com.owncloud.android.R import com.owncloud.android.databinding.VideoPreviewBinding import com.owncloud.android.domain.files.model.OCFile import com.owncloud.android.domain.utils.Event -import com.owncloud.android.extensions.collectLatestLifecycleFlow import com.owncloud.android.extensions.filterMenuOptions import com.owncloud.android.extensions.sendDownloadedFilesByShareSheet import com.owncloud.android.extensions.showErrorInSnackbar @@ -86,7 +85,6 @@ import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf import timber.log.Timber -@RequiresApi(Build.VERSION_CODES.TIRAMISU) @OptIn(UnstableApi::class) class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlayerTaskListener, FileFragment.ContainerActivity, MenuProvider { private var account: Account? = null @@ -97,7 +95,7 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay private var playWhenReady = true private var playbackPosition: Long = 0 private var windowInsetsController: WindowInsetsControllerCompat? = null - private val previewVideoViewModel: PreviewVideoViewModel by viewModel() { parametersOf(intent.getParcelableExtra(EXTRA_FILE, OCFile::class.java)) } + private val previewVideoViewModel: PreviewVideoViewModel by viewModel { parametersOf(intent.getParcelableExtra(EXTRA_FILE)) } private val fileOperationsViewModel: FileOperationsViewModel by viewModel() private val transfersViewModel: TransfersViewModel by viewModel() @@ -333,8 +331,6 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay } override fun onPrepareMenu(menu: Menu) { - - val safeFile = file val accountName = account!!.name previewVideoViewModel.filterMenuOptions(safeFile, accountName) @@ -401,7 +397,7 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay val fileToSetAsAvailableOffline = ArrayList() fileToSetAsAvailableOffline.add(file) fileOperationsViewModel.performOperation(SetFilesAsAvailableOffline(fileToSetAsAvailableOffline)) - Snackbar.make(binding.root, R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() + Snackbar.make(binding.root, R.string.confirmation_set_available_offline, Snackbar.LENGTH_LONG).show() true } @@ -409,7 +405,7 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay val fileToUnsetAsAvailableOffline = ArrayList() fileToUnsetAsAvailableOffline.add(file) fileOperationsViewModel.performOperation(UnsetFilesAsAvailableOffline(fileToUnsetAsAvailableOffline)) - Snackbar.make(binding.root, R.string.sync_file_nothing_to_do_msg, Snackbar.LENGTH_LONG).show() + Snackbar.make(binding.root, R.string.confirmation_unset_available_offline, Snackbar.LENGTH_LONG).show() true } diff --git a/owncloudApp/src/main/res/values/strings.xml b/owncloudApp/src/main/res/values/strings.xml index fec7bd88555..08dd4fcc844 100644 --- a/owncloudApp/src/main/res/values/strings.xml +++ b/owncloudApp/src/main/res/values/strings.xml @@ -369,6 +369,8 @@ Set as available offline Unset as available offline + The file was set as available offline correctly + The file was unset as available offline correctly Rename Remove Do you really want to remove %1$s? From 683e9332253a4ddaa7c65171ff33ee29a3017102 Mon Sep 17 00:00:00 2001 From: joragua Date: Wed, 9 Oct 2024 09:26:04 +0200 Subject: [PATCH 13/15] refactor: removed an additional identation --- .../com/owncloud/android/ui/preview/PreviewAudioFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index 8bbeb12c4d2..2087cfffb49 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -301,7 +301,7 @@ class PreviewAudioFragment : FileFragment() { R.id.action_set_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.SetFilesAsAvailableOffline(listOf(file))) - Snackbar.make(requireView(), R.string.confirmation_set_available_offline, Snackbar.LENGTH_LONG).show() + Snackbar.make(requireView(), R.string.confirmation_set_available_offline, Snackbar.LENGTH_LONG).show() true } From 97dbbbfe27e619da78b596aac9491348908646cd Mon Sep 17 00:00:00 2001 From: joragua Date: Wed, 9 Oct 2024 14:29:44 +0200 Subject: [PATCH 14/15] fix: modified snackbar in image preview avoiding margins --- .../android/ui/preview/PreviewImageFragment.kt | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index f5191f36ab3..1e1e2bdd7b8 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -248,13 +248,13 @@ class PreviewImageFragment : FileFragment() { R.id.action_set_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.SetFilesAsAvailableOffline(listOf(file))) - showSnackbarMessage(setAvailableOffline = true) + Snackbar.make(requireActivity().window.decorView, R.string.confirmation_set_available_offline, Snackbar.LENGTH_LONG).show() true } R.id.action_unset_available_offline -> { fileOperationsViewModel.performOperation(FileOperation.UnsetFilesAsAvailableOffline(listOf(file))) - showSnackbarMessage(setAvailableOffline = false) + Snackbar.make(requireActivity().window.decorView, R.string.confirmation_unset_available_offline, Snackbar.LENGTH_LONG).show() true } @@ -348,19 +348,6 @@ class PreviewImageFragment : FileFragment() { return if (isSVGFile(file)) Color.WHITE else Color.BLACK } - private fun showSnackbarMessage(setAvailableOffline: Boolean) { - val snackbarString = if (setAvailableOffline) { - R.string.confirmation_set_available_offline - } else { - R.string.confirmation_unset_available_offline - } - val snackbar = Snackbar.make(requireView(), snackbarString, Snackbar.LENGTH_LONG) - val params = snackbar.view.layoutParams as ViewGroup.MarginLayoutParams - params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, 100) - snackbar.view.layoutParams = params - snackbar.show() - } - /** * Finishes the preview */ From bdd665f529136d7861e6762c852bd55d4af2bcaa Mon Sep 17 00:00:00 2001 From: joragua Date: Thu, 10 Oct 2024 08:56:47 +0000 Subject: [PATCH 15/15] docs: calens changelog updated --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e10f38121af..d6c14a25ef7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ ownCloud admins and users. ## Summary * Change - Replace auto-uploads with automatic uploads: [#4252](https://github.com/owncloud/android/issues/4252) +* Enhancement - Add status message when (un)setting av. offline from preview: [#4382](https://github.com/owncloud/android/issues/4382) ## Details @@ -45,6 +46,15 @@ ownCloud admins and users. https://github.com/owncloud/android/issues/4252 https://github.com/owncloud/android/pull/4492 +* Enhancement - Add status message when (un)setting av. offline from preview: [#4382](https://github.com/owncloud/android/issues/4382) + + A message has been added in all previews when the (un)setting av. offline + buttons are clicked. The options menu has been updated in all previews depending + on the file status. + + https://github.com/owncloud/android/issues/4382 + https://github.com/owncloud/android/pull/4482 + # Changelog for ownCloud Android Client [4.4.0] (2024-09-30) The following sections list the changes in ownCloud Android Client 4.4.0 relevant to