Set preference icon tints programmatically

Tinting preference icons with 'preferenceStyle' prevents
programmatic tinting
pull/935/head
Alex Baker 4 years ago
parent 0df5f32913
commit d627cb1d5a

@ -19,9 +19,9 @@ class Debug : InjectingPreferenceFragment() {
@Inject lateinit var billingClient: BillingClient @Inject lateinit var billingClient: BillingClient
@Inject lateinit var toaster: Toaster @Inject lateinit var toaster: Toaster
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_debug
setPreferencesFromResource(R.xml.preferences_debug, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
for (pref in Ints.asList( for (pref in Ints.asList(
R.string.p_leakcanary, R.string.p_leakcanary,
R.string.p_flipper, R.string.p_flipper,

@ -3,7 +3,11 @@ package org.tasks.injection
import android.app.Activity import android.app.Activity
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.Bundle
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceGroup import androidx.preference.PreferenceGroup
@ -16,13 +20,37 @@ import org.tasks.dialogs.DialogBuilder
import org.tasks.preferences.Device import org.tasks.preferences.Device
import javax.inject.Inject import javax.inject.Inject
abstract class InjectingPreferenceFragment : PreferenceFragmentCompat() { abstract class InjectingPreferenceFragment : PreferenceFragmentCompat() {
companion object {
fun tintIcons(pref: Preference, color: Int) {
if (pref is PreferenceGroup) {
for (i in 0 until pref.preferenceCount) {
tintIcons(pref.getPreference(i), color)
}
} else {
val icon: Drawable? = pref.icon
if (icon != null) {
DrawableCompat.setTint(icon, color)
}
}
}
}
@Inject lateinit var device: Device @Inject lateinit var device: Device
@Inject lateinit var dialogBuilder: DialogBuilder @Inject lateinit var dialogBuilder: DialogBuilder
private var injected = false private var injected = false
final override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(getPreferenceXml(), rootKey)
tintIcons(preferenceScreen, ContextCompat.getColor(context!!, R.color.icon_tint))
setupPreferences(savedInstanceState)
}
override fun onAttach(activity: Activity) { override fun onAttach(activity: Activity) {
super.onAttach(activity) super.onAttach(activity)
if (!injected) { if (!injected) {
@ -76,6 +104,10 @@ abstract class InjectingPreferenceFragment : PreferenceFragmentCompat() {
open fun getMenu() = R.menu.menu_preferences open fun getMenu() = R.menu.menu_preferences
abstract fun getPreferenceXml(): Int
abstract fun setupPreferences(savedInstanceState: Bundle?)
protected fun recreate() { protected fun recreate() {
activity!!.recreate() activity!!.recreate()
} }

@ -46,9 +46,9 @@ class Advanced : InjectingPreferenceFragment() {
private lateinit var disposables: CompositeDisposable private lateinit var disposables: CompositeDisposable
private lateinit var calendarReminderPreference: SwitchPreferenceCompat private lateinit var calendarReminderPreference: SwitchPreferenceCompat
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_advanced
setPreferencesFromResource(R.xml.preferences_advanced, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
findPreference(R.string.EPr_manage_purge_deleted) findPreference(R.string.EPr_manage_purge_deleted)
.setOnPreferenceClickListener { .setOnPreferenceClickListener {
purgeDeletedTasks() purgeDeletedTasks()

@ -35,9 +35,9 @@ class Backups : InjectingPreferenceFragment() {
@Inject lateinit var toaster: Toaster @Inject lateinit var toaster: Toaster
@Inject lateinit var googleAccountManager: GoogleAccountManager @Inject lateinit var googleAccountManager: GoogleAccountManager
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_backups
setPreferencesFromResource(R.xml.preferences_backups, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
initializeBackupDirectory() initializeBackupDirectory()
findPreference(R.string.backup_BAc_import) findPreference(R.string.backup_BAc_import)

@ -23,9 +23,9 @@ class DashClock : InjectingPreferenceFragment() {
@Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var inventory: Inventory @Inject lateinit var inventory: Inventory
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_dashclock
setPreferencesFromResource(R.xml.preferences_dashclock, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
findPreference(R.string.p_dashclock_filter) findPreference(R.string.p_dashclock_filter)
.setOnPreferenceClickListener { .setOnPreferenceClickListener {
val intent = Intent(context, FilterSelectionActivity::class.java) val intent = Intent(context, FilterSelectionActivity::class.java)

@ -16,9 +16,9 @@ class HelpAndFeedback : InjectingPreferenceFragment() {
@Inject lateinit var billingClient: BillingClient @Inject lateinit var billingClient: BillingClient
@Inject lateinit var inventory: Inventory @Inject lateinit var inventory: Inventory
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.help_and_feedback
setPreferencesFromResource(R.xml.help_and_feedback, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
findPreference(R.string.changelog).summary = findPreference(R.string.changelog).summary =
getString(R.string.version_string, BuildConfig.VERSION_NAME) getString(R.string.version_string, BuildConfig.VERSION_NAME)

@ -68,9 +68,9 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange
@Inject lateinit var inventory: Inventory @Inject lateinit var inventory: Inventory
@Inject lateinit var toaster: Toaster @Inject lateinit var toaster: Toaster
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_look_and_feel
setPreferencesFromResource(R.xml.preferences_look_and_feel, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
setupColorPreference(R.string.p_theme, themeBase.name, THEMES, REQUEST_THEME_PICKER) setupColorPreference(R.string.p_theme, themeBase.name, THEMES, REQUEST_THEME_PICKER)
setupColorPreference(R.string.p_theme_color, themeColor.name, COLORS, REQUEST_COLOR_PICKER) setupColorPreference(R.string.p_theme_color, themeColor.name, COLORS, REQUEST_COLOR_PICKER)
setupColorPreference( setupColorPreference(

@ -9,9 +9,9 @@ import org.tasks.injection.InjectingPreferenceFragment
class MainSettingsFragment : InjectingPreferenceFragment() { class MainSettingsFragment : InjectingPreferenceFragment() {
override fun inject(component: FragmentComponent) = component.inject(this) override fun inject(component: FragmentComponent) = component.inject(this)
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences
setPreferencesFromResource(R.xml.preferences, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
requires(BuildConfig.DEBUG, R.string.debug) requires(BuildConfig.DEBUG, R.string.debug)
} }
} }

@ -44,9 +44,9 @@ class Notifications : InjectingPreferenceFragment() {
@Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var voiceOutputAssistant: VoiceOutputAssistant @Inject lateinit var voiceOutputAssistant: VoiceOutputAssistant
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_notifications
setPreferencesFromResource(R.xml.preferences_notifications, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
rescheduleNotificationsOnChange( rescheduleNotificationsOnChange(
false, false,
R.string.p_rmd_time, R.string.p_rmd_time,

@ -51,9 +51,9 @@ class ScrollableWidget : InjectingPreferenceFragment() {
private lateinit var widgetPreferences: WidgetPreferences private lateinit var widgetPreferences: WidgetPreferences
private var appWidgetId = 0 private var appWidgetId = 0
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_widget
setPreferencesFromResource(R.xml.preferences_widget, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
appWidgetId = arguments!!.getInt(EXTRA_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID) appWidgetId = arguments!!.getInt(EXTRA_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
widgetPreferences = WidgetPreferences(context, preferences, appWidgetId) widgetPreferences = WidgetPreferences(context, preferences, appWidgetId)

@ -45,9 +45,9 @@ class Synchronization : InjectingPreferenceFragment() {
@Inject lateinit var taskDeleter: TaskDeleter @Inject lateinit var taskDeleter: TaskDeleter
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider @Inject lateinit var defaultFilterProvider: DefaultFilterProvider
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_synchronization
setPreferencesFromResource(R.xml.preferences_synchronization, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
findPreference(R.string.p_background_sync_unmetered_only) findPreference(R.string.p_background_sync_unmetered_only)
.setOnPreferenceChangeListener { _: Preference?, o: Any? -> .setOnPreferenceChangeListener { _: Preference?, o: Any? ->
workManager.updateBackgroundSync(null, null, o as Boolean?) workManager.updateBackgroundSync(null, null, o as Boolean?)

@ -33,9 +33,9 @@ class TaskDefaults : InjectingPreferenceFragment() {
private lateinit var defaultCalendarPref: Preference private lateinit var defaultCalendarPref: Preference
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_task_defaults
setPreferencesFromResource(R.xml.preferences_task_defaults, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
defaultCalendarPref = findPreference(R.string.gcal_p_default) defaultCalendarPref = findPreference(R.string.gcal_p_default)
defaultCalendarPref.onPreferenceClickListener = Preference.OnPreferenceClickListener { defaultCalendarPref.onPreferenceClickListener = Preference.OnPreferenceClickListener {
if (permissionRequester.requestCalendarPermissions()) { if (permissionRequester.requestCalendarPermissions()) {
@ -59,7 +59,7 @@ class TaskDefaults : InjectingPreferenceFragment() {
} }
updateRemoteListSummary() updateRemoteListSummary()
requires(device.supportsGeofences(), R.string.p_default_location_reminder_key) requires(device.supportsGeofences(), R.string.p_default_location_reminder_key, R.string.p_default_location_radius)
} }
override fun onRequestPermissionsResult( override fun onRequestPermissionsResult(

@ -36,9 +36,9 @@ class TaskerListNotification : InjectingPreferenceFragment() {
var filter: Filter? = null var filter: Filter? = null
var cancelled: Boolean = false var cancelled: Boolean = false
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun getPreferenceXml() = R.xml.preferences_tasker
setPreferencesFromResource(R.xml.preferences_tasker, rootKey)
override fun setupPreferences(savedInstanceState: Bundle?) {
filter = if (savedInstanceState == null) { filter = if (savedInstanceState == null) {
defaultFilterProvider.getFilterFromPreference(arguments?.getString(EXTRA_FILTER)) defaultFilterProvider.getFilterFromPreference(arguments?.getString(EXTRA_FILTER))
} else { } else {

@ -1,9 +1,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<style name="PreferenceTheme" parent="@style/PreferenceThemeOverlay.v14.Material">
<item name="android:tint">@color/icon_tint</item>
</style>
<style name="popup_overlay" parent="ThemeOverlay.MaterialComponents.Light"/> <style name="popup_overlay" parent="ThemeOverlay.MaterialComponents.Light"/>
<style name="SpinnerNoPadding" parent="Widget.AppCompat.TextView.SpinnerItem"> <style name="SpinnerNoPadding" parent="Widget.AppCompat.TextView.SpinnerItem">

@ -24,7 +24,6 @@
<item name="nnf_dir_icon_color">?attr/colorAccent</item> <item name="nnf_dir_icon_color">?attr/colorAccent</item>
<item name="card_elevation">2dp</item> <item name="card_elevation">2dp</item>
<item name="horizontal_divider">2</item> <!-- View.GONE --> <item name="horizontal_divider">2</item> <!-- View.GONE -->
<item name="preferenceTheme">@style/PreferenceTheme</item>
</style> </style>
<style name="Tasks" parent="TasksBase"/> <style name="Tasks" parent="TasksBase"/>

Loading…
Cancel
Save