forked from upstream-mirrors/quik
Add support for changing font size
This commit is contained in:
@@ -27,8 +27,16 @@ import com.uber.autodispose.android.scope
|
||||
import com.uber.autodispose.kotlin.autoDisposable
|
||||
import common.util.Colors
|
||||
import common.util.FontProvider
|
||||
import common.widget.QkTextView.Companion.SIZE_PRIMARY
|
||||
import common.widget.QkTextView.Companion.SIZE_SECONDARY
|
||||
import common.widget.QkTextView.Companion.SIZE_TERTIARY
|
||||
import common.widget.QkTextView.Companion.SIZE_TOOLBAR
|
||||
import injection.appComponent
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.rxkotlin.Observables
|
||||
import io.reactivex.subjects.BehaviorSubject
|
||||
import io.reactivex.subjects.Subject
|
||||
import util.Preferences
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
@@ -39,38 +47,76 @@ import javax.inject.Inject
|
||||
*/
|
||||
class QkEditText @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : EditText(context, attrs) {
|
||||
|
||||
companion object {
|
||||
const val COLOR_PRIMARY = 0
|
||||
const val COLOR_SECONDARY = 1
|
||||
const val COLOR_TERTIARY = 2
|
||||
const val COLOR_PRIMARY_ON_THEME = 3
|
||||
const val COLOR_SECONDARY_ON_THEME = 4
|
||||
const val COLOR_TERTIARY_ON_THEME = 5
|
||||
|
||||
const val SIZE_PRIMARY = 0
|
||||
const val SIZE_SECONDARY = 1
|
||||
const val SIZE_TERTIARY = 2
|
||||
const val SIZE_TOOLBAR = 3
|
||||
}
|
||||
|
||||
@Inject lateinit var colors: Colors
|
||||
@Inject lateinit var fontProvider: FontProvider
|
||||
@Inject lateinit var prefs: Preferences
|
||||
|
||||
private var textColorObservable: Observable<Int>? = null
|
||||
private var textColorHintObservable: Observable<Int>? = null
|
||||
|
||||
init {
|
||||
appComponent.inject(this)
|
||||
fontProvider.getLato { setTypeface(it, typeface?.style ?: Typeface.NORMAL) }
|
||||
private var textSizeAttrSubject: Subject<Int> = BehaviorSubject.create()
|
||||
|
||||
context.obtainStyledAttributes(attrs, R.styleable.QkEditText)?.run {
|
||||
textColorObservable = when (getInt(R.styleable.QkEditText_textColor, -1)) {
|
||||
0 -> colors.textPrimary
|
||||
1 -> colors.textSecondary
|
||||
2 -> colors.textTertiary
|
||||
3 -> colors.textPrimaryOnTheme
|
||||
4 -> colors.textSecondaryOnTheme
|
||||
5 -> colors.textTertiaryOnTheme
|
||||
else -> null
|
||||
init {
|
||||
if (!isInEditMode) {
|
||||
appComponent.inject(this)
|
||||
fontProvider.getLato { setTypeface(it, typeface?.style ?: Typeface.NORMAL) }
|
||||
|
||||
context.obtainStyledAttributes(attrs, R.styleable.QkEditText)?.run {
|
||||
val colorAttr = getInt(R.styleable.QkEditText_textColor, -1)
|
||||
val colorHintAttr = getInt(R.styleable.QkEditText_textColorHint, -1)
|
||||
val textSizeAttr = getInt(R.styleable.QkEditText_textSize, -1)
|
||||
|
||||
textColorObservable = when (colorAttr) {
|
||||
COLOR_PRIMARY -> colors.textPrimary
|
||||
COLOR_SECONDARY -> colors.textSecondary
|
||||
COLOR_TERTIARY -> colors.textTertiary
|
||||
COLOR_PRIMARY_ON_THEME -> colors.textPrimaryOnTheme
|
||||
COLOR_SECONDARY_ON_THEME -> colors.textSecondaryOnTheme
|
||||
COLOR_TERTIARY_ON_THEME -> colors.textTertiaryOnTheme
|
||||
else -> null
|
||||
}
|
||||
|
||||
textColorHintObservable = when (colorHintAttr) {
|
||||
COLOR_PRIMARY -> colors.textPrimary
|
||||
COLOR_SECONDARY -> colors.textSecondary
|
||||
COLOR_TERTIARY -> colors.textTertiary
|
||||
else -> null
|
||||
}
|
||||
|
||||
setTextSize(textSizeAttr)
|
||||
|
||||
recycle()
|
||||
}
|
||||
textColorHintObservable = when (getInt(R.styleable.QkEditText_textColorHint, -1)) {
|
||||
0 -> colors.textPrimary
|
||||
1 -> colors.textSecondary
|
||||
2 -> colors.textTertiary
|
||||
else -> null
|
||||
}
|
||||
recycle()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see SIZE_PRIMARY
|
||||
* @see SIZE_SECONDARY
|
||||
* @see SIZE_TERTIARY
|
||||
* @see SIZE_TOOLBAR
|
||||
*/
|
||||
fun setTextSize(size: Int) {
|
||||
textSizeAttrSubject.onNext(size)
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
if (isInEditMode) return
|
||||
|
||||
textColorObservable
|
||||
?.autoDisposable(scope())
|
||||
@@ -79,6 +125,45 @@ class QkEditText @JvmOverloads constructor(context: Context, attrs: AttributeSet
|
||||
textColorHintObservable
|
||||
?.autoDisposable(scope())
|
||||
?.subscribe { color -> setHintTextColor(color) }
|
||||
|
||||
Observables
|
||||
.combineLatest(prefs.textSize.asObservable(), textSizeAttrSubject, { textSizePref, textSizeAttr ->
|
||||
when (textSizeAttr) {
|
||||
SIZE_PRIMARY -> textSize = when (textSizePref) {
|
||||
Preferences.TEXT_SIZE_SMALL -> 14f
|
||||
Preferences.TEXT_SIZE_NORMAL -> 16f
|
||||
Preferences.TEXT_SIZE_LARGE -> 18f
|
||||
Preferences.TEXT_SIZE_LARGER -> 20f
|
||||
else -> 16f
|
||||
}
|
||||
|
||||
SIZE_SECONDARY -> textSize = when (textSizePref) {
|
||||
Preferences.TEXT_SIZE_SMALL -> 12f
|
||||
Preferences.TEXT_SIZE_NORMAL -> 14f
|
||||
Preferences.TEXT_SIZE_LARGE -> 16f
|
||||
Preferences.TEXT_SIZE_LARGER -> 18f
|
||||
else -> 14f
|
||||
}
|
||||
|
||||
SIZE_TERTIARY -> textSize = when (textSizePref) {
|
||||
Preferences.TEXT_SIZE_SMALL -> 10f
|
||||
Preferences.TEXT_SIZE_NORMAL -> 12f
|
||||
Preferences.TEXT_SIZE_LARGE -> 14f
|
||||
Preferences.TEXT_SIZE_LARGER -> 16f
|
||||
else -> 12f
|
||||
}
|
||||
|
||||
SIZE_TOOLBAR -> textSize = when (textSizePref) {
|
||||
Preferences.TEXT_SIZE_SMALL -> 18f
|
||||
Preferences.TEXT_SIZE_NORMAL -> 20f
|
||||
Preferences.TEXT_SIZE_LARGE -> 22f
|
||||
Preferences.TEXT_SIZE_LARGER -> 26f
|
||||
else -> 20f
|
||||
}
|
||||
}
|
||||
})
|
||||
.autoDisposable(scope())
|
||||
.subscribe()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -23,12 +23,18 @@ import android.graphics.Typeface
|
||||
import android.support.text.emoji.widget.EmojiAppCompatTextView
|
||||
import android.util.AttributeSet
|
||||
import com.moez.QKSMS.R
|
||||
import com.uber.autodispose.android.scope
|
||||
import com.uber.autodispose.kotlin.autoDisposable
|
||||
import common.util.Colors
|
||||
import common.util.FontProvider
|
||||
import common.util.extensions.getColorCompat
|
||||
import injection.appComponent
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.disposables.Disposable
|
||||
import io.reactivex.rxkotlin.Observables
|
||||
import io.reactivex.subjects.BehaviorSubject
|
||||
import io.reactivex.subjects.Subject
|
||||
import util.Preferences
|
||||
import javax.inject.Inject
|
||||
|
||||
open class QkTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null)
|
||||
@@ -41,10 +47,16 @@ open class QkTextView @JvmOverloads constructor(context: Context, attrs: Attribu
|
||||
const val COLOR_PRIMARY_ON_THEME = 3
|
||||
const val COLOR_SECONDARY_ON_THEME = 4
|
||||
const val COLOR_TERTIARY_ON_THEME = 5
|
||||
|
||||
const val SIZE_PRIMARY = 0
|
||||
const val SIZE_SECONDARY = 1
|
||||
const val SIZE_TERTIARY = 2
|
||||
const val SIZE_TOOLBAR = 3
|
||||
}
|
||||
|
||||
@Inject lateinit var colors: Colors
|
||||
@Inject lateinit var fontProvider: FontProvider
|
||||
@Inject lateinit var prefs: Preferences
|
||||
|
||||
var textColorObservable: Observable<Int>? = null
|
||||
set(value) {
|
||||
@@ -58,6 +70,8 @@ open class QkTextView @JvmOverloads constructor(context: Context, attrs: Attribu
|
||||
field = value
|
||||
}
|
||||
|
||||
private var textSizeAttrSubject: Subject<Int> = BehaviorSubject.create()
|
||||
|
||||
init {
|
||||
if (!isInEditMode) {
|
||||
appComponent.inject(this)
|
||||
@@ -66,6 +80,8 @@ open class QkTextView @JvmOverloads constructor(context: Context, attrs: Attribu
|
||||
|
||||
context.obtainStyledAttributes(attrs, R.styleable.QkTextView)?.run {
|
||||
val colorAttr = getInt(R.styleable.QkTextView_textColor, -1)
|
||||
val textSizeAttr = getInt(R.styleable.QkTextView_textSize, -1)
|
||||
|
||||
if (isInEditMode) {
|
||||
setTextColor(context.getColorCompat(when (colorAttr) {
|
||||
COLOR_PRIMARY -> R.color.textPrimary
|
||||
@@ -76,6 +92,14 @@ open class QkTextView @JvmOverloads constructor(context: Context, attrs: Attribu
|
||||
COLOR_TERTIARY_ON_THEME -> R.color.textTertiaryDark
|
||||
else -> R.color.textPrimary
|
||||
}))
|
||||
|
||||
textSize = when (textSizeAttr) {
|
||||
SIZE_PRIMARY -> 16f
|
||||
SIZE_SECONDARY -> 14f
|
||||
SIZE_TERTIARY -> 12f
|
||||
SIZE_TOOLBAR -> 20f
|
||||
else -> textSize
|
||||
}
|
||||
} else {
|
||||
textColorObservable = when (colorAttr) {
|
||||
COLOR_PRIMARY -> colors.textPrimary
|
||||
@@ -86,12 +110,24 @@ open class QkTextView @JvmOverloads constructor(context: Context, attrs: Attribu
|
||||
COLOR_TERTIARY_ON_THEME -> colors.textTertiaryOnTheme
|
||||
else -> null
|
||||
}
|
||||
|
||||
setTextSize(textSizeAttr)
|
||||
}
|
||||
|
||||
recycle()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see SIZE_PRIMARY
|
||||
* @see SIZE_SECONDARY
|
||||
* @see SIZE_TERTIARY
|
||||
* @see SIZE_TOOLBAR
|
||||
*/
|
||||
fun setTextSize(size: Int) {
|
||||
textSizeAttrSubject.onNext(size)
|
||||
}
|
||||
|
||||
private fun updateSubscription() {
|
||||
if (isAttachedToWindow) {
|
||||
textColorDisposable = textColorObservable?.subscribe { color ->
|
||||
@@ -103,7 +139,48 @@ open class QkTextView @JvmOverloads constructor(context: Context, attrs: Attribu
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
if (isInEditMode) return
|
||||
|
||||
updateSubscription()
|
||||
|
||||
Observables
|
||||
.combineLatest(prefs.textSize.asObservable(), textSizeAttrSubject, { textSizePref, textSizeAttr ->
|
||||
when (textSizeAttr) {
|
||||
SIZE_PRIMARY -> textSize = when (textSizePref) {
|
||||
Preferences.TEXT_SIZE_SMALL -> 14f
|
||||
Preferences.TEXT_SIZE_NORMAL -> 16f
|
||||
Preferences.TEXT_SIZE_LARGE -> 18f
|
||||
Preferences.TEXT_SIZE_LARGER -> 20f
|
||||
else -> 16f
|
||||
}
|
||||
|
||||
SIZE_SECONDARY -> textSize = when (textSizePref) {
|
||||
Preferences.TEXT_SIZE_SMALL -> 12f
|
||||
Preferences.TEXT_SIZE_NORMAL -> 14f
|
||||
Preferences.TEXT_SIZE_LARGE -> 16f
|
||||
Preferences.TEXT_SIZE_LARGER -> 18f
|
||||
else -> 14f
|
||||
}
|
||||
|
||||
SIZE_TERTIARY -> textSize = when (textSizePref) {
|
||||
Preferences.TEXT_SIZE_SMALL -> 10f
|
||||
Preferences.TEXT_SIZE_NORMAL -> 12f
|
||||
Preferences.TEXT_SIZE_LARGE -> 14f
|
||||
Preferences.TEXT_SIZE_LARGER -> 16f
|
||||
else -> 12f
|
||||
}
|
||||
|
||||
SIZE_TOOLBAR -> textSize = when (textSizePref) {
|
||||
Preferences.TEXT_SIZE_SMALL -> 18f
|
||||
Preferences.TEXT_SIZE_NORMAL -> 20f
|
||||
Preferences.TEXT_SIZE_LARGE -> 22f
|
||||
Preferences.TEXT_SIZE_LARGER -> 26f
|
||||
else -> 20f
|
||||
}
|
||||
}
|
||||
})
|
||||
.autoDisposable(scope())
|
||||
.subscribe()
|
||||
}
|
||||
|
||||
override fun onDetachedFromWindow() {
|
||||
|
||||
@@ -45,6 +45,7 @@ import common.util.extensions.dpToPx
|
||||
import common.util.extensions.setBackgroundTint
|
||||
import common.util.extensions.setTint
|
||||
import common.util.extensions.setVisible
|
||||
import common.widget.QkEditText
|
||||
import feature.conversations.ConversationItemTouchCallback
|
||||
import feature.conversations.ConversationsAdapter
|
||||
import injection.appComponent
|
||||
@@ -178,7 +179,7 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView {
|
||||
|
||||
override fun render(state: MainState) {
|
||||
toolbarSearch.isEnabled = state.page is Inbox
|
||||
toolbarSearch.textSize = if (state.page is Inbox) 16f else 20f
|
||||
toolbarSearch.setTextSize(if (state.page is Inbox) QkEditText.SIZE_PRIMARY else QkEditText.SIZE_TOOLBAR)
|
||||
|
||||
toolbar.menu.findItem(R.id.clear)?.run {
|
||||
isVisible = state.page is Inbox && state.page.showClearButton
|
||||
|
||||
@@ -45,6 +45,7 @@ import javax.inject.Inject
|
||||
class SettingsActivity : QkThemedActivity<SettingsViewModel>(), SettingsView {
|
||||
|
||||
@Inject lateinit var nightModeAdapter: MenuItemAdapter
|
||||
@Inject lateinit var textSizeAdapter: MenuItemAdapter
|
||||
@Inject lateinit var mmsSizeAdapter: MenuItemAdapter
|
||||
|
||||
override val viewModelClass = SettingsViewModel::class
|
||||
@@ -53,6 +54,7 @@ class SettingsActivity : QkThemedActivity<SettingsViewModel>(), SettingsView {
|
||||
override val viewQksmsPlusIntent: Subject<Unit> = PublishSubject.create()
|
||||
override val startTimeSelectedIntent: Subject<Pair<Int, Int>> = PublishSubject.create()
|
||||
override val endTimeSelectedIntent: Subject<Pair<Int, Int>> = PublishSubject.create()
|
||||
override val textSizeSelectedIntent by lazy { textSizeAdapter.menuItemClicks }
|
||||
override val mmsSizeSelectedIntent: Subject<Int> by lazy { mmsSizeAdapter.menuItemClicks }
|
||||
|
||||
// TODO remove this
|
||||
@@ -65,6 +67,7 @@ class SettingsActivity : QkThemedActivity<SettingsViewModel>(), SettingsView {
|
||||
}
|
||||
|
||||
private var nightModeDialog: AlertDialog? = null
|
||||
private var textSizeDialog: AlertDialog? = null
|
||||
private var mmsSizeDialog: AlertDialog? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
@@ -76,6 +79,7 @@ class SettingsActivity : QkThemedActivity<SettingsViewModel>(), SettingsView {
|
||||
viewModel.bindView(this)
|
||||
|
||||
nightModeAdapter.setData(R.array.night_modes)
|
||||
textSizeAdapter.setData(R.array.text_sizes)
|
||||
mmsSizeAdapter.setData(R.array.mms_sizes, R.array.mms_sizes_ids)
|
||||
|
||||
colors.background
|
||||
@@ -114,6 +118,9 @@ class SettingsActivity : QkThemedActivity<SettingsViewModel>(), SettingsView {
|
||||
autoEmoji.checkbox.isChecked = state.autoEmojiEnabled
|
||||
delivery.checkbox.isChecked = state.deliveryEnabled
|
||||
qkreply.checkbox.isChecked = state.qkReplyEnabled
|
||||
|
||||
textSize.summary = state.textSizeSummary
|
||||
|
||||
unicode.checkbox.isChecked = state.stripUnicodeEnabled
|
||||
mms.checkbox.isChecked = state.mmsEnabled
|
||||
|
||||
@@ -157,6 +164,22 @@ class SettingsActivity : QkThemedActivity<SettingsViewModel>(), SettingsView {
|
||||
}, hour, minute, false).show()
|
||||
}
|
||||
|
||||
override fun showTextSizePicker() {
|
||||
val recyclerView = RecyclerView(this)
|
||||
recyclerView.layoutManager = LinearLayoutManager(this)
|
||||
recyclerView.adapter = textSizeAdapter
|
||||
recyclerView.setPadding(0, 8.dpToPx(this), 0, 8.dpToPx(this))
|
||||
textSizeDialog = AlertDialog.Builder(this)
|
||||
.setTitle(R.string.settings_text_size_title)
|
||||
.setView(recyclerView)
|
||||
.create().apply { show() }
|
||||
}
|
||||
|
||||
override fun dismissTextSizePicker() {
|
||||
textSizeDialog?.dismiss()
|
||||
textSizeDialog = null
|
||||
}
|
||||
|
||||
override fun showMmsSizePicker() {
|
||||
val recyclerView = RecyclerView(this)
|
||||
recyclerView.layoutManager = LinearLayoutManager(this)
|
||||
|
||||
@@ -34,6 +34,7 @@ data class SettingsState(
|
||||
val notificationsEnabled: Boolean = true,
|
||||
val deliveryEnabled: Boolean = false,
|
||||
val qkReplyEnabled: Boolean = Build.VERSION.SDK_INT < Build.VERSION_CODES.N,
|
||||
val textSizeSummary: String = "",
|
||||
val splitSmsEnabled: Boolean = false,
|
||||
val stripUnicodeEnabled: Boolean = false,
|
||||
val mmsEnabled: Boolean = true,
|
||||
|
||||
@@ -18,11 +18,10 @@
|
||||
*/
|
||||
package feature.settings
|
||||
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.subjects.Subject
|
||||
import common.base.QkView
|
||||
import common.widget.PreferenceView
|
||||
import feature.settings.SettingsState
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.subjects.Subject
|
||||
|
||||
interface SettingsView : QkView<SettingsState> {
|
||||
|
||||
@@ -31,6 +30,7 @@ interface SettingsView : QkView<SettingsState> {
|
||||
val viewQksmsPlusIntent: Subject<Unit>
|
||||
val startTimeSelectedIntent: Subject<Pair<Int, Int>>
|
||||
val endTimeSelectedIntent: Subject<Pair<Int, Int>>
|
||||
val textSizeSelectedIntent: Subject<Int>
|
||||
val mmsSizeSelectedIntent: Observable<Int>
|
||||
|
||||
fun showNightModeDialog()
|
||||
@@ -38,6 +38,8 @@ interface SettingsView : QkView<SettingsState> {
|
||||
fun showQksmsPlusSnackbar()
|
||||
fun showStartTimePicker(hour: Int, minute: Int)
|
||||
fun showEndTimePicker(hour: Int, minute: Int)
|
||||
fun showTextSizePicker()
|
||||
fun dismissTextSizePicker()
|
||||
fun showMmsSizePicker()
|
||||
fun dismissMmsSizePicker()
|
||||
}
|
||||
|
||||
@@ -82,6 +82,10 @@ class SettingsViewModel : QkViewModel<SettingsView, SettingsState>(SettingsState
|
||||
disposables += prefs.qkreply.asObservable()
|
||||
.subscribe { enabled -> newState { it.copy(qkReplyEnabled = enabled) } }
|
||||
|
||||
val textSizeLabels = context.resources.getStringArray(R.array.text_sizes)
|
||||
disposables += prefs.textSize.asObservable()
|
||||
.subscribe { textSize -> newState { it.copy(textSizeSummary = textSizeLabels[textSize]) } }
|
||||
|
||||
disposables += prefs.unicode.asObservable()
|
||||
.subscribe { enabled -> newState { it.copy(stripUnicodeEnabled = enabled) } }
|
||||
|
||||
@@ -136,6 +140,8 @@ class SettingsViewModel : QkViewModel<SettingsView, SettingsState>(SettingsState
|
||||
|
||||
R.id.qkreply -> prefs.qkreply.set(!prefs.qkreply.get())
|
||||
|
||||
R.id.textSize -> view.showTextSizePicker()
|
||||
|
||||
R.id.unicode -> prefs.unicode.set(!prefs.unicode.get())
|
||||
|
||||
R.id.mms -> prefs.mms.set(!prefs.mms.get())
|
||||
@@ -179,6 +185,11 @@ class SettingsViewModel : QkViewModel<SettingsView, SettingsState>(SettingsState
|
||||
.autoDisposable(view.scope())
|
||||
.subscribe { prefs.nightEnd.set(it) }
|
||||
|
||||
view.textSizeSelectedIntent
|
||||
.doOnNext { view.dismissTextSizePicker() }
|
||||
.autoDisposable(view.scope())
|
||||
.subscribe { prefs.textSize.set(it) }
|
||||
|
||||
view.mmsSizeSelectedIntent
|
||||
.doOnNext { view.dismissMmsSizePicker() }
|
||||
.autoDisposable(view.scope())
|
||||
|
||||
@@ -61,8 +61,13 @@ class MigratePreferences @Inject constructor(
|
||||
prefs.delivery.set(rxPrefs.getBoolean("pref_key_delivery", prefs.delivery.get()).get())
|
||||
}
|
||||
.doOnNext {
|
||||
// Quickreply
|
||||
prefs.qkreply.set(rxPrefs.getBoolean("pref_key_quickreply_enabled", prefs.qkreply.get()).get())
|
||||
}
|
||||
.doOnNext {
|
||||
// Font size
|
||||
prefs.textSize.set(rxPrefs.getString("pref_key_font_size", "${prefs.textSize.get()}").get().toInt())
|
||||
}
|
||||
.doOnNext {
|
||||
// Unicode
|
||||
prefs.unicode.set(rxPrefs.getBoolean("pref_key_strip_unicode", prefs.unicode.get()).get())
|
||||
|
||||
Reference in New Issue
Block a user