1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 13:57:10 +09:00

DROID-1158 App | Enhancement | Added support for gradients in profile/space screens

DROID-1158 App | Enhancement | Added support for gradients in profile/space screens
This commit is contained in:
Allan Quatermain 2023-04-25 11:16:28 +03:00 committed by GitHub
parent ecd93b32f2
commit 0733e88abb
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 209 additions and 26 deletions

View file

@ -30,6 +30,7 @@ import com.anytypeio.anytype.domain.templates.GetTemplates
import com.anytypeio.anytype.domain.workspace.WorkspaceManager
import com.anytypeio.anytype.presentation.home.HomeScreenViewModel
import com.anytypeio.anytype.presentation.home.Unsubscriber
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
import com.anytypeio.anytype.presentation.util.Dispatcher
import com.anytypeio.anytype.presentation.widgets.CollapsedWidgetStateHolder
import com.anytypeio.anytype.presentation.widgets.WidgetActiveViewStateHolder
@ -184,6 +185,11 @@ object HomeScreenModule {
channel = channel
)
@JvmStatic
@Provides
@PerScreen
fun gradientProvider(): SpaceGradientProvider = SpaceGradientProvider.Impl()
@Module
interface Declarations {
@PerScreen

View file

@ -17,6 +17,7 @@ import com.anytypeio.anytype.domain.library.StorelessSubscriptionContainer
import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.`object`.SetObjectDetails
import com.anytypeio.anytype.domain.search.SubscriptionEventChannel
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
import com.anytypeio.anytype.presentation.util.downloader.UriFileProvider
import com.anytypeio.anytype.providers.DefaultUriFileProvider
import com.anytypeio.anytype.ui.settings.AccountAndDataFragment
@ -56,7 +57,8 @@ object AccountAndDataModule {
setObjectDetails: SetObjectDetails,
configStorage: ConfigStorage,
urlBuilder: UrlBuilder,
setDocumentImageIcon: SetDocumentImageIcon
setDocumentImageIcon: SetDocumentImageIcon,
spaceGradientProvider: SpaceGradientProvider
): AccountAndDataViewModel.Factory = AccountAndDataViewModel.Factory(
clearFileCache = clearFileCache,
deleteAccount = deleteAccount,
@ -66,9 +68,14 @@ object AccountAndDataModule {
setObjectDetails = setObjectDetails,
configStorage = configStorage,
urlBuilder = urlBuilder,
setDocumentImageIcon = setDocumentImageIcon
setDocumentImageIcon = setDocumentImageIcon,
spaceGradientProvider = spaceGradientProvider
)
@Provides
@PerScreen
fun provideSpaceGradientProvider(): SpaceGradientProvider = SpaceGradientProvider.Impl()
@Provides
@PerScreen
fun provideDebugSync(

View file

@ -10,6 +10,7 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.`object`.SetObjectDetails
import com.anytypeio.anytype.domain.search.SubscriptionEventChannel
import com.anytypeio.anytype.presentation.settings.MainSettingsViewModel
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
import com.anytypeio.anytype.ui.settings.MainSettingFragment
import dagger.Module
import dagger.Provides
@ -55,6 +56,11 @@ object MainSettingsModule {
dispatchers = dispatchers
)
@JvmStatic
@Provides
@PerScreen
fun provideSpaceGradientProvider(): SpaceGradientProvider = SpaceGradientProvider.Impl()
@JvmStatic
@Provides
@PerScreen
@ -63,12 +69,14 @@ object MainSettingsModule {
storelessSubscriptionContainer: StorelessSubscriptionContainer,
configStorage: ConfigStorage,
urlBuilder: UrlBuilder,
setObjectDetails: SetObjectDetails
setObjectDetails: SetObjectDetails,
spaceGradientProvider: SpaceGradientProvider
): MainSettingsViewModel.Factory = MainSettingsViewModel.Factory(
analytics,
storelessSubscriptionContainer,
configStorage,
urlBuilder,
setObjectDetails
setObjectDetails,
spaceGradientProvider
)
}

View file

@ -36,6 +36,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.colorResource
@ -43,6 +44,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.core.graphics.toColorInt
import coil.compose.rememberAsyncImagePainter
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.ObjectWrapper
@ -583,6 +585,21 @@ fun HomeScreenBottomToolbar(
contentScale = ContentScale.Crop
)
}
is SpaceIconView.Gradient -> {
val gradient = Brush.radialGradient(
colors = listOf(
Color(spaceIconView.from.toColorInt()),
Color(spaceIconView.to.toColorInt())
)
)
Box(
modifier = Modifier
.size(24.dp)
.clip(RoundedCornerShape(3.dp))
.align(Alignment.Center)
.background(gradient)
)
}
else -> {
Image(
painter = painterResource(id = R.drawable.ic_home_widget_space),

View file

@ -133,7 +133,7 @@ class MainSettingFragment : BaseBottomSheetComposeFragment() {
safeNavigate(
R.id.actionOpenImagePickerScreen, bundleOf(
ARG_CONTEXT_ID_KEY to command.id,
ARG_SHOW_REMOVE_BUTTON to false
ARG_SHOW_REMOVE_BUTTON to true
)
)
}

View file

@ -24,6 +24,7 @@ sealed class ObjectWrapper {
val iconEmoji: String? by default
val iconImage: String? by default
val iconOption: Double? by default
val coverId: String? by default

View file

@ -13,6 +13,7 @@ object Relations {
const val LAYOUT = "layout"
const val NAME = "name"
const val ICON_EMOJI = "iconEmoji"
const val ICON_OPTION = "iconOption"
const val ICON_IMAGE = "iconImage"
const val RELATION_FORMAT = "relationFormat"
const val IS_ARCHIVED = "isArchived"

View file

@ -46,6 +46,7 @@ import com.anytypeio.anytype.presentation.extension.sendAnalyticsObjectCreateEve
import com.anytypeio.anytype.presentation.home.Command.ChangeWidgetType.Companion.UNDEFINED_LAYOUT_CODE
import com.anytypeio.anytype.presentation.navigation.NavigationViewModel
import com.anytypeio.anytype.presentation.search.Subscriptions
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
import com.anytypeio.anytype.presentation.spaces.SpaceIconView
import com.anytypeio.anytype.presentation.spaces.spaceIcon
import com.anytypeio.anytype.presentation.util.Dispatcher
@ -107,7 +108,8 @@ class HomeScreenViewModel(
private val appActionManager: AppActionManager,
private val analytics: Analytics,
private val getWidgetSession: GetWidgetSession,
private val saveWidgetSession: SaveWidgetSession
private val saveWidgetSession: SaveWidgetSession,
private val spaceGradientProvider: SpaceGradientProvider
) : NavigationViewModel<HomeScreenViewModel.Navigation>(),
Reducer<ObjectView, Payload>,
WidgetActiveViewStateHolder by widgetActiveViewStateHolder,
@ -256,11 +258,16 @@ class HomeScreenViewModel(
StoreSearchByIdsParams(
subscription = HOME_SCREEN_SPACE_OBJECT_SUBSCRIPTION,
targets = listOf(config.workspace),
keys = listOf(Relations.ID, Relations.ICON_EMOJI, Relations.ICON_IMAGE)
keys = listOf(
Relations.ID,
Relations.ICON_EMOJI,
Relations.ICON_IMAGE,
Relations.ICON_OPTION
)
)
).map { result ->
val obj = result.firstOrNull()
obj?.spaceIcon(urlBuilder) ?: SpaceIconView.Placeholder
obj?.spaceIcon(urlBuilder, spaceGradientProvider) ?: SpaceIconView.Placeholder
}.flowOn(appCoroutineDispatchers.io).collect {
icon.value = it
}
@ -613,9 +620,9 @@ class HomeScreenViewModel(
widget = widget,
source = curr.source.id,
type = parseWidgetType(curr),
layout = when(val source = curr.source) {
layout = when (val source = curr.source) {
is Widget.Source.Bundled -> UNDEFINED_LAYOUT_CODE
is Widget.Source.Default -> {
is Widget.Source.Default -> {
source.obj.layout?.code ?: UNDEFINED_LAYOUT_CODE
}
}
@ -852,7 +859,8 @@ class HomeScreenViewModel(
private val appActionManager: AppActionManager,
private val analytics: Analytics,
private val getWidgetSession: GetWidgetSession,
private val saveWidgetSession: SaveWidgetSession
private val saveWidgetSession: SaveWidgetSession,
private val spaceGradientProvider: SpaceGradientProvider
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T = HomeScreenViewModel(
@ -880,7 +888,8 @@ class HomeScreenViewModel(
appActionManager = appActionManager,
analytics = analytics,
getWidgetSession = getWidgetSession,
saveWidgetSession = saveWidgetSession
saveWidgetSession = saveWidgetSession,
spaceGradientProvider = spaceGradientProvider
) as T
}

View file

@ -3,18 +3,27 @@ package com.anytypeio.anytype.presentation.profile
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_models.Url
import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
sealed class ProfileIconView {
object Loading : ProfileIconView()
object Placeholder : ProfileIconView()
data class Emoji(val unicode: String) : ProfileIconView()
data class Image(val url: Url) : ProfileIconView()
data class Gradient(val from: String, val to: String): ProfileIconView()
}
fun ObjectWrapper.Basic.profileIcon(builder: UrlBuilder): ProfileIconView = when {
fun ObjectWrapper.Basic.profileIcon(builder: UrlBuilder, gradientProvider: SpaceGradientProvider): ProfileIconView = when {
!iconImage.isNullOrEmpty() -> {
val hash = checkNotNull(iconImage)
ProfileIconView.Image(builder.thumbnail(hash))
}
iconOption != null -> {
iconOption?.let {
val gradient = gradientProvider.get(it)
ProfileIconView.Gradient(gradient.from, gradient.to)
} ?: ProfileIconView.Placeholder
}
else -> ProfileIconView.Placeholder
}

View file

@ -17,6 +17,7 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.`object`.SetObjectDetails
import com.anytypeio.anytype.presentation.profile.ProfileIconView
import com.anytypeio.anytype.presentation.profile.profileIcon
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
import com.anytypeio.anytype.presentation.spaces.SpaceIconView
import com.anytypeio.anytype.presentation.spaces.spaceIcon
import kotlinx.coroutines.flow.MutableSharedFlow
@ -33,7 +34,8 @@ class MainSettingsViewModel(
private val storelessSubscriptionContainer: StorelessSubscriptionContainer,
private val configStorage: ConfigStorage,
private val urlBuilder: UrlBuilder,
private val setObjectDetails: SetObjectDetails
private val setObjectDetails: SetObjectDetails,
private val spaceGradientProvider: SpaceGradientProvider
) : ViewModel() {
val events = MutableSharedFlow<Event>(replay = 0)
@ -50,7 +52,8 @@ class MainSettingsViewModel(
Relations.ID,
Relations.NAME,
Relations.ICON_EMOJI,
Relations.ICON_IMAGE
Relations.ICON_IMAGE,
Relations.ICON_OPTION
)
)
).map { result ->
@ -60,13 +63,13 @@ class MainSettingsViewModel(
space = workspace?.let {
WorkspaceAndAccount.SpaceData(
name = workspace.name ?: "",
icon = workspace.spaceIcon(urlBuilder)
icon = workspace.spaceIcon(urlBuilder, spaceGradientProvider)
)
},
profile = profile?.let {
WorkspaceAndAccount.ProfileData(
name = profile.name ?: "",
icon = profile.profileIcon(urlBuilder)
icon = profile.profileIcon(urlBuilder, spaceGradientProvider)
)
}
)
@ -168,7 +171,8 @@ class MainSettingsViewModel(
private val storelessSubscriptionContainer: StorelessSubscriptionContainer,
private val configStorage: ConfigStorage,
private val urlBuilder: UrlBuilder,
private val setObjectDetails: SetObjectDetails
private val setObjectDetails: SetObjectDetails,
private val spaceGradientProvider: SpaceGradientProvider
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(
@ -178,7 +182,8 @@ class MainSettingsViewModel(
storelessSubscriptionContainer = storelessSubscriptionContainer,
configStorage = configStorage,
urlBuilder = urlBuilder,
setObjectDetails = setObjectDetails
setObjectDetails = setObjectDetails,
spaceGradientProvider = spaceGradientProvider
) as T
}

View file

@ -0,0 +1,38 @@
package com.anytypeio.anytype.presentation.spaces
import javax.inject.Inject
interface SpaceGradientProvider {
fun get(id: Double): Gradient
class Impl @Inject constructor(): SpaceGradientProvider {
override fun get(id: Double): Gradient {
return gradients[id] ?: Gradient("#F6EB7D", "#CBD2FA")
}
private val gradients = mapOf(
1.0 to Gradient("#F6EB7D", "#CBD2FA"),
2.0 to Gradient("#112156", "#CBD2FA"),
3.0 to Gradient("#FFA15E", "#CBD2FA"),
4.0 to Gradient("#BC3A54", "#CBD2FA"),
5.0 to Gradient("#4D7AFF", "#CBD2FA"),
6.0 to Gradient("#F6EB7D", "#BC3A54"),
7.0 to Gradient("#112156", "#BC3A54"),
8.0 to Gradient("#CBD2FA", "#BC3A54"),
9.0 to Gradient("#FFA25E", "#BC3A54"),
10.0 to Gradient("#4D7AFF", "#BC3A54"),
11.0 to Gradient("#CBD2FA", "#FFA25E"),
12.0 to Gradient("#4D7AFF", "#FFA25E"),
13.0 to Gradient("#BC3A54", "#FFA25E"),
14.0 to Gradient("#F6EB7D", "#FFA25E"),
15.0 to Gradient("#BC3A54", "#F6EB7D"),
16.0 to Gradient("#4D7AFF", "#F6EB7D")
)
}
data class Gradient(val from: String, val to: String)
}

View file

@ -7,11 +7,15 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder
sealed class SpaceIconView {
object Loading : SpaceIconView()
object Placeholder : SpaceIconView()
class Gradient(val from: String, val to: String) : SpaceIconView()
data class Emoji(val unicode: String) : SpaceIconView()
data class Image(val url: Url) : SpaceIconView()
}
fun ObjectWrapper.Basic.spaceIcon(builder: UrlBuilder): SpaceIconView = when {
fun ObjectWrapper.Basic.spaceIcon(
builder: UrlBuilder,
spaceGradientProvider: SpaceGradientProvider
) = when {
!iconEmoji.isNullOrEmpty() -> {
val emoji = checkNotNull(iconEmoji)
SpaceIconView.Emoji(emoji)
@ -20,5 +24,11 @@ fun ObjectWrapper.Basic.spaceIcon(builder: UrlBuilder): SpaceIconView = when {
val hash = checkNotNull(iconImage)
SpaceIconView.Image(builder.thumbnail(hash))
}
iconOption != null -> {
iconOption?.let {
val gradient = spaceGradientProvider.get(it)
SpaceIconView.Gradient(gradient.from, gradient.to)
} ?: SpaceIconView.Placeholder
}
else -> SpaceIconView.Placeholder
}

View file

@ -42,6 +42,7 @@ import com.anytypeio.anytype.domain.widgets.SaveWidgetSession
import com.anytypeio.anytype.domain.widgets.UpdateWidget
import com.anytypeio.anytype.presentation.objects.ObjectIcon
import com.anytypeio.anytype.presentation.search.Subscriptions
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
import com.anytypeio.anytype.presentation.util.DefaultCoroutineTestRule
import com.anytypeio.anytype.presentation.util.Dispatcher
import com.anytypeio.anytype.presentation.widgets.BundledWidgetSourceIds
@ -142,6 +143,9 @@ class HomeScreenViewModelTest {
@Mock
lateinit var saveWidgetSession: SaveWidgetSession
@Mock
lateinit var spaceGradientProvider: SpaceGradientProvider
@Mock
lateinit var getWidgetSession: GetWidgetSession
@ -1923,7 +1927,8 @@ class HomeScreenViewModelTest {
appActionManager = appActionManager,
analytics = analytics,
getWidgetSession = getWidgetSession,
saveWidgetSession = saveWidgetSession
saveWidgetSession = saveWidgetSession,
spaceGradientProvider = spaceGradientProvider
)
companion object {

View file

@ -29,6 +29,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalFocusManager
@ -42,6 +43,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.graphics.toColorInt
import coil.compose.rememberAsyncImagePainter
import com.anytypeio.anytype.core_ui.foundation.Arrow
import com.anytypeio.anytype.core_ui.foundation.Divider
@ -380,6 +382,21 @@ fun ProfileImageBlock(
}
)
}
is ProfileIconView.Gradient -> {
val gradient = Brush.radialGradient(
colors = listOf(
Color(icon.from.toColorInt()),
Color(icon.to.toColorInt())
)
)
Box(modifier = Modifier
.size(96.dp)
.clip(RoundedCornerShape(48.dp))
.background(gradient)
.noRippleClickable {
onProfileIconClick.invoke()
})
}
else -> {
val nameFirstChar = if (name.isEmpty()) {
stringResource(id = R.string.account_default_name)

View file

@ -22,6 +22,7 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.`object`.SetObjectDetails
import com.anytypeio.anytype.presentation.profile.ProfileIconView
import com.anytypeio.anytype.presentation.profile.profileIcon
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
import com.anytypeio.anytype.ui_settings.account.repo.DebugSyncShareDownloader
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow
@ -40,7 +41,8 @@ class AccountAndDataViewModel(
private val setObjectDetails: SetObjectDetails,
private val configStorage: ConfigStorage,
private val urlBuilder: UrlBuilder,
private val setImageIcon: SetDocumentImageIcon
private val setImageIcon: SetDocumentImageIcon,
private val spaceGradientProvider: SpaceGradientProvider
) : ViewModel() {
private val jobs = mutableListOf<Job>()
@ -59,7 +61,8 @@ class AccountAndDataViewModel(
Relations.ID,
Relations.NAME,
Relations.ICON_IMAGE,
Relations.ICON_EMOJI
Relations.ICON_EMOJI,
Relations.ICON_OPTION
),
targets = listOf(profileId)
)
@ -67,7 +70,7 @@ class AccountAndDataViewModel(
val obj = result.firstOrNull()
AccountProfile.Data(
name = obj?.name ?: "",
icon = obj?.profileIcon(urlBuilder) ?: ProfileIconView.Placeholder
icon = obj?.profileIcon(urlBuilder, spaceGradientProvider) ?: ProfileIconView.Placeholder
)
}.stateIn(
viewModelScope,
@ -209,7 +212,8 @@ class AccountAndDataViewModel(
private val setObjectDetails: SetObjectDetails,
private val configStorage: ConfigStorage,
private val urlBuilder: UrlBuilder,
private val setDocumentImageIcon: SetDocumentImageIcon
private val setDocumentImageIcon: SetDocumentImageIcon,
private val spaceGradientProvider: SpaceGradientProvider
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@ -222,7 +226,8 @@ class AccountAndDataViewModel(
setObjectDetails = setObjectDetails,
configStorage = configStorage,
urlBuilder = urlBuilder,
setImageIcon = setDocumentImageIcon
setImageIcon = setDocumentImageIcon,
spaceGradientProvider = spaceGradientProvider
) as T
}
}

View file

@ -18,12 +18,15 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.graphics.toColorInt
import coil.compose.rememberAsyncImagePainter
import com.anytypeio.anytype.core_ui.foundation.Arrow
import com.anytypeio.anytype.core_ui.foundation.Divider
@ -181,6 +184,21 @@ fun AccountOption(
.clip(RoundedCornerShape(14.dp))
)
}
is ProfileIconView.Gradient -> {
val gradient = Brush.radialGradient(
colors = listOf(
Color(icon.from.toColorInt()),
Color(icon.to.toColorInt())
)
)
Box(
modifier = Modifier
.padding(start = 20.dp)
.size(28.dp)
.clip(RoundedCornerShape(14.dp))
.background(gradient)
)
}
else -> {
val nameFirstChar = if (data.name.isEmpty()) {
stringResource(id = R.string.account_default_name)

View file

@ -22,6 +22,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.layout.ContentScale
@ -32,6 +33,7 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import androidx.core.graphics.toColorInt
import coil.compose.rememberAsyncImagePainter
import com.anytypeio.anytype.core_ui.foundation.noRippleClickable
import com.anytypeio.anytype.core_ui.views.Caption1Regular
@ -134,6 +136,31 @@ fun SpaceImageBlock(icon: SpaceIconView, onSpaceIconClick: () -> Unit) {
}
)
}
is SpaceIconView.Gradient -> {
val gradient = Brush.radialGradient(
colors = listOf(
Color(icon.from.toColorInt()),
Color(icon.to.toColorInt())
)
)
Box(
modifier = Modifier
.size(96.dp)
.clip(RoundedCornerShape(8.dp))
.background(color = colorResource(id = R.color.shape_primary))
.noRippleClickable {
onSpaceIconClick.invoke()
}
) {
Box(
modifier = Modifier.align(Alignment.Center)
.size(64.dp)
.clip(RoundedCornerShape(32.dp))
.background(gradient)
)
}
}
else -> {
Image(
painter = painterResource(id = R.drawable.ic_home_widget_space),