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:
parent
ecd93b32f2
commit
0733e88abb
17 changed files with 209 additions and 26 deletions
|
@ -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
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue