Browse Source

WIP Prefs: SwitchPreference

prefs
charlag 4 years ago
parent
commit
8b8f39e13b
No known key found for this signature in database
GPG Key ID: 5B96E7C76F0CA558
  1. 54
      app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt
  2. 74
      app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt

54
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

74
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)
fun View.dpToPx(dp: Int) = Utils.dpToPx(this.context, dp)
fun PreferenceParent.dpToPx(dp: Int) = Utils.dpToPx(this.context, dp)
Loading…
Cancel
Save