Notification policy (#4768)

This was so much work wow. I think it works pretty well and is the best
compromise between all the alternative we considered. Yes the
pull-to-refreh on the notifications works slightly different now when
the new bar is visible, but I don't think there is a way around that.

Things I plan to do later, i.e. not as part of this PR or release:
- Cache the notification policy summary for better offline behavior and
less view shifting when it loads
- try to reduce some of the code duplications that are now in there
- if there is user demand, add a "legacy mode" setting where this
feature is disabled even if the server would support it

closes #4331
closes #4550 as won't do
closes #4712 as won't do

<img
src="https://github.com/user-attachments/assets/de322d3c-3775-41e7-be57-28ab7fbaecdf"
width="240"/> <img
src="https://github.com/user-attachments/assets/1ce958a4-4f15-484c-a337-5ad93f36046c"
width="240"/> <img
src="https://github.com/user-attachments/assets/98b0482b-1c05-4c99-a371-f7f4d8a69abd"
width="240"/>
This commit is contained in:
Konrad Pozniak 2024-12-03 18:46:50 +01:00 committed by GitHub
commit cd57352cbd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
42 changed files with 2401 additions and 97 deletions

View file

@ -15,9 +15,10 @@
package com.keylesspalace.tusky.util
import android.content.Context
import android.graphics.Color
import androidx.annotation.Px
import android.graphics.drawable.Drawable
import androidx.appcompat.content.res.AppCompatResources
import androidx.preference.PreferenceFragmentCompat
import com.google.android.material.color.MaterialColors
import com.keylesspalace.tusky.R
import com.mikepenz.iconics.IconicsDrawable
@ -25,9 +26,19 @@ import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizePx
fun makeIcon(context: Context, icon: GoogleMaterial.Icon, @Px iconSize: Int): IconicsDrawable {
fun PreferenceFragmentCompat.icon(icon: GoogleMaterial.Icon): IconicsDrawable {
val context = requireContext()
return IconicsDrawable(context, icon).apply {
sizePx = iconSize
sizePx = context.resources.getDimensionPixelSize(
R.dimen.preference_icon_size
)
colorInt = MaterialColors.getColor(context, R.attr.iconColor, Color.BLACK)
}
}
fun PreferenceFragmentCompat.icon(icon: Int): Drawable? {
val context = requireContext()
return AppCompatResources.getDrawable(context, icon)?.apply {
setTint(MaterialColors.getColor(context, R.attr.iconColor, Color.BLACK))
}
}