From df87f33b9dbe15805abd841a4db1d4d4898efe42 Mon Sep 17 00:00:00 2001 From: Konstantin Ivanov <54908981+konstantiniiv@users.noreply.github.com> Date: Thu, 24 Apr 2025 16:22:12 +0200 Subject: [PATCH] DROID-3601 App | Fix | Release 10 stabilization, part 1 (#2353) --- .../anytype/ui/home/HomeScreenToolbar.kt | 28 +++++++++++------ .../ui/widgets/types/SpaceWidgetCard.kt | 12 ++++++-- .../anytype/core_ui/common/Markup.kt | 16 +++++++--- .../core_ui/widgets/TypeTemplatesWidget.kt | 20 +++++-------- .../mapping/MembershipResourcesExt.kt | 30 ++++++++++++------- 5 files changed, 68 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreenToolbar.kt b/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreenToolbar.kt index c7aa3c6bcd..0c6d988dec 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreenToolbar.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreenToolbar.kt @@ -13,6 +13,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.pluralStringResource @@ -26,6 +27,7 @@ import com.anytypeio.anytype.core_ui.views.PreviewTitle2Medium import com.anytypeio.anytype.core_ui.views.Relations2 import com.anytypeio.anytype.feature_chats.R import com.anytypeio.anytype.presentation.spaces.SpaceIconView +import timber.log.Timber @Composable fun HomeScreenToolbar( @@ -84,16 +86,24 @@ fun HomeScreenToolbar( overflow = TextOverflow.Ellipsis ) + val context = LocalContext.current + val locale = context.resources.configuration.locales[0] + val text = if (locale != null && membersCount > 0) { + pluralStringResource( + id = R.plurals.multiplayer_number_of_space_members, + membersCount, + membersCount, + membersCount + ) + } else { + if (locale == null) { + Timber.e("Error getting the locale") + } + stringResource(id = R.string.three_dots_text_placeholder) + } + Text( - text = if (membersCount > 0 ) { - pluralStringResource( - id = R.plurals.multiplayer_number_of_space_members, - membersCount, - membersCount, - membersCount - ) - } else - stringResource(id = R.string.three_dots_text_placeholder), + text = text, style = Relations2, color = colorResource(R.color.transparent_active), modifier = Modifier diff --git a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/SpaceWidgetCard.kt b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/SpaceWidgetCard.kt index 30075e4f4d..b53dd5f807 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/SpaceWidgetCard.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/SpaceWidgetCard.kt @@ -11,6 +11,7 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.pluralStringResource @@ -28,6 +29,7 @@ import com.anytypeio.anytype.core_ui.foundation.noRippleClickable import com.anytypeio.anytype.core_ui.views.PreviewTitle2Medium import com.anytypeio.anytype.core_ui.views.Relations3 import com.anytypeio.anytype.presentation.spaces.SpaceIconView +import timber.log.Timber @Composable @@ -105,15 +107,21 @@ fun SpaceWidgetCard( DEFAULT_SPACE_TYPE -> stringResource(id = R.string.space_type_default_space) PRIVATE_SPACE_TYPE -> stringResource(id = R.string.space_type_private_space) SHARED_SPACE_TYPE -> { - if (membersCount > 0 ) { + val context = LocalContext.current + val locale = context.resources.configuration.locales[0] + if (locale != null && membersCount > 0) { pluralStringResource( id = R.plurals.multiplayer_number_of_space_members, membersCount, membersCount, membersCount ) - } else + } else { + if (locale == null) { + Timber.e("Error getting the locale") + } stringResource(id = R.string.three_dots_text_placeholder) + } } else -> stringResource(id = R.string.space_type_unknown) } diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/common/Markup.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/common/Markup.kt index ca75e9edd7..150c721c4d 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/common/Markup.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/common/Markup.kt @@ -497,11 +497,19 @@ fun Editable.proceedWithSettingMentionSpan( } is Markup.Mark.Mention.ObjectType -> { val (drawableRes, tint) = mark.icon.getDrawableAndTintColor(context) - val drawable = ContextCompat.getDrawable(context, drawableRes)?.mutate() - if (drawable != null) { - DrawableCompat.setTint(drawable, tint) + + val baseDrawable = when { + drawableRes == 0 -> null + else -> try { + context.drawable(drawableRes).mutate().apply { + DrawableCompat.setTint(this, tint) + } + } catch (e: Exception) { + null + } } - val finalDrawable = drawable ?: ContextCompat.getDrawable(context, R.drawable.ic_empty_state_type) + + val finalDrawable = baseDrawable ?: context.drawable(R.drawable.ic_empty_state_type) setSpan( MentionSpan( onImageResourceReady = onImageReady, diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/widgets/TypeTemplatesWidget.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/widgets/TypeTemplatesWidget.kt index 2205fd2a11..d9c31e8132 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/widgets/TypeTemplatesWidget.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/widgets/TypeTemplatesWidget.kt @@ -104,9 +104,6 @@ import com.anytypeio.anytype.presentation.widgets.TypeTemplatesWidgetUI import com.anytypeio.anytype.presentation.widgets.TypeTemplatesWidgetUIAction import com.anytypeio.anytype.presentation.widgets.TypeTemplatesWidgetUIAction.TemplateClick import com.anytypeio.anytype.presentation.widgets.TypeTemplatesWidgetUIAction.TypeClick -import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi -import com.bumptech.glide.integration.compose.GlideImage -import com.bumptech.glide.integration.compose.placeholder import kotlin.math.roundToInt import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -575,7 +572,6 @@ private fun ColumnScope.TemplateHeaderBasic(item: TemplateView.Template) { ) } -@OptIn(ExperimentalGlideComposeApi::class) @Composable private fun ColumnScope.TemplateHeaderProfile(item: TemplateView.Template) { if (item.isCoverPresent()) { @@ -593,7 +589,6 @@ private fun ColumnScope.TemplateHeaderProfile(item: TemplateView.Template) { ) } -@OptIn(ExperimentalGlideComposeApi::class) @Composable private fun ProfileIcon( modifier: Modifier = Modifier, @@ -608,8 +603,8 @@ private fun ProfileIcon( ) ) { if (item.image != null) { - GlideImage( - model = item.image, + Image( + painter = rememberAsyncImagePainter(model = item.image), contentDescription = "Custom image template's icon", modifier = Modifier .size(40.dp) @@ -638,7 +633,6 @@ private fun ColumnScope.TemplateHeaderTask(item: TemplateView.Template) { TemplateItemTodoTitle(text = item.name) } -@OptIn(ExperimentalGlideComposeApi::class) @Composable private fun TemplateItemIconOrImage( item: TemplateView.Template, @@ -654,9 +648,12 @@ private fun TemplateItemIconOrImage( shape = RoundedCornerShape(5.dp) ) ) { - GlideImage( - model = it, - failure = placeholder(painterResource(id = R.drawable.ic_home_widget_space)), + Image( + painter = rememberAsyncImagePainter( + model = it, + fallback = painterResource(id = R.drawable.ic_home_widget_space), + error = painterResource(id = R.drawable.ic_home_widget_space) + ), contentDescription = "Custom image template's icon", modifier = Modifier .size(40.dp) @@ -690,7 +687,6 @@ private fun TemplateItemIconOrImage( } } -@OptIn(ExperimentalGlideComposeApi::class) @Composable private fun TemplateItemCoverAndIcon(item: TemplateView.Template) { Box( diff --git a/payments/src/main/java/com/anytypeio/anytype/payments/mapping/MembershipResourcesExt.kt b/payments/src/main/java/com/anytypeio/anytype/payments/mapping/MembershipResourcesExt.kt index 48ad3c3c80..6e3519d465 100644 --- a/payments/src/main/java/com/anytypeio/anytype/payments/mapping/MembershipResourcesExt.kt +++ b/payments/src/main/java/com/anytypeio/anytype/payments/mapping/MembershipResourcesExt.kt @@ -1,12 +1,14 @@ package com.anytypeio.anytype.payments.mapping import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.pluralStringResource import com.anytypeio.anytype.core_ui.R import com.anytypeio.anytype.payments.models.PeriodDescription import com.anytypeio.anytype.payments.models.PeriodUnit import com.anytypeio.anytype.payments.models.TierPeriod import java.time.Period +import timber.log.Timber fun String.parsePeriod(): PeriodDescription? { return try { @@ -24,18 +26,24 @@ fun String.parsePeriod(): PeriodDescription? { @Composable fun LocalizedPeriodString(desc: PeriodDescription?): String { - desc ?: return "" - val quantityStringId = when (desc.unit) { - PeriodUnit.YEARS -> R.plurals.period_years - PeriodUnit.MONTHS -> R.plurals.period_months - PeriodUnit.DAYS -> R.plurals.period_days - PeriodUnit.WEEKS -> R.plurals.period_weeks + val context = LocalContext.current + val localeList = context.resources.configuration.locales + if (!localeList.isEmpty && desc != null) { + val quantityStringId = when (desc.unit) { + PeriodUnit.YEARS -> R.plurals.period_years + PeriodUnit.MONTHS -> R.plurals.period_months + PeriodUnit.DAYS -> R.plurals.period_days + PeriodUnit.WEEKS -> R.plurals.period_weeks + } + return pluralStringResource( + id = quantityStringId, + count = desc.amount, + formatArgs = arrayOf(desc.amount) + ) + } else { + Timber.e("Error getting the locale or desc is null") + return "" } - return pluralStringResource( - id = quantityStringId, - count = desc.amount, - formatArgs = arrayOf(desc.amount) - ) } fun TierPeriod.toPeriodDescription(): PeriodDescription {