mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 03:59:35 +01:00
theme polls and add further theming functions to the utils
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
This commit is contained in:
parent
0463a39bfb
commit
e54abe63f1
@ -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
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user