Explorar o código

theme polls and add further theming functions to the utils

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Andy Scherzinger %!s(int64=2) %!d(string=hai) anos
pai
achega
e54abe63f1

+ 5 - 1
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

+ 3 - 1
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<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(

+ 13 - 2
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)
     }

+ 14 - 0
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)

+ 42 - 3
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
     }
 }