Эх сурвалжийг харах

FileActionsBottomSheet: parse arguments in ViewModel, handle errors

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Álvaro Brey 2 жил өмнө
parent
commit
0cc2e6875d

+ 12 - 17
app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt

@@ -31,6 +31,7 @@ import android.text.style.StyleSpan
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.Toast
 import androidx.annotation.IdRes
 import androidx.appcompat.content.res.AppCompatResources
 import androidx.core.os.bundleOf
@@ -74,14 +75,6 @@ class FileActionsBottomSheet private constructor() : BottomSheetDialogFragment()
     lateinit var componentsGetter: ComponentsGetter
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
-        val args = requireArguments()
-        // todo parse bundle in viewmodel, not here
-        val files: Array<OCFile>? = args.getParcelableArray(ARG_FILES) as Array<OCFile>?
-        require(files != null)
-        val numberOfAllFiles: Int = args.getInt(ARG_ALL_FILES_COUNT, 1)
-        val isOverflow = args.getBoolean(ARG_IS_OVERFLOW, false)
-        val additionalFilter: IntArray? = args.getIntArray(ARG_ADDITIONAL_FILTER)
-
         viewModel = ViewModelProvider(this, vmFactory)[FileActionsViewModel::class.java]
         _binding = FileActionsBottomSheetBinding.inflate(inflater, container, false)
 
@@ -100,6 +93,12 @@ class FileActionsBottomSheet private constructor() : BottomSheetDialogFragment()
                     displayTitle(state.fileCount)
                 }
                 FileActionsViewModel.UiState.Loading -> {}
+                FileActionsViewModel.UiState.Error -> {
+                    context?.let {
+                        Toast.makeText(it, R.string.error_file_actions, Toast.LENGTH_SHORT).show()
+                    }
+                    dismissAllowingStateLoss()
+                }
             }
         }
 
@@ -107,7 +106,7 @@ class FileActionsBottomSheet private constructor() : BottomSheetDialogFragment()
             dispatchActionClick(id)
         }
 
-        viewModel.load(files.toList(), componentsGetter, numberOfAllFiles, isOverflow, additionalFilter)
+        viewModel.load(requireArguments(), componentsGetter)
 
         return binding.root
     }
@@ -255,10 +254,6 @@ class FileActionsBottomSheet private constructor() : BottomSheetDialogFragment()
     companion object {
         private const val REQUEST_KEY = "REQUEST_KEY_ACTION"
         private const val RESULT_KEY_ACTION_ID = "RESULT_KEY_ACTION_ID"
-        private const val ARG_ALL_FILES_COUNT = "ALL_FILES_COUNT"
-        private const val ARG_FILES = "FILES"
-        private const val ARG_IS_OVERFLOW = "OVERFLOW"
-        private const val ARG_ADDITIONAL_FILTER = "ADDITIONAL_FILTER"
 
         @JvmStatic
         @JvmOverloads
@@ -282,12 +277,12 @@ class FileActionsBottomSheet private constructor() : BottomSheetDialogFragment()
         ): FileActionsBottomSheet {
             return FileActionsBottomSheet().apply {
                 val argsBundle = bundleOf(
-                    ARG_ALL_FILES_COUNT to numberOfAllFiles,
-                    ARG_FILES to files.toTypedArray(),
-                    ARG_IS_OVERFLOW to isOverflow
+                    FileActionsViewModel.ARG_ALL_FILES_COUNT to numberOfAllFiles,
+                    FileActionsViewModel.ARG_FILES to ArrayList<OCFile>(files),
+                    FileActionsViewModel.ARG_IS_OVERFLOW to isOverflow
                 )
                 additionalToHide?.let {
-                    argsBundle.putIntArray(ARG_ADDITIONAL_FILTER, additionalToHide.toIntArray())
+                    argsBundle.putIntArray(FileActionsViewModel.ARG_ADDITIONAL_FILTER, additionalToHide.toIntArray())
                 }
                 arguments = argsBundle
             }

+ 32 - 5
app/src/main/java/com/nextcloud/ui/fileactions/FileActionsViewModel.kt

@@ -22,12 +22,14 @@
 
 package com.nextcloud.ui.fileactions
 
+import android.os.Bundle
 import androidx.annotation.IdRes
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import com.nextcloud.client.account.CurrentAccountProvider
+import com.nextcloud.client.logger.Logger
 import com.nextcloud.utils.TimeConstants
 import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.files.FileMenuFilter
@@ -39,7 +41,8 @@ import javax.inject.Inject
 
 class FileActionsViewModel @Inject constructor(
     private val currentAccountProvider: CurrentAccountProvider,
-    private val filterFactory: FileMenuFilter.Factory
+    private val filterFactory: FileMenuFilter.Factory,
+    private val logger: Logger
 ) :
     ViewModel() {
 
@@ -47,6 +50,7 @@ class FileActionsViewModel @Inject constructor(
 
     sealed interface UiState {
         object Loading : UiState
+        object Error : UiState
         data class LoadedForSingleFile(
             val actions: List<FileAction>,
             val titleFile: OCFile?,
@@ -65,24 +69,38 @@ class FileActionsViewModel @Inject constructor(
         @IdRes
         get() = _clickActionId
 
-    fun load(
-        files: Collection<OCFile>,
+    fun load(arguments: Bundle, componentsGetter: ComponentsGetter) {
+        val files: List<OCFile>? = arguments.getParcelableArrayList(ARG_FILES)
+        val numberOfAllFiles: Int = arguments.getInt(ARG_ALL_FILES_COUNT, 1)
+        val isOverflow = arguments.getBoolean(ARG_IS_OVERFLOW, false)
+        val additionalFilter: IntArray? = arguments.getIntArray(ARG_ADDITIONAL_FILTER)
+
+        if (files.isNullOrEmpty()) {
+            logger.d(TAG, "No valid files argument for loading actions")
+            _uiState.postValue(UiState.Error)
+        } else {
+            load(componentsGetter, files.toList(), numberOfAllFiles, isOverflow, additionalFilter)
+        }
+    }
+
+    private fun load(
         componentsGetter: ComponentsGetter,
+        files: Collection<OCFile>,
         numberOfAllFiles: Int?,
         isOverflow: Boolean?,
         additionalFilter: IntArray?
     ) {
         viewModelScope.launch(Dispatchers.IO) {
-            val toHide = getHiddenActions(numberOfAllFiles, files, componentsGetter, isOverflow)
+            val toHide = getHiddenActions(componentsGetter, numberOfAllFiles, files, isOverflow)
             val availableActions = getActionsToShow(additionalFilter, toHide)
             updateStateLoaded(files, availableActions)
         }
     }
 
     private fun getHiddenActions(
+        componentsGetter: ComponentsGetter,
         numberOfAllFiles: Int?,
         files: Collection<OCFile>,
-        componentsGetter: ComponentsGetter,
         isOverflow: Boolean?
     ): List<Int> {
         return filterFactory.newInstance(
@@ -137,4 +155,13 @@ class FileActionsViewModel @Inject constructor(
     fun onClick(action: FileAction) {
         _clickActionId.value = action.id
     }
+
+    companion object {
+        const val ARG_ALL_FILES_COUNT = "ALL_FILES_COUNT"
+        const val ARG_FILES = "FILES"
+        const val ARG_IS_OVERFLOW = "OVERFLOW"
+        const val ARG_ADDITIONAL_FILTER = "ADDITIONAL_FILTER"
+
+        private val TAG = FileActionsViewModel::class.simpleName!!
+    }
 }

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -1053,4 +1053,5 @@
     <string name="no_items">No items</string>
     <string name="check_back_later_or_reload">Check back later or reload.</string>
     <string name="e2e_not_yet_setup">E2E not yet setup</string>
+    <string name="error_file_actions">Error showing file actions</string>
 </resources>