From 8b8f39e13b3e81a5c31c899ad3ee983efe6f7cfd Mon Sep 17 00:00:00 2001 From: charlag Date: Tue, 17 May 2022 23:31:24 +0200 Subject: [PATCH] WIP Prefs: SwitchPreference --- .../preference/PreferencesFragment.kt | 54 ++++++++++++-- .../tusky/settings/SettingsDSL.kt | 74 +++++++++++++++---- 2 files changed, 107 insertions(+), 21 deletions(-) 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 3f5ec1992..b7043c737 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 @@ -20,20 +20,23 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout -import android.widget.LinearLayout -import android.widget.TextView import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import com.keylesspalace.tusky.R import com.keylesspalace.tusky.db.AccountManager import com.keylesspalace.tusky.di.Injectable -import com.keylesspalace.tusky.settings.checkBoxPreference +import com.keylesspalace.tusky.settings.PrefData +import com.keylesspalace.tusky.settings.PrefStore +import com.keylesspalace.tusky.settings.getBlocking import com.keylesspalace.tusky.settings.makePreferenceScreen 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.sizePx +import kotlinx.coroutines.launch import okhttp3.OkHttpClient import javax.inject.Inject @@ -45,18 +48,57 @@ class PreferencesFragment : Fragment(), Injectable { @Inject lateinit var accountManager: AccountManager + @Inject + lateinit var prefStore: PrefStore + private val iconSize by lazy { resources.getDimensionPixelSize(R.dimen.preference_icon_size) } -// private var httpProxyPref: Preference? = null + + private fun updatePrefs(updater: (PrefData) -> PrefData) { + lifecycleScope.launch { + prefStore.updateData(updater) + } + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { val view = FrameLayout(inflater.context) + var prefs = prefStore.getBlocking() + lifecycleScope.launch { + prefStore.data.collect { + prefs = it + // trigger update? + } + } + makePreferenceScreen(view) { preferenceCategory(R.string.pref_title_appearance_settings) { - checkBoxPreference("TEST", true) {} + switchPreference(getString(R.string.pref_title_hide_top_toolbar), prefs::hideTopToolbar) { + updatePrefs { data -> data.copy(hideTopToolbar = it) } + } + switchPreference(getString(R.string.pref_title_hide_follow_button), prefs::hideFab) { + updatePrefs { data -> data.copy(hideFab = it) } + } + switchPreference(getString(R.string.pref_title_absolute_time), prefs::useAbsoluteTime) { + updatePrefs { data -> data.copy(useAbsoluteTime = it) } + } + switchPreference(getString(R.string.pref_title_bot_overlay), prefs::showBotOverlay) { + updatePrefs { data -> data.copy(showBotOverlay = it) } + } + switchPreference(getString(R.string.pref_title_animate_gif_avatars), prefs::animateAvatars) { + updatePrefs { data -> data.copy(animateAvatars = it) } + } + switchPreference(getString(R.string.pref_title_animate_custom_emojis), prefs::animateEmojis) { + updatePrefs { data -> data.copy(animateEmojis = it) } + } + switchPreference(getString(R.string.pref_title_gradient_for_media), prefs::useBlurhash) { + updatePrefs { data -> data.copy(useBlurhash = it) } + } + switchPreference(getString(R.string.pref_title_show_cards_in_timelines), prefs::showCardsInTimelines) { + updatePrefs { data -> data.copy(showCardsInTimelines = it) } + } } } return view 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 6302f4170..acdbd2ac3 100644 --- a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt @@ -1,6 +1,7 @@ package com.keylesspalace.tusky.settings import android.content.Context +import android.text.TextUtils import android.util.TypedValue import android.view.Gravity import android.view.View @@ -12,7 +13,9 @@ import android.widget.TextView import androidx.annotation.StringRes import androidx.fragment.app.Fragment import at.connyduck.sparkbutton.helpers.Utils +import com.google.android.material.switchmaterial.SwitchMaterial import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.util.ThemeUtils class PreferenceParent( val context: Context, @@ -80,15 +83,15 @@ private fun itemLayout(context: Context): LinearLayout { } fun PreferenceParent.checkBoxPreference( - text: String, - selected: Boolean, - onSelection: (Boolean) -> Unit + text: String, + selected: Boolean, + onSelection: (Boolean) -> Unit ) { val layout = itemLayout(context) val textView = TextView(context) - layout.addView(textView) textView.text = text + layout.addView(textView) val checkbox = CheckBox(context) layout.addView(checkbox) @@ -100,6 +103,50 @@ fun PreferenceParent.checkBoxPreference( addPref(layout) } +fun PreferenceParent.switchPreference( + title: String, + isChecked: () -> Boolean, + onSelection: (Boolean) -> Unit +) { + val layout = itemLayout(context) + val textView = TextView(context).apply { + text = title + val refs = TypedValue() + context.theme.resolveAttribute(android.R.attr.textAppearanceListItem, refs, true) + setTextAppearance(context, refs.resourceId) + setTextColor(ThemeUtils.getColor(context, android.R.attr.textColorPrimary)) + // this is in resource but not at runtime? +// setSingleLine() + ellipsize = TextUtils.TruncateAt.MARQUEE + } + textView.layoutParams = LinearLayout.LayoutParams( + 0, + LinearLayout.LayoutParams.WRAP_CONTENT + ).apply { + weight = 1f + topMargin = dpToPx(16) + bottomMargin = dpToPx(16) + } + layout.addView(textView) + + val switchLayout = LinearLayout(context).apply { + orientation = LinearLayout.VERTICAL + gravity = Gravity.CENTER_VERTICAL or Gravity.END + } + switchLayout.layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT, + ) + layout.addView(switchLayout) + + val switch = SwitchMaterial(context) + switch.isChecked = isChecked() + switch.setOnCheckedChangeListener { _, isChecked -> onSelection(isChecked) } + switchLayout.addView(switch) + + addPref(layout) +} + fun PreferenceParent.preferenceCategory( @StringRes title: Int, @@ -110,23 +157,19 @@ fun PreferenceParent.preferenceCategory( addPref(categoryLayout) - val titleLayout = itemLayout(context) + val titleLayout = itemLayout(context).apply { + setPadding(dpToPx(16), dpToPx(8 + 16), dpToPx(16), dpToPx(8)) + } categoryLayout.addView(titleLayout) val titleView = TextView(context).apply { layoutParams = ViewGroup.MarginLayoutParams( 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) + setTextAppearance(context, R.style.TextAppearance_AppCompat_Body2) + setTextColor(ThemeUtils.getColor(context, R.attr.colorPrimary)) setText(title) } @@ -147,4 +190,5 @@ inline fun Fragment.makePreferenceScreen( builder(parent) } -fun View.dpToPx(dp: Int) = Utils.dpToPx(this.context, dp) \ No newline at end of file +fun View.dpToPx(dp: Int) = Utils.dpToPx(this.context, dp) +fun PreferenceParent.dpToPx(dp: Int) = Utils.dpToPx(this.context, dp) \ No newline at end of file