theme polls and add further theming functions to the utils

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
This commit is contained in:
Andy Scherzinger 2022-07-27 20:15:26 +02:00
parent 0463a39bfb
commit e54abe63f1
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
5 changed files with 77 additions and 7 deletions

View File

@ -23,15 +23,19 @@ package com.nextcloud.talk.polls.adapters
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.Typeface import android.graphics.Typeface
import com.nextcloud.talk.databinding.PollResultHeaderItemBinding import com.nextcloud.talk.databinding.PollResultHeaderItemBinding
import com.nextcloud.talk.ui.theme.ViewThemeUtils
class PollResultHeaderViewHolder( class PollResultHeaderViewHolder(
override val binding: PollResultHeaderItemBinding override val binding: PollResultHeaderItemBinding,
private val viewThemeUtils: ViewThemeUtils
) : PollResultViewHolder(binding) { ) : PollResultViewHolder(binding) {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun bind(pollResultItem: PollResultItem, clickListener: PollResultItemClickListener) { override fun bind(pollResultItem: PollResultItem, clickListener: PollResultItemClickListener) {
val item = pollResultItem as PollResultHeaderItem val item = pollResultItem as PollResultHeaderItem
viewThemeUtils.colorProgressBar(binding.pollOptionBar)
binding.root.setOnClickListener { clickListener.onClick() } binding.root.setOnClickListener { clickListener.onClick() }
binding.pollOptionText.text = item.name binding.pollOptionText.text = item.name

View File

@ -27,10 +27,12 @@ import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.PollResultHeaderItemBinding import com.nextcloud.talk.databinding.PollResultHeaderItemBinding
import com.nextcloud.talk.databinding.PollResultVoterItemBinding import com.nextcloud.talk.databinding.PollResultVoterItemBinding
import com.nextcloud.talk.databinding.PollResultVotersOverviewItemBinding import com.nextcloud.talk.databinding.PollResultVotersOverviewItemBinding
import com.nextcloud.talk.ui.theme.ViewThemeUtils
class PollResultsAdapter( class PollResultsAdapter(
private val user: User, private val user: User,
private val clickListener: PollResultItemClickListener, private val clickListener: PollResultItemClickListener,
private val viewThemeUtils: ViewThemeUtils
) : RecyclerView.Adapter<PollResultViewHolder>() { ) : RecyclerView.Adapter<PollResultViewHolder>() {
internal var list: MutableList<PollResultItem> = ArrayList() internal var list: MutableList<PollResultItem> = ArrayList()
@ -43,7 +45,7 @@ class PollResultsAdapter(
LayoutInflater.from(parent.context), parent, LayoutInflater.from(parent.context), parent,
false false
) )
viewHolder = PollResultHeaderViewHolder(itemBinding) viewHolder = PollResultHeaderViewHolder(itemBinding, viewThemeUtils)
} }
PollResultVoterItem.VIEW_TYPE -> { PollResultVoterItem.VIEW_TYPE -> {
val itemBinding = PollResultVoterItemBinding.inflate( val itemBinding = PollResultVoterItemBinding.inflate(

View File

@ -38,6 +38,7 @@ import com.nextcloud.talk.polls.adapters.PollResultItemClickListener
import com.nextcloud.talk.polls.adapters.PollResultsAdapter import com.nextcloud.talk.polls.adapters.PollResultsAdapter
import com.nextcloud.talk.polls.viewmodels.PollMainViewModel import com.nextcloud.talk.polls.viewmodels.PollMainViewModel
import com.nextcloud.talk.polls.viewmodels.PollResultsViewModel import com.nextcloud.talk.polls.viewmodels.PollResultsViewModel
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import javax.inject.Inject import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class) @AutoInjector(NextcloudTalkApplication::class)
@ -46,6 +47,9 @@ class PollResultsFragment : Fragment(), PollResultItemClickListener {
@Inject @Inject
lateinit var viewModelFactory: ViewModelProvider.Factory lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var parentViewModel: PollMainViewModel private lateinit var parentViewModel: PollMainViewModel
lateinit var viewModel: PollResultsViewModel lateinit var viewModel: PollResultsViewModel
@ -82,17 +86,24 @@ class PollResultsFragment : Fragment(), PollResultItemClickListener {
} }
viewModel.items.observe(viewLifecycleOwner) { viewModel.items.observe(viewLifecycleOwner) {
val adapter = PollResultsAdapter(parentViewModel.user, this).apply { val adapter = PollResultsAdapter(parentViewModel.user, this, viewThemeUtils).apply {
if (it != null) { if (it != null) {
list = it list = it
} }
} }
binding.pollResultsList.adapter = adapter binding.pollResultsList.adapter = adapter
} }
themeDialog()
}
private fun themeDialog() {
viewThemeUtils.colorMaterialButtonBackground(binding.editVoteButton)
viewThemeUtils.colorMaterialButtonText(binding.pollResultsEndPollButton)
} }
private fun initAdapter() { private fun initAdapter() {
adapter = PollResultsAdapter(parentViewModel.user, this) adapter = PollResultsAdapter(parentViewModel.user, this, viewThemeUtils)
binding.pollResultsList.adapter = adapter binding.pollResultsList.adapter = adapter
binding.pollResultsList.layoutManager = LinearLayoutManager(context) binding.pollResultsList.layoutManager = LinearLayoutManager(context)
} }

View File

@ -43,6 +43,7 @@ import com.nextcloud.talk.databinding.DialogPollVoteBinding
import com.nextcloud.talk.polls.model.Poll import com.nextcloud.talk.polls.model.Poll
import com.nextcloud.talk.polls.viewmodels.PollMainViewModel import com.nextcloud.talk.polls.viewmodels.PollMainViewModel
import com.nextcloud.talk.polls.viewmodels.PollVoteViewModel import com.nextcloud.talk.polls.viewmodels.PollVoteViewModel
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import javax.inject.Inject import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class) @AutoInjector(NextcloudTalkApplication::class)
@ -51,6 +52,9 @@ class PollVoteFragment : Fragment() {
@Inject @Inject
lateinit var viewModelFactory: ViewModelProvider.Factory lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var parentViewModel: PollMainViewModel private lateinit var parentViewModel: PollMainViewModel
lateinit var viewModel: PollVoteViewModel lateinit var viewModel: PollVoteViewModel
@ -117,6 +121,14 @@ class PollVoteFragment : Fragment() {
binding.pollVoteEditDismiss.setOnClickListener { binding.pollVoteEditDismiss.setOnClickListener {
parentViewModel.dismissEditVotes() parentViewModel.dismissEditVotes()
} }
themeDialog()
}
private fun themeDialog() {
viewThemeUtils.colorMaterialButtonBackground(binding.pollVoteSubmitButton)
viewThemeUtils.colorMaterialButtonText(binding.pollVoteEndPollButton)
viewThemeUtils.colorMaterialButtonText(binding.pollVoteEndPollButton)
} }
private fun updateDismissEditButton(showDismissEditButton: Boolean) { private fun updateDismissEditButton(showDismissEditButton: Boolean) {
@ -136,6 +148,7 @@ class PollVoteFragment : Fragment() {
RadioButton(context).apply { text = option } RadioButton(context).apply { text = option }
}?.forEachIndexed { index, radioButton -> }?.forEachIndexed { index, radioButton ->
radioButton.id = index radioButton.id = index
viewThemeUtils.themeRadioButton(radioButton)
makeOptionBoldIfSelfVoted(radioButton, poll, index) makeOptionBoldIfSelfVoted(radioButton, poll, index)
binding.pollVoteRadioGroup.addView(radioButton) binding.pollVoteRadioGroup.addView(radioButton)
@ -156,6 +169,7 @@ class PollVoteFragment : Fragment() {
setLayoutParams(layoutParams) setLayoutParams(layoutParams)
} }
}?.forEachIndexed { index, checkBox -> }?.forEachIndexed { index, checkBox ->
viewThemeUtils.themeCheckbox(checkBox)
checkBox.id = index checkBox.id = index
makeOptionBoldIfSelfVoted(checkBox, poll, index) makeOptionBoldIfSelfVoted(checkBox, poll, index)
binding.voteOptionsCheckboxesWrapper.addView(checkBox) binding.voteOptionsCheckboxesWrapper.addView(checkBox)

View File

@ -25,23 +25,25 @@ import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.Color import android.graphics.Color
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.view.View import android.view.View
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.EditText import android.widget.EditText
import android.widget.ImageView import android.widget.ImageView
import android.widget.RadioButton
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.SwitchCompat import androidx.appcompat.widget.SwitchCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.ColorUtils
import androidx.core.view.children import androidx.core.view.children
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.progressindicator.LinearProgressIndicator
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import com.nextcloud.talk.R import com.nextcloud.talk.R
@ -50,6 +52,7 @@ import com.yarolegovich.mp.MaterialPreferenceCategory
import com.yarolegovich.mp.MaterialSwitchPreference import com.yarolegovich.mp.MaterialSwitchPreference
import javax.inject.Inject import javax.inject.Inject
@Suppress("Detekt.TooManyFunctions")
class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
private fun isDarkMode(context: Context): Boolean = when ( private fun isDarkMode(context: Context): Boolean = when (
@ -176,7 +179,7 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
context.theme context.theme
) )
val trackColor = Color.argb(77, Color.red(color), Color.green(color), Color.blue(color)) val trackColor = Color.argb(TRACK_ALPHA, Color.red(color), Color.green(color), Color.blue(color))
switchCompat.thumbTintList = ColorStateList( switchCompat.thumbTintList = ColorStateList(
arrayOf(intArrayOf(android.R.attr.state_checked), intArrayOf()), arrayOf(intArrayOf(android.R.attr.state_checked), intArrayOf()),
intArrayOf(color, thumbUncheckedColor) intArrayOf(color, thumbUncheckedColor)
@ -206,6 +209,18 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
} }
} }
fun themeRadioButton(radioButton: RadioButton) {
withElementColor(radioButton) { color ->
radioButton.buttonTintList = ColorStateList(
arrayOf(
intArrayOf(-android.R.attr.state_checked),
intArrayOf(android.R.attr.state_checked),
),
intArrayOf(Color.GRAY, color)
)
}
}
fun themeSwipeRefreshLayout(swipeRefreshLayout: SwipeRefreshLayout) { fun themeSwipeRefreshLayout(swipeRefreshLayout: SwipeRefreshLayout) {
withElementColor(swipeRefreshLayout) { color -> withElementColor(swipeRefreshLayout) { color ->
swipeRefreshLayout.setColorSchemeColors(color) swipeRefreshLayout.setColorSchemeColors(color)
@ -213,6 +228,12 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
} }
} }
fun colorProgressBar(progressIndicator: LinearProgressIndicator) {
withElementColor(progressIndicator) { color ->
progressIndicator.setIndicatorColor(progressColor(progressIndicator.context, color))
}
}
fun colorEditText(editText: EditText) { fun colorEditText(editText: EditText) {
withElementColor(editText) { color -> withElementColor(editText) { color ->
editText.setTextColor(color) editText.setTextColor(color)
@ -319,10 +340,28 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
} }
} }
private fun progressColor(context: Context, color: Int): Int {
val hsl = FloatArray(HSL_SIZE)
ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl)
if (isDarkMode(context)) {
hsl[INDEX_LUMINATION] = LUMINATION_DARK_THEME
} else {
hsl[INDEX_LUMINATION] = LUMINATION_LIGHT_THEME
}
return ColorUtils.HSLToColor(hsl)
}
companion object { companion object {
private val THEMEABLE_PLACEHOLDER_IDS = listOf( private val THEMEABLE_PLACEHOLDER_IDS = listOf(
R.drawable.ic_mimetype_package_x_generic, R.drawable.ic_mimetype_package_x_generic,
R.drawable.ic_mimetype_folder R.drawable.ic_mimetype_folder
) )
private const val TRACK_ALPHA: Int = 77
private const val HSL_SIZE: Int = 3
private const val INDEX_LUMINATION: Int = 2
private const val LUMINATION_LIGHT_THEME: Float = 0.76f
private const val LUMINATION_DARK_THEME: Float = 0.28f
} }
} }