From 18af449e1f94732530dd1a2e20afa1d8d01ed28e Mon Sep 17 00:00:00 2001 From: David Perez Date: Sun, 14 Jan 2024 17:58:03 -0600 Subject: [PATCH] Add underlying pull-to-refresh support to BitwardenScaffold (#610) --- .../platform/components/BitwardenScaffold.kt | 28 +++++++++++++++++-- .../VaultUnlockedNavBarScreen.kt | 2 ++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/BitwardenScaffold.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/BitwardenScaffold.kt index 674b1c7b30..2f80bcad97 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/BitwardenScaffold.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/BitwardenScaffold.kt @@ -1,22 +1,30 @@ package com.x8bit.bitwarden.ui.platform.components +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.exclude import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FabPosition import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.contentColorFor +import androidx.compose.material3.pulltorefresh.PullToRefreshContainer +import androidx.compose.material3.pulltorefresh.PullToRefreshState import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.nestedscroll.nestedScroll /** * Direct passthrough to [Scaffold] but contains a few specific override values. Everything is * still overridable if necessary. */ +@OptIn(ExperimentalMaterial3Api::class) @Composable fun BitwardenScaffold( modifier: Modifier = Modifier, @@ -25,6 +33,7 @@ fun BitwardenScaffold( snackbarHost: @Composable () -> Unit = { }, floatingActionButton: @Composable () -> Unit = { }, floatingActionButtonPosition: FabPosition = FabPosition.End, + pullToRefreshState: PullToRefreshState? = null, containerColor: Color = MaterialTheme.colorScheme.surface, contentColor: Color = contentColorFor(containerColor), contentWindowInsets: WindowInsets = ScaffoldDefaults @@ -33,7 +42,9 @@ fun BitwardenScaffold( content: @Composable (PaddingValues) -> Unit, ) { Scaffold( - modifier = modifier, + modifier = Modifier + .run { pullToRefreshState?.let { nestedScroll(it.nestedScrollConnection) } ?: this } + .then(modifier), topBar = topBar, bottomBar = bottomBar, snackbarHost = snackbarHost, @@ -42,6 +53,19 @@ fun BitwardenScaffold( containerColor = containerColor, contentColor = contentColor, contentWindowInsets = contentWindowInsets, - content = content, + content = { paddingValues -> + Box { + content(paddingValues) + + pullToRefreshState?.let { + PullToRefreshContainer( + state = it, + modifier = Modifier + .padding(paddingValues) + .align(Alignment.TopCenter), + ) + } + } + }, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt index 78d011fa25..ecad6f90af 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBars import androidx.compose.material3.BottomAppBar +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.NavigationBarItem @@ -139,6 +140,7 @@ fun VaultUnlockedNavBarScreen( * Scaffold that contains the bottom nav bar for the [VaultUnlockedNavBarScreen] */ @Composable +@OptIn(ExperimentalMaterial3Api::class) @Suppress("LongMethod") private fun VaultUnlockedNavBarScaffold( navController: NavHostController,