2222
2323package com.owncloud.android.presentation.spaces
2424
25+ import android.content.res.Configuration
2526import android.os.Bundle
2627import android.view.LayoutInflater
2728import android.view.Menu
@@ -34,7 +35,10 @@ import androidx.core.view.isVisible
3435import androidx.fragment.app.Fragment
3536import androidx.fragment.app.setFragmentResult
3637import androidx.recyclerview.widget.GridLayoutManager
38+ import com.google.android.material.bottomsheet.BottomSheetBehavior
39+ import com.google.android.material.bottomsheet.BottomSheetDialog
3740import com.owncloud.android.R
41+ import com.owncloud.android.databinding.FileOptionsBottomSheetFragmentBinding
3842import com.owncloud.android.databinding.SpacesListFragmentBinding
3943import com.owncloud.android.domain.files.model.FileListOption
4044import com.owncloud.android.domain.spaces.model.OCSpace
@@ -44,6 +48,7 @@ import com.owncloud.android.extensions.toDrawableRes
4448import com.owncloud.android.extensions.toSubtitleStringRes
4549import com.owncloud.android.extensions.toTitleStringRes
4650import com.owncloud.android.presentation.capabilities.CapabilityViewModel
51+ import com.owncloud.android.utils.DisplayUtils
4752import com.owncloud.android.presentation.common.UIResult
4853import org.koin.androidx.viewmodel.ext.android.viewModel
4954import org.koin.core.parameter.parametersOf
@@ -84,11 +89,14 @@ class SpacesListFragment : SpacesListAdapter.SpacesListAdapterListener, Fragment
8489 subscribeToViewModels()
8590 }
8691
92+ override fun onConfigurationChanged (newConfig : Configuration ) {
93+ super .onConfigurationChanged(newConfig)
94+ setSpacesLayout(newConfig)
95+ }
96+
8797 private fun initViews () {
8898 setHasOptionsMenu(true )
89-
90- val spacesListLayoutManager = GridLayoutManager (requireContext(), 2 )
91- binding.recyclerSpacesList.layoutManager = spacesListLayoutManager
99+ setSpacesLayout(resources.configuration)
92100 spacesListAdapter = SpacesListAdapter (this )
93101 binding.recyclerSpacesList.adapter = spacesListAdapter
94102
@@ -151,10 +159,53 @@ class SpacesListFragment : SpacesListAdapter.SpacesListAdapterListener, Fragment
151159 }
152160 }
153161
162+ private fun setSpacesLayout (config : Configuration ) {
163+ val layoutColumns = if (config.orientation == Configuration .ORIENTATION_LANDSCAPE ) 2 else 1
164+ val spacesListLayoutManager = GridLayoutManager (requireContext(), layoutColumns)
165+ binding.recyclerSpacesList.layoutManager = spacesListLayoutManager
166+ }
167+
154168 override fun onItemClick (ocSpace : OCSpace ) {
155169 spacesListViewModel.getRootFileForSpace(ocSpace)
156170 }
157171
172+ override fun onThreeDotButtonClick (ocSpace : OCSpace ) {
173+ val spaceOptionsBottomSheetBinding = FileOptionsBottomSheetFragmentBinding .inflate(layoutInflater)
174+ val dialog = BottomSheetDialog (requireContext())
175+ dialog.setContentView(spaceOptionsBottomSheetBinding.root)
176+
177+ val fileOptionsBottomSheetSingleFileBehavior: BottomSheetBehavior <* > = BottomSheetBehavior .from(
178+ spaceOptionsBottomSheetBinding.root.parent as View )
179+ val closeBottomSheetButton = spaceOptionsBottomSheetBinding.closeBottomSheet
180+ closeBottomSheetButton.setOnClickListener {
181+ dialog.dismiss()
182+ }
183+
184+ val thumbnailBottomSheet = spaceOptionsBottomSheetBinding.thumbnailBottomSheet
185+ thumbnailBottomSheet.setImageResource(R .drawable.ic_menu_space)
186+
187+ val spaceNameBottomSheet = spaceOptionsBottomSheetBinding.fileNameBottomSheet
188+ spaceNameBottomSheet.text = ocSpace.name
189+
190+ val spaceSizeBottomSheet = spaceOptionsBottomSheetBinding.fileSizeBottomSheet
191+ spaceSizeBottomSheet.text = DisplayUtils .bytesToHumanReadable(ocSpace.quota?.used ? : 0L , requireContext(), true )
192+
193+ val spaceSeparatorBottomSheet = spaceOptionsBottomSheetBinding.fileSeparatorBottomSheet
194+ spaceSeparatorBottomSheet.visibility = View .GONE
195+
196+ fileOptionsBottomSheetSingleFileBehavior.addBottomSheetCallback(object : BottomSheetBehavior .BottomSheetCallback () {
197+ override fun onStateChanged (bottomSheet : View , newState : Int ) {
198+ if (newState == BottomSheetBehavior .STATE_DRAGGING ) {
199+ fileOptionsBottomSheetSingleFileBehavior.state = BottomSheetBehavior .STATE_EXPANDED
200+ }
201+ }
202+ override fun onSlide (bottomSheet : View , slideOffset : Float ) {}
203+ })
204+
205+ dialog.setOnShowListener { fileOptionsBottomSheetSingleFileBehavior.peekHeight = spaceOptionsBottomSheetBinding.root.measuredHeight }
206+ dialog.show()
207+ }
208+
158209 override fun onCreateOptionsMenu (menu : Menu , inflater : MenuInflater ) {
159210 super .onCreateOptionsMenu(menu, inflater)
160211 (menu.findItem(R .id.action_search).actionView as SearchView ).run {
0 commit comments