diff --git a/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt index 5de628677..4c986d5df 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt @@ -16,28 +16,49 @@ package com.keylesspalace.tusky.components.preference import android.content.Intent +import android.graphics.drawable.Drawable import android.os.Build import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.ScrollView import androidx.annotation.DrawableRes +import androidx.fragment.app.Fragment import androidx.preference.PreferenceFragmentCompat import com.google.android.material.snackbar.Snackbar +import com.keylesspalace.tusky.AccountListActivity +import com.keylesspalace.tusky.BaseActivity import com.keylesspalace.tusky.BuildConfig import com.keylesspalace.tusky.FiltersActivity import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.TabPreferenceActivity 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.AccountManager import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.entity.Account +import com.keylesspalace.tusky.entity.Filter import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.network.MastodonApi +import com.keylesspalace.tusky.settings.PrefKeys +import com.keylesspalace.tusky.settings.PreferenceOption +import com.keylesspalace.tusky.settings.clickPreference +import com.keylesspalace.tusky.settings.listPreference +import com.keylesspalace.tusky.settings.makePreferenceScreen +import com.keylesspalace.tusky.settings.preferenceCategory +import com.keylesspalace.tusky.settings.switchPreference +import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import retrofit2.Call import retrofit2.Callback import retrofit2.Response import javax.inject.Inject -class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable { +class AccountPreferencesFragment : Fragment(), Injectable { @Inject lateinit var accountManager: AccountManager @@ -47,207 +68,141 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable { @Inject lateinit var eventHub: EventHub - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - val context = requireContext() -// makePreferenceScreen { -// preference { -// setTitle(R.string.pref_title_edit_notification_settings) -// icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_notifications).apply { -// sizeRes = R.dimen.preference_icon_size -// colorInt = ThemeUtils.getColor(context, R.attr.iconColor) -// } -// setOnPreferenceClickListener { -// openNotificationPrefs() -// true -// } -// } -// -// preference { -// setTitle(R.string.title_tab_preferences) -// setIcon(R.drawable.ic_tabs) -// setOnPreferenceClickListener { -// val intent = Intent(context, TabPreferenceActivity::class.java) -// activity?.startActivity(intent) -// activity?.overridePendingTransition( -// R.anim.slide_from_right, -// R.anim.slide_to_left -// ) -// true -// } -// } -// -// preference { -// setTitle(R.string.action_view_mutes) -// setIcon(R.drawable.ic_mute_24dp) -// setOnPreferenceClickListener { -// val intent = Intent(context, AccountListActivity::class.java) -// intent.putExtra("type", AccountListActivity.Type.MUTES) -// activity?.startActivity(intent) -// activity?.overridePendingTransition( -// R.anim.slide_from_right, -// R.anim.slide_to_left -// ) -// true -// } -// } -// -// preference { -// setTitle(R.string.action_view_blocks) -// icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_block).apply { -// sizeRes = R.dimen.preference_icon_size -// colorInt = ThemeUtils.getColor(context, R.attr.iconColor) -// } -// setOnPreferenceClickListener { -// val intent = Intent(context, AccountListActivity::class.java) -// intent.putExtra("type", AccountListActivity.Type.BLOCKS) -// activity?.startActivity(intent) -// activity?.overridePendingTransition( -// R.anim.slide_from_right, -// R.anim.slide_to_left -// ) -// true -// } -// } -// -// preference { -// setTitle(R.string.title_domain_mutes) -// setIcon(R.drawable.ic_mute_24dp) -// setOnPreferenceClickListener { -// val intent = Intent(context, InstanceListActivity::class.java) -// activity?.startActivity(intent) -// activity?.overridePendingTransition( -// R.anim.slide_from_right, -// R.anim.slide_to_left -// ) -// true -// } -// } -// -// preferenceCategory(R.string.pref_publishing) { -// listPreference { -// setTitle(R.string.pref_default_post_privacy) -// setEntries(R.array.post_privacy_names) -// setEntryValues(R.array.post_privacy_values) -// key = PrefKeys.DEFAULT_POST_PRIVACY -// setSummaryProvider { entry } -// val visibility = accountManager.activeAccount?.defaultPostPrivacy -// ?: Status.Visibility.PUBLIC -// value = visibility.serverString() -// setIcon(getIconForVisibility(visibility)) -// setOnPreferenceChangeListener { _, newValue -> -// setIcon(getIconForVisibility(Status.Visibility.byString(newValue as String))) -// syncWithServer(visibility = newValue) -// eventHub.dispatch(PreferenceChangedEvent(key)) -// true -// } -// } -// -// switchPreference { -// setTitle(R.string.pref_default_media_sensitivity) -// setIcon(R.drawable.ic_eye_24dp) -// key = PrefKeys.DEFAULT_MEDIA_SENSITIVITY -// isSingleLineTitle = false -// val sensitivity = accountManager.activeAccount?.defaultMediaSensitivity -// ?: false -// setDefaultValue(sensitivity) -// setIcon(getIconForSensitivity(sensitivity)) -// setOnPreferenceChangeListener { _, newValue -> -// setIcon(getIconForSensitivity(newValue as Boolean)) -// syncWithServer(sensitive = newValue) -// eventHub.dispatch(PreferenceChangedEvent(key)) -// true -// } -// } -// } -// -// preferenceCategory(R.string.pref_title_timelines) { -// switchPreference { -// key = PrefKeys.MEDIA_PREVIEW_ENABLED -// setTitle(R.string.pref_title_show_media_preview) -// isSingleLineTitle = false -// isChecked = accountManager.activeAccount?.mediaPreviewEnabled ?: true -// setOnPreferenceChangeListener { _, newValue -> -// updateAccount { it.mediaPreviewEnabled = newValue as Boolean } -// eventHub.dispatch(PreferenceChangedEvent(key)) -// true -// } -// } -// -// switchPreference { -// key = PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA -// setTitle(R.string.pref_title_alway_show_sensitive_media) -// isSingleLineTitle = false -// isChecked = accountManager.activeAccount?.alwaysShowSensitiveMedia ?: false -// setOnPreferenceChangeListener { _, newValue -> -// updateAccount { it.alwaysShowSensitiveMedia = newValue as Boolean } -// eventHub.dispatch(PreferenceChangedEvent(key)) -// true -// } -// } -// -// switchPreference { -// key = PrefKeys.ALWAYS_OPEN_SPOILER -// setTitle(R.string.pref_title_alway_open_spoiler) -// isSingleLineTitle = false -// isChecked = accountManager.activeAccount?.alwaysOpenSpoiler ?: false -// setOnPreferenceChangeListener { _, newValue -> -// updateAccount { it.alwaysOpenSpoiler = newValue as Boolean } -// eventHub.dispatch(PreferenceChangedEvent(key)) -// true -// } -// } -// } -// -// preferenceCategory(R.string.pref_title_timeline_filters) { -// preference { -// setTitle(R.string.pref_title_public_filter_keywords) -// setOnPreferenceClickListener { -// launchFilterActivity( -// Filter.PUBLIC, -// R.string.pref_title_public_filter_keywords -// ) -// true -// } -// } -// -// preference { -// setTitle(R.string.title_notifications) -// setOnPreferenceClickListener { -// launchFilterActivity(Filter.NOTIFICATIONS, R.string.title_notifications) -// true -// } -// } -// -// preference { -// setTitle(R.string.title_home) -// setOnPreferenceClickListener { -// launchFilterActivity(Filter.HOME, R.string.title_home) -// true -// } -// } -// -// preference { -// setTitle(R.string.pref_title_thread_filter_keywords) -// setOnPreferenceClickListener { -// launchFilterActivity( -// Filter.THREAD, -// R.string.pref_title_thread_filter_keywords -// ) -// true -// } -// } -// -// preference { -// setTitle(R.string.title_accounts) -// setOnPreferenceClickListener { -// launchFilterActivity(Filter.ACCOUNT, R.string.title_accounts) -// true -// } -// } -// } -// } + private var updateTrigger: (() -> Unit)? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val viewRoot = ScrollView(inflater.context) + val rootLayout = LinearLayout(inflater.context).apply { + orientation = LinearLayout.VERTICAL + viewRoot.addView(this) + } + + updateTrigger = makePreferenceScreen(rootLayout) { + clickPreference( + getString(R.string.pref_title_edit_notification_settings), + { makeIcon(GoogleMaterial.Icon.gmd_notifications) } + ) { + openNotificationPrefs() + } + clickPreference( + getString(R.string.title_tab_preferences), + { makeIcon(R.drawable.ic_tabs) } + ) { + val activity = requireActivity() as BaseActivity + val intent = Intent(context, TabPreferenceActivity::class.java) + activity.startActivityWithSlideInAnimation(intent) + } + clickPreference( + getString(R.string.action_view_mutes), + { makeIcon(R.drawable.ic_mute_24dp) } + ) { + val activity = requireActivity() as BaseActivity + val intent = AccountListActivity.newIntent(context, AccountListActivity.Type.MUTES) + + activity.startActivityWithSlideInAnimation(intent) + } + clickPreference( + getString(R.string.action_view_blocks), + { makeIcon(GoogleMaterial.Icon.gmd_block) } + ) { + val activity = requireActivity() as BaseActivity + val intent = AccountListActivity.newIntent(context, AccountListActivity.Type.BLOCKS) + + activity.startActivityWithSlideInAnimation(intent) + } + + clickPreference( + getString(R.string.title_domain_mutes), + { makeIcon(R.drawable.ic_mute_24dp) } + ) { + val activity = requireActivity() as BaseActivity + val intent = Intent(context, InstanceListActivity::class.java) + + activity.startActivityWithSlideInAnimation(intent) + } + + preferenceCategory(R.string.pref_publishing) { + val privacyOptions = listOf( + "public" to R.string.post_privacy_public, + "unlisted" to R.string.post_privacy_unlisted, + "private" to R.string.post_privacy_followers_only + ).map(::PreferenceOption) + listPreference( + getString(R.string.pref_default_post_privacy), + privacyOptions, + { activeAccount.defaultPostPrivacy.serverString() }, + { getIconForVisibility(activeAccount.defaultPostPrivacy) } + ) { newValue -> + syncWithServer(visibility = newValue) + eventHub.dispatch(PreferenceChangedEvent(PrefKeys.DEFAULT_POST_PRIVACY)) + } + + switchPreference( + getString(R.string.pref_default_media_sensitivity), + { activeAccount.defaultMediaSensitivity }, + { getIconForSensitivity(activeAccount.defaultMediaSensitivity) } + ) { + updateAccount { account -> account.mediaPreviewEnabled = it } + eventHub.dispatch(PreferenceChangedEvent(PrefKeys.DEFAULT_MEDIA_SENSITIVITY)) + } + } + + preferenceCategory(R.string.pref_title_timelines) { + switchPreference( + getString(R.string.pref_title_timelines), + { activeAccount.mediaPreviewEnabled }, + ) { + updateAccount { account -> account.mediaPreviewEnabled = it } + eventHub.dispatch(PreferenceChangedEvent(PrefKeys.MEDIA_PREVIEW_ENABLED)) + } + + switchPreference( + getString(R.string.pref_title_alway_show_sensitive_media), + { activeAccount.alwaysShowSensitiveMedia } + ) { + updateAccount { account -> account.alwaysShowSensitiveMedia = it } + eventHub.dispatch(PreferenceChangedEvent(PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA)) + } + + switchPreference( + getString(R.string.pref_title_alway_open_spoiler), + { activeAccount.alwaysOpenSpoiler } + ) { + updateAccount { account -> account.alwaysOpenSpoiler = it } + eventHub.dispatch(PreferenceChangedEvent(PrefKeys.ALWAYS_OPEN_SPOILER)) + } + + } + + preferenceCategory(R.string.pref_title_timeline_filters) { + clickPreference(getString(R.string.pref_title_public_filter_keywords)) { + launchFilterActivity(Filter.PUBLIC, R.string.pref_title_public_filter_keywords) + } + + clickPreference(getString(R.string.title_notifications)) { + launchFilterActivity(Filter.NOTIFICATIONS, R.string.title_notifications) + } + + clickPreference(getString(R.string.pref_title_thread_filter_keywords)) { + launchFilterActivity(Filter.THREAD, R.string.pref_title_thread_filter_keywords) + } + + clickPreference(getString(R.string.title_accounts)) { + launchFilterActivity(Filter.ACCOUNT, R.string.title_accounts) + } + } + } + + return viewRoot } + private val activeAccount: AccountEntity + get() = accountManager.activeAccount!! + private fun openNotificationPrefs() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val intent = Intent() @@ -256,7 +211,8 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable { startActivity(intent) } else { activity?.let { - val intent = PreferencesActivity.newIntent(it, PreferencesActivity.NOTIFICATION_PREFERENCES) + val intent = + PreferencesActivity.newIntent(it, PreferencesActivity.NOTIFICATION_PREFERENCES) it.startActivity(intent) it.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) } @@ -267,6 +223,7 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable { accountManager.activeAccount?.let { account -> changer(account) accountManager.saveAccount(account) + updateTrigger?.invoke() } } @@ -276,12 +233,10 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable { override fun onResponse(call: Call, response: Response) { val account = response.body() if (response.isSuccessful && account != null) { - - accountManager.activeAccount?.let { + updateAccount { it.defaultPostPrivacy = account.source?.privacy ?: Status.Visibility.PUBLIC it.defaultMediaSensitivity = account.source?.sensitive ?: false - accountManager.saveAccount(it) } } else { Log.e("AccountPreferences", "failed updating settings on server") @@ -304,24 +259,24 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable { } } - @DrawableRes - private fun getIconForVisibility(visibility: Status.Visibility): Int { - return when (visibility) { + private fun getIconForVisibility(visibility: Status.Visibility): Drawable { + @DrawableRes + val res = when (visibility) { Status.Visibility.PRIVATE -> R.drawable.ic_lock_outline_24dp - Status.Visibility.UNLISTED -> R.drawable.ic_lock_open_24dp - else -> R.drawable.ic_public_24dp } + return makeIcon(res) } - @DrawableRes - private fun getIconForSensitivity(sensitive: Boolean): Int { - return if (sensitive) { + private fun getIconForSensitivity(sensitive: Boolean): Drawable { + @DrawableRes + val res = if (sensitive) { R.drawable.ic_hide_media_24dp } else { R.drawable.ic_eye_24dp } + return makeIcon(res) } private fun launchFilterActivity(filterContext: String, titleResource: Int) { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt index 9111deba7..588097217 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt @@ -48,9 +48,10 @@ import com.keylesspalace.tusky.util.ThemeUtils import com.keylesspalace.tusky.util.deserialize import com.keylesspalace.tusky.util.serialize import com.mikepenz.iconics.IconicsDrawable +import com.mikepenz.iconics.IconicsSize import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import com.mikepenz.iconics.utils.colorInt -import com.mikepenz.iconics.utils.sizePx +import com.mikepenz.iconics.utils.size import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -69,8 +70,6 @@ class PreferencesFragment : Fragment(), Injectable { lateinit var prefStore: PrefStore lateinit var prefs: PrefData - private val iconSize by lazy { resources.getDimensionPixelSize(R.dimen.preference_icon_size) } - private var updateTrigger: (() -> Unit)? = null private fun updatePrefs(updater: (PrefData) -> PrefData) { lifecycleScope.launch { @@ -202,7 +201,7 @@ class PreferencesFragment : Fragment(), Injectable { getString(R.string.pref_title_app_theme), themeOptions, { prefs.appTheme }, - makeIcon(GoogleMaterial.Icon.gmd_palette), + { makeIcon(GoogleMaterial.Icon.gmd_palette) }, ) { updatePrefs { data -> data.copy(appTheme = it) } } @@ -215,7 +214,7 @@ class PreferencesFragment : Fragment(), Injectable { { emojiSelector.summary }, - makeIcon(GoogleMaterial.Icon.gmd_sentiment_satisfied), + { makeIcon(GoogleMaterial.Icon.gmd_sentiment_satisfied) }, ) { emojiSelector.showSelectionDialog() @@ -230,7 +229,7 @@ class PreferencesFragment : Fragment(), Injectable { getString(R.string.pref_title_language), languageOptions, { prefs.language }, - makeIcon(GoogleMaterial.Icon.gmd_translate) + { makeIcon(GoogleMaterial.Icon.gmd_translate) } ) { updatePrefs { data -> data.copy(language = it) } } @@ -246,7 +245,7 @@ class PreferencesFragment : Fragment(), Injectable { getString(R.string.pref_status_text_size), textSizeOptions, { prefs.statusTextSize }, - makeIcon(GoogleMaterial.Icon.gmd_format_size) + { makeIcon(GoogleMaterial.Icon.gmd_format_size) } ) { updatePrefs { data -> data.copy(statusTextSize = it) } } @@ -284,7 +283,7 @@ class PreferencesFragment : Fragment(), Injectable { switchPreference( getString(R.string.pref_title_bot_overlay), { prefs.showBotOverlay }, - makeIcon(R.drawable.ic_bot_24dp), + { makeIcon(R.drawable.ic_bot_24dp) }, ) { updatePrefs { data -> data.copy(showBotOverlay = it) } } @@ -339,238 +338,24 @@ class PreferencesFragment : Fragment(), Injectable { } } -// override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { -// makePreferenceScreen { -// preferenceCategory(R.string.pref_title_appearance_settings) { -// listPreference { -// setDefaultValue(AppTheme.NIGHT.value) -// setEntries(R.array.app_theme_names) -// entryValues = AppTheme.stringValues() -// key = PrefKeys.APP_THEME -// setSummaryProvider { entry } -// setTitle(R.string.pref_title_app_theme) -// icon = makeIcon(GoogleMaterial.Icon.gmd_palette) -// } -// -// emojiPreference(okhttpclient) { -// setDefaultValue("system_default") -// setIcon(R.drawable.ic_emoji_24dp) -// key = PrefKeys.EMOJI -// setSummary(R.string.system_default) -// setTitle(R.string.emoji_style) -// icon = makeIcon(GoogleMaterial.Icon.gmd_sentiment_satisfied) -// } -// -// listPreference { -// setDefaultValue("default") -// setEntries(R.array.language_entries) -// setEntryValues(R.array.language_values) -// key = PrefKeys.LANGUAGE -// setSummaryProvider { entry } -// setTitle(R.string.pref_title_language) -// icon = makeIcon(GoogleMaterial.Icon.gmd_translate) -// } -// -// listPreference { -// setDefaultValue("medium") -// setEntries(R.array.status_text_size_names) -// setEntryValues(R.array.status_text_size_values) -// key = PrefKeys.STATUS_TEXT_SIZE -// setSummaryProvider { entry } -// setTitle(R.string.pref_status_text_size) -// icon = makeIcon(GoogleMaterial.Icon.gmd_format_size) -// } -// -// listPreference { -// setDefaultValue("top") -// setEntries(R.array.pref_main_nav_position_options) -// setEntryValues(R.array.pref_main_nav_position_values) -// key = PrefKeys.MAIN_NAV_POSITION -// setSummaryProvider { entry } -// setTitle(R.string.pref_main_nav_position) -// } -// -// switchPreference { -// setDefaultValue(false) -// key = PrefKeys.HIDE_TOP_TOOLBAR -// setTitle(R.string.pref_title_hide_top_toolbar) -// } -// -// switchPreference { -// setDefaultValue(false) -// key = PrefKeys.FAB_HIDE -// setTitle(R.string.pref_title_hide_follow_button) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(false) -// key = PrefKeys.ABSOLUTE_TIME_VIEW -// setTitle(R.string.pref_title_absolute_time) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(true) -// key = PrefKeys.SHOW_BOT_OVERLAY -// setTitle(R.string.pref_title_bot_overlay) -// isSingleLineTitle = false -// setIcon(R.drawable.ic_bot_24dp) -// } -// -// switchPreference { -// setDefaultValue(false) -// key = PrefKeys.ANIMATE_GIF_AVATARS -// setTitle(R.string.pref_title_animate_gif_avatars) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(false) -// key = PrefKeys.ANIMATE_CUSTOM_EMOJIS -// setTitle(R.string.pref_title_animate_custom_emojis) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(true) -// key = PrefKeys.USE_BLURHASH -// setTitle(R.string.pref_title_gradient_for_media) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(false) -// key = PrefKeys.SHOW_CARDS_IN_TIMELINES -// setTitle(R.string.pref_title_show_cards_in_timelines) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(true) -// key = PrefKeys.SHOW_NOTIFICATIONS_FILTER -// setTitle(R.string.pref_title_show_notifications_filter) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(true) -// key = PrefKeys.CONFIRM_REBLOGS -// setTitle(R.string.pref_title_confirm_reblogs) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(false) -// key = PrefKeys.CONFIRM_FAVOURITES -// setTitle(R.string.pref_title_confirm_favourites) -// isSingleLineTitle = false -// } -// -// switchPreference { -// setDefaultValue(true) -// key = PrefKeys.ENABLE_SWIPE_FOR_TABS -// setTitle(R.string.pref_title_enable_swipe_for_tabs) -// isSingleLineTitle = false -// } -// } -// -// preferenceCategory(R.string.pref_title_browser_settings) { -// switchPreference { -// setDefaultValue(false) -// key = PrefKeys.CUSTOM_TABS -// setTitle(R.string.pref_title_custom_tabs) -// isSingleLineTitle = false -// } -// } -// -// preferenceCategory(R.string.pref_title_timeline_filters) { -// preference { -// setTitle(R.string.pref_title_status_tabs) -// setOnPreferenceClickListener { -// activity?.let { activity -> -// val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.TAB_FILTER_PREFERENCES) -// activity.startActivity(intent) -// activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) -// } -// true -// } -// } -// } -// -// preferenceCategory(R.string.pref_title_wellbeing_mode) { -// switchPreference { -// title = getString(R.string.limit_notifications) -// setDefaultValue(false) -// key = PrefKeys.WELLBEING_LIMITED_NOTIFICATIONS -// setOnPreferenceChangeListener { _, value -> -// for (account in accountManager.accounts) { -// val notificationFilter = deserialize(account.notificationsFilter).toMutableSet() -// -// if (value == true) { -// notificationFilter.add(Notification.Type.FAVOURITE) -// notificationFilter.add(Notification.Type.FOLLOW) -// notificationFilter.add(Notification.Type.REBLOG) -// } else { -// notificationFilter.remove(Notification.Type.FAVOURITE) -// notificationFilter.remove(Notification.Type.FOLLOW) -// notificationFilter.remove(Notification.Type.REBLOG) -// } -// -// account.notificationsFilter = serialize(notificationFilter) -// accountManager.saveAccount(account) -// } -// true -// } -// } -// -// switchPreference { -// title = getString(R.string.wellbeing_hide_stats_posts) -// setDefaultValue(false) -// key = PrefKeys.WELLBEING_HIDE_STATS_POSTS -// } -// -// switchPreference { -// title = getString(R.string.wellbeing_hide_stats_profile) -// setDefaultValue(false) -// key = PrefKeys.WELLBEING_HIDE_STATS_PROFILE -// } -// } -// -// preferenceCategory(R.string.pref_title_proxy_settings) { -// httpProxyPref = preference { -// setTitle(R.string.pref_title_http_proxy_settings) -// setOnPreferenceClickListener { -// activity?.let { activity -> -// val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.PROXY_PREFERENCES) -// activity.startActivity(intent) -// activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) -// } -// true -// } -// } -// } -// } -// } - - private fun makeIcon(icon: GoogleMaterial.Icon): IconicsDrawable { - val context = requireContext() - return IconicsDrawable(context, icon).apply { - sizePx = iconSize - colorInt = ThemeUtils.getColor(context, R.attr.iconColor) - } - } - - private fun makeIcon(@DrawableRes res: Int): Drawable { - val context = requireContext() - return AppCompatResources.getDrawable(context, res)!!.apply { - setTint(ThemeUtils.getColor(context, R.attr.iconColor)) - } - } - companion object { fun newInstance(): PreferencesFragment { return PreferencesFragment() } } } + +fun Fragment.makeIcon(icon: GoogleMaterial.Icon): IconicsDrawable { + val context = requireContext() + return IconicsDrawable(context, icon).apply { + size = IconicsSize.res(R.dimen.preference_icon_size) + colorInt = ThemeUtils.getColor(context, R.attr.iconColor) + } +} + +fun Fragment.makeIcon(@DrawableRes res: Int): Drawable { + val context = requireContext() + return AppCompatResources.getDrawable(context, res)!!.apply { + setTint(ThemeUtils.getColor(context, R.attr.iconColor)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt index a3f990c52..10df083b2 100644 --- a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt @@ -47,6 +47,7 @@ private fun itemLayout(context: Context): LinearLayout { fun PreferenceParent.checkBoxPreference( title: String, selected: () -> Boolean, + icon: IconProvider = NoIconProvider, onSelection: (Boolean) -> Unit ) { val layout = inflateItemLayout().apply { @@ -63,6 +64,7 @@ fun PreferenceParent.checkBoxPreference( layout.prefCutomContainer.addView(checkbox) registerUpdate { + layout.setIcon(icon()) checkbox.isChecked = selected() } @@ -71,6 +73,7 @@ fun PreferenceParent.checkBoxPreference( fun PreferenceParent.clickPreference( title: String, + icon: IconProvider = NoIconProvider, onClick: () -> Unit, ) { val layout = inflateItemLayout().apply { @@ -78,25 +81,29 @@ fun PreferenceParent.clickPreference( setShowSummary(false) } layout.root.setOnClickListener { onClick() } + + registerUpdate { + layout.setIcon(icon()) + } addPref(layout.root) } fun PreferenceParent.switchPreference( title: String, isChecked: () -> Boolean, - icon: Drawable? = null, + icon: IconProvider = NoIconProvider, onSelection: (Boolean) -> Unit ) { val layout = inflateItemLayout().apply { setTitle(title) setShowSummary(false) - icon?.let { setIcon(it) } } val switch = SwitchMaterial(context) layout.prefCutomContainer.addView(switch) registerUpdate { switch.isChecked = isChecked() + layout.setIcon(icon()) } layout.root.setOnClickListener { onSelection(!isChecked()) } switch.setOnCheckedChangeListener { _, isChecked -> onSelection(isChecked) } @@ -110,6 +117,7 @@ fun PreferenceParent.switchPreference( fun PreferenceParent.editTextPreference( title: String, value: () -> String, + icon: IconProvider = NoIconProvider, onNewValue: (String) -> Unit ) { val layout = inflateItemLayout() @@ -138,8 +146,9 @@ fun PreferenceParent.editTextPreference( } layout.prefTitle.text = title registerUpdate { - layout.prefSummary.text = value() - layout.prefSummary.visible(value().isNotBlank()) + layout.setSummary(value()) + layout.setShowSummary(value().isNotBlank()) + layout.setIcon(icon()) } addPref(layout.root) } @@ -153,20 +162,23 @@ fun PreferenceParent.PreferenceOption(pair: Pair): PreferenceOption< infix fun T.named(name: String) = PreferenceOption(name, this) +typealias IconProvider = () -> Drawable? +val NoIconProvider: IconProvider = { null } + fun PreferenceParent.listPreference( title: String, options: List>, selected: () -> T, - icon: Drawable? = null, + icon: IconProvider = NoIconProvider, onSelection: (T) -> Unit, ) { val layout = inflateItemLayout().apply { setTitle(title) setShowSummary(true) - icon?.let { setIcon(it) } } registerUpdate { + layout.setIcon(icon()) val selectedOptionIndex = options.indexOfFirst { it.value == selected() } layout.setSummary(options[selectedOptionIndex].name) @@ -190,13 +202,12 @@ fun PreferenceParent.listPreference( fun PreferenceParent.customListPreference( title: String, selected: () -> String, - icon: Drawable? = null, + icon: IconProvider = NoIconProvider, onClick: () -> Unit ) { val layout = inflateItemLayout().apply { setTitle(title) setShowSummary(true) - icon?.let { setIcon(it) } } layout.root.setOnClickListener { @@ -204,6 +215,7 @@ fun PreferenceParent.customListPreference( } registerUpdate { + layout.setIcon(icon()) layout.setSummary(selected()) } addPref(layout.root) @@ -284,6 +296,6 @@ private fun ItemPrefBinding.setShowSummary(show: Boolean) { prefSummary.isVisible = show } -private fun ItemPrefBinding.setIcon(icon: Drawable) { +private fun ItemPrefBinding.setIcon(icon: Drawable?) { prefIcon.setImageDrawable(icon) } \ No newline at end of file diff --git a/app/src/main/res/layout/item_pref.xml b/app/src/main/res/layout/item_pref.xml index 4625d8b9d..01d120c84 100644 --- a/app/src/main/res/layout/item_pref.xml +++ b/app/src/main/res/layout/item_pref.xml @@ -11,8 +11,8 @@