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.graphics.Typeface
import com.nextcloud.talk.databinding.PollResultHeaderItemBinding
import com.nextcloud.talk.ui.theme.ViewThemeUtils
class PollResultHeaderViewHolder(
override val binding: PollResultHeaderItemBinding
override val binding: PollResultHeaderItemBinding,
private val viewThemeUtils: ViewThemeUtils
) : PollResultViewHolder(binding) {
@SuppressLint("SetTextI18n")
override fun bind(pollResultItem: PollResultItem, clickListener: PollResultItemClickListener) {
val item = pollResultItem as PollResultHeaderItem
viewThemeUtils.colorProgressBar(binding.pollOptionBar)
binding.root.setOnClickListener { clickListener.onClick() }
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.PollResultVoterItemBinding
import com.nextcloud.talk.databinding.PollResultVotersOverviewItemBinding
import com.nextcloud.talk.ui.theme.ViewThemeUtils
class PollResultsAdapter(
private val user: User,
private val clickListener: PollResultItemClickListener,
private val viewThemeUtils: ViewThemeUtils
) : RecyclerView.Adapter<PollResultViewHolder>() {
internal var list: MutableList<PollResultItem> = ArrayList()
@ -43,7 +45,7 @@ class PollResultsAdapter(
LayoutInflater.from(parent.context), parent,
false
)
viewHolder = PollResultHeaderViewHolder(itemBinding)
viewHolder = PollResultHeaderViewHolder(itemBinding, viewThemeUtils)
}
PollResultVoterItem.VIEW_TYPE -> {
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.viewmodels.PollMainViewModel
import com.nextcloud.talk.polls.viewmodels.PollResultsViewModel
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class)
@ -46,6 +47,9 @@ class PollResultsFragment : Fragment(), PollResultItemClickListener {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var parentViewModel: PollMainViewModel
lateinit var viewModel: PollResultsViewModel
@ -82,17 +86,24 @@ class PollResultsFragment : Fragment(), PollResultItemClickListener {
}
viewModel.items.observe(viewLifecycleOwner) {
val adapter = PollResultsAdapter(parentViewModel.user, this).apply {
val adapter = PollResultsAdapter(parentViewModel.user, this, viewThemeUtils).apply {
if (it != null) {
list = it
}
}
binding.pollResultsList.adapter = adapter
}
themeDialog()
}
private fun themeDialog() {
viewThemeUtils.colorMaterialButtonBackground(binding.editVoteButton)
viewThemeUtils.colorMaterialButtonText(binding.pollResultsEndPollButton)
}
private fun initAdapter() {
adapter = PollResultsAdapter(parentViewModel.user, this)
adapter = PollResultsAdapter(parentViewModel.user, this, viewThemeUtils)
binding.pollResultsList.adapter = adapter
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.viewmodels.PollMainViewModel
import com.nextcloud.talk.polls.viewmodels.PollVoteViewModel
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class)
@ -51,6 +52,9 @@ class PollVoteFragment : Fragment() {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var parentViewModel: PollMainViewModel
lateinit var viewModel: PollVoteViewModel
@ -117,6 +121,14 @@ class PollVoteFragment : Fragment() {
binding.pollVoteEditDismiss.setOnClickListener {
parentViewModel.dismissEditVotes()
}
themeDialog()
}
private fun themeDialog() {
viewThemeUtils.colorMaterialButtonBackground(binding.pollVoteSubmitButton)
viewThemeUtils.colorMaterialButtonText(binding.pollVoteEndPollButton)
viewThemeUtils.colorMaterialButtonText(binding.pollVoteEndPollButton)
}
private fun updateDismissEditButton(showDismissEditButton: Boolean) {
@ -136,6 +148,7 @@ class PollVoteFragment : Fragment() {
RadioButton(context).apply { text = option }
}?.forEachIndexed { index, radioButton ->
radioButton.id = index
viewThemeUtils.themeRadioButton(radioButton)
makeOptionBoldIfSelfVoted(radioButton, poll, index)
binding.pollVoteRadioGroup.addView(radioButton)
@ -156,6 +169,7 @@ class PollVoteFragment : Fragment() {
setLayoutParams(layoutParams)
}
}?.forEachIndexed { index, checkBox ->
viewThemeUtils.themeCheckbox(checkBox)
checkBox.id = index
makeOptionBoldIfSelfVoted(checkBox, poll, index)
binding.voteOptionsCheckboxesWrapper.addView(checkBox)

View File

@ -25,23 +25,25 @@ import android.content.Context
import android.content.res.ColorStateList
import android.content.res.Configuration
import android.graphics.Color
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import android.view.View
import android.widget.CheckBox
import android.widget.EditText
import android.widget.ImageView
import android.widget.RadioButton
import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.SwitchCompat
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.ColorUtils
import androidx.core.view.children
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView
import com.google.android.material.chip.Chip
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.textfield.TextInputLayout
import com.nextcloud.talk.R
@ -50,6 +52,7 @@ import com.yarolegovich.mp.MaterialPreferenceCategory
import com.yarolegovich.mp.MaterialSwitchPreference
import javax.inject.Inject
@Suppress("Detekt.TooManyFunctions")
class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
private fun isDarkMode(context: Context): Boolean = when (
@ -176,7 +179,7 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
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(
arrayOf(intArrayOf(android.R.attr.state_checked), intArrayOf()),
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) {
withElementColor(swipeRefreshLayout) { color ->
swipeRefreshLayout.setColorSchemeColors(color)
@ -213,11 +228,17 @@ 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) {
withElementColor(editText) { color ->
editText.setTextColor(color)
// TODO check API-level compatibility
//editText.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
// editText.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
editText.backgroundTintList = ColorStateList(
arrayOf(
intArrayOf(-android.R.attr.state_focused),
@ -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 {
private val THEMEABLE_PLACEHOLDER_IDS = listOf(
R.drawable.ic_mimetype_package_x_generic,
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
}
}