1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-07 21:37:02 +09:00

Editor | Fix | Delete colors from ThemeColor.kt (#2284)

This commit is contained in:
Sergey Boishtyan 2022-05-18 19:27:19 +03:00 committed by GitHub
parent 4132e0cb4e
commit 39046f787f
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 196 additions and 154 deletions

View file

@ -13,6 +13,7 @@ import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Block
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_models.ext.content
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.emojifier.data.DefaultDocumentEmojiIconProvider
import com.anytypeio.anytype.features.editor.base.EditorTestSetup
import com.anytypeio.anytype.features.editor.base.TestEditorFragment
@ -29,6 +30,7 @@ import com.anytypeio.anytype.test_utils.utils.checkIsSelected
import com.anytypeio.anytype.test_utils.utils.onItem
import com.anytypeio.anytype.test_utils.utils.onItemView
import com.anytypeio.anytype.test_utils.utils.rVMatcher
import com.anytypeio.anytype.test_utils.utils.resources
import com.anytypeio.anytype.ui.editor.EditorFragment
import com.anytypeio.anytype.utils.checkHasMarginStart
import com.anytypeio.anytype.utils.checkHasPaddingLeft
@ -383,7 +385,7 @@ class RelationBlockUITesting : EditorTestSetup() {
id = MockDataFactory.randomUuid(),
fields = Block.Fields.empty(),
children = emptyList(),
backgroundColor = background2.code,
backgroundColor = background3.code,
content = Block.Content.RelationBlock(
key = relation3.key
)
@ -393,7 +395,7 @@ class RelationBlockUITesting : EditorTestSetup() {
id = MockDataFactory.randomUuid(),
fields = Block.Fields.empty(),
children = emptyList(),
backgroundColor = background2.code,
backgroundColor = background4.code,
content = Block.Content.RelationBlock(
key = relation4.key
)
@ -431,10 +433,10 @@ class RelationBlockUITesting : EditorTestSetup() {
with(R.id.recycler.rVMatcher()) {
checkIsRecyclerSize(7)
onItem(2).checkHasBackgroundColor(background1.background)
onItem(3).checkHasBackgroundColor(background2.background)
onItem(4).checkHasBackgroundColor(background3.background)
onItem(5).checkHasBackgroundColor(background4.background)
onItem(2).checkHasBackgroundColor(resources.veryLight(background1))
onItem(3).checkHasBackgroundColor(resources.veryLight(background2))
onItem(4).checkHasBackgroundColor(resources.veryLight(background3))
onItem(5).checkHasBackgroundColor(resources.veryLight(background4))
onItem(6).checkHasNoBackground()
}

View file

@ -12,6 +12,7 @@ import com.anytypeio.anytype.core_models.Block
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Payload
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.domain.`object`.UpdateDetail
import com.anytypeio.anytype.domain.block.repo.BlockRepository
import com.anytypeio.anytype.domain.config.Gateway
@ -39,6 +40,7 @@ import com.anytypeio.anytype.test_utils.utils.matchView
import com.anytypeio.anytype.test_utils.utils.onItemView
import com.anytypeio.anytype.test_utils.utils.performClick
import com.anytypeio.anytype.test_utils.utils.rVMatcher
import com.anytypeio.anytype.test_utils.utils.resources
import com.anytypeio.anytype.test_utils.utils.type
import com.anytypeio.anytype.ui.relations.add.BaseAddOptionsRelationFragment
import com.anytypeio.anytype.utils.CoroutinesTestRule
@ -407,9 +409,9 @@ class AddRelationStatusValueTest {
)
R.id.recycler.rVMatcher().apply {
onItemView(0, R.id.tvStatusName).checkHasText(option1.text)
onItemView(0, R.id.tvStatusName).checkHasTextColor(option1Color.text)
checkIsRecyclerSize(1)
onItemView(0, R.id.tvStatusName).checkHasText(option1.text)
onItemView(0, R.id.tvStatusName).checkHasTextColor(resources.dark(option1Color))
}
}
@ -624,7 +626,7 @@ class AddRelationStatusValueTest {
}
private fun launchFragment(args: Bundle): FragmentScenario<TestRelationOptionValueDVAddFragment> {
return launchFragmentInContainer<TestRelationOptionValueDVAddFragment>(
return launchFragmentInContainer(
fragmentArgs = args,
themeResId = R.style.AppTheme
)

View file

@ -12,6 +12,7 @@ import com.anytypeio.anytype.core_models.Block
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Payload
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.domain.`object`.UpdateDetail
import com.anytypeio.anytype.domain.block.repo.BlockRepository
import com.anytypeio.anytype.domain.config.Gateway
@ -38,6 +39,7 @@ import com.anytypeio.anytype.test_utils.utils.matchView
import com.anytypeio.anytype.test_utils.utils.onItemView
import com.anytypeio.anytype.test_utils.utils.performClick
import com.anytypeio.anytype.test_utils.utils.rVMatcher
import com.anytypeio.anytype.test_utils.utils.resources
import com.anytypeio.anytype.test_utils.utils.type
import com.anytypeio.anytype.ui.relations.add.BaseAddOptionsRelationFragment
import com.anytypeio.anytype.utils.CoroutinesTestRule
@ -318,9 +320,9 @@ class AddRelationTagValueTest {
)
R.id.recycler.rVMatcher().apply {
onItemView(0, R.id.tvTagName).checkHasText(option1.text)
onItemView(0, R.id.tvTagName).checkHasTextColor(option1Color.text)
checkIsRecyclerSize(1)
onItemView(0, R.id.tvTagName).checkHasText(option1.text)
onItemView(0, R.id.tvTagName).checkHasTextColor(resources.dark(option1Color))
}
}

View file

@ -17,6 +17,7 @@ import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectType
import com.anytypeio.anytype.core_models.Payload
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider
import com.anytypeio.anytype.domain.`object`.UpdateDetail
import com.anytypeio.anytype.domain.block.repo.BlockRepository
@ -40,8 +41,10 @@ import com.anytypeio.anytype.presentation.util.CopyFileToCacheDirectory
import com.anytypeio.anytype.presentation.util.Dispatcher
import com.anytypeio.anytype.test_utils.MockDataFactory
import com.anytypeio.anytype.test_utils.utils.TestUtils.withRecyclerView
import com.anytypeio.anytype.test_utils.utils.espresso.WithTextColor
import com.anytypeio.anytype.test_utils.utils.checkHasText
import com.anytypeio.anytype.test_utils.utils.checkHasTextColor
import com.anytypeio.anytype.test_utils.utils.espresso.WithTextColorRes
import com.anytypeio.anytype.test_utils.utils.resources
import com.anytypeio.anytype.ui.relations.RelationValueBaseFragment
import com.anytypeio.anytype.utils.CoroutinesTestRule
import com.bartoszlipinski.disableanimationsrule.DisableAnimationsRule
@ -102,7 +105,7 @@ class DisplayRelationStatusValueTest {
TestRelationValueDVFragment.testVmFactory = RelationValueDVViewModel.Factory(
relations = DataViewObjectRelationProvider(state),
values = DataViewObjectValueProvider(state, session),
details = object: ObjectDetailProvider {
details = object : ObjectDetailProvider {
override fun provide(): Map<Id, Block.Fields> = state.value.details
},
types = object : ObjectTypesProvider {
@ -352,8 +355,8 @@ class DisplayRelationStatusValueTest {
val rvMatcher = withRecyclerView(R.id.recycler)
onView(rvMatcher.atPositionOnView(0, R.id.tvStatusName)).apply {
check(matches(withText(option2.text)))
check(matches(WithTextColor(option2Color.text)))
checkHasText(option2.text)
checkHasTextColor(resources.dark(option2Color))
}
}
@ -433,7 +436,7 @@ class DisplayRelationStatusValueTest {
val rvMatcher = withRecyclerView(R.id.recycler)
onView(rvMatcher.atPositionOnView(0, R.id.tvStatusName)).apply {
check(matches(WithTextColorRes(R.color.default_filter_tag_text_color)))
check(matches(WithTextColorRes(com.anytypeio.anytype.core_ui.R.color.text_primary)))
}
}

View file

@ -17,6 +17,7 @@ import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectType
import com.anytypeio.anytype.core_models.Payload
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider
import com.anytypeio.anytype.domain.`object`.UpdateDetail
import com.anytypeio.anytype.domain.block.repo.BlockRepository
@ -40,8 +41,10 @@ import com.anytypeio.anytype.presentation.util.CopyFileToCacheDirectory
import com.anytypeio.anytype.presentation.util.Dispatcher
import com.anytypeio.anytype.test_utils.MockDataFactory
import com.anytypeio.anytype.test_utils.utils.TestUtils.withRecyclerView
import com.anytypeio.anytype.test_utils.utils.espresso.WithTextColor
import com.anytypeio.anytype.test_utils.utils.checkHasText
import com.anytypeio.anytype.test_utils.utils.checkHasTextColor
import com.anytypeio.anytype.test_utils.utils.espresso.WithTextColorRes
import com.anytypeio.anytype.test_utils.utils.resources
import com.anytypeio.anytype.ui.relations.RelationValueBaseFragment
import com.anytypeio.anytype.utils.CoroutinesTestRule
import com.bartoszlipinski.disableanimationsrule.DisableAnimationsRule
@ -356,13 +359,13 @@ class DisplayRelationTagValueTest {
// }
onView(rvMatcher.atPositionOnView(0, R.id.tvTagName)).apply {
check(matches(withText(option2.text)))
check(matches(WithTextColor(option2Color.text)))
checkHasText(option2.text)
checkHasTextColor(resources.dark(option2Color))
}
onView(rvMatcher.atPositionOnView(1, R.id.tvTagName)).apply {
check(matches(withText(option3.text)))
check(matches(WithTextColorRes(R.color.default_filter_tag_text_color)))
checkHasText(option3.text)
check(matches(WithTextColorRes(com.anytypeio.anytype.core_ui.R.color.text_primary)))
}
}
@ -442,7 +445,7 @@ class DisplayRelationTagValueTest {
val rvMatcher = withRecyclerView(R.id.recycler)
onView(rvMatcher.atPositionOnView(0, R.id.tvTagName)).apply {
check(matches(WithTextColorRes(R.color.default_filter_tag_text_color)))
check(matches(WithTextColorRes(com.anytypeio.anytype.core_ui.R.color.text_primary)))
}
}

View file

@ -12,6 +12,7 @@ import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectType
import com.anytypeio.anytype.core_models.Payload
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider
import com.anytypeio.anytype.domain.`object`.UpdateDetail
import com.anytypeio.anytype.domain.block.repo.BlockRepository
@ -43,6 +44,7 @@ import com.anytypeio.anytype.test_utils.utils.matchView
import com.anytypeio.anytype.test_utils.utils.onItemView
import com.anytypeio.anytype.test_utils.utils.performClick
import com.anytypeio.anytype.test_utils.utils.rVMatcher
import com.anytypeio.anytype.test_utils.utils.resources
import com.anytypeio.anytype.ui.relations.RelationValueBaseFragment
import com.anytypeio.anytype.utils.CoroutinesTestRule
import com.bartoszlipinski.disableanimationsrule.DisableAnimationsRule
@ -216,7 +218,7 @@ class EditRelationTagValueTest {
with(R.id.recycler.rVMatcher()) {
onItemView(0, R.id.tvTagName).checkHasText(option2.text)
onItemView(0, R.id.tvTagName).checkHasTextColor(option2Color.text)
onItemView(0, R.id.tvTagName).checkHasTextColor(resources.dark(option2Color))
onItemView(0, R.id.btnRemoveTag).checkIsNotDisplayed()
onItemView(0, R.id.btnDragAndDropTag).checkIsNotDisplayed()
onItemView(1, R.id.tvTagName).checkHasText(option3.text)
@ -231,7 +233,7 @@ class EditRelationTagValueTest {
with(R.id.recycler.rVMatcher()) {
onItemView(0, R.id.tvTagName).checkHasText(option2.text)
onItemView(0, R.id.tvTagName).checkHasTextColor(option2Color.text)
onItemView(0, R.id.tvTagName).checkHasTextColor(resources.dark(option2Color))
onItemView(0, R.id.btnRemoveTag).checkIsDisplayed()
onItemView(0, R.id.btnDragAndDropTag).checkIsDisplayed()
onItemView(1, R.id.tvTagName).checkHasText(option3.text)
@ -344,7 +346,6 @@ class EditRelationTagValueTest {
target = dv.id,
record = target,
values = mapOf(
ObjectSetConfig.ID_KEY to target,
relationKey to listOf(option2.id)
)
)

View file

@ -15,6 +15,7 @@ import com.anytypeio.anytype.core_models.Block
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Payload
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.core_utils.const.DateConst
import com.anytypeio.anytype.core_utils.ext.toTimeSeconds
import com.anytypeio.anytype.domain.`object`.UpdateDetail
@ -36,6 +37,7 @@ import com.anytypeio.anytype.test_utils.utils.checkHasTextColor
import com.anytypeio.anytype.test_utils.utils.checkIsRecyclerSize
import com.anytypeio.anytype.test_utils.utils.onItemView
import com.anytypeio.anytype.test_utils.utils.rVMatcher
import com.anytypeio.anytype.test_utils.utils.resources
import com.anytypeio.anytype.ui.relations.RelationListFragment
import com.anytypeio.anytype.utils.CoroutinesTestRule
import com.bartoszlipinski.disableanimationsrule.DisableAnimationsRule
@ -501,10 +503,10 @@ class ObjectRelationListTest {
onItemView(0, R.id.tvSectionName).checkHasText(R.string.other_relations)
onItemView(1, R.id.tvRelationTitle).checkHasText(name1)
onItemView(1, R.id.tvRelationValue).checkHasText(option1.text)
onItemView(1, R.id.tvRelationValue).checkHasTextColor(color1.text)
onItemView(1, R.id.tvRelationValue).checkHasTextColor(resources.dark(color1))
onItemView(2, R.id.tvRelationTitle).checkHasText(name2)
onItemView(2, R.id.tvRelationValue).checkHasText(option2.text)
onItemView(2, R.id.tvRelationValue).checkHasTextColor(color2.text)
onItemView(2, R.id.tvRelationValue).checkHasTextColor(resources.dark(color2))
checkIsRecyclerSize(3)
}
}

View file

@ -4,11 +4,18 @@ import android.content.Context
import android.content.res.Resources
import android.view.View
import android.widget.TextView
import androidx.annotation.ColorInt
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.presentation.editor.editor.ThemeColor
fun Resources.dark(color: ThemeColor, default: Int): Int = when (color) {
ThemeColor.DEFAULT -> default
@ColorInt
fun Resources.dark(
color: ThemeColor,
@ColorInt
default: Int? = null
): Int = when (color) {
// TODO pass Theme
ThemeColor.DEFAULT -> default ?: getColor(R.color.palette_dark_default, null)
ThemeColor.GREY -> getColor(R.color.palette_dark_grey, null)
ThemeColor.YELLOW -> getColor(R.color.palette_dark_yellow, null)
ThemeColor.ORANGE -> getColor(R.color.palette_dark_orange, null)
@ -21,8 +28,13 @@ fun Resources.dark(color: ThemeColor, default: Int): Int = when (color) {
ThemeColor.LIME -> getColor(R.color.palette_dark_lime, null)
}
fun Resources.light(color: ThemeColor, default: Int): Int = when (color) {
ThemeColor.DEFAULT -> default
@ColorInt
fun Resources.light(
color: ThemeColor,
@ColorInt
default: Int? = null
): Int = when (color) {
ThemeColor.DEFAULT -> default ?: getColor(R.color.palette_light_default, null)
ThemeColor.GREY -> getColor(R.color.palette_light_grey, null)
ThemeColor.YELLOW -> getColor(R.color.palette_light_yellow, null)
ThemeColor.ORANGE -> getColor(R.color.palette_light_orange, null)
@ -35,8 +47,13 @@ fun Resources.light(color: ThemeColor, default: Int): Int = when (color) {
ThemeColor.LIME -> getColor(R.color.palette_light_lime, null)
}
fun Resources.lighter(color: ThemeColor, default: Int): Int = when (color) {
ThemeColor.DEFAULT -> default
@ColorInt
fun Resources.veryLight(
color: ThemeColor,
@ColorInt
default: Int? = null
): Int = when (color) {
ThemeColor.DEFAULT -> default ?: getColor(R.color.palette_very_light_default, null)
ThemeColor.GREY -> getColor(R.color.palette_very_light_grey, null)
ThemeColor.YELLOW -> getColor(R.color.palette_very_light_yellow, null)
ThemeColor.ORANGE -> getColor(R.color.palette_very_light_orange, null)
@ -67,7 +84,7 @@ fun View.setBlockBackgroundColor(color: String?) {
if (!color.isNullOrEmpty()) {
val value = ThemeColor.values().find { value -> value.code == color }
if (value != null && value != ThemeColor.DEFAULT) {
setBackgroundColor(resources.lighter(value, 0))
setBackgroundColor(resources.veryLight(value, 0))
} else {
background = null
}

View file

@ -5,6 +5,7 @@ import android.widget.TextView
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.databinding.ItemDvViewerFilterStatusBinding
import com.anytypeio.anytype.core_ui.extensions.color
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.core_utils.ext.invisible
import com.anytypeio.anytype.core_utils.ext.visible
import com.anytypeio.anytype.presentation.editor.editor.ThemeColor
@ -12,7 +13,8 @@ import com.anytypeio.anytype.presentation.extension.hasValue
import com.anytypeio.anytype.presentation.sets.model.FilterView
import timber.log.Timber
class FilterStatusViewHolder(val binding: ItemDvViewerFilterStatusBinding) : FilterViewHolder(binding.root) {
class FilterStatusViewHolder(val binding: ItemDvViewerFilterStatusBinding) :
FilterViewHolder(binding.root) {
override val textTitle: TextView get() = binding.tvTitle
override val textCondition: TextView get() = binding.tvCondition
@ -43,16 +45,11 @@ class FilterStatusViewHolder(val binding: ItemDvViewerFilterStatusBinding) : Fil
}
private fun setTextColor(view: TextView, color: String) {
if (color.isNotBlank()) {
val value = ThemeColor.values().find { value -> value.code == color }
if (value != null)
view.setTextColor(value.text)
else{
Timber.e("Could not find value for text color: $color")
view.setTextColor(view.context.color(R.color.black))
}
} else {
view.setTextColor(view.context.color(R.color.black))
val defaultColor = view.context.color(R.color.default_filter_tag_text_color)
val value = ThemeColor.values().find { value -> value.code == color }
if (value == null) {
Timber.w("Could not find value for text color: $color")
}
view.setTextColor(view.resources.dark(value ?: ThemeColor.DEFAULT, defaultColor))
}
}

View file

@ -12,7 +12,7 @@ import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.RecyclerView
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.databinding.ItemBlockCodeSnippetBinding
import com.anytypeio.anytype.core_ui.extensions.lighter
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil
import com.anytypeio.anytype.core_ui.features.editor.BlockViewHolder
import com.anytypeio.anytype.core_ui.features.editor.EditorTouchProcessor
@ -216,7 +216,7 @@ class Code(val binding: ItemBlockCodeSnippetBinding) : BlockViewHolder(binding.r
private fun setBackgroundColor(color: String? = null) {
val value = ThemeColor.values().find { value -> value.code == color }
if (value != null && value != ThemeColor.DEFAULT) {
(root.background as? ColorDrawable)?.color = root.resources.lighter(value, 0)
(root.background as? ColorDrawable)?.color = root.resources.veryLight(value, 0)
} else {
val defaultBackgroundColor =
content.context.resources.getColor(R.color.shape_tertiary, null)

View file

@ -7,7 +7,7 @@ import androidx.core.view.updatePadding
import androidx.recyclerview.widget.RecyclerView
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding
import com.anytypeio.anytype.core_ui.extensions.lighter
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil
import com.anytypeio.anytype.core_ui.features.editor.BlockViewHolder
import com.anytypeio.anytype.core_ui.features.editor.EditorTouchProcessor
@ -93,7 +93,7 @@ abstract class MediaPlaceholder(binding: ItemBlockMediaPlaceholderBinding) :
if (!background.isNullOrEmpty()) {
val value = ThemeColor.values().find { value -> value.code == background }
if (value != null && value != ThemeColor.DEFAULT) {
card.setCardBackgroundColor(card.resources.lighter(value, 0))
card.setCardBackgroundColor(card.resources.veryLight(value, 0))
} else {
Timber.e("Could not find value for background color: $background, setting background to null")
card.setCardBackgroundColor(0)

View file

@ -1,9 +1,13 @@
package com.anytypeio.anytype.core_ui.features.editor.slash.holders
import android.content.Context
import android.content.res.Resources
import androidx.annotation.ColorInt
import androidx.recyclerview.widget.RecyclerView
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.databinding.ItemSlashWidgetColorBinding
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.presentation.editor.editor.ThemeColor
import com.anytypeio.anytype.presentation.editor.editor.slash.SlashItem
@ -13,7 +17,7 @@ class ColorMenuHolder(
fun bind(item: SlashItem.Color) = with(binding) {
circle.isSelected = item.isSelected
circle.innerColor = item.colorHex
circle.innerColor = view.context.resources.getColor(item)
val capitalizedTitle = view.context.getTitle(item.themeColor)
title.text = when (item) {
is SlashItem.Color.Text -> capitalizedTitle
@ -24,6 +28,14 @@ class ColorMenuHolder(
}
}
@ColorInt
private fun Resources.getColor(item: SlashItem.Color): Int {
return when (item) {
is SlashItem.Color.Text -> dark(item.themeColor)
is SlashItem.Color.Background -> veryLight(item.themeColor)
}
}
private fun Context.getTitle(color: ThemeColor): String {
return when (color) {
ThemeColor.DEFAULT -> getString(R.string.slash_widget_default_color_title)

View file

@ -8,9 +8,13 @@ import com.anytypeio.anytype.core_ui.databinding.ItemFeaturedRelationDefaultBind
import com.anytypeio.anytype.core_ui.databinding.ItemFeaturedRelationStatusBinding
import com.anytypeio.anytype.core_ui.databinding.ItemFeaturedRelationTagsBinding
import com.anytypeio.anytype.core_ui.extensions.color
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.core_utils.ext.setDrawableColor
import com.anytypeio.anytype.presentation.editor.editor.ThemeColor
import com.anytypeio.anytype.presentation.relations.DocumentRelationView
import com.anytypeio.anytype.presentation.sets.model.StatusView
import com.anytypeio.anytype.presentation.sets.model.TagView
sealed class FeaturedRelationViewHolder(view: View) : RecyclerView.ViewHolder(view) {
@ -30,22 +34,24 @@ sealed class FeaturedRelationViewHolder(view: View) : RecyclerView.ViewHolder(vi
private val container = binding.featuredRelationTagContainer
fun bind(item: DocumentRelationView.Tags) {
// TODO optimize create and delete only diff between views
container.removeAllViews()
item.tags.forEach { tag ->
container.addView(
TextView(itemView.context).apply {
text = tag.tag
setBackgroundResource(R.drawable.rect_dv_cell_tag_item)
val themeColor = ThemeColor.values().find { it.code == tag.color }
if (themeColor != null) {
background.setDrawableColor(themeColor.background)
setTextColor(themeColor.text)
} else {
background.setDrawableColor(context.color(R.color.default_filter_tag_background_color))
setTextColor(context.color(R.color.default_filter_tag_text_color))
}
}
)
container.addView(createTagView(tag))
}
}
private fun createTagView(tag: TagView): View {
val context = itemView.context
val resources = context.resources
val defaultTextColor = context.color(R.color.default_filter_tag_text_color)
val defaultBackgroundColor = context.color(R.color.default_filter_tag_background_color)
val themeColor = ThemeColor.values().find { it.code == tag.color } ?: ThemeColor.DEFAULT
return TextView(context).apply {
text = tag.tag
setBackgroundResource(R.drawable.rect_dv_cell_tag_item)
background.setDrawableColor(resources.veryLight(themeColor, defaultBackgroundColor))
setTextColor(resources.dark(themeColor, defaultTextColor))
}
}
}
@ -57,19 +63,20 @@ sealed class FeaturedRelationViewHolder(view: View) : RecyclerView.ViewHolder(vi
private val container = binding.featuredRelationStatusContainer
fun bind(item: DocumentRelationView.Status) {
// TODO optimize create and delete only diff between views
container.removeAllViews()
item.status.forEach { status ->
container.addView(
TextView(itemView.context).apply {
text = status.status
val themeColor = ThemeColor.values().find { it.code == status.color }
if (themeColor != null) {
setTextColor(themeColor.text)
} else {
setTextColor(context.color(R.color.default_filter_tag_text_color))
}
}
)
container.addView(createStatusView(status))
}
}
private fun createStatusView(status: StatusView): View {
val resources = itemView.context.resources
val color = ThemeColor.values().find { it.code == status.color } ?: ThemeColor.DEFAULT
val defaultTextColor = itemView.context.color(R.color.default_filter_tag_text_color)
return TextView(itemView.context).apply {
text = status.status
setTextColor(resources.dark(color, defaultTextColor))
}
}
}

View file

@ -14,12 +14,8 @@ class StatusWidget @JvmOverloads constructor(
) : AppCompatTextView(context, attrs, defStyleAttr) {
fun setColor(color: String?) {
val defaultTextColor = resources.getColor(R.color.text_primary, null)
val themeColor = ThemeColor.values().find { it.code == color }
if (themeColor != null && themeColor != ThemeColor.DEFAULT) {
setTextColor(resources.dark(themeColor, defaultTextColor))
} else {
setTextColor(defaultTextColor)
}
val defaultTextColor = context.getColor(R.color.text_primary)
val themeColor = ThemeColor.values().find { it.code == color } ?: ThemeColor.DEFAULT
setTextColor(resources.dark(themeColor, defaultTextColor))
}
}

View file

@ -34,15 +34,10 @@ class TagWidget @JvmOverloads constructor(
}
private fun setColor(color: String?) {
val defaultTextColor = resources.getColor(R.color.text_primary, null)
val defaultBackground = resources.getColor(R.color.shape_primary, null)
val themeColor = ThemeColor.values().find { it.code == color }
if (themeColor != null && themeColor != ThemeColor.DEFAULT) {
background.setDrawableColor(resources.light(themeColor, defaultBackground))
setTextColor(resources.dark(themeColor, defaultTextColor))
} else {
background.setDrawableColor(defaultBackground)
setTextColor(defaultTextColor)
}
val defaultTextColor = context.getColor(R.color.text_primary)
val defaultBackground = context.getColor(R.color.shape_primary)
val themeColor = ThemeColor.values().find { it.code == color } ?: ThemeColor.DEFAULT
setTextColor(resources.dark(themeColor, defaultTextColor))
background.setDrawableColor(resources.light(themeColor, defaultBackground))
}
}

View file

@ -9,7 +9,7 @@ import android.text.Spanned
import androidx.core.graphics.drawable.DrawableCompat
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.common.Span
import com.anytypeio.anytype.core_ui.extensions.lighter
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.presentation.editor.editor.ThemeColor
import timber.log.Timber
@ -118,7 +118,7 @@ class HighlightDrawer(
val value = ThemeColor.values().find { value -> value.code == span.value }
val default = resources.getColor(R.color.background_primary, null)
val color = if (value != null && value != ThemeColor.DEFAULT) {
resources.lighter(value, default)
resources.veryLight(value, default)
} else {
default
}

View file

@ -8,8 +8,8 @@ import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.databinding.WidgetMarkupToolbarMainBinding
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.core_ui.extensions.light
import com.anytypeio.anytype.core_ui.extensions.lighter
import com.anytypeio.anytype.core_ui.extensions.tint
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.core_ui.reactive.clicks
import com.anytypeio.anytype.core_utils.ext.invisible
import com.anytypeio.anytype.core_utils.ext.visible
@ -89,7 +89,7 @@ class MarkupToolbarWidget @JvmOverloads constructor(
val code = ThemeColor.values().find { it.code == props?.blockBackroundColor }
if (code != null) {
val default = resources.getColor(R.color.background_primary, null)
val value = resources.lighter(code, default)
val value = resources.veryLight(code, default)
backgroundColorCircle.tint(value)
} else
backgroundColorCircle.backgroundTintList = null

View file

@ -17,6 +17,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.test.core.app.ApplicationProvider
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Url
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.core_ui.features.editor.BlockAdapter
import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil
import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil.Companion.BACKGROUND_COLOR_CHANGED
@ -196,7 +197,7 @@ class BlockAdapterTest {
val color = holder.content.currentTextColor
assertEquals(
expected = ThemeColor.BLUE.text,
expected = context.resources.dark(ThemeColor.BLUE),
actual = color
)
}
@ -344,7 +345,7 @@ class BlockAdapterTest {
// Testing
assertEquals(
expected = ThemeColor.BLUE.text,
expected = context.resources.dark(ThemeColor.BLUE),
actual = holder.content.currentTextColor
)

View file

@ -5,6 +5,7 @@ import androidx.core.text.getSpans
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.anytypeio.anytype.core_ui.common.CheckedCheckboxColorSpan
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.core_ui.features.editor.holders.text.Bulleted
import com.anytypeio.anytype.core_ui.features.editor.holders.text.Checkbox
import com.anytypeio.anytype.presentation.editor.editor.Markup
@ -52,7 +53,7 @@ class BlockAdapterCheckboxTest : BlockAdapterTestSetup() {
assertEquals(
actual = holder.content.currentTextColor,
expected = ThemeColor.DEFAULT.text
expected = context.resources.dark(ThemeColor.DEFAULT)
)
}
@ -85,7 +86,7 @@ class BlockAdapterCheckboxTest : BlockAdapterTestSetup() {
assertEquals(
actual = holder.content.currentTextColor,
expected = ThemeColor.DEFAULT.text
expected = context.resources.dark(ThemeColor.DEFAULT)
)
val spans = holder.content.text!!.getSpans<CheckedCheckboxColorSpan>(0)

View file

@ -3,6 +3,7 @@ package com.anytypeio.anytype.core_ui.features.editor
import android.os.Build
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.anytypeio.anytype.core_ui.extensions.dark
import com.anytypeio.anytype.core_ui.features.editor.holders.text.Bulleted
import com.anytypeio.anytype.presentation.editor.editor.ThemeColor
import com.anytypeio.anytype.presentation.editor.editor.model.BlockView
@ -57,7 +58,7 @@ class BlockAdapterTextColorTest : BlockAdapterTestSetup() {
assertEquals(
actual = holder.content.currentTextColor,
expected = ThemeColor.BLUE.text
expected = context.resources.dark(ThemeColor.BLUE)
)
val payload: MutableList<Any> = mutableListOf(
@ -74,7 +75,7 @@ class BlockAdapterTextColorTest : BlockAdapterTestSetup() {
assertEquals(
actual = holder.content.currentTextColor,
expected = ThemeColor.DEFAULT.text
expected = context.resources.dark(ThemeColor.DEFAULT)
)
}
}

View file

@ -10,7 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.test.core.app.ApplicationProvider
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.extensions.lighter
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.presentation.editor.editor.ThemeColor
import com.anytypeio.anytype.presentation.editor.editor.model.BlockView
import com.anytypeio.anytype.test_utils.MockDataFactory
@ -95,7 +95,7 @@ class TitleBlockTest {
rvMatcher.apply {
onItemView(0, R.id.root).checkIsDisplayed()
onItemView(0, R.id.title).checkHasBackgroundColor(
resources.lighter(redBackground, 0)
resources.veryLight(redBackground, 0)
)
onItemView(0, R.id.title).checkHasText(title.text!!)
}

View file

@ -1,70 +1,42 @@
package com.anytypeio.anytype.presentation.editor.editor
import android.graphics.Color
/**
* @property code color code name
* @property text text color integer for text styling
* @property background background color integer for background/highlight styling
*/
enum class ThemeColor(
val code: String,
val text: Int,
val background: Int
) {
DEFAULT(
code = "default",
text = Color.parseColor("#2C2B27"),
background = Color.parseColor("#FFFFFF")
),
GREY(
code = "grey",
text = Color.parseColor("#929082"),
background = Color.parseColor("#F1F0ED")
),
YELLOW(
code = "yellow",
text = Color.parseColor("#AFA100"),
background = Color.parseColor("#FCF8D6")
),
ORANGE(
code = "orange",
text = Color.parseColor("#C38400"),
background = Color.parseColor("#FFF2D7")
),
RED(
code = "red",
text = Color.parseColor("#E9410B"),
background = Color.parseColor("#FEE7E0")
),
PINK(
code = "pink",
text = Color.parseColor("#D20D8F"),
background = Color.parseColor("#FBDFF2")
),
PURPLE(
code = "purple",
text = Color.parseColor("#9F43C1"),
background = Color.parseColor("#F3E7F8")
),
BLUE(
code = "blue",
text = Color.parseColor("#3E58EB"),
background = Color.parseColor("#E4E8FC")
),
ICE(
code = "ice",
text = Color.parseColor("#188DCF"),
background = Color.parseColor("#DDF1FC")
),
TEAL(
code = "teal",
text = Color.parseColor("#0BA599"),
background = Color.parseColor("#D9F6F4")
),
LIME(
code = "lime",
text = Color.parseColor("#4DAE00"),
background = Color.parseColor("#E5F8D6")
);
}

View file

@ -1,6 +1,5 @@
package com.anytypeio.anytype.presentation.editor.editor.slash
import androidx.annotation.ColorInt
import com.anytypeio.anytype.core_models.Url
import com.anytypeio.anytype.core_utils.const.SlashConst
import com.anytypeio.anytype.core_utils.const.SlashConst.SLASH_OTHER_TOC_ABBREVIATION
@ -404,8 +403,6 @@ sealed class SlashItem {
abstract val isSelected: Boolean
abstract val themeColor: ThemeColor
@get:ColorInt
abstract val colorHex: Int
override fun getSearchName(): String = themeColor.code
override fun getAbbreviation(): List<String>? = null
@ -413,18 +410,12 @@ sealed class SlashItem {
data class Text(
override val themeColor: ThemeColor,
override val isSelected: Boolean,
) : Color() {
@get:ColorInt
override val colorHex: Int = themeColor.text
}
) : Color()
data class Background(
override val themeColor: ThemeColor,
override val isSelected: Boolean,
) : Color() {
@get:ColorInt
override val colorHex: Int = themeColor.background
}
) : Color()
}
//endregion
}

View file

@ -14,6 +14,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import timber.log.Timber
abstract class BaseAddOptionsRelationViewModel(
@ -36,6 +37,8 @@ abstract class BaseAddOptionsRelationViewModel(
val isMultiple = MutableStateFlow(true)
private val logger = Timber.tag("BaseAddOptionsRelationViewModel")
init {
viewModelScope.launch {
allRelationOptions.collect { all ->
@ -45,7 +48,10 @@ abstract class BaseAddOptionsRelationViewModel(
viewModelScope.launch {
choosingRelationOptions.combine(query) { choosing, query ->
filterRelationsBy(query, allRelationOptions.value.all, choosing)
}.collect { ui.value = it }
}.collect {
logger.i("Update ui: $it")
ui.value = it
}
}
}

View file

@ -1,5 +1,7 @@
package com.anytypeio.anytype.test_utils.utils
import androidx.annotation.ColorInt
import androidx.annotation.IdRes
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.ViewInteraction
import androidx.test.espresso.action.ViewActions
@ -65,15 +67,15 @@ fun ViewInteraction.checkIsNotSelected() {
check(matches(not(ViewMatchers.isSelected())))
}
fun ViewInteraction.checkHasText(resId: Int) {
fun ViewInteraction.checkHasText(@IdRes resId: Int) {
check(matches(ViewMatchers.withText(resId)))
}
fun ViewInteraction.checkHasTextColor(color: Int) {
fun ViewInteraction.checkHasTextColor(@ColorInt color: Int) {
check(matches(WithTextColor(color)))
}
fun ViewInteraction.checkHasBackgroundColor(color: Int) {
fun ViewInteraction.checkHasBackgroundColor(@ColorInt color: Int) {
check(matches(WithBackgroundColor(color)))
}

View file

@ -0,0 +1,11 @@
package com.anytypeio.anytype.test_utils.utils
import android.content.Context
import android.content.res.Resources
import androidx.test.platform.app.InstrumentationRegistry
val context: Context
get() = InstrumentationRegistry.getInstrumentation().targetContext
val resources: Resources
get() = InstrumentationRegistry.getInstrumentation().targetContext.resources

View file

@ -5,6 +5,8 @@ import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.TextView
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.UiController
@ -17,8 +19,11 @@ import org.hamcrest.Description
import org.hamcrest.Matcher
import org.hamcrest.TypeSafeMatcher
class WithTextColor(private val expectedColor: Int) : BoundedMatcher<View, TextView>(TextView::class.java) {
class WithTextColor(
@ColorInt
private val expectedColor: Int
) :
BoundedMatcher<View, TextView>(TextView::class.java) {
override fun matchesSafely(item: TextView) = item.currentTextColor == expectedColor
override fun describeTo(description: Description) {
description.appendText("with text color:")
@ -26,7 +31,10 @@ class WithTextColor(private val expectedColor: Int) : BoundedMatcher<View, TextV
}
}
class WithBackgroundColor(private val expected: Int) : BoundedMatcher<View, View>(View::class.java) {
class WithBackgroundColor(
@ColorInt
private val expected: Int
) : BoundedMatcher<View, View>(View::class.java) {
override fun describeTo(description: Description) {
description.appendText("with background color:")
description.appendValue(expected)
@ -48,14 +56,16 @@ class WithoutBackgroundColor : BoundedMatcher<View, View>(View::class.java) {
}
}
class WithChildViewCount(private val expectedCount: Int) : BoundedMatcher<View, ViewGroup>(ViewGroup::class.java) {
class WithChildViewCount(private val expectedCount: Int) :
BoundedMatcher<View, ViewGroup>(ViewGroup::class.java) {
override fun matchesSafely(item: ViewGroup): Boolean = item.childCount == expectedCount
override fun describeTo(description: Description) {
description.appendText("ViewGroup with child-count = $expectedCount");
}
}
class HasViewGroupChildViewWithText(private val pos: Int, val text: String) : BoundedMatcher<View, ViewGroup>(ViewGroup::class.java) {
class HasViewGroupChildViewWithText(private val pos: Int, val text: String) :
BoundedMatcher<View, ViewGroup>(ViewGroup::class.java) {
private var actual: String? = null
@ -66,6 +76,7 @@ class HasViewGroupChildViewWithText(private val pos: Int, val text: String) : Bo
actual = child.text.toString()
return actual == text
}
override fun describeTo(description: Description) {
if (actual != null) {
description.appendText("Should have text [$text] at position: $pos but was: $actual");
@ -73,7 +84,8 @@ class HasViewGroupChildViewWithText(private val pos: Int, val text: String) : Bo
}
}
class HasChildViewWithText(private val pos: Int, val text: String, val target: Int) : BoundedMatcher<View, RecyclerView>(RecyclerView::class.java) {
class HasChildViewWithText(private val pos: Int, val text: String, val target: Int) :
BoundedMatcher<View, RecyclerView>(RecyclerView::class.java) {
private var actual: String? = null
@ -84,6 +96,7 @@ class HasChildViewWithText(private val pos: Int, val text: String, val target: I
actual = target.text.toString()
return actual == text
}
override fun describeTo(description: Description) {
if (actual != null) {
description.appendText("Should have text [$text] at position: $pos but was: $actual");
@ -91,11 +104,16 @@ class HasChildViewWithText(private val pos: Int, val text: String, val target: I
}
}
class WithTextColorRes(private val expectedColorRes: Int) : BoundedMatcher<View, TextView>(TextView::class.java) {
class WithTextColorRes(
@ColorRes
private val expectedColorRes: Int
) :
BoundedMatcher<View, TextView>(TextView::class.java) {
override fun matchesSafely(item: TextView): Boolean {
val color = ContextCompat.getColor(item.context, expectedColorRes)
return item.currentTextColor == color
}
override fun describeTo(description: Description) {
description.appendText("with text color:")
description.appendValue(expectedColorRes)