From ef0040937aa5bf133a894ca94f74c2455737ca6b Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Thu, 22 Feb 2024 16:22:12 +0100 Subject: [PATCH 1/3] Show network availability in RootFilesFragment --- .../drive/ui/fileList/FileListFragment.kt | 4 +- .../infomaniak/drive/ui/home/HomeFragment.kt | 1 - .../drive/ui/home/RootFilesFragment.kt | 6 +- .../com/infomaniak/drive/utils/Extensions.kt | 19 +++ .../main/res/layout/fragment_file_list.xml | 17 +- .../main/res/layout/fragment_root_files.xml | 159 ++++++++++-------- .../res/layout/layout_no_network_small.xml | 33 ++++ 7 files changed, 144 insertions(+), 95 deletions(-) create mode 100644 app/src/main/res/layout/layout_no_network_small.xml diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt index 398de8b8e2..4b4d421d34 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt @@ -438,7 +438,7 @@ open class FileListFragment : MultiSelectFragment(MATOMO_CATEGORY), SwipeRefresh protected open fun setupFileAdapter() { mainViewModel.isInternetAvailable.observe(viewLifecycleOwner) { isInternetAvailable -> fileAdapter.toggleOfflineMode(requireContext(), !isInternetAvailable) - binding.noNetwork.isGone = isInternetAvailable + binding.noNetworkInclude.noNetwork.isGone = isInternetAvailable } multiSelectManager.apply { @@ -818,7 +818,7 @@ open class FileListFragment : MultiSelectFragment(MATOMO_CATEGORY), SwipeRefresh if (changeControlsVisibility) { val isFileListDestination = findNavController().currentDestination?.id == R.id.fileListFragment - noNetwork.isVisible = hasFilesAndIsOffline + noNetworkInclude.noNetwork.isVisible = hasFilesAndIsOffline toolbar.menu?.findItem(R.id.searchItem)?.isVisible = !hideFileList && isFileListDestination } diff --git a/app/src/main/java/com/infomaniak/drive/ui/home/HomeFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/home/HomeFragment.kt index 5ee8cd8f9a..48a7f4060f 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/home/HomeFragment.kt @@ -53,7 +53,6 @@ class HomeFragment : Fragment(), SwipeRefreshLayout.OnRefreshListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) = with(binding) { super.onViewCreated(view, savedInstanceState) - mainViewModel.isInternetAvailable.observe(viewLifecycleOwner) { isInternetAvailable -> noNetworkCard.root.isGone = isInternetAvailable } diff --git a/app/src/main/java/com/infomaniak/drive/ui/home/RootFilesFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/home/RootFilesFragment.kt index bbc42fdfb1..a5533c331f 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/home/RootFilesFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/home/RootFilesFragment.kt @@ -37,13 +37,10 @@ import com.infomaniak.drive.data.models.File import com.infomaniak.drive.databinding.FragmentRootFilesBinding import com.infomaniak.drive.ui.MainViewModel import com.infomaniak.drive.ui.fileList.FileListViewModel -import com.infomaniak.drive.utils.AccountUtils +import com.infomaniak.drive.utils.* import com.infomaniak.drive.utils.FilePresenter.displayFile import com.infomaniak.drive.utils.FilePresenter.openFolder -import com.infomaniak.drive.utils.Utils import com.infomaniak.drive.utils.Utils.Shortcuts -import com.infomaniak.drive.utils.isPositive -import com.infomaniak.drive.utils.setupSwitchDriveButton import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.lib.core.utils.safeNavigate @@ -79,6 +76,7 @@ class RootFilesFragment : Fragment() { updateAndObserveFiles() observeNavigateFileListTo() + observeAndDisplayNetworkAvailability(mainViewModel, noNetworkInclude, contentLinearLayout) } private fun setupDriveToolbar() = with(binding) { diff --git a/app/src/main/java/com/infomaniak/drive/utils/Extensions.kt b/app/src/main/java/com/infomaniak/drive/utils/Extensions.kt index 65cceb7c4c..dbbd219766 100644 --- a/app/src/main/java/com/infomaniak/drive/utils/Extensions.kt +++ b/app/src/main/java/com/infomaniak/drive/utils/Extensions.kt @@ -30,6 +30,8 @@ import android.os.Build.VERSION import android.os.Build.VERSION_CODES import android.provider.MediaStore import android.text.format.Formatter +import android.transition.AutoTransition +import android.transition.TransitionManager import android.util.DisplayMetrics import android.util.Patterns import android.view.ViewGroup @@ -39,6 +41,7 @@ import android.widget.ImageView import androidx.annotation.DrawableRes import androidx.core.content.ContextCompat import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.view.children import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.fragment.app.Fragment @@ -67,6 +70,7 @@ import com.infomaniak.drive.data.models.drive.Category import com.infomaniak.drive.data.models.drive.Drive import com.infomaniak.drive.databinding.CardviewFileListBinding import com.infomaniak.drive.databinding.ItemUserBinding +import com.infomaniak.drive.databinding.LayoutNoNetworkSmallBinding import com.infomaniak.drive.databinding.LayoutSwitchDriveBinding import com.infomaniak.drive.ui.MainActivity import com.infomaniak.drive.ui.MainViewModel @@ -455,3 +459,18 @@ fun LayoutSwitchDriveBinding.setupSwitchDriveButton(fragment: Fragment) { }, ) } + +fun Fragment.observeAndDisplayNetworkAvailability( + mainViewModel: MainViewModel, + binding: LayoutNoNetworkSmallBinding, + directParent: ViewGroup, +) { + mainViewModel.isInternetAvailable.observe(viewLifecycleOwner) { isInternetAvailable -> + with(AutoTransition()) { + directParent.children.forEach { child -> addTarget(child) } + TransitionManager.beginDelayedTransition(directParent, this) + } + + binding.noNetwork.isGone = isInternetAvailable + } +} diff --git a/app/src/main/res/layout/fragment_file_list.xml b/app/src/main/res/layout/fragment_file_list.xml index 7e0fb68e4b..71a419f7dc 100644 --- a/app/src/main/res/layout/fragment_file_list.xml +++ b/app/src/main/res/layout/fragment_file_list.xml @@ -121,20 +121,9 @@ - + - - + + + android:layout_height="match_parent"> - - - - - - - - - - - + android:layout_marginStart="@dimen/marginStandard" + android:layout_marginTop="@dimen/marginStandard" + android:layout_marginEnd="@dimen/marginStandard"> - - - - - - - - - + android:divider="@drawable/divider" + android:orientation="vertical" + android:showDividers="middle"> + + + + + + + + + + + + + + + + + + + + + + From 98f907eb16b631bacb041f1f913aba900cb29cd4 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Fri, 23 Feb 2024 10:17:20 +0100 Subject: [PATCH 2/3] Reuse newtwork availability method in file list --- .../drive/ui/fileList/FileListFragment.kt | 10 ++++++---- .../drive/ui/home/RootFilesFragment.kt | 6 +++++- .../com/infomaniak/drive/utils/Extensions.kt | 18 ++++++++++-------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt index 4b4d421d34..95f370aba9 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt @@ -436,10 +436,12 @@ open class FileListFragment : MultiSelectFragment(MATOMO_CATEGORY), SwipeRefresh } protected open fun setupFileAdapter() { - mainViewModel.isInternetAvailable.observe(viewLifecycleOwner) { isInternetAvailable -> - fileAdapter.toggleOfflineMode(requireContext(), !isInternetAvailable) - binding.noNetworkInclude.noNetwork.isGone = isInternetAvailable - } + observeAndDisplayNetworkAvailability( + mainViewModel = mainViewModel, + noNetworkBinding = binding.noNetworkInclude, + noNetworkBindingDirectParent = binding.fileListLayout, + additionalChanges = { isInternetAvailable -> fileAdapter.toggleOfflineMode(requireContext(), !isInternetAvailable) } + ) multiSelectManager.apply { openMultiSelect = { openMultiSelect() } diff --git a/app/src/main/java/com/infomaniak/drive/ui/home/RootFilesFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/home/RootFilesFragment.kt index a5533c331f..901585bb9b 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/home/RootFilesFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/home/RootFilesFragment.kt @@ -76,7 +76,11 @@ class RootFilesFragment : Fragment() { updateAndObserveFiles() observeNavigateFileListTo() - observeAndDisplayNetworkAvailability(mainViewModel, noNetworkInclude, contentLinearLayout) + observeAndDisplayNetworkAvailability( + mainViewModel = mainViewModel, + noNetworkBinding = noNetworkInclude, + noNetworkBindingDirectParent = contentLinearLayout, + ) } private fun setupDriveToolbar() = with(binding) { diff --git a/app/src/main/java/com/infomaniak/drive/utils/Extensions.kt b/app/src/main/java/com/infomaniak/drive/utils/Extensions.kt index dbbd219766..dbc1fad1f0 100644 --- a/app/src/main/java/com/infomaniak/drive/utils/Extensions.kt +++ b/app/src/main/java/com/infomaniak/drive/utils/Extensions.kt @@ -30,8 +30,7 @@ import android.os.Build.VERSION import android.os.Build.VERSION_CODES import android.provider.MediaStore import android.text.format.Formatter -import android.transition.AutoTransition -import android.transition.TransitionManager +import android.transition.* import android.util.DisplayMetrics import android.util.Patterns import android.view.ViewGroup @@ -462,15 +461,18 @@ fun LayoutSwitchDriveBinding.setupSwitchDriveButton(fragment: Fragment) { fun Fragment.observeAndDisplayNetworkAvailability( mainViewModel: MainViewModel, - binding: LayoutNoNetworkSmallBinding, - directParent: ViewGroup, + noNetworkBinding: LayoutNoNetworkSmallBinding, + noNetworkBindingDirectParent: ViewGroup, + additionalChanges: ((isInternetAvailable: Boolean) -> Unit)? = null, ) { mainViewModel.isInternetAvailable.observe(viewLifecycleOwner) { isInternetAvailable -> - with(AutoTransition()) { - directParent.children.forEach { child -> addTarget(child) } - TransitionManager.beginDelayedTransition(directParent, this) + val togetherAutoTransition = AutoTransition().apply { ordering = TransitionSet.ORDERING_TOGETHER } + with(togetherAutoTransition) { + noNetworkBindingDirectParent.children.forEach { child -> addTarget(child) } + TransitionManager.beginDelayedTransition(noNetworkBindingDirectParent, this) } - binding.noNetwork.isGone = isInternetAvailable + noNetworkBinding.noNetwork.isGone = isInternetAvailable + additionalChanges?.invoke(isInternetAvailable) } } From 2d0d3002d760fe5b01a0ecc7dcdba04e550d3540 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Fri, 23 Feb 2024 10:56:35 +0100 Subject: [PATCH 3/3] Add no network to gallery --- .../drive/ui/menu/MenuGalleryFragment.kt | 10 +++++++++- .../main/res/layout/fragment_menu_gallery.xml | 19 +++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/MenuGalleryFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/MenuGalleryFragment.kt index a2c5da80ad..09e786f05f 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/MenuGalleryFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/MenuGalleryFragment.kt @@ -26,19 +26,22 @@ import androidx.core.view.isGone import androidx.core.view.marginBottom import androidx.core.view.marginTop import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController +import androidx.fragment.app.activityViewModels import com.google.android.material.appbar.AppBarLayout import com.infomaniak.drive.R import com.infomaniak.drive.databinding.FragmentMenuGalleryBinding import com.infomaniak.drive.databinding.MultiSelectLayoutBinding import com.infomaniak.drive.ui.MainActivity +import com.infomaniak.drive.ui.MainViewModel import com.infomaniak.drive.ui.fileList.multiSelect.GalleryMultiSelectActionsBottomSheetDialog +import com.infomaniak.drive.utils.observeAndDisplayNetworkAvailability import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.lib.core.utils.toPx class MenuGalleryFragment : Fragment() { private var binding: FragmentMenuGalleryBinding by safeBinding() + private val mainViewModel: MainViewModel by activityViewModels() private var galleryFragment = GalleryFragment() @@ -89,6 +92,11 @@ class MenuGalleryFragment : Fragment() { }) adjustFastScrollBarScrollRange() + observeAndDisplayNetworkAvailability( + mainViewModel = mainViewModel, + noNetworkBinding = binding.noNetworkInclude, + noNetworkBindingDirectParent = binding.galleryContentLinearLayout, + ) } private fun adjustFastScrollBarScrollRange() = with(binding) { diff --git a/app/src/main/res/layout/fragment_menu_gallery.xml b/app/src/main/res/layout/fragment_menu_gallery.xml index 2b9f8b1988..d06eb7862d 100644 --- a/app/src/main/res/layout/fragment_menu_gallery.xml +++ b/app/src/main/res/layout/fragment_menu_gallery.xml @@ -59,12 +59,23 @@ android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> - + android:orientation="vertical"> + + + + +