mirror of
https://github.com/bitwarden/android.git
synced 2026-03-21 22:00:42 -05:00
Replace landscape and portrait logic with sceen width logic (#4915)
This commit is contained in:
@@ -226,6 +226,7 @@ dependencies {
|
|||||||
implementation(platform(libs.androidx.compose.bom))
|
implementation(platform(libs.androidx.compose.bom))
|
||||||
implementation(libs.androidx.compose.animation)
|
implementation(libs.androidx.compose.animation)
|
||||||
implementation(libs.androidx.compose.material3)
|
implementation(libs.androidx.compose.material3)
|
||||||
|
implementation(libs.androidx.compose.material3.adaptive)
|
||||||
implementation(libs.androidx.compose.runtime)
|
implementation(libs.androidx.compose.runtime)
|
||||||
implementation(libs.androidx.compose.ui)
|
implementation(libs.androidx.compose.ui)
|
||||||
implementation(libs.androidx.compose.ui.graphics)
|
implementation(libs.androidx.compose.ui.graphics)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.x8bit.bitwarden.ui.auth.feature.accountsetup
|
package com.x8bit.bitwarden.ui.auth.feature.accountsetup
|
||||||
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
@@ -23,7 +22,6 @@ import androidx.compose.ui.Alignment
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
@@ -48,8 +46,9 @@ import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenSwitch
|
|||||||
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
||||||
import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager
|
import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager
|
||||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||||
|
import com.x8bit.bitwarden.ui.platform.model.WindowSize
|
||||||
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
||||||
import com.x8bit.bitwarden.ui.platform.util.isPortrait
|
import com.x8bit.bitwarden.ui.platform.util.rememberWindowSize
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Top level composable for the Auto-fill setup screen.
|
* Top level composable for the Auto-fill setup screen.
|
||||||
@@ -198,21 +197,24 @@ private fun SetupAutoFillContent(
|
|||||||
@Composable
|
@Composable
|
||||||
private fun SetupAutoFillContentHeader(
|
private fun SetupAutoFillContentHeader(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
configuration: Configuration = LocalConfiguration.current,
|
|
||||||
) {
|
) {
|
||||||
if (configuration.isPortrait) {
|
when (rememberWindowSize()) {
|
||||||
Column(
|
WindowSize.Compact -> {
|
||||||
modifier = modifier,
|
Column(
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
modifier = modifier,
|
||||||
) {
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
OrderedHeaderContent()
|
) {
|
||||||
|
OrderedHeaderContent()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Row(
|
WindowSize.Medium -> {
|
||||||
modifier = modifier,
|
Row(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
modifier = modifier,
|
||||||
) {
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
OrderedHeaderContent()
|
) {
|
||||||
|
OrderedHeaderContent()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.x8bit.bitwarden.ui.auth.feature.accountsetup
|
package com.x8bit.bitwarden.ui.auth.feature.accountsetup
|
||||||
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.ColumnScope
|
import androidx.compose.foundation.layout.ColumnScope
|
||||||
@@ -28,7 +27,6 @@ import androidx.compose.runtime.setValue
|
|||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
|
||||||
import androidx.compose.ui.platform.testTag
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
@@ -54,8 +52,9 @@ import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
|||||||
import com.x8bit.bitwarden.ui.platform.composition.LocalBiometricsManager
|
import com.x8bit.bitwarden.ui.platform.composition.LocalBiometricsManager
|
||||||
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricSupportStatus
|
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricSupportStatus
|
||||||
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricsManager
|
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricsManager
|
||||||
|
import com.x8bit.bitwarden.ui.platform.model.WindowSize
|
||||||
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
||||||
import com.x8bit.bitwarden.ui.platform.util.isPortrait
|
import com.x8bit.bitwarden.ui.platform.util.rememberWindowSize
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Top level composable for the setup unlock screen.
|
* Top level composable for the setup unlock screen.
|
||||||
@@ -146,15 +145,13 @@ private fun SetupUnlockScreenContent(
|
|||||||
handler: SetupUnlockHandler,
|
handler: SetupUnlockHandler,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
biometricsManager: BiometricsManager,
|
biometricsManager: BiometricsManager,
|
||||||
config: Configuration = LocalConfiguration.current,
|
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
modifier = modifier.verticalScroll(state = rememberScrollState()),
|
modifier = modifier.verticalScroll(state = rememberScrollState()),
|
||||||
) {
|
) {
|
||||||
if (config.isPortrait) {
|
when (rememberWindowSize()) {
|
||||||
SetupUnlockHeaderPortrait()
|
WindowSize.Compact -> SetupUnlockHeaderCompact()
|
||||||
} else {
|
WindowSize.Medium -> SetupUnlockHeaderMedium()
|
||||||
SetupUnlockHeaderLandscape()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Spacer(modifier = Modifier.height(height = 24.dp))
|
Spacer(modifier = Modifier.height(height = 24.dp))
|
||||||
@@ -243,7 +240,7 @@ private fun SetUpLaterButton(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun ColumnScope.SetupUnlockHeaderPortrait() {
|
private fun ColumnScope.SetupUnlockHeaderCompact() {
|
||||||
Spacer(modifier = Modifier.height(height = 32.dp))
|
Spacer(modifier = Modifier.height(height = 32.dp))
|
||||||
Image(
|
Image(
|
||||||
painter = rememberVectorPainter(id = R.drawable.account_setup),
|
painter = rememberVectorPainter(id = R.drawable.account_setup),
|
||||||
@@ -281,7 +278,7 @@ private fun ColumnScope.SetupUnlockHeaderPortrait() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun SetupUnlockHeaderLandscape(
|
private fun SetupUnlockHeaderMedium(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.x8bit.bitwarden.ui.auth.feature.completeregistration
|
package com.x8bit.bitwarden.ui.auth.feature.completeregistration
|
||||||
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.compose.BackHandler
|
import androidx.activity.compose.BackHandler
|
||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
@@ -27,7 +26,6 @@ import androidx.compose.runtime.setValue
|
|||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.testTag
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
@@ -57,8 +55,9 @@ import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
|
|||||||
import com.x8bit.bitwarden.ui.platform.components.text.BitwardenClickableText
|
import com.x8bit.bitwarden.ui.platform.components.text.BitwardenClickableText
|
||||||
import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenSwitch
|
import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenSwitch
|
||||||
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
||||||
|
import com.x8bit.bitwarden.ui.platform.model.WindowSize
|
||||||
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
||||||
import com.x8bit.bitwarden.ui.platform.util.isPortrait
|
import com.x8bit.bitwarden.ui.platform.util.rememberWindowSize
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Top level composable for the complete registration screen.
|
* Top level composable for the complete registration screen.
|
||||||
@@ -341,21 +340,24 @@ private fun CompleteRegistrationContent(
|
|||||||
@Composable
|
@Composable
|
||||||
private fun CompleteRegistrationContentHeader(
|
private fun CompleteRegistrationContentHeader(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
configuration: Configuration = LocalConfiguration.current,
|
|
||||||
) {
|
) {
|
||||||
if (configuration.isPortrait) {
|
when (rememberWindowSize()) {
|
||||||
Column(
|
WindowSize.Compact -> {
|
||||||
modifier = modifier,
|
Column(
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
modifier = modifier,
|
||||||
) {
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
OrderedHeaderContent()
|
) {
|
||||||
|
OrderedHeaderContent()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Row(
|
WindowSize.Medium -> {
|
||||||
modifier = modifier,
|
Row(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
modifier = modifier,
|
||||||
) {
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
OrderedHeaderContent()
|
) {
|
||||||
|
OrderedHeaderContent()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import androidx.compose.runtime.remember
|
|||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
|
||||||
import androidx.compose.ui.platform.testTag
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.semantics.clearAndSetSemantics
|
import androidx.compose.ui.semantics.clearAndSetSemantics
|
||||||
@@ -48,13 +47,14 @@ import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton
|
|||||||
import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton
|
import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton
|
||||||
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
|
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
|
||||||
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
||||||
|
import com.x8bit.bitwarden.ui.platform.model.WindowSize
|
||||||
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
||||||
import com.x8bit.bitwarden.ui.platform.util.isPortrait
|
import com.x8bit.bitwarden.ui.platform.util.rememberWindowSize
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The custom horizontal margin that is specific to this screen.
|
* The custom horizontal margin that is specific to this screen.
|
||||||
*/
|
*/
|
||||||
private val LANDSCAPE_HORIZONTAL_MARGIN: Dp = 128.dp
|
private val HORIZONTAL_MARGIN_MEDIUM: Dp = 128.dp
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Top level composable for the welcome screen.
|
* Top level composable for the welcome screen.
|
||||||
@@ -106,6 +106,7 @@ fun WelcomeScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("LongMethod")
|
||||||
@Composable
|
@Composable
|
||||||
private fun WelcomeScreenContent(
|
private fun WelcomeScreenContent(
|
||||||
state: WelcomeState,
|
state: WelcomeState,
|
||||||
@@ -119,7 +120,6 @@ private fun WelcomeScreenContent(
|
|||||||
LaunchedEffect(pagerState.currentPage) {
|
LaunchedEffect(pagerState.currentPage) {
|
||||||
onPagerSwipe(pagerState.currentPage)
|
onPagerSwipe(pagerState.currentPage)
|
||||||
}
|
}
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
modifier = modifier.verticalScroll(rememberScrollState()),
|
modifier = modifier.verticalScroll(rememberScrollState()),
|
||||||
@@ -132,17 +132,21 @@ private fun WelcomeScreenContent(
|
|||||||
val pagerSemanticsModifier = Modifier.semantics(mergeDescendants = true) {
|
val pagerSemanticsModifier = Modifier.semantics(mergeDescendants = true) {
|
||||||
contentDescription = pageNumberContentDescription
|
contentDescription = pageNumberContentDescription
|
||||||
}
|
}
|
||||||
if (LocalConfiguration.current.isPortrait) {
|
when (rememberWindowSize()) {
|
||||||
WelcomeCardPortrait(
|
WindowSize.Compact -> {
|
||||||
state = state.pages[index],
|
WelcomeCardCompact(
|
||||||
modifier = pagerSemanticsModifier.standardHorizontalMargin(),
|
state = state.pages[index],
|
||||||
)
|
modifier = pagerSemanticsModifier.standardHorizontalMargin(),
|
||||||
} else {
|
)
|
||||||
WelcomeCardLandscape(
|
}
|
||||||
state = state.pages[index],
|
|
||||||
modifier = pagerSemanticsModifier
|
WindowSize.Medium -> {
|
||||||
.standardHorizontalMargin(landscape = LANDSCAPE_HORIZONTAL_MARGIN),
|
WelcomeCardMedium(
|
||||||
)
|
state = state.pages[index],
|
||||||
|
modifier = pagerSemanticsModifier
|
||||||
|
.standardHorizontalMargin(medium = HORIZONTAL_MARGIN_MEDIUM),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +165,7 @@ private fun WelcomeScreenContent(
|
|||||||
label = stringResource(id = R.string.create_account),
|
label = stringResource(id = R.string.create_account),
|
||||||
onClick = onCreateAccountClick,
|
onClick = onCreateAccountClick,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.standardHorizontalMargin(landscape = LANDSCAPE_HORIZONTAL_MARGIN)
|
.standardHorizontalMargin(medium = HORIZONTAL_MARGIN_MEDIUM)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.testTag("ChooseAccountCreationButton"),
|
.testTag("ChooseAccountCreationButton"),
|
||||||
)
|
)
|
||||||
@@ -170,7 +174,7 @@ private fun WelcomeScreenContent(
|
|||||||
label = stringResource(id = R.string.log_in_verb),
|
label = stringResource(id = R.string.log_in_verb),
|
||||||
onClick = onLoginClick,
|
onClick = onLoginClick,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.standardHorizontalMargin(landscape = LANDSCAPE_HORIZONTAL_MARGIN)
|
.standardHorizontalMargin(medium = HORIZONTAL_MARGIN_MEDIUM)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.testTag("ChooseLoginButton"),
|
.testTag("ChooseLoginButton"),
|
||||||
)
|
)
|
||||||
@@ -181,7 +185,7 @@ private fun WelcomeScreenContent(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun WelcomeCardLandscape(
|
private fun WelcomeCardMedium(
|
||||||
state: WelcomeState.WelcomeCard,
|
state: WelcomeState.WelcomeCard,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
@@ -218,7 +222,7 @@ private fun WelcomeCardLandscape(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun WelcomeCardPortrait(
|
private fun WelcomeCardCompact(
|
||||||
state: WelcomeState.WelcomeCard,
|
state: WelcomeState.WelcomeCard,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import androidx.compose.foundation.layout.PaddingValues
|
|||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.TopAppBarScrollBehavior
|
import androidx.compose.material3.TopAppBarScrollBehavior
|
||||||
|
import androidx.compose.material3.adaptive.WindowAdaptiveInfo
|
||||||
|
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
|
||||||
import androidx.compose.material3.ripple
|
import androidx.compose.material3.ripple
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.Stable
|
import androidx.compose.runtime.Stable
|
||||||
@@ -33,11 +35,8 @@ import androidx.compose.ui.input.key.type
|
|||||||
import androidx.compose.ui.layout.Measurable
|
import androidx.compose.ui.layout.Measurable
|
||||||
import androidx.compose.ui.layout.MeasureResult
|
import androidx.compose.ui.layout.MeasureResult
|
||||||
import androidx.compose.ui.layout.MeasureScope
|
import androidx.compose.ui.layout.MeasureScope
|
||||||
import androidx.compose.ui.node.CompositionLocalConsumerModifierNode
|
|
||||||
import androidx.compose.ui.node.LayoutModifierNode
|
import androidx.compose.ui.node.LayoutModifierNode
|
||||||
import androidx.compose.ui.node.ModifierNodeElement
|
import androidx.compose.ui.node.ModifierNodeElement
|
||||||
import androidx.compose.ui.node.currentValueOf
|
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
|
||||||
import androidx.compose.ui.platform.LocalFocusManager
|
import androidx.compose.ui.platform.LocalFocusManager
|
||||||
import androidx.compose.ui.platform.LocalLayoutDirection
|
import androidx.compose.ui.platform.LocalLayoutDirection
|
||||||
import androidx.compose.ui.platform.testTag
|
import androidx.compose.ui.platform.testTag
|
||||||
@@ -49,8 +48,9 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.compose.ui.unit.offset
|
import androidx.compose.ui.unit.offset
|
||||||
import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage
|
import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage
|
||||||
import com.x8bit.bitwarden.ui.platform.components.model.CardStyle
|
import com.x8bit.bitwarden.ui.platform.components.model.CardStyle
|
||||||
|
import com.x8bit.bitwarden.ui.platform.model.WindowSize
|
||||||
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
||||||
import com.x8bit.bitwarden.ui.platform.util.isPortrait
|
import com.x8bit.bitwarden.ui.platform.util.getWindowSize
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a performance-optimized background color specified by the given [topAppBarScrollBehavior]
|
* Adds a performance-optimized background color specified by the given [topAppBarScrollBehavior]
|
||||||
@@ -215,39 +215,65 @@ fun Modifier.tabNavigation(): Modifier {
|
|||||||
*/
|
*/
|
||||||
@OmitFromCoverage
|
@OmitFromCoverage
|
||||||
@Stable
|
@Stable
|
||||||
|
@Composable
|
||||||
fun Modifier.standardHorizontalMargin(
|
fun Modifier.standardHorizontalMargin(
|
||||||
portrait: Dp = 16.dp,
|
compact: Dp = 16.dp,
|
||||||
landscape: Dp = 48.dp,
|
medium: Dp = 48.dp,
|
||||||
): Modifier =
|
): Modifier =
|
||||||
this then StandardHorizontalMarginElement(portrait = portrait, landscape = landscape)
|
standardHorizontalMargin(
|
||||||
|
compact = compact,
|
||||||
|
medium = medium,
|
||||||
|
windowAdaptiveInfo = currentWindowAdaptiveInfo(),
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a [Modifier] extension for ensuring that the content uses the standard horizontal margin.
|
||||||
|
*/
|
||||||
|
@OmitFromCoverage
|
||||||
|
@Stable
|
||||||
|
fun Modifier.standardHorizontalMargin(
|
||||||
|
compact: Dp = 16.dp,
|
||||||
|
medium: Dp = 48.dp,
|
||||||
|
windowAdaptiveInfo: WindowAdaptiveInfo,
|
||||||
|
): Modifier =
|
||||||
|
this then StandardHorizontalMarginElement(
|
||||||
|
compact = compact,
|
||||||
|
medium = medium,
|
||||||
|
windowAdaptiveInfo = windowAdaptiveInfo,
|
||||||
|
)
|
||||||
|
|
||||||
private data class StandardHorizontalMarginElement(
|
private data class StandardHorizontalMarginElement(
|
||||||
private val portrait: Dp,
|
private val compact: Dp,
|
||||||
private val landscape: Dp,
|
private val medium: Dp,
|
||||||
|
private val windowAdaptiveInfo: WindowAdaptiveInfo,
|
||||||
) : ModifierNodeElement<StandardHorizontalMarginElement.StandardHorizontalMarginConsumerNode>() {
|
) : ModifierNodeElement<StandardHorizontalMarginElement.StandardHorizontalMarginConsumerNode>() {
|
||||||
override fun create(): StandardHorizontalMarginConsumerNode =
|
override fun create(): StandardHorizontalMarginConsumerNode =
|
||||||
StandardHorizontalMarginConsumerNode(
|
StandardHorizontalMarginConsumerNode(
|
||||||
portrait = portrait,
|
compact = compact,
|
||||||
landscape = landscape,
|
medium = medium,
|
||||||
|
windowAdaptiveInfo = windowAdaptiveInfo,
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun update(node: StandardHorizontalMarginConsumerNode) {
|
override fun update(node: StandardHorizontalMarginConsumerNode) {
|
||||||
node.portrait = portrait
|
node.compact = compact
|
||||||
node.landscape = landscape
|
node.medium = medium
|
||||||
}
|
}
|
||||||
|
|
||||||
class StandardHorizontalMarginConsumerNode(
|
class StandardHorizontalMarginConsumerNode(
|
||||||
var portrait: Dp,
|
var compact: Dp,
|
||||||
var landscape: Dp,
|
var medium: Dp,
|
||||||
|
private val windowAdaptiveInfo: WindowAdaptiveInfo,
|
||||||
) : Modifier.Node(),
|
) : Modifier.Node(),
|
||||||
LayoutModifierNode,
|
LayoutModifierNode {
|
||||||
CompositionLocalConsumerModifierNode {
|
|
||||||
override fun MeasureScope.measure(
|
override fun MeasureScope.measure(
|
||||||
measurable: Measurable,
|
measurable: Measurable,
|
||||||
constraints: Constraints,
|
constraints: Constraints,
|
||||||
): MeasureResult {
|
): MeasureResult {
|
||||||
val currentConfig = currentValueOf(LocalConfiguration)
|
val paddingPx = when (windowAdaptiveInfo.getWindowSize()) {
|
||||||
val paddingPx = (if (currentConfig.isPortrait) portrait else landscape).roundToPx()
|
WindowSize.Compact -> compact.roundToPx()
|
||||||
|
WindowSize.Medium -> medium.roundToPx()
|
||||||
|
}
|
||||||
|
|
||||||
// Account for the padding on each side.
|
// Account for the padding on each side.
|
||||||
val horizontalPx = paddingPx * 2
|
val horizontalPx = paddingPx * 2
|
||||||
// Measure the placeable within the horizontal space accounting for the padding Px.
|
// Measure the placeable within the horizontal space accounting for the padding Px.
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.x8bit.bitwarden.ui.platform.model
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum representing the window size classes currently supported by the app.
|
||||||
|
*/
|
||||||
|
enum class WindowSize {
|
||||||
|
Compact,
|
||||||
|
Medium,
|
||||||
|
}
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
@file:OmitFromCoverage
|
|
||||||
|
|
||||||
package com.x8bit.bitwarden.ui.platform.util
|
|
||||||
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A helper method to indicate if the current UI configuration is portrait or not.
|
|
||||||
*/
|
|
||||||
val Configuration.isPortrait: Boolean
|
|
||||||
get() = when (this.orientation) {
|
|
||||||
Configuration.ORIENTATION_LANDSCAPE -> false
|
|
||||||
else -> true
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.x8bit.bitwarden.ui.platform.util
|
||||||
|
|
||||||
|
import androidx.compose.material3.adaptive.WindowAdaptiveInfo
|
||||||
|
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.window.core.layout.WindowWidthSizeClass
|
||||||
|
import com.x8bit.bitwarden.ui.platform.model.WindowSize
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remembers the [WindowSize] class for the window corresponding to the current window metrics.
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
fun rememberWindowSize(
|
||||||
|
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo(),
|
||||||
|
): WindowSize {
|
||||||
|
return remember(key1 = windowAdaptiveInfo.windowSizeClass.windowWidthSizeClass) {
|
||||||
|
windowAdaptiveInfo.getWindowSize()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the [WindowSize] class for the window corresponding to the current window metrics.
|
||||||
|
*/
|
||||||
|
fun WindowAdaptiveInfo.getWindowSize(): WindowSize {
|
||||||
|
// Currently the app only operates with the Compact and Medium sizes in
|
||||||
|
// mind, but we can add support for others in the future here.
|
||||||
|
return when (this.windowSizeClass.windowWidthSizeClass) {
|
||||||
|
WindowWidthSizeClass.COMPACT -> WindowSize.Compact
|
||||||
|
WindowWidthSizeClass.MEDIUM -> WindowSize.Medium
|
||||||
|
else -> WindowSize.Medium
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,6 +17,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
|
|||||||
import androidx.compose.material3.SnackbarDuration
|
import androidx.compose.material3.SnackbarDuration
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.material3.TopAppBarScrollBehavior
|
import androidx.compose.material3.TopAppBarScrollBehavior
|
||||||
|
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
|
||||||
import androidx.compose.material3.rememberTopAppBarState
|
import androidx.compose.material3.rememberTopAppBarState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
import androidx.compose.runtime.DisposableEffect
|
||||||
@@ -382,6 +383,7 @@ private fun CoachMarkScope<ExploreGeneratorCoachMark>.ScrollContent(
|
|||||||
onCoachMarkComplete: () -> Unit,
|
onCoachMarkComplete: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
|
val windowAdaptiveInfo = currentWindowAdaptiveInfo()
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = lazyListState,
|
state = lazyListState,
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
@@ -461,7 +463,7 @@ private fun CoachMarkScope<ExploreGeneratorCoachMark>.ScrollContent(
|
|||||||
onActionClick = onCoachMarkComplete,
|
onActionClick = onCoachMarkComplete,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
modifier = Modifier.standardHorizontalMargin(),
|
modifier = Modifier.standardHorizontalMargin(windowAdaptiveInfo = windowAdaptiveInfo),
|
||||||
) {
|
) {
|
||||||
BitwardenFilledButton(
|
BitwardenFilledButton(
|
||||||
label = stringResource(id = R.string.copy),
|
label = stringResource(id = R.string.copy),
|
||||||
@@ -507,7 +509,8 @@ private fun CoachMarkScope<ExploreGeneratorCoachMark>.ScrollContent(
|
|||||||
onActionClick = onShowNextCoachMark,
|
onActionClick = onShowNextCoachMark,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
modifier = Modifier.standardHorizontalMargin(),
|
modifier = Modifier
|
||||||
|
.standardHorizontalMargin(windowAdaptiveInfo = windowAdaptiveInfo),
|
||||||
) {
|
) {
|
||||||
PasswordTypeContent(
|
PasswordTypeContent(
|
||||||
passwordTypeState = selectedType,
|
passwordTypeState = selectedType,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.navigationBarsPadding
|
|||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
|
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
@@ -70,6 +71,7 @@ fun CoachMarkScope<AddEditItemCoachMark>.VaultAddEditContent(
|
|||||||
)
|
)
|
||||||
|
|
||||||
var isAdditionalOptionsExpanded = rememberSaveable { mutableStateOf(value = false) }
|
var isAdditionalOptionsExpanded = rememberSaveable { mutableStateOf(value = false) }
|
||||||
|
val windowAdaptiveInfo = currentWindowAdaptiveInfo()
|
||||||
LazyColumn(modifier = modifier, state = lazyListState) {
|
LazyColumn(modifier = modifier, state = lazyListState) {
|
||||||
item {
|
item {
|
||||||
Spacer(modifier = Modifier.height(height = 12.dp))
|
Spacer(modifier = Modifier.height(height = 12.dp))
|
||||||
@@ -196,6 +198,7 @@ fun CoachMarkScope<AddEditItemCoachMark>.VaultAddEditContent(
|
|||||||
vaultAddEditLoginItems(
|
vaultAddEditLoginItems(
|
||||||
loginState = state.type,
|
loginState = state.type,
|
||||||
loginItemTypeHandlers = loginItemTypeHandlers,
|
loginItemTypeHandlers = loginItemTypeHandlers,
|
||||||
|
windowAdaptiveInfo = windowAdaptiveInfo,
|
||||||
onTotpSetupClick = {
|
onTotpSetupClick = {
|
||||||
if (permissionsManager.checkPermission(Manifest.permission.CAMERA)) {
|
if (permissionsManager.checkPermission(Manifest.permission.CAMERA)) {
|
||||||
loginItemTypeHandlers.onSetupTotpClick(true)
|
loginItemTypeHandlers.onSetupTotpClick(true)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
|
|||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.lazy.LazyListScope
|
import androidx.compose.foundation.lazy.LazyListScope
|
||||||
|
import androidx.compose.material3.adaptive.WindowAdaptiveInfo
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
@@ -46,6 +47,7 @@ fun LazyListScope.vaultAddEditLoginItems(
|
|||||||
coachMarkScope: CoachMarkScope<AddEditItemCoachMark>,
|
coachMarkScope: CoachMarkScope<AddEditItemCoachMark>,
|
||||||
loginState: VaultAddEditState.ViewState.Content.ItemType.Login,
|
loginState: VaultAddEditState.ViewState.Content.ItemType.Login,
|
||||||
loginItemTypeHandlers: VaultAddEditLoginTypeHandlers,
|
loginItemTypeHandlers: VaultAddEditLoginTypeHandlers,
|
||||||
|
windowAdaptiveInfo: WindowAdaptiveInfo,
|
||||||
onTotpSetupClick: () -> Unit,
|
onTotpSetupClick: () -> Unit,
|
||||||
onNextCoachMark: () -> Unit,
|
onNextCoachMark: () -> Unit,
|
||||||
onPreviousCoachMark: () -> Unit,
|
onPreviousCoachMark: () -> Unit,
|
||||||
@@ -124,7 +126,7 @@ fun LazyListScope.vaultAddEditLoginItems(
|
|||||||
},
|
},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.standardHorizontalMargin(),
|
.standardHorizontalMargin(windowAdaptiveInfo = windowAdaptiveInfo),
|
||||||
) {
|
) {
|
||||||
TotpRow(
|
TotpRow(
|
||||||
totpKey = loginState.totp,
|
totpKey = loginState.totp,
|
||||||
@@ -182,7 +184,7 @@ fun LazyListScope.vaultAddEditLoginItems(
|
|||||||
},
|
},
|
||||||
items = loginState.uriList,
|
items = loginState.uriList,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.standardHorizontalMargin(),
|
.standardHorizontalMargin(windowAdaptiveInfo = windowAdaptiveInfo),
|
||||||
) { uriItem, cardStyle ->
|
) { uriItem, cardStyle ->
|
||||||
VaultAddEditUriItem(
|
VaultAddEditUriItem(
|
||||||
uriItem = uriItem,
|
uriItem = uriItem,
|
||||||
@@ -230,8 +232,7 @@ private fun UsernameRow(
|
|||||||
BitwardenTwoButtonDialog(
|
BitwardenTwoButtonDialog(
|
||||||
title = stringResource(id = R.string.username),
|
title = stringResource(id = R.string.username),
|
||||||
message = stringResource(
|
message = stringResource(
|
||||||
id =
|
id = R.string.are_you_sure_you_want_to_overwrite_the_current_username,
|
||||||
R.string.are_you_sure_you_want_to_overwrite_the_current_username,
|
|
||||||
),
|
),
|
||||||
confirmButtonText = stringResource(id = R.string.yes),
|
confirmButtonText = stringResource(id = R.string.yes),
|
||||||
dismissButtonText = stringResource(id = R.string.no),
|
dismissButtonText = stringResource(id = R.string.no),
|
||||||
@@ -323,10 +324,7 @@ private fun CoachMarkScope<AddEditItemCoachMark>.PasswordRow(
|
|||||||
if (shouldShowDialog) {
|
if (shouldShowDialog) {
|
||||||
BitwardenTwoButtonDialog(
|
BitwardenTwoButtonDialog(
|
||||||
title = stringResource(id = R.string.password),
|
title = stringResource(id = R.string.password),
|
||||||
message = stringResource(
|
message = stringResource(id = R.string.password_override_alert),
|
||||||
id =
|
|
||||||
R.string.password_override_alert,
|
|
||||||
),
|
|
||||||
confirmButtonText = stringResource(id = R.string.yes),
|
confirmButtonText = stringResource(id = R.string.yes),
|
||||||
dismissButtonText = stringResource(id = R.string.no),
|
dismissButtonText = stringResource(id = R.string.no),
|
||||||
onConfirmClick = {
|
onConfirmClick = {
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ import androidx.compose.ui.geometry.Offset
|
|||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
|
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
|
||||||
import androidx.compose.ui.graphics.nativeCanvas
|
import androidx.compose.ui.graphics.nativeCanvas
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.semantics.CustomAccessibilityAction
|
import androidx.compose.ui.semantics.CustomAccessibilityAction
|
||||||
@@ -58,10 +57,11 @@ import com.x8bit.bitwarden.ui.platform.base.util.toAnnotatedString
|
|||||||
import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar
|
import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar
|
||||||
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
|
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
|
||||||
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
|
||||||
|
import com.x8bit.bitwarden.ui.platform.model.WindowSize
|
||||||
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
|
||||||
import com.x8bit.bitwarden.ui.platform.theme.LocalBitwardenColorScheme
|
import com.x8bit.bitwarden.ui.platform.theme.LocalBitwardenColorScheme
|
||||||
import com.x8bit.bitwarden.ui.platform.theme.color.darkBitwardenColorScheme
|
import com.x8bit.bitwarden.ui.platform.theme.color.darkBitwardenColorScheme
|
||||||
import com.x8bit.bitwarden.ui.platform.util.isPortrait
|
import com.x8bit.bitwarden.ui.platform.util.rememberWindowSize
|
||||||
import com.x8bit.bitwarden.ui.vault.feature.qrcodescan.util.QrCodeAnalyzer
|
import com.x8bit.bitwarden.ui.vault.feature.qrcodescan.util.QrCodeAnalyzer
|
||||||
import com.x8bit.bitwarden.ui.vault.feature.qrcodescan.util.QrCodeAnalyzerImpl
|
import com.x8bit.bitwarden.ui.vault.feature.qrcodescan.util.QrCodeAnalyzerImpl
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
@@ -76,9 +76,9 @@ import kotlin.coroutines.suspendCoroutine
|
|||||||
@Composable
|
@Composable
|
||||||
fun QrCodeScanScreen(
|
fun QrCodeScanScreen(
|
||||||
onNavigateBack: () -> Unit,
|
onNavigateBack: () -> Unit,
|
||||||
|
onNavigateToManualCodeEntryScreen: () -> Unit,
|
||||||
viewModel: QrCodeScanViewModel = hiltViewModel(),
|
viewModel: QrCodeScanViewModel = hiltViewModel(),
|
||||||
qrCodeAnalyzer: QrCodeAnalyzer = QrCodeAnalyzerImpl(),
|
qrCodeAnalyzer: QrCodeAnalyzer = QrCodeAnalyzerImpl(),
|
||||||
onNavigateToManualCodeEntryScreen: () -> Unit,
|
|
||||||
) {
|
) {
|
||||||
qrCodeAnalyzer.onQrCodeScanned = remember(viewModel) {
|
qrCodeAnalyzer.onQrCodeScanned = remember(viewModel) {
|
||||||
{ viewModel.trySendAction(QrCodeScanAction.QrCodeScanReceive(it)) }
|
{ viewModel.trySendAction(QrCodeScanAction.QrCodeScanReceive(it)) }
|
||||||
@@ -131,22 +131,25 @@ fun QrCodeScanScreen(
|
|||||||
},
|
},
|
||||||
qrCodeAnalyzer = qrCodeAnalyzer,
|
qrCodeAnalyzer = qrCodeAnalyzer,
|
||||||
)
|
)
|
||||||
|
when (rememberWindowSize()) {
|
||||||
|
WindowSize.Compact -> {
|
||||||
|
QrCodeContentCompact(
|
||||||
|
onEnterKeyManuallyClick = onEnterKeyManuallyClick,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (LocalConfiguration.current.isPortrait) {
|
WindowSize.Medium -> {
|
||||||
PortraitQRCodeContent(
|
QrCodeContentMedium(
|
||||||
onEnterKeyManuallyClick = onEnterKeyManuallyClick,
|
onEnterKeyManuallyClick = onEnterKeyManuallyClick,
|
||||||
)
|
)
|
||||||
} else {
|
}
|
||||||
LandscapeQRCodeContent(
|
|
||||||
onEnterKeyManuallyClick = onEnterKeyManuallyClick,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun PortraitQRCodeContent(
|
private fun QrCodeContentCompact(
|
||||||
onEnterKeyManuallyClick: () -> Unit,
|
onEnterKeyManuallyClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
@@ -186,7 +189,7 @@ private fun PortraitQRCodeContent(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun LandscapeQRCodeContent(
|
private fun QrCodeContentMedium(
|
||||||
onEnterKeyManuallyClick: () -> Unit,
|
onEnterKeyManuallyClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
@@ -294,7 +297,7 @@ private fun CameraPreview(
|
|||||||
} else {
|
} else {
|
||||||
cameraErrorReceive()
|
cameraErrorReceive()
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (_: Exception) {
|
||||||
cameraErrorReceive()
|
cameraErrorReceive()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "
|
|||||||
androidx-compose-animation = { module = "androidx.compose.animation:animation" }
|
androidx-compose-animation = { module = "androidx.compose.animation:animation" }
|
||||||
androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "androidxComposeBom" }
|
androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "androidxComposeBom" }
|
||||||
androidx-compose-material3 = { module = "androidx.compose.material3:material3" }
|
androidx-compose-material3 = { module = "androidx.compose.material3:material3" }
|
||||||
|
androidx-compose-material3-adaptive = { module = "androidx.compose.material3.adaptive:adaptive" }
|
||||||
androidx-compose-runtime = { module = "androidx.compose.runtime:runtime" }
|
androidx-compose-runtime = { module = "androidx.compose.runtime:runtime" }
|
||||||
androidx-compose-ui = { module = "androidx.compose.ui:ui" }
|
androidx-compose-ui = { module = "androidx.compose.ui:ui" }
|
||||||
androidx-compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics" }
|
androidx-compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics" }
|
||||||
|
|||||||
Reference in New Issue
Block a user