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 toaster: Toaster
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences_debug, rootKey)
override fun getPreferenceXml() = R.xml.preferences_debug
override fun setupPreferences(savedInstanceState: Bundle?) {
for (pref in Ints.asList(
R.string.p_leakcanary,
R.string.p_flipper,

@ -3,7 +3,11 @@ package org.tasks.injection
import android.app.Activity
import android.content.DialogInterface
import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.Bundle
import androidx.annotation.StringRes
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceGroup
@ -16,13 +20,37 @@ import org.tasks.dialogs.DialogBuilder
import org.tasks.preferences.Device
import javax.inject.Inject
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 dialogBuilder: DialogBuilder
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) {
super.onAttach(activity)
if (!injected) {
@ -76,6 +104,10 @@ abstract class InjectingPreferenceFragment : PreferenceFragmentCompat() {
open fun getMenu() = R.menu.menu_preferences
abstract fun getPreferenceXml(): Int
abstract fun setupPreferences(savedInstanceState: Bundle?)
protected fun recreate() {
activity!!.recreate()
}

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

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

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

@ -16,9 +16,9 @@ class HelpAndFeedback : InjectingPreferenceFragment() {
@Inject lateinit var billingClient: BillingClient
@Inject lateinit var inventory: Inventory
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.help_and_feedback, rootKey)
override fun getPreferenceXml() = R.xml.help_and_feedback
override fun setupPreferences(savedInstanceState: Bundle?) {
findPreference(R.string.changelog).summary =
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 toaster: Toaster
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences_look_and_feel, rootKey)
override fun getPreferenceXml() = R.xml.preferences_look_and_feel
override fun setupPreferences(savedInstanceState: Bundle?) {
setupColorPreference(R.string.p_theme, themeBase.name, THEMES, REQUEST_THEME_PICKER)
setupColorPreference(R.string.p_theme_color, themeColor.name, COLORS, REQUEST_COLOR_PICKER)
setupColorPreference(

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

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

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

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

@ -33,9 +33,9 @@ class TaskDefaults : InjectingPreferenceFragment() {
private lateinit var defaultCalendarPref: Preference
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences_task_defaults, rootKey)
override fun getPreferenceXml() = R.xml.preferences_task_defaults
override fun setupPreferences(savedInstanceState: Bundle?) {
defaultCalendarPref = findPreference(R.string.gcal_p_default)
defaultCalendarPref.onPreferenceClickListener = Preference.OnPreferenceClickListener {
if (permissionRequester.requestCalendarPermissions()) {
@ -59,7 +59,7 @@ class TaskDefaults : InjectingPreferenceFragment() {
}
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(

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

@ -1,9 +1,5 @@
<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="SpinnerNoPadding" parent="Widget.AppCompat.TextView.SpinnerItem">

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

Loading…
Cancel
Save