Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.gravatar.quickeditor.ui.abouteditor

import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
Expand Down Expand Up @@ -105,7 +106,11 @@ internal fun AboutEditor(
}

Surface {
Box(modifier = Modifier.wrapContentSize()) {
Box(
modifier = Modifier
.wrapContentSize()
.animateContentSize(),
) {
AboutEditor(
uiState = uiState,
onEvent = { event ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@ public class QuickEditorScopeOption private constructor(
is Scope.AvatarPicker -> AboutInputField.all
}

internal val initialPage: QuickEditorPage
get() = when (scope) {
is Scope.AvatarPicker -> QuickEditorPage.AvatarPicker
is Scope.AboutEditor -> QuickEditorPage.AboutEditor
is Scope.AvatarPickerAndAboutEditor -> scope.config.initialPage.internalType
}

public companion object {
internal val default = QuickEditorScopeOption(
scope = Scope.AvatarPicker(AvatarPickerConfiguration.default),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,7 @@ internal class QuickEditorViewModelFactory(
}
}

private val QuickEditorScopeOption.initialPage: QuickEditorPage
get() = when (scope) {
is Scope.AvatarPicker -> QuickEditorPage.AvatarPicker
is Scope.AboutEditor -> QuickEditorPage.AboutEditor
is Scope.AvatarPickerAndAboutEditor -> scope.config.initialPage.internalType
}

private val AvatarPickerAndAboutEditorConfiguration.Page.internalType: QuickEditorPage
internal val AvatarPickerAndAboutEditorConfiguration.Page.internalType: QuickEditorPage
get() = when (this) {
AvatarPicker -> QuickEditorPage.AvatarPicker
AboutEditor -> QuickEditorPage.AboutEditor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import android.content.res.Configuration
import android.graphics.Color
import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.asPaddingValues
Expand All @@ -13,6 +15,7 @@ import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
Expand Down Expand Up @@ -54,6 +57,8 @@ import com.gravatar.quickeditor.ui.editor.GravatarQuickEditorDismissReason
import com.gravatar.quickeditor.ui.editor.GravatarQuickEditorPage
import com.gravatar.quickeditor.ui.editor.GravatarQuickEditorParams
import com.gravatar.quickeditor.ui.editor.GravatarUiMode
import com.gravatar.quickeditor.ui.editor.QuickEditorPage
import com.gravatar.quickeditor.ui.editor.QuickEditorScopeOption
import com.gravatar.quickeditor.ui.editor.UpdateHandler
import com.gravatar.ui.GravatarTheme
import com.gravatar.ui.LocalGravatarTheme
Expand Down Expand Up @@ -84,7 +89,7 @@ public fun GravatarQuickEditorBottomSheet(
authenticationMethod = authenticationMethod,
updateHandler = updateHandler,
onDismiss = onDismiss,
modalDetents = gravatarQuickEditorParams.scopeOption.avatarPickerContentLayout.modalDetents(),
modalDetents = gravatarQuickEditorParams.scopeOption.modalDetents(),
)
}

Expand Down Expand Up @@ -120,7 +125,7 @@ public fun GravatarQuickEditorBottomSheet(
}
},
onDismiss = onDismiss,
modalDetents = gravatarQuickEditorParams.scopeOption.avatarPickerContentLayout.modalDetents(),
modalDetents = gravatarQuickEditorParams.scopeOption.modalDetents(),
)
}

Expand Down Expand Up @@ -261,36 +266,49 @@ private fun GravatarModalBottomSheet(
Scrim(
scrimColor = MaterialTheme.colorScheme.scrim.copy(alpha = 0.32f),
)
Sheet(
Box(
modifier = Modifier
.imePadding()
.clip(RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp))
.background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp))
.widthIn(max = 640.dp)
.fillMaxWidth()
.padding(
WindowInsets.navigationBars
.only(WindowInsetsSides.Vertical)
.asPaddingValues(),
paddingValues = if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
PaddingValues(0.dp)
} else {
WindowInsets.statusBars
.only(WindowInsetsSides.Top)
.asPaddingValues()
},
),
) {
val window = LocalModalWindow.current
val isDarkTheme = isSystemInDarkTheme()
LaunchedEffect(Unit) {
window.navigationBarColor = Color.TRANSPARENT
WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightNavigationBars =
!isDarkTheme
}
Surface(
Sheet(
modifier = Modifier
.fillMaxWidth(),
tonalElevation = 1.dp,
.imePadding()
.clip(RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp))
.background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp))
.widthIn(max = 640.dp)
.fillMaxWidth()
.padding(
WindowInsets.navigationBars
.only(WindowInsetsSides.Vertical)
.asPaddingValues(),
),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
val window = LocalModalWindow.current
val isDarkTheme = isSystemInDarkTheme()
LaunchedEffect(Unit) {
window.navigationBarColor = Color.TRANSPARENT
WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightNavigationBars =
!isDarkTheme
}
Surface(
modifier = Modifier
.fillMaxWidth(),
tonalElevation = 1.dp,
) {
QEDragHandle()
content()
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
QEDragHandle()
content()
}
}
}
}
Expand All @@ -300,35 +318,63 @@ private fun GravatarModalBottomSheet(
}
}

internal val peek = SheetDetent(identifier = "peek") { containerHeight, _ ->
private val peek = SheetDetent(identifier = "peek") { containerHeight, _ ->
containerHeight * 0.6f
}

@Composable
internal fun AvatarPickerContentLayout.modalDetents(): ModalDetents {
internal fun QuickEditorScopeOption.modalDetents(): ModalDetents {
val windowHeightSizeClass = currentWindowAdaptiveInfo().windowSizeClass.windowHeightSizeClass
val initialDetent = if (windowHeightSizeClass == WindowHeightSizeClass.COMPACT) {
FullyExpanded
} else {
when (this) {
AvatarPickerContentLayout.Horizontal -> FullyExpanded
AvatarPickerContentLayout.Vertical -> peek
}
}

val detents = buildList {
add(Hidden)
if (this@modalDetents == AvatarPickerContentLayout.Horizontal) {
add(FullyExpanded)
} else {
val detents = buildDetentsList()
val initialDetent = initialDetent(windowHeightSizeClass)

return ModalDetents(
initialDetent = if (detents.contains(initialDetent)) initialDetent else detents.last(),
detents = detents,
)
}

private fun QuickEditorScopeOption.buildDetentsList(): List<SheetDetent> {
return when (this.scope) {
is QuickEditorScopeOption.Scope.AvatarPickerAndAboutEditor,
is QuickEditorScopeOption.Scope.AboutEditor,
-> buildList {
add(Hidden)
add(peek)
add(FullyExpanded)
}

is QuickEditorScopeOption.Scope.AvatarPicker -> buildList {
add(Hidden)
if (avatarPickerContentLayout == AvatarPickerContentLayout.Vertical) {
add(peek)
}
add(FullyExpanded)
}
}
}

private fun QuickEditorScopeOption.initialDetent(windowHeightSizeClass: WindowHeightSizeClass): SheetDetent {
return if (windowHeightSizeClass == WindowHeightSizeClass.COMPACT) {
FullyExpanded
} else {
when (this.scope) {
is QuickEditorScopeOption.Scope.AboutEditor -> peek
is QuickEditorScopeOption.Scope.AvatarPickerAndAboutEditor,
is QuickEditorScopeOption.Scope.AvatarPicker,
-> {
if (
this.avatarPickerContentLayout == AvatarPickerContentLayout.Horizontal &&
this.initialPage == QuickEditorPage.AvatarPicker
) {
FullyExpanded
} else {
peek
}
}
}
}
return ModalDetents(
initialDetent = initialDetent,
detents = detents,
)
}

internal data class ModalDetents(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ internal fun addQuickEditorToView(
authenticationMethod = authenticationMethod,
updateHandler = updateHandler,
onDismiss = onDismiss,
modalDetents = gravatarQuickEditorParams.scopeOption.avatarPickerContentLayout.modalDetents(),
modalDetents = gravatarQuickEditorParams.scopeOption.modalDetents(),
onCurrentDetentChanged = {
if (it == Hidden) {
viewGroup.removeView(this)
Expand Down