Fix crash that occurs when tapping GroupPlanMemberList

Constrain GroupPlanMemberList bottom sheet height to prevent infinite-measure crash
This commit is contained in:
Hafiz 2025-06-09 13:38:12 -05:00 committed by Phillip Thelen
parent e7e28ff44c
commit 6732eaee20

View file

@ -22,9 +22,14 @@ import androidx.activity.viewModels
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -32,6 +37,7 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
@ -344,69 +350,76 @@ open class MainActivity : BaseActivity(), SnackbarActivity {
isMyProfile = true, isMyProfile = true,
onAvatarClicked = { onAvatarClicked = {
showAsBottomSheet { dismiss -> showAsBottomSheet { dismiss ->
Column( Box(
horizontalAlignment = Alignment.CenterHorizontally, Modifier
verticalArrangement = Arrangement.spacedBy(4.dp), .fillMaxWidth()
modifier = Modifier.padding(22.dp) .heightIn(max = LocalConfiguration.current.screenHeightDp.dp * 0.8f)
.padding(22.dp)
) { ) {
ComposableAvatarView(
avatar = user,
configManager = appConfigManager
)
Column( Column(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(15.dp) verticalArrangement = Arrangement.spacedBy(4.dp),
modifier = Modifier.verticalScroll(rememberScrollState())
) { ) {
HabiticaButton( ComposableAvatarView(
background = HabiticaTheme.colors.tintedUiSub, avatar = user,
color = Color.White, configManager = appConfigManager
modifier = Modifier.height(48.dp), )
onClick = { Column(
dismiss() horizontalAlignment = Alignment.CenterHorizontally,
MainNavigationController.navigate( verticalArrangement = Arrangement.spacedBy(15.dp)
MainNavDirections.openProfileActivity(
user?.id ?: ""
)
)
}
) { ) {
Text(stringResource(id = R.string.open_profile)) HabiticaButton(
} background = HabiticaTheme.colors.tintedUiSub,
color = Color.White,
HabiticaButton( modifier = Modifier.height(48.dp),
background = HabiticaTheme.colors.tintedUiSub, onClick = {
color = Color.White, dismiss()
modifier = Modifier.height(48.dp), MainNavigationController.navigate(
onClick = { MainNavDirections.openProfileActivity(
dismiss() user?.id ?: ""
MainNavigationController.navigate(R.id.avatarOverviewFragment)
}
) {
Text(stringResource(id = R.string.customize_avatar))
}
HabiticaButton(
background = HabiticaTheme.colors.tintedUiSub,
color = Color.White,
modifier = Modifier.height(48.dp),
onClick = {
dismiss()
user?.let {
val usecase = ShareAvatarUseCase()
lifecycleScope.launchCatching {
usecase.callInteractor(
ShareAvatarUseCase.RequestValues(
this@MainActivity,
it,
"Check out my avatar on Habitica!",
"avatar_bottomsheet"
)
) )
)
}
) {
Text(stringResource(id = R.string.open_profile))
}
HabiticaButton(
background = HabiticaTheme.colors.tintedUiSub,
color = Color.White,
modifier = Modifier.height(48.dp),
onClick = {
dismiss()
MainNavigationController.navigate(R.id.avatarOverviewFragment)
}
) {
Text(stringResource(id = R.string.customize_avatar))
}
HabiticaButton(
background = HabiticaTheme.colors.tintedUiSub,
color = Color.White,
modifier = Modifier.height(48.dp),
onClick = {
dismiss()
user?.let {
val usecase = ShareAvatarUseCase()
lifecycleScope.launchCatching {
usecase.callInteractor(
ShareAvatarUseCase.RequestValues(
this@MainActivity,
it,
"Check out my avatar on Habitica!",
"avatar_bottomsheet"
)
)
}
} }
} }
) {
Text(stringResource(id = R.string.share_avatar))
} }
) {
Text(stringResource(id = R.string.share_avatar))
} }
} }
} }
@ -414,13 +427,18 @@ open class MainActivity : BaseActivity(), SnackbarActivity {
}, },
onMemberRowClicked = { onMemberRowClicked = {
showAsBottomSheet { onClose -> showAsBottomSheet { onClose ->
val group by viewModel.userViewModel.currentTeamPlanGroup.collectAsState( val group by viewModel.userViewModel.currentTeamPlanGroup.collectAsState(null)
null
)
val members by viewModel.userViewModel.currentTeamPlanMembers.observeAsState() val members by viewModel.userViewModel.currentTeamPlanMembers.observeAsState()
GroupPlanMemberList(members, group, appConfigManager) { Box(
onClose() Modifier
FullProfileActivity.open(it) .fillMaxWidth()
.heightIn(max = LocalConfiguration.current.screenHeightDp.dp * 0.8f)
.padding(horizontal = 16.dp, vertical = 12.dp)
) {
GroupPlanMemberList(members, group, appConfigManager) { member ->
onClose()
FullProfileActivity.open(member)
}
} }
} }
}, },