diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt index b963f515d..f08cb68cf 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt @@ -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 diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt index 98a576cba..df600fd37 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt @@ -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() { internal var list: MutableList = 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( diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt index b1cbe4392..0a9c3db12 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt @@ -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) } diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt index 67b878442..39b637637 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt @@ -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) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 57a21b52d..9778e12f2 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -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 } }