diff --git a/app/src/main/java/org/thoughtcrime/securesms/color/ViewColorSet.kt b/app/src/main/java/org/thoughtcrime/securesms/color/ViewColorSet.kt new file mode 100644 index 0000000000..654d62d518 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/color/ViewColorSet.kt @@ -0,0 +1,50 @@ +package org.thoughtcrime.securesms.color + +import android.content.Context +import android.os.Parcelable +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes +import androidx.core.content.ContextCompat +import kotlinx.parcelize.Parcelize +import org.thoughtcrime.securesms.R + +/** + * Represents a set of colors to be applied to the foreground and background of a view. + * + * Supports mixing color ints and color resource ids. + */ +@Parcelize +data class ViewColorSet( + val foreground: ViewColor, + val background: ViewColor +) : Parcelable { + companion object { + fun forCustomColor(@ColorInt customColor: Int): ViewColorSet { + return ViewColorSet( + foreground = ViewColor.ColorResource(R.color.signal_colorOnCustom), + background = ViewColor.ColorValue(customColor) + ) + } + } + + @Parcelize + sealed class ViewColor : Parcelable { + + @ColorInt + abstract fun resolve(context: Context): Int + + @Parcelize + data class ColorValue(@ColorInt val colorInt: Int) : ViewColor() { + override fun resolve(context: Context): Int { + return colorInt + } + } + + @Parcelize + data class ColorResource(@ColorRes val colorRes: Int) : ViewColor() { + override fun resolve(context: Context): Int { + return ContextCompat.getColor(context, colorRes) + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt index 223b378907..8e0fd39ded 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt @@ -10,6 +10,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.color.ViewColorSet import org.thoughtcrime.securesms.components.FragmentWrapperActivity import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment.Companion.RESULT_SELECTION @@ -36,8 +37,14 @@ open class MultiselectForwardActivity : FragmentWrapperActivity(), MultiselectFo override fun getFragment(): Fragment { return MultiselectForwardFragment.create( args.let { - if (it.sendButtonTint == -1) { + if (it.sendButtonColors == null) { args.withSendButtonTint(ContextCompat.getColor(this, R.color.signal_colorPrimary)) + args.copy( + sendButtonColors = ViewColorSet( + foreground = ViewColorSet.ViewColor.ColorResource(R.color.signal_colorOnPrimary), + background = ViewColorSet.ViewColor.ColorResource(R.color.signal_colorPrimary) + ) + ) } else { args } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt index 7c6ebba575..77ec1289b3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt @@ -144,9 +144,10 @@ class MultiselectForwardFragment : val sendButton: AppCompatImageView = bottomBar.findViewById(R.id.share_confirm) val backgroundHelper: View = bottomBar.findViewById(R.id.background_helper) - if (args.sendButtonTint != -1) { - sendButton.setColorFilter(ContextCompat.getColor(requireContext(), R.color.signal_colorOnCustom)) - ViewCompat.setBackgroundTintList(sendButton, ColorStateList.valueOf(args.sendButtonTint)) + val sendButtonColors = args.sendButtonColors + if (sendButtonColors != null) { + sendButton.setColorFilter(sendButtonColors.foreground.resolve(requireContext())) + ViewCompat.setBackgroundTintList(sendButton, ColorStateList.valueOf(sendButtonColors.background.resolve(requireContext()))) } FullscreenHelper.configureBottomBarLayout(requireActivity(), bottomBarSpacer, bottomBar) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt index 1d34fa3f30..940ee8fdd7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt @@ -12,6 +12,7 @@ import org.signal.core.util.ThreadUtil import org.signal.core.util.concurrent.SignalExecutors import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.attachments.Attachment +import org.thoughtcrime.securesms.color.ViewColorSet import org.thoughtcrime.securesms.conversation.ConversationMessage import org.thoughtcrime.securesms.conversation.mutiselect.Multiselect import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart @@ -43,12 +44,12 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor( val forceDisableAddMessage: Boolean = false, val forceSelectionOnly: Boolean = false, val selectSingleRecipient: Boolean = false, - @ColorInt val sendButtonTint: Int = -1, + val sendButtonColors: ViewColorSet? = null, val storySendRequirements: Stories.MediaTransform.SendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND, val isSearchEnabled: Boolean = true ) : Parcelable { - fun withSendButtonTint(@ColorInt sendButtonTint: Int) = copy(sendButtonTint = sendButtonTint) + fun withSendButtonTint(@ColorInt sendButtonTint: Int) = copy(sendButtonColors = ViewColorSet.forCustomColor(sendButtonTint)) companion object { @JvmStatic @@ -61,9 +62,11 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor( .withDataType(mediaType) .build() - val sendButtonTint: Int = threadId.takeIf { it > 0 } - ?.let { SignalDatabase.threads.getRecipientForThreadId(it) }?.chatColors?.asSingleColor() - ?: -1 + val sendButtonColors: ViewColorSet? = threadId.takeIf { it > 0 } + ?.let { SignalDatabase.threads.getRecipientForThreadId(it) } + ?.chatColors + ?.asSingleColor() + ?.let { ViewColorSet.forCustomColor(it) } ThreadUtil.runOnMain { consumer.accept( @@ -71,7 +74,7 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor( isMmsSupported, listOf(multiShareArgs), storySendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND, - sendButtonTint = sendButtonTint + sendButtonColors = sendButtonColors ) ) }