update to material3 for compose

This commit is contained in:
Phillip Thelen 2024-05-15 12:26:47 +02:00
parent 74c283eb8a
commit 01a156c4b0
41 changed files with 183 additions and 174 deletions

View file

@ -105,19 +105,17 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version" implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"
implementation "androidx.fragment:fragment-ktx:1.6.2" implementation "androidx.fragment:fragment-ktx:1.7.0"
implementation "androidx.paging:paging-runtime-ktx:$paging_version" implementation "androidx.paging:paging-runtime-ktx:$paging_version"
implementation "androidx.paging:paging-compose:$paging_version" implementation "androidx.paging:paging-compose:$paging_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
implementation "com.google.accompanist:accompanist-themeadapter-material:$accompanist_version"
implementation "androidx.compose.material3:material3:1.2.1" implementation "androidx.compose.material3:material3:1.2.1"
implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist_version" implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist_version"
implementation 'com.google.android.play:core:1.10.3' implementation 'com.google.android.play:core:1.10.3'
implementation 'androidx.activity:activity-compose:1.9.0' implementation 'androidx.activity:activity-compose:1.9.0'
implementation "androidx.compose.runtime:runtime-livedata:$compose_version" implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.compose.animation:animation:$compose_version" implementation "androidx.compose.animation:animation:$compose_version"
implementation "androidx.compose.ui:ui-text-google-fonts:$compose_version" implementation "androidx.compose.ui:ui-text-google-fonts:$compose_version"
implementation "androidx.compose.ui:ui-tooling:$compose_version" implementation "androidx.compose.ui:ui-tooling:$compose_version"

View file

@ -17,14 +17,14 @@ import com.habitrpg.common.habitica.helpers.launchCatching
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import java.util.Date import java.util.Date
class AppConfigManager(contentRepository: ContentRepository?) : class AppConfigManager(contentRepository: ContentRepository) :
com.habitrpg.common.habitica.helpers.AppConfigManager() { com.habitrpg.common.habitica.helpers.AppConfigManager() {
private var worldState: WorldState? = null private var worldState: WorldState? = null
init { init {
try { try {
MainScope().launchCatching { MainScope().launchCatching {
contentRepository?.getWorldState()?.collect { contentRepository.getWorldState().collect {
worldState = it worldState = it
} }
} }
@ -190,7 +190,7 @@ class AppConfigManager(contentRepository: ContentRepository?) :
} }
fun enableCustomizationShop(): Boolean { fun enableCustomizationShop(): Boolean {
if (BuildConfig.DEBUG) return false if (BuildConfig.DEBUG) return true
return remoteConfig.getBoolean("enableCustomizationShop") return remoteConfig.getBoolean("enableCustomizationShop")
} }
} }

View file

@ -104,7 +104,7 @@ class AppModule {
@Provides @Provides
@Singleton @Singleton
fun providesRemoteConfigManager(contentRepository: ContentRepository?): AppConfigManager { fun providesRemoteConfigManager(contentRepository: ContentRepository): AppConfigManager {
return AppConfigManager(contentRepository) return AppConfigManager(contentRepository)
} }

View file

@ -17,16 +17,16 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Button import androidx.compose.material3.Button
import androidx.compose.material.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material.DrawerState import androidx.compose.material3.DrawerState
import androidx.compose.material.DrawerValue import androidx.compose.material3.DrawerValue
import androidx.compose.material.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material.ScaffoldState import androidx.compose.material3.ScaffoldState
import androidx.compose.material.SnackbarHostState import androidx.compose.material3.SnackbarHostState
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.material.rememberScaffoldState import androidx.compose.material3.rememberScaffoldState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf

View file

@ -21,7 +21,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
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.material.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
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState

View file

@ -14,10 +14,10 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button import androidx.compose.material3.Button
import androidx.compose.material.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState

View file

@ -273,6 +273,16 @@ class NavigationDrawerFragment : DialogFragment() {
val shop = getItemWithIdentifier(SIDEBAR_SHOPS_SEASONAL) ?: return val shop = getItemWithIdentifier(SIDEBAR_SHOPS_SEASONAL) ?: return
shop.subtitle = gearEvent?.end?.getRemainingString(requireContext().resources) shop.subtitle = gearEvent?.end?.getRemainingString(requireContext().resources)
if (!configManager.enableCustomizationShop()) {
shop.pillText = context?.getString(R.string.open)
if (gearEvent?.isCurrentlyActive == true) {
shop.isVisible = true
shop.subtitle =
context?.getString(R.string.open_for, gearEvent.end?.getShortRemainingString())
} else {
shop.isVisible = false
}
}
adapter.updateItem(shop) adapter.updateItem(shop)
} }

View file

@ -12,8 +12,8 @@ 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
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.Switch import androidx.compose.material3.Switch
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState

View file

@ -23,11 +23,11 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.Button import androidx.compose.material3.Button
import androidx.compose.material.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.material.TextField import androidx.compose.material3.TextField
import androidx.compose.material.TextFieldDefaults import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateListOf

View file

@ -20,11 +20,11 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material3.ExperimentalMaterialApi
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material3.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.pullrefresh.rememberPullRefreshState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateMapOf

View file

@ -29,8 +29,8 @@ import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -49,6 +49,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ContentRepository
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.models.TeamPlan import com.habitrpg.android.habitica.models.TeamPlan
import com.habitrpg.android.habitica.models.auth.LocalAuthentication import com.habitrpg.android.habitica.models.auth.LocalAuthentication
@ -116,7 +117,7 @@ fun AppHeaderView(
onAvatarClicked: (() -> Unit)? = null, onAvatarClicked: (() -> Unit)? = null,
onMemberRowClicked: () -> Unit, onMemberRowClicked: () -> Unit,
onClassSelectionClicked: () -> Unit, onClassSelectionClicked: () -> Unit,
configManager: AppConfigManager, configManager: AppConfigManager? = null,
) { ) {
val isPlayerOptedOutOfClass = user?.preferences?.disableClasses ?: false val isPlayerOptedOutOfClass = user?.preferences?.disableClasses ?: false
Column(modifier) { Column(modifier) {
@ -191,7 +192,7 @@ fun AppHeaderView(
} else if (user?.hasClass == false && isMyProfile && !isPlayerOptedOutOfClass) { } else if (user?.hasClass == false && isMyProfile && !isPlayerOptedOutOfClass) {
HabiticaButton( HabiticaButton(
background = HabiticaTheme.colors.basicButtonColor(), background = HabiticaTheme.colors.basicButtonColor(),
color = MaterialTheme.colors.onPrimary, color = MaterialTheme.colorScheme.onPrimary,
onClick = { onClick = {
onClassSelectionClicked() onClassSelectionClicked()
}, },
@ -431,8 +432,7 @@ private fun Preview(
.background(HabiticaTheme.colors.contentBackground) .background(HabiticaTheme.colors.contentBackground)
.padding(8.dp), .padding(8.dp),
onMemberRowClicked = { }, onMemberRowClicked = { },
onClassSelectionClicked = { }, onClassSelectionClicked = { }
configManager = AppConfigManager(null),
) )
} }
} }

View file

@ -9,10 +9,12 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material3.BottomSheetScaffoldState
import androidx.compose.material.ModalBottomSheetLayout import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material.ModalBottomSheetValue import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.material3.SheetState
import androidx.compose.material3.SheetValue
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@ -37,13 +39,13 @@ import kotlinx.coroutines.launch
// Extension for Activity // Extension for Activity
fun Activity.showAsBottomSheet(content: @Composable (() -> Unit) -> Unit) { fun Activity.showAsBottomSheet(content: @Composable (() -> Unit) -> Unit) {
val viewGroup = this.findViewById(android.R.id.content) as ViewGroup val viewGroup: ViewGroup = this.findViewById(android.R.id.content)
addContentToView(viewGroup, content) addContentToView(viewGroup, content)
} }
// Extension for Fragment // Extension for Fragment
fun Fragment.showAsBottomSheet(content: @Composable (() -> Unit) -> Unit) { fun Fragment.showAsBottomSheet(content: @Composable (() -> Unit) -> Unit) {
val viewGroup = requireActivity().findViewById(android.R.id.content) as ViewGroup val viewGroup: ViewGroup = requireActivity().findViewById(android.R.id.content)
addContentToView(viewGroup, content) addContentToView(viewGroup, content)
} }
@ -63,7 +65,7 @@ private fun addContentToView(
) )
} }
@OptIn(ExperimentalMaterialApi::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
private fun BottomSheetWrapper( private fun BottomSheetWrapper(
parent: ViewGroup, parent: ViewGroup,
@ -72,7 +74,7 @@ private fun BottomSheetWrapper(
) { ) {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val modalBottomSheetState = val modalBottomSheetState =
rememberModalBottomSheetState(ModalBottomSheetValue.Hidden, skipHalfExpanded = true) rememberModalBottomSheetState(skipPartiallyExpanded = true)
var isSheetOpened by remember { mutableStateOf(false) } var isSheetOpened by remember { mutableStateOf(false) }
val systemUiController = rememberSystemUiController() val systemUiController = rememberSystemUiController()
@ -83,12 +85,13 @@ private fun BottomSheetWrapper(
} }
val radius = 20.dp val radius = 20.dp
ModalBottomSheetLayout( ModalBottomSheet(
sheetBackgroundColor = Color.Transparent, {},
containerColor = Color.Transparent,
scrimColor = colorResource(R.color.content_background).copy(alpha = 0.5f), scrimColor = colorResource(R.color.content_background).copy(alpha = 0.5f),
sheetState = modalBottomSheetState, sheetState = modalBottomSheetState,
sheetShape = RoundedCornerShape(topStart = radius, topEnd = radius), shape = RoundedCornerShape(topStart = radius, topEnd = radius),
sheetContent = { content = {
Column( Column(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
modifier = modifier =
@ -115,7 +118,7 @@ private fun BottomSheetWrapper(
} }
} }
}, },
) {} )
BackHandler { BackHandler {
coroutineScope.launch { coroutineScope.launch {
@ -126,7 +129,7 @@ private fun BottomSheetWrapper(
// Take action based on hidden state // Take action based on hidden state
LaunchedEffect(modalBottomSheetState.currentValue) { LaunchedEffect(modalBottomSheetState.currentValue) {
when (modalBottomSheetState.currentValue) { when (modalBottomSheetState.currentValue) {
ModalBottomSheetValue.Hidden -> { SheetValue.Hidden -> {
when { when {
isSheetOpened -> { isSheetOpened -> {
systemUiController.setStatusBarColor(statusBarColor, darkIcons = false) systemUiController.setStatusBarColor(statusBarColor, darkIcons = false)

View file

@ -2,7 +2,7 @@ package com.habitrpg.android.habitica.ui.views
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -4,7 +4,7 @@ import android.text.format.DateUtils
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -4,8 +4,8 @@ import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.ProgressIndicatorDefaults import androidx.compose.material3.ProgressIndicatorDefaults
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -12,7 +12,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -77,7 +77,7 @@ fun GroupPlanMemberList(
member, member,
role, role,
onMemberClicked, onMemberClicked,
configManager, configManager = configManager,
modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp),
) )
} }
@ -90,8 +90,8 @@ fun MemberItem(
member: Member, member: Member,
role: String, role: String,
onMemberClicked: (String) -> Unit, onMemberClicked: (String) -> Unit,
configManager: AppConfigManager,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
configManager: AppConfigManager? = null,
) { ) {
Box( Box(
modifier modifier
@ -232,5 +232,5 @@ private class MemberProvider : PreviewParameterProvider<Member> {
private fun Preview( private fun Preview(
@PreviewParameter(MemberProvider::class) member: Member, @PreviewParameter(MemberProvider::class) member: Member,
) { ) {
MemberItem(member = member, role = "Manager", onMemberClicked = {}, AppConfigManager(null)) MemberItem(member = member, role = "Manager", onMemberClicked = {})
} }

View file

@ -6,7 +6,7 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.ProvideTextStyle import androidx.compose.material3.ProvideTextStyle
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -21,8 +21,8 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.LinearProgressIndicator import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material.Text import androidx.compose.material3.Text
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

View file

@ -25,14 +25,14 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.layout.requiredHeight
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.Button import androidx.compose.material3.Button
import androidx.compose.material.ButtonColors import androidx.compose.material3.ButtonColors
import androidx.compose.material.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material.ButtonElevation import androidx.compose.material3.ButtonElevation
import androidx.compose.material.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.ProvideTextStyle import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material.Text import androidx.compose.material3.Text
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
@ -76,7 +76,7 @@ fun LoadingButton(
onClick: () -> Unit, onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
type: LoadingButtonType = LoadingButtonType.NORMAL, type: LoadingButtonType = LoadingButtonType.NORMAL,
elevation: ButtonElevation? = ButtonDefaults.elevation(0.dp), elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
shape: Shape = MaterialTheme.shapes.medium, shape: Shape = MaterialTheme.shapes.medium,
border: BorderStroke? = null, border: BorderStroke? = null,
colors: ButtonColors? = null, colors: ButtonColors? = null,
@ -88,16 +88,16 @@ fun LoadingButton(
val colorStyle = val colorStyle =
if (type == LoadingButtonType.DESTRUCTIVE) { if (type == LoadingButtonType.DESTRUCTIVE) {
ButtonDefaults.buttonColors( ButtonDefaults.buttonColors(
backgroundColor = HabiticaTheme.colors.errorBackground, containerColor = HabiticaTheme.colors.errorBackground,
contentColor = Color.White, contentColor = Color.White,
disabledBackgroundColor = HabiticaTheme.colors.offsetBackground, disabledContainerColor = HabiticaTheme.colors.offsetBackground,
disabledContentColor = HabiticaTheme.colors.textQuad, disabledContentColor = HabiticaTheme.colors.textQuad,
) )
} else { } else {
ButtonDefaults.buttonColors( ButtonDefaults.buttonColors(
backgroundColor = HabiticaTheme.colors.tintedUiSub, containerColor = HabiticaTheme.colors.tintedUiSub,
contentColor = Color.White, contentColor = Color.White,
disabledBackgroundColor = HabiticaTheme.colors.offsetBackground, disabledContainerColor = HabiticaTheme.colors.offsetBackground,
disabledContentColor = HabiticaTheme.colors.textQuad, disabledContentColor = HabiticaTheme.colors.textQuad,
) )
} }
@ -108,7 +108,7 @@ fun LoadingButton(
when (state) { when (state) {
LoadingButtonState.FAILED -> HabiticaTheme.colors.errorBackground LoadingButtonState.FAILED -> HabiticaTheme.colors.errorBackground
LoadingButtonState.SUCCESS -> Color.Transparent LoadingButtonState.SUCCESS -> Color.Transparent
else -> colorStyle.backgroundColor(enabled = state != LoadingButtonState.DISABLED).value else -> if (state != LoadingButtonState.DISABLED) colorStyle.disabledContainerColor else colorStyle.containerColor
}, },
animationSpec = colorSpec, animationSpec = colorSpec,
) )
@ -118,7 +118,7 @@ fun LoadingButton(
when (state) { when (state) {
LoadingButtonState.FAILED -> Color.White LoadingButtonState.FAILED -> Color.White
LoadingButtonState.SUCCESS -> if (type == LoadingButtonType.DESTRUCTIVE) HabiticaTheme.colors.errorColor else HabiticaTheme.colors.successColor LoadingButtonState.SUCCESS -> if (type == LoadingButtonType.DESTRUCTIVE) HabiticaTheme.colors.errorColor else HabiticaTheme.colors.successColor
else -> colorStyle.contentColor(enabled = state != LoadingButtonState.DISABLED).value else -> if (state != LoadingButtonState.DISABLED) colorStyle.disabledContentColor else colorStyle.disabledContainerColor
}, },
animationSpec = colorSpec, animationSpec = colorSpec,
) )
@ -134,9 +134,9 @@ fun LoadingButton(
val buttonColors = val buttonColors =
ButtonDefaults.buttonColors( ButtonDefaults.buttonColors(
backgroundColor = backgroundColor.value, containerColor = backgroundColor.value,
contentColor = contentColor.value, contentColor = contentColor.value,
disabledBackgroundColor = backgroundColor.value, disabledContainerColor = backgroundColor.value,
disabledContentColor = contentColor.value, disabledContentColor = contentColor.value,
) )
Button( Button(
@ -235,9 +235,9 @@ private fun Preview() {
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp),
modifier = modifier =
Modifier Modifier
.width(200.dp) .width(200.dp)
.padding(8.dp), .padding(8.dp),
) { ) {
LoadingButton(state, { LoadingButton(state, {
scope.launch { scope.launch {
@ -263,7 +263,7 @@ private fun Preview() {
{}, {},
colors = colors =
ButtonDefaults.buttonColors( ButtonDefaults.buttonColors(
backgroundColor = HabiticaTheme.colors.successBackground, containerColor = HabiticaTheme.colors.successBackground,
contentColor = Color.White, contentColor = Color.White,
), ),
content = { content = {

View file

@ -6,10 +6,10 @@ import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.OutlinedButton import androidx.compose.material3.OutlinedButton
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -39,7 +39,7 @@ fun SegmentedControl(
onItemSelection: (selectedItemIndex: Int) -> Unit, onItemSelection: (selectedItemIndex: Int) -> Unit,
) { ) {
val selectedIndex = remember { mutableIntStateOf(defaultSelectedItemIndex) } val selectedIndex = remember { mutableIntStateOf(defaultSelectedItemIndex) }
val color = MaterialTheme.colors.primary val color = MaterialTheme.colorScheme.primary
Row( Row(
modifier = Modifier, modifier = Modifier,
) { ) {
@ -52,12 +52,12 @@ fun SegmentedControl(
Modifier Modifier
.width(itemWidth) .width(itemWidth)
.offset(0.dp, 0.dp) .offset(0.dp, 0.dp)
.zIndex(if (selectedIndex.value == 0) 1f else 0f) .zIndex(if (selectedIndex.intValue == 0) 1f else 0f)
} else { } else {
Modifier Modifier
.wrapContentSize() .wrapContentSize()
.offset(0.dp, 0.dp) .offset(0.dp, 0.dp)
.zIndex(if (selectedIndex.value == 0) 1f else 0f) .zIndex(if (selectedIndex.intValue == 0) 1f else 0f)
} }
} }
@ -66,18 +66,18 @@ fun SegmentedControl(
Modifier Modifier
.width(itemWidth) .width(itemWidth)
.offset((-1 * index).dp, 0.dp) .offset((-1 * index).dp, 0.dp)
.zIndex(if (selectedIndex.value == index) 1f else 0f) .zIndex(if (selectedIndex.intValue == index) 1f else 0f)
} else { } else {
Modifier Modifier
.wrapContentSize() .wrapContentSize()
.offset((-1 * index).dp, 0.dp) .offset((-1 * index).dp, 0.dp)
.zIndex(if (selectedIndex.value == index) 1f else 0f) .zIndex(if (selectedIndex.intValue == index) 1f else 0f)
} }
} }
}, },
onClick = { onClick = {
selectedIndex.value = index selectedIndex.intValue = index
onItemSelection(selectedIndex.value) onItemSelection(selectedIndex.intValue)
}, },
shape = shape =
when (index) { when (index) {
@ -115,32 +115,32 @@ fun SegmentedControl(
border = border =
BorderStroke( BorderStroke(
1.dp, 1.dp,
if (selectedIndex.value == index) { if (selectedIndex.intValue == index) {
color color
} else { } else {
color.copy(alpha = 0.75f) color.copy(alpha = 0.75f)
}, },
), ),
colors = colors =
if (selectedIndex.value == index) { if (selectedIndex.intValue == index) {
/** /**
* selected colors * selected colors
*/ */
ButtonDefaults.outlinedButtonColors( ButtonDefaults.outlinedButtonColors(
backgroundColor = color, containerColor = color,
) )
} else { } else {
/** /**
* not selected colors * not selected colors
*/ */
ButtonDefaults.outlinedButtonColors(backgroundColor = Color.Transparent) ButtonDefaults.outlinedButtonColors(containerColor = Color.Transparent)
}, },
) { ) {
Text( Text(
text = item, text = item,
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
color = color =
if (selectedIndex.value == index) { if (selectedIndex.intValue == index) {
Color.White Color.White
} else { } else {
color.copy(alpha = 0.9f) color.copy(alpha = 0.9f)

View file

@ -9,8 +9,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -62,7 +62,7 @@ fun UserRow(
"@$username", "@$username",
fontSize = 16.sp, fontSize = 16.sp,
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
color = color ?: MaterialTheme.colors.primary, color = color ?: MaterialTheme.colorScheme.primary,
) )
if (extraContent != null) { if (extraContent != null) {
extraContent() extraContent()

View file

@ -14,8 +14,8 @@ import android.widget.TextView
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.material.ProvideTextStyle import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -11,8 +11,8 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.ui.views.preferences
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -10,13 +10,13 @@ import androidx.compose.foundation.layout.fillMaxSize
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.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material3.ExperimentalMaterialApi
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Surface import androidx.compose.material3.Surface
import androidx.compose.material.pullrefresh.PullRefreshState import androidx.compose.material3.pullrefresh.PullRefreshState
import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material3.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.pullRefreshIndicatorTransform import androidx.compose.material3.pullrefresh.pullRefreshIndicatorTransform
import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.pullrefresh.rememberPullRefreshState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -13,7 +13,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.requiredSize
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue

View file

@ -85,6 +85,8 @@ class PurchaseDialog(
private var purchaseCardAction: ((ShopItem) -> Unit)? = null private var purchaseCardAction: ((ShopItem) -> Unit)? = null
var onShopNeedsRefresh: ((ShopItem) -> Unit)? = null var onShopNeedsRefresh: ((ShopItem) -> Unit)? = null
private var gemsLeft = 0
private var shopItem: ShopItem = item private var shopItem: ShopItem = item
set(value) { set(value) {
field = value field = value
@ -307,7 +309,7 @@ class PurchaseDialog(
if ("gems" == shopItem.purchaseType) { if ("gems" == shopItem.purchaseType) {
val maxGems = user.purchased?.plan?.totalNumberOfGems ?: 0 val maxGems = user.purchased?.plan?.totalNumberOfGems ?: 0
val gemsLeft = user.purchased?.plan?.numberOfGemsLeft gemsLeft = user.purchased?.plan?.numberOfGemsLeft ?: 0
if (maxGems > 0) { if (maxGems > 0) {
limitedTextView.text = context.getString(R.string.gems_left_max, gemsLeft, maxGems) limitedTextView.text = context.getString(R.string.gems_left_max, gemsLeft, maxGems)
} else { } else {
@ -347,8 +349,7 @@ class PurchaseDialog(
private fun onBuyButtonClicked() { private fun onBuyButtonClicked() {
if (shopItem.isValid && !shopItem.locked) { if (shopItem.isValid && !shopItem.locked) {
val gemsLeft = if (shopItem.limitedNumberLeft != null) shopItem.limitedNumberLeft else 0 if ((gemsLeft > 0 && shopItem.purchaseType == "gems") || shopItem.canAfford(user, purchaseQuantity)) {
if ((gemsLeft == 0 && shopItem.purchaseType == "gems") || shopItem.canAfford(user, purchaseQuantity)) {
MainScope().launch(Dispatchers.Main) { MainScope().launch(Dispatchers.Main) {
remainingPurchaseQuantity { quantity -> remainingPurchaseQuantity { quantity ->
if (quantity >= 0) { if (quantity >= 0) {

View file

@ -8,9 +8,9 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material.Divider import androidx.compose.material3.Divider
import androidx.compose.material.ProvideTextStyle import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -54,7 +54,7 @@ fun PartySeekingListItem(
isInvited: Boolean = false, isInvited: Boolean = false,
showHeader: Boolean = false, showHeader: Boolean = false,
showExtendedInfo: Boolean = true, showExtendedInfo: Boolean = true,
configManager: AppConfigManager, configManager: AppConfigManager? = null,
onInvite: (Member) -> Unit, onInvite: (Member) -> Unit,
) { ) {
Column( Column(
@ -214,5 +214,5 @@ private class MemberProvider : PreviewParameterProvider<Member> {
private fun Preview( private fun Preview(
@PreviewParameter(MemberProvider::class) data: Member, @PreviewParameter(MemberProvider::class) data: Member,
) { ) {
PartySeekingListItem(user = data, onInvite = {}, configManager = AppConfigManager(null)) PartySeekingListItem(user = data, onInvite = {})
} }

View file

@ -18,7 +18,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment

View file

@ -28,8 +28,8 @@ import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.LinearProgressIndicator import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue

View file

@ -16,9 +16,9 @@ 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.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.material.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -18,10 +18,10 @@ import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.material.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember

View file

@ -12,8 +12,8 @@ import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View file

@ -19,8 +19,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember

View file

@ -17,8 +17,8 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember

View file

@ -16,8 +16,8 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember

View file

@ -10,18 +10,18 @@ buildscript {
app_version_name = '' app_version_name = ''
app_version_code = 0 app_version_code = 0
accompanist_version = '0.28.0' accompanist_version = '0.30.0'
amplitude_version = '1.6.1' amplitude_version = '1.6.1'
appcompat_version = '1.6.1' appcompat_version = '1.6.1'
coil_version = '2.4.0' coil_version = '2.4.0'
compose_version = '1.6.6' compose_version = '1.6.7'
compose_compiler = '1.5.12' compose_compiler = '1.5.12'
core_ktx_version = '1.13.0' core_ktx_version = '1.13.1'
coroutines_version = '1.7.3' coroutines_version = '1.7.3'
daggerhilt_version = '2.51.1' daggerhilt_version = '2.51.1'
firebase_bom = '31.3.0' firebase_bom = '31.3.0'
kotest_version = '5.6.2' kotest_version = '5.6.2'
kotlin_version = '1.9.23' kotlin_version = '1.9.24'
ktlint_version = '1.2.1' ktlint_version = '1.2.1'
lifecycle_version = '2.7.0' lifecycle_version = '2.7.0'
markwon_version = '4.6.2' markwon_version = '4.6.2'
@ -47,7 +47,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:8.3.2' classpath 'com.android.tools.build:gradle:8.3.2'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'com.google.gms:google-services:4.4.1' classpath 'com.google.gms:google-services:4.4.1'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.1'
classpath "io.realm:realm-gradle-plugin:10.13.2-transformer-api" classpath "io.realm:realm-gradle-plugin:10.13.2-transformer-api"
classpath("io.realm.kotlin:gradle-plugin:$realm_version") classpath("io.realm.kotlin:gradle-plugin:$realm_version")
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

View file

@ -121,7 +121,7 @@ dependencies {
implementation("androidx.recyclerview:recyclerview:1.3.2") implementation("androidx.recyclerview:recyclerview:1.3.2")
implementation("androidx.navigation:navigation-common-ktx:$navigation_version") implementation("androidx.navigation:navigation-common-ktx:$navigation_version")
implementation("androidx.navigation:navigation-runtime-ktx:$navigation_version") implementation("androidx.navigation:navigation-runtime-ktx:$navigation_version")
implementation("com.google.android.material:material:1.11.0") implementation("com.google.android.material:material:1.12.0")
testImplementation("io.mockk:mockk:$mockk_version") testImplementation("io.mockk:mockk:$mockk_version")
testImplementation("io.mockk:mockk-android:$mockk_version") testImplementation("io.mockk:mockk-android:$mockk_version")
@ -134,14 +134,13 @@ dependencies {
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version") androidTestImplementation("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version")
implementation("androidx.activity:activity-compose:1.8.2") implementation("androidx.activity:activity-compose:1.9.0")
implementation("androidx.compose.runtime:runtime-livedata:$compose_version") implementation("androidx.compose.runtime:runtime-livedata:$compose_version")
implementation("androidx.compose.material:material:$compose_version")
implementation("androidx.compose.animation:animation:$compose_version") implementation("androidx.compose.animation:animation:$compose_version")
implementation("androidx.compose.ui:ui-text-google-fonts:$compose_version") implementation("androidx.compose.ui:ui-text-google-fonts:$compose_version")
implementation("androidx.compose.ui:ui-tooling:$compose_version") implementation("androidx.compose.ui:ui-tooling:$compose_version")
implementation("androidx.compose.material3:material3:1.2.0") implementation("androidx.compose.material3:material3:1.2.1")
implementation("com.google.accompanist:accompanist-themeadapter-material:$accompanist_version") implementation("com.google.accompanist:accompanist-themeadapter-material3:$accompanist_version")
implementation(project(":shared")) implementation(project(":shared"))
} }

View file

@ -1,19 +1,18 @@
package com.habitrpg.common.habitica.theme package com.habitrpg.common.habitica.theme
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material.Shapes import androidx.compose.material3.Shapes
import androidx.compose.material.Typography import androidx.compose.material3.Typography
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.google.accompanist.themeadapter.material.createMdcTheme import com.google.accompanist.themeadapter.material3.createMdc3Theme
@Composable @Composable
fun HabiticaTheme( fun HabiticaTheme(
@ -22,65 +21,64 @@ fun HabiticaTheme(
val context = LocalContext.current val context = LocalContext.current
val layoutDirection = LocalLayoutDirection.current val layoutDirection = LocalLayoutDirection.current
val (colors, _, _) = val (colors, _, _) =
createMdcTheme( createMdc3Theme(
context = context, context = context,
layoutDirection = layoutDirection, layoutDirection = layoutDirection,
setTextColors = true, setTextColors = true,
) )
MaterialTheme( MaterialTheme(
colors = colors ?: MaterialTheme.colors, colorScheme = colors ?: MaterialTheme.colorScheme,
typography = typography =
Typography( Typography(
defaultFontFamily = FontFamily.Default, displayLarge =
h1 =
TextStyle( TextStyle(
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 20.sp, fontSize = 20.sp,
letterSpacing = (0.05).sp, letterSpacing = (0.05).sp,
), ),
h2 = displayMedium =
TextStyle( TextStyle(
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
fontSize = 28.sp, fontSize = 28.sp,
letterSpacing = (0.05).sp, letterSpacing = (0.05).sp,
), ),
subtitle1 = titleLarge =
TextStyle( TextStyle(
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 16.sp, fontSize = 16.sp,
), ),
subtitle2 = titleMedium =
TextStyle( TextStyle(
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
fontSize = 16.sp, fontSize = 16.sp,
letterSpacing = 0.1.sp, letterSpacing = 0.1.sp,
), ),
body1 = bodyLarge =
TextStyle( TextStyle(
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 14.sp, fontSize = 14.sp,
letterSpacing = 0.35.sp, letterSpacing = 0.35.sp,
lineHeight = 16.sp, lineHeight = 16.sp,
), ),
body2 = bodyMedium =
TextStyle( TextStyle(
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
fontSize = 14.sp, fontSize = 14.sp,
letterSpacing = 0.2.sp, letterSpacing = 0.2.sp,
lineHeight = 16.sp, lineHeight = 16.sp,
), ),
button = labelMedium =
TextStyle( TextStyle(
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 14.sp, fontSize = 14.sp,
letterSpacing = 1.25.sp, letterSpacing = 1.25.sp,
), ),
caption = labelSmall =
TextStyle( TextStyle(
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
fontSize = 12.sp, fontSize = 12.sp,
), ),
overline = titleSmall =
TextStyle( TextStyle(
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 10.sp, fontSize = 10.sp,
@ -98,7 +96,7 @@ fun HabiticaTheme(
} }
val Typography.caption1 val Typography.caption1
get() = caption get() = labelMedium
val Typography.caption2 val Typography.caption2
get() = get() =
TextStyle( TextStyle(

View file

@ -9,7 +9,7 @@ import com.habitrpg.shared.habitica.models.Avatar
@Composable @Composable
fun ComposableAvatarView( fun ComposableAvatarView(
avatar: Avatar?, avatar: Avatar?,
configManager: AppConfigManager, configManager: AppConfigManager?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
AndroidView( AndroidView(

View file

@ -1,2 +1,2 @@
NAME=4.3.7 NAME=4.3.7
CODE=7671 CODE=7701