Browse Source

WIP prefs UI

prefs
charlag 4 years ago
parent
commit
3130ffd8ea
No known key found for this signature in database
GPG Key ID: 5B96E7C76F0CA558
  1. 410
      app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt
  2. 258
      app/src/main/java/com/keylesspalace/tusky/components/preference/NotificationPreferencesFragment.kt
  3. 67
      app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt
  4. 49
      app/src/main/java/com/keylesspalace/tusky/components/preference/ProxyPreferencesFragment.kt
  5. 43
      app/src/main/java/com/keylesspalace/tusky/components/preference/TabFilterPreferencesFragment.kt
  6. 150
      app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt

410
app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt

@ -22,32 +22,16 @@ import android.util.Log
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.keylesspalace.tusky.AccountListActivity
import com.keylesspalace.tusky.BuildConfig import com.keylesspalace.tusky.BuildConfig
import com.keylesspalace.tusky.FiltersActivity import com.keylesspalace.tusky.FiltersActivity
import com.keylesspalace.tusky.R import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.TabPreferenceActivity
import com.keylesspalace.tusky.appstore.EventHub import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent
import com.keylesspalace.tusky.components.instancemute.InstanceListActivity
import com.keylesspalace.tusky.db.AccountEntity import com.keylesspalace.tusky.db.AccountEntity
import com.keylesspalace.tusky.db.AccountManager import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.entity.Account import com.keylesspalace.tusky.entity.Account
import com.keylesspalace.tusky.entity.Filter
import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.settings.listPreference
import com.keylesspalace.tusky.settings.makePreferenceScreen
import com.keylesspalace.tusky.settings.preference
import com.keylesspalace.tusky.settings.preferenceCategory
import com.keylesspalace.tusky.settings.switchPreference
import com.keylesspalace.tusky.util.ThemeUtils
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizeRes
import retrofit2.Call import retrofit2.Call
import retrofit2.Callback import retrofit2.Callback
import retrofit2.Response import retrofit2.Response
@ -65,203 +49,203 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
val context = requireContext() val context = requireContext()
makePreferenceScreen { // makePreferenceScreen {
preference { // preference {
setTitle(R.string.pref_title_edit_notification_settings) // setTitle(R.string.pref_title_edit_notification_settings)
icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_notifications).apply { // icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_notifications).apply {
sizeRes = R.dimen.preference_icon_size // sizeRes = R.dimen.preference_icon_size
colorInt = ThemeUtils.getColor(context, R.attr.iconColor) // colorInt = ThemeUtils.getColor(context, R.attr.iconColor)
} // }
setOnPreferenceClickListener { // setOnPreferenceClickListener {
openNotificationPrefs() // openNotificationPrefs()
true // true
} // }
} // }
//
preference { // preference {
setTitle(R.string.title_tab_preferences) // setTitle(R.string.title_tab_preferences)
setIcon(R.drawable.ic_tabs) // setIcon(R.drawable.ic_tabs)
setOnPreferenceClickListener { // setOnPreferenceClickListener {
val intent = Intent(context, TabPreferenceActivity::class.java) // val intent = Intent(context, TabPreferenceActivity::class.java)
activity?.startActivity(intent) // activity?.startActivity(intent)
activity?.overridePendingTransition( // activity?.overridePendingTransition(
R.anim.slide_from_right, // R.anim.slide_from_right,
R.anim.slide_to_left // R.anim.slide_to_left
) // )
true // true
} // }
} // }
//
preference { // preference {
setTitle(R.string.action_view_mutes) // setTitle(R.string.action_view_mutes)
setIcon(R.drawable.ic_mute_24dp) // setIcon(R.drawable.ic_mute_24dp)
setOnPreferenceClickListener { // setOnPreferenceClickListener {
val intent = Intent(context, AccountListActivity::class.java) // val intent = Intent(context, AccountListActivity::class.java)
intent.putExtra("type", AccountListActivity.Type.MUTES) // intent.putExtra("type", AccountListActivity.Type.MUTES)
activity?.startActivity(intent) // activity?.startActivity(intent)
activity?.overridePendingTransition( // activity?.overridePendingTransition(
R.anim.slide_from_right, // R.anim.slide_from_right,
R.anim.slide_to_left // R.anim.slide_to_left
) // )
true // true
} // }
} // }
//
preference { // preference {
setTitle(R.string.action_view_blocks) // setTitle(R.string.action_view_blocks)
icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_block).apply { // icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_block).apply {
sizeRes = R.dimen.preference_icon_size // sizeRes = R.dimen.preference_icon_size
colorInt = ThemeUtils.getColor(context, R.attr.iconColor) // colorInt = ThemeUtils.getColor(context, R.attr.iconColor)
} // }
setOnPreferenceClickListener { // setOnPreferenceClickListener {
val intent = Intent(context, AccountListActivity::class.java) // val intent = Intent(context, AccountListActivity::class.java)
intent.putExtra("type", AccountListActivity.Type.BLOCKS) // intent.putExtra("type", AccountListActivity.Type.BLOCKS)
activity?.startActivity(intent) // activity?.startActivity(intent)
activity?.overridePendingTransition( // activity?.overridePendingTransition(
R.anim.slide_from_right, // R.anim.slide_from_right,
R.anim.slide_to_left // R.anim.slide_to_left
) // )
true // true
} // }
} // }
//
preference { // preference {
setTitle(R.string.title_domain_mutes) // setTitle(R.string.title_domain_mutes)
setIcon(R.drawable.ic_mute_24dp) // setIcon(R.drawable.ic_mute_24dp)
setOnPreferenceClickListener { // setOnPreferenceClickListener {
val intent = Intent(context, InstanceListActivity::class.java) // val intent = Intent(context, InstanceListActivity::class.java)
activity?.startActivity(intent) // activity?.startActivity(intent)
activity?.overridePendingTransition( // activity?.overridePendingTransition(
R.anim.slide_from_right, // R.anim.slide_from_right,
R.anim.slide_to_left // R.anim.slide_to_left
) // )
true // true
} // }
} // }
//
preferenceCategory(R.string.pref_publishing) { // preferenceCategory(R.string.pref_publishing) {
listPreference { // listPreference {
setTitle(R.string.pref_default_post_privacy) // setTitle(R.string.pref_default_post_privacy)
setEntries(R.array.post_privacy_names) // setEntries(R.array.post_privacy_names)
setEntryValues(R.array.post_privacy_values) // setEntryValues(R.array.post_privacy_values)
key = PrefKeys.DEFAULT_POST_PRIVACY // key = PrefKeys.DEFAULT_POST_PRIVACY
setSummaryProvider { entry } // setSummaryProvider { entry }
val visibility = accountManager.activeAccount?.defaultPostPrivacy // val visibility = accountManager.activeAccount?.defaultPostPrivacy
?: Status.Visibility.PUBLIC // ?: Status.Visibility.PUBLIC
value = visibility.serverString() // value = visibility.serverString()
setIcon(getIconForVisibility(visibility)) // setIcon(getIconForVisibility(visibility))
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
setIcon(getIconForVisibility(Status.Visibility.byString(newValue as String))) // setIcon(getIconForVisibility(Status.Visibility.byString(newValue as String)))
syncWithServer(visibility = newValue) // syncWithServer(visibility = newValue)
eventHub.dispatch(PreferenceChangedEvent(key)) // eventHub.dispatch(PreferenceChangedEvent(key))
true // true
} // }
} // }
//
switchPreference { // switchPreference {
setTitle(R.string.pref_default_media_sensitivity) // setTitle(R.string.pref_default_media_sensitivity)
setIcon(R.drawable.ic_eye_24dp) // setIcon(R.drawable.ic_eye_24dp)
key = PrefKeys.DEFAULT_MEDIA_SENSITIVITY // key = PrefKeys.DEFAULT_MEDIA_SENSITIVITY
isSingleLineTitle = false // isSingleLineTitle = false
val sensitivity = accountManager.activeAccount?.defaultMediaSensitivity // val sensitivity = accountManager.activeAccount?.defaultMediaSensitivity
?: false // ?: false
setDefaultValue(sensitivity) // setDefaultValue(sensitivity)
setIcon(getIconForSensitivity(sensitivity)) // setIcon(getIconForSensitivity(sensitivity))
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
setIcon(getIconForSensitivity(newValue as Boolean)) // setIcon(getIconForSensitivity(newValue as Boolean))
syncWithServer(sensitive = newValue) // syncWithServer(sensitive = newValue)
eventHub.dispatch(PreferenceChangedEvent(key)) // eventHub.dispatch(PreferenceChangedEvent(key))
true // true
} // }
} // }
} // }
//
preferenceCategory(R.string.pref_title_timelines) { // preferenceCategory(R.string.pref_title_timelines) {
switchPreference { // switchPreference {
key = PrefKeys.MEDIA_PREVIEW_ENABLED // key = PrefKeys.MEDIA_PREVIEW_ENABLED
setTitle(R.string.pref_title_show_media_preview) // setTitle(R.string.pref_title_show_media_preview)
isSingleLineTitle = false // isSingleLineTitle = false
isChecked = accountManager.activeAccount?.mediaPreviewEnabled ?: true // isChecked = accountManager.activeAccount?.mediaPreviewEnabled ?: true
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.mediaPreviewEnabled = newValue as Boolean } // updateAccount { it.mediaPreviewEnabled = newValue as Boolean }
eventHub.dispatch(PreferenceChangedEvent(key)) // eventHub.dispatch(PreferenceChangedEvent(key))
true // true
} // }
} // }
//
switchPreference { // switchPreference {
key = PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA // key = PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA
setTitle(R.string.pref_title_alway_show_sensitive_media) // setTitle(R.string.pref_title_alway_show_sensitive_media)
isSingleLineTitle = false // isSingleLineTitle = false
isChecked = accountManager.activeAccount?.alwaysShowSensitiveMedia ?: false // isChecked = accountManager.activeAccount?.alwaysShowSensitiveMedia ?: false
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.alwaysShowSensitiveMedia = newValue as Boolean } // updateAccount { it.alwaysShowSensitiveMedia = newValue as Boolean }
eventHub.dispatch(PreferenceChangedEvent(key)) // eventHub.dispatch(PreferenceChangedEvent(key))
true // true
} // }
} // }
//
switchPreference { // switchPreference {
key = PrefKeys.ALWAYS_OPEN_SPOILER // key = PrefKeys.ALWAYS_OPEN_SPOILER
setTitle(R.string.pref_title_alway_open_spoiler) // setTitle(R.string.pref_title_alway_open_spoiler)
isSingleLineTitle = false // isSingleLineTitle = false
isChecked = accountManager.activeAccount?.alwaysOpenSpoiler ?: false // isChecked = accountManager.activeAccount?.alwaysOpenSpoiler ?: false
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.alwaysOpenSpoiler = newValue as Boolean } // updateAccount { it.alwaysOpenSpoiler = newValue as Boolean }
eventHub.dispatch(PreferenceChangedEvent(key)) // eventHub.dispatch(PreferenceChangedEvent(key))
true // true
} // }
} // }
} // }
//
preferenceCategory(R.string.pref_title_timeline_filters) { // preferenceCategory(R.string.pref_title_timeline_filters) {
preference { // preference {
setTitle(R.string.pref_title_public_filter_keywords) // setTitle(R.string.pref_title_public_filter_keywords)
setOnPreferenceClickListener { // setOnPreferenceClickListener {
launchFilterActivity( // launchFilterActivity(
Filter.PUBLIC, // Filter.PUBLIC,
R.string.pref_title_public_filter_keywords // R.string.pref_title_public_filter_keywords
) // )
true // true
} // }
} // }
//
preference { // preference {
setTitle(R.string.title_notifications) // setTitle(R.string.title_notifications)
setOnPreferenceClickListener { // setOnPreferenceClickListener {
launchFilterActivity(Filter.NOTIFICATIONS, R.string.title_notifications) // launchFilterActivity(Filter.NOTIFICATIONS, R.string.title_notifications)
true // true
} // }
} // }
//
preference { // preference {
setTitle(R.string.title_home) // setTitle(R.string.title_home)
setOnPreferenceClickListener { // setOnPreferenceClickListener {
launchFilterActivity(Filter.HOME, R.string.title_home) // launchFilterActivity(Filter.HOME, R.string.title_home)
true // true
} // }
} // }
//
preference { // preference {
setTitle(R.string.pref_title_thread_filter_keywords) // setTitle(R.string.pref_title_thread_filter_keywords)
setOnPreferenceClickListener { // setOnPreferenceClickListener {
launchFilterActivity( // launchFilterActivity(
Filter.THREAD, // Filter.THREAD,
R.string.pref_title_thread_filter_keywords // R.string.pref_title_thread_filter_keywords
) // )
true // true
} // }
} // }
//
preference { // preference {
setTitle(R.string.title_accounts) // setTitle(R.string.title_accounts)
setOnPreferenceClickListener { // setOnPreferenceClickListener {
launchFilterActivity(Filter.ACCOUNT, R.string.title_accounts) // launchFilterActivity(Filter.ACCOUNT, R.string.title_accounts)
true // true
} // }
} // }
} // }
} // }
} }
private fun openNotificationPrefs() { private fun openNotificationPrefs() {

258
app/src/main/java/com/keylesspalace/tusky/components/preference/NotificationPreferencesFragment.kt

@ -17,15 +17,9 @@ package com.keylesspalace.tusky.components.preference
import android.os.Bundle import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.components.notifications.NotificationHelper
import com.keylesspalace.tusky.db.AccountEntity import com.keylesspalace.tusky.db.AccountEntity
import com.keylesspalace.tusky.db.AccountManager import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.settings.makePreferenceScreen
import com.keylesspalace.tusky.settings.preferenceCategory
import com.keylesspalace.tusky.settings.switchPreference
import javax.inject.Inject import javax.inject.Inject
class NotificationPreferencesFragment : PreferenceFragmentCompat(), Injectable { class NotificationPreferencesFragment : PreferenceFragmentCompat(), Injectable {
@ -36,132 +30,132 @@ class NotificationPreferencesFragment : PreferenceFragmentCompat(), Injectable {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
val activeAccount = accountManager.activeAccount ?: return val activeAccount = accountManager.activeAccount ?: return
val context = requireContext() val context = requireContext()
makePreferenceScreen { // makePreferenceScreen {
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notifications_enabled) // setTitle(R.string.pref_title_notifications_enabled)
key = PrefKeys.NOTIFICATIONS_ENABLED // key = PrefKeys.NOTIFICATIONS_ENABLED
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationsEnabled // isChecked = activeAccount.notificationsEnabled
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsEnabled = newValue as Boolean } // updateAccount { it.notificationsEnabled = newValue as Boolean }
if (NotificationHelper.areNotificationsEnabled(context, accountManager)) { // if (NotificationHelper.areNotificationsEnabled(context, accountManager)) {
NotificationHelper.enablePullNotifications(context) // NotificationHelper.enablePullNotifications(context)
} else { // } else {
NotificationHelper.disablePullNotifications(context) // NotificationHelper.disablePullNotifications(context)
} // }
true // true
} // }
} // }
//
preferenceCategory(R.string.pref_title_notification_filters) { category -> // preferenceCategory(R.string.pref_title_notification_filters) { category ->
category.dependency = PrefKeys.NOTIFICATIONS_ENABLED // category.dependency = PrefKeys.NOTIFICATIONS_ENABLED
category.isIconSpaceReserved = false // category.isIconSpaceReserved = false
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_filter_follows) // setTitle(R.string.pref_title_notification_filter_follows)
key = PrefKeys.NOTIFICATIONS_FILTER_FOLLOWS // key = PrefKeys.NOTIFICATIONS_FILTER_FOLLOWS
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationsFollowed // isChecked = activeAccount.notificationsFollowed
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsFollowed = newValue as Boolean } // updateAccount { it.notificationsFollowed = newValue as Boolean }
true // true
} // }
} // }
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_filter_follow_requests) // setTitle(R.string.pref_title_notification_filter_follow_requests)
key = PrefKeys.NOTIFICATION_FILTER_FOLLOW_REQUESTS // key = PrefKeys.NOTIFICATION_FILTER_FOLLOW_REQUESTS
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationsFollowRequested // isChecked = activeAccount.notificationsFollowRequested
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsFollowRequested = newValue as Boolean } // updateAccount { it.notificationsFollowRequested = newValue as Boolean }
true // true
} // }
} // }
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_filter_reblogs) // setTitle(R.string.pref_title_notification_filter_reblogs)
key = PrefKeys.NOTIFICATION_FILTER_REBLOGS // key = PrefKeys.NOTIFICATION_FILTER_REBLOGS
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationsReblogged // isChecked = activeAccount.notificationsReblogged
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsReblogged = newValue as Boolean } // updateAccount { it.notificationsReblogged = newValue as Boolean }
true // true
} // }
} // }
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_filter_favourites) // setTitle(R.string.pref_title_notification_filter_favourites)
key = PrefKeys.NOTIFICATION_FILTER_FAVS // key = PrefKeys.NOTIFICATION_FILTER_FAVS
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationsFavorited // isChecked = activeAccount.notificationsFavorited
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsFavorited = newValue as Boolean } // updateAccount { it.notificationsFavorited = newValue as Boolean }
true // true
} // }
} // }
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_filter_poll) // setTitle(R.string.pref_title_notification_filter_poll)
key = PrefKeys.NOTIFICATION_FILTER_POLLS // key = PrefKeys.NOTIFICATION_FILTER_POLLS
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationsPolls // isChecked = activeAccount.notificationsPolls
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsPolls = newValue as Boolean } // updateAccount { it.notificationsPolls = newValue as Boolean }
true // true
} // }
} // }
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_filter_subscriptions) // setTitle(R.string.pref_title_notification_filter_subscriptions)
key = PrefKeys.NOTIFICATION_FILTER_SUBSCRIPTIONS // key = PrefKeys.NOTIFICATION_FILTER_SUBSCRIPTIONS
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationsSubscriptions // isChecked = activeAccount.notificationsSubscriptions
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsSubscriptions = newValue as Boolean } // updateAccount { it.notificationsSubscriptions = newValue as Boolean }
true // true
} // }
} // }
} // }
//
preferenceCategory(R.string.pref_title_notification_alerts) { category -> // preferenceCategory(R.string.pref_title_notification_alerts) { category ->
category.dependency = PrefKeys.NOTIFICATIONS_ENABLED // category.dependency = PrefKeys.NOTIFICATIONS_ENABLED
category.isIconSpaceReserved = false // category.isIconSpaceReserved = false
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_alert_sound) // setTitle(R.string.pref_title_notification_alert_sound)
key = PrefKeys.NOTIFICATION_ALERT_SOUND // key = PrefKeys.NOTIFICATION_ALERT_SOUND
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationSound // isChecked = activeAccount.notificationSound
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationSound = newValue as Boolean } // updateAccount { it.notificationSound = newValue as Boolean }
true // true
} // }
} // }
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_alert_vibrate) // setTitle(R.string.pref_title_notification_alert_vibrate)
key = PrefKeys.NOTIFICATION_ALERT_VIBRATE // key = PrefKeys.NOTIFICATION_ALERT_VIBRATE
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationVibration // isChecked = activeAccount.notificationVibration
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationVibration = newValue as Boolean } // updateAccount { it.notificationVibration = newValue as Boolean }
true // true
} // }
} // }
//
switchPreference { // switchPreference {
setTitle(R.string.pref_title_notification_alert_light) // setTitle(R.string.pref_title_notification_alert_light)
key = PrefKeys.NOTIFICATION_ALERT_LIGHT // key = PrefKeys.NOTIFICATION_ALERT_LIGHT
isIconSpaceReserved = false // isIconSpaceReserved = false
isChecked = activeAccount.notificationLight // isChecked = activeAccount.notificationLight
setOnPreferenceChangeListener { _, newValue -> // setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationLight = newValue as Boolean } // updateAccount { it.notificationLight = newValue as Boolean }
true // true
} // }
} // }
} // }
} // }
} }
private inline fun updateAccount(changer: (AccountEntity) -> Unit) { private inline fun updateAccount(changer: (AccountEntity) -> Unit) {

67
app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt

@ -19,25 +19,16 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.keylesspalace.tusky.R import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.db.AccountManager import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.entity.Notification
import com.keylesspalace.tusky.settings.AppTheme
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.settings.emojiPreference
import com.keylesspalace.tusky.settings.listPreference
import com.keylesspalace.tusky.settings.makePreferenceScreen import com.keylesspalace.tusky.settings.makePreferenceScreen
import com.keylesspalace.tusky.settings.preference
import com.keylesspalace.tusky.settings.preferenceCategory import com.keylesspalace.tusky.settings.preferenceCategory
import com.keylesspalace.tusky.settings.switchPreference
import com.keylesspalace.tusky.util.ThemeUtils import com.keylesspalace.tusky.util.ThemeUtils
import com.keylesspalace.tusky.util.deserialize
import com.keylesspalace.tusky.util.getNonNullString
import com.keylesspalace.tusky.util.serialize
import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
import com.mikepenz.iconics.utils.colorInt import com.mikepenz.iconics.utils.colorInt
@ -54,14 +45,20 @@ class PreferencesFragment : Fragment(), Injectable {
lateinit var accountManager: AccountManager lateinit var accountManager: AccountManager
private val iconSize by lazy { resources.getDimensionPixelSize(R.dimen.preference_icon_size) } private val iconSize by lazy { resources.getDimensionPixelSize(R.dimen.preference_icon_size) }
private var httpProxyPref: Preference? = null // private var httpProxyPref: Preference? = null
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
return super.onCreateView(inflater, container, savedInstanceState) val view = FrameLayout(inflater.context)
makePreferenceScreen(view) {
preferenceCategory(R.string.pref_title_appearance_settings) {
}
}
return view
} }
// override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { // override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@ -288,29 +285,29 @@ class PreferencesFragment : Fragment(), Injectable {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
updateHttpProxySummary() // updateHttpProxySummary()
} }
private fun updateHttpProxySummary() { // private fun updateHttpProxySummary() {
preferenceManager.sharedPreferences?.let { sharedPreferences -> // preferenceManager.sharedPreferences?.let { sharedPreferences ->
val httpProxyEnabled = sharedPreferences.getBoolean(PrefKeys.HTTP_PROXY_ENABLED, false) // val httpProxyEnabled = sharedPreferences.getBoolean(PrefKeys.HTTP_PROXY_ENABLED, false)
val httpServer = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_SERVER, "") // val httpServer = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_SERVER, "")
//
try { // try {
val httpPort = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_PORT, "-1") // val httpPort = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_PORT, "-1")
.toInt() // .toInt()
//
if (httpProxyEnabled && httpServer.isNotBlank() && httpPort > 0 && httpPort < 65535) { // if (httpProxyEnabled && httpServer.isNotBlank() && httpPort > 0 && httpPort < 65535) {
httpProxyPref?.summary = "$httpServer:$httpPort" // httpProxyPref?.summary = "$httpServer:$httpPort"
return // return
} // }
} catch (e: NumberFormatException) { // } catch (e: NumberFormatException) {
// user has entered wrong port, fall back to empty summary // // user has entered wrong port, fall back to empty summary
} // }
//
httpProxyPref?.summary = "" // httpProxyPref?.summary = ""
} // }
} // }
companion object { companion object {
fun newInstance(): PreferencesFragment { fun newInstance(): PreferencesFragment {

49
app/src/main/java/com/keylesspalace/tusky/components/preference/ProxyPreferencesFragment.kt

@ -17,39 +17,34 @@ package com.keylesspalace.tusky.components.preference
import android.os.Bundle import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.settings.editTextPreference
import com.keylesspalace.tusky.settings.makePreferenceScreen
import com.keylesspalace.tusky.settings.switchPreference
import kotlin.system.exitProcess import kotlin.system.exitProcess
class ProxyPreferencesFragment : PreferenceFragmentCompat() { class ProxyPreferencesFragment : PreferenceFragmentCompat() {
private var pendingRestart = false private var pendingRestart = false
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
makePreferenceScreen { // makePreferenceScreen {
switchPreference { // switchPreference {
setTitle(R.string.pref_title_http_proxy_enable) // setTitle(R.string.pref_title_http_proxy_enable)
isIconSpaceReserved = false // isIconSpaceReserved = false
key = PrefKeys.HTTP_PROXY_ENABLED // key = PrefKeys.HTTP_PROXY_ENABLED
setDefaultValue(false) // setDefaultValue(false)
} // }
//
editTextPreference { // editTextPreference {
setTitle(R.string.pref_title_http_proxy_server) // setTitle(R.string.pref_title_http_proxy_server)
key = PrefKeys.HTTP_PROXY_SERVER // key = PrefKeys.HTTP_PROXY_SERVER
isIconSpaceReserved = false // isIconSpaceReserved = false
setSummaryProvider { text } // setSummaryProvider { text }
} // }
//
editTextPreference { // editTextPreference {
setTitle(R.string.pref_title_http_proxy_port) // setTitle(R.string.pref_title_http_proxy_port)
key = PrefKeys.HTTP_PROXY_PORT // key = PrefKeys.HTTP_PROXY_PORT
isIconSpaceReserved = false // isIconSpaceReserved = false
setSummaryProvider { text } // setSummaryProvider { text }
} // }
} // }
} }
override fun onPause() { override fun onPause() {

43
app/src/main/java/com/keylesspalace/tusky/components/preference/TabFilterPreferencesFragment.kt

@ -17,33 +17,28 @@ package com.keylesspalace.tusky.components.preference
import android.os.Bundle import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.settings.checkBoxPreference
import com.keylesspalace.tusky.settings.makePreferenceScreen
import com.keylesspalace.tusky.settings.preferenceCategory
class TabFilterPreferencesFragment : PreferenceFragmentCompat() { class TabFilterPreferencesFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
makePreferenceScreen { // makePreferenceScreen {
preferenceCategory(R.string.title_home) { category -> // preferenceCategory(R.string.title_home) { category ->
category.isIconSpaceReserved = false // category.isIconSpaceReserved = false
//
checkBoxPreference { // checkBoxPreference {
setTitle(R.string.pref_title_show_boosts) // setTitle(R.string.pref_title_show_boosts)
key = PrefKeys.TAB_FILTER_HOME_BOOSTS // key = PrefKeys.TAB_FILTER_HOME_BOOSTS
setDefaultValue(true) // setDefaultValue(true)
isIconSpaceReserved = false // isIconSpaceReserved = false
} // }
//
checkBoxPreference { // checkBoxPreference {
setTitle(R.string.pref_title_show_replies) // setTitle(R.string.pref_title_show_replies)
key = PrefKeys.TAB_FILTER_HOME_REPLIES // key = PrefKeys.TAB_FILTER_HOME_REPLIES
setDefaultValue(false) // setDefaultValue(false)
isIconSpaceReserved = false // isIconSpaceReserved = false
} // }
} // }
} // }
} }
companion object { companion object {

150
app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt

@ -1,7 +1,15 @@
package com.keylesspalace.tusky.settings package com.keylesspalace.tusky.settings
import android.content.Context import android.content.Context
import android.util.TypedValue
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.view.marginLeft
import androidx.core.view.marginTop
import androidx.fragment.app.Fragment
import androidx.preference.CheckBoxPreference import androidx.preference.CheckBoxPreference
import androidx.preference.EditTextPreference import androidx.preference.EditTextPreference
import androidx.preference.ListPreference import androidx.preference.ListPreference
@ -10,82 +18,106 @@ import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import androidx.preference.SwitchPreference import androidx.preference.SwitchPreference
import at.connyduck.sparkbutton.helpers.Utils
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.components.preference.EmojiPreference import com.keylesspalace.tusky.components.preference.EmojiPreference
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
class PreferenceParent( class PreferenceParent(
val context: Context, val context: Context,
val addPref: (pref: Preference) -> Unit val addPref: (pref: View) -> Unit
) )
inline fun PreferenceParent.preference(builder: Preference.() -> Unit): Preference { //inline fun PreferenceParent.preference(builder: Preference.() -> Unit): Preference {
val pref = Preference(context) // val pref = Preference(context)
builder(pref) // builder(pref)
addPref(pref) // addPref(pref)
return pref // return pref
} //}
//
inline fun PreferenceParent.listPreference(builder: ListPreference.() -> Unit): ListPreference { //inline fun PreferenceParent.listPreference(builder: ListPreference.() -> Unit): ListPreference {
val pref = ListPreference(context) // val pref = ListPreference(context)
builder(pref) // builder(pref)
addPref(pref) // addPref(pref)
return pref // return pref
} //}
//
inline fun PreferenceParent.emojiPreference(okHttpClient: OkHttpClient, builder: EmojiPreference.() -> Unit): EmojiPreference { //inline fun PreferenceParent.emojiPreference(
val pref = EmojiPreference(context, okHttpClient) // okHttpClient: OkHttpClient,
builder(pref) // builder: EmojiPreference.() -> Unit
addPref(pref) //): EmojiPreference {
return pref // val pref = EmojiPreference(context, okHttpClient)
} // builder(pref)
// addPref(pref)
inline fun PreferenceParent.switchPreference( // return pref
builder: SwitchPreference.() -> Unit //}
): SwitchPreference { //
val pref = SwitchPreference(context) //inline fun PreferenceParent.switchPreference(
builder(pref) // builder: SwitchPreference.() -> Unit
addPref(pref) //): SwitchPreference {
return pref // val pref = SwitchPreference(context)
} // builder(pref)
// addPref(pref)
inline fun PreferenceParent.editTextPreference( // return pref
builder: EditTextPreference.() -> Unit //}
): EditTextPreference { //
val pref = EditTextPreference(context) //inline fun PreferenceParent.editTextPreference(
builder(pref) // builder: EditTextPreference.() -> Unit
addPref(pref) //): EditTextPreference {
return pref // val pref = EditTextPreference(context)
} // builder(pref)
// addPref(pref)
inline fun PreferenceParent.checkBoxPreference( // return pref
builder: CheckBoxPreference.() -> Unit //}
): CheckBoxPreference { //
val pref = CheckBoxPreference(context) //inline fun PreferenceParent.checkBoxPreference(
builder(pref) // builder: CheckBoxPreference.() -> Unit
addPref(pref) //): CheckBoxPreference {
return pref // val pref = CheckBoxPreference(context)
} // builder(pref)
// addPref(pref)
// return pref
//}
//
inline fun PreferenceParent.preferenceCategory( inline fun PreferenceParent.preferenceCategory(
@StringRes title: Int, @StringRes title: Int,
builder: PreferenceParent.(PreferenceCategory) -> Unit builder: PreferenceParent.() -> Unit
) { ) {
val category = PreferenceCategory(context) val category = LinearLayout(context)
addPref(category) addPref(category)
category.setTitle(title) val titleView = TextView(context).apply {
val newParent = PreferenceParent(context) { category.addPreference(it) } layoutParams = ViewGroup.MarginLayoutParams(
builder(newParent, category) ViewGroup.MarginLayoutParams.WRAP_CONTENT,
ViewGroup.MarginLayoutParams.WRAP_CONTENT
).apply {
leftMargin = dpToPx(20)
topMargin = 10
rightMargin = 10
bottomMargin = 10
}
val typedValue = TypedValue()
context.theme.resolveAttribute(R.attr.colorPrimary, typedValue, true)
setTextColor(typedValue.data)
setText(title)
}
category.addView(titleView)
val newParent = PreferenceParent(context) { category.addView(it) }
builder(newParent)
} }
inline fun PreferenceFragmentCompat.makePreferenceScreen( inline fun Fragment.makePreferenceScreen(
viewGroup: ViewGroup,
builder: PreferenceParent.() -> Unit builder: PreferenceParent.() -> Unit
): PreferenceScreen { ) {
val context = requireContext() val context = requireContext()
val screen = preferenceManager.createPreferenceScreen(context) val parent = PreferenceParent(context) { viewGroup.addView(it) }
val parent = PreferenceParent(context) { screen.addPreference(it) }
// For some functions (like dependencies) it's much easier for us if we attach screen first // For some functions (like dependencies) it's much easier for us if we attach screen first
// and change it later // and change it later
preferenceScreen = screen
builder(parent) builder(parent)
return screen
} }
fun View.dpToPx(dp: Int) = Utils.dpToPx(this.context, dp)
Loading…
Cancel
Save