This repository has been archived on 2026-05-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
text-basic/app/src/main/java/com/denizd/textbasic/fragment/SettingsNewFragment.kt
T

400 lines
13 KiB
Kotlin

package com.denizd.textbasic.fragment
import android.annotation.SuppressLint
import android.os.Bundle
import android.util.TypedValue
import android.view.View
import android.widget.ImageButton
import android.widget.PopupMenu
import android.widget.TextView
import androidx.annotation.ColorInt
import com.denizd.textbasic.BuildConfig
import com.denizd.textbasic.R
import com.denizd.textbasic.databinding.FragmentSettingsNewBinding
import com.denizd.textbasic.db.QuoteStorage
import com.denizd.textbasic.util.SettingsPreference
import com.denizd.textbasic.util.viewBinding
import com.denizd.textbasic.widget.CanvasText
import com.google.android.material.button.MaterialButton
class SettingsNewFragment : BaseFragment(R.layout.fragment_settings_new) {
private lateinit var storage: QuoteStorage
private val binding: FragmentSettingsNewBinding by viewBinding(FragmentSettingsNewBinding::bind)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
storage = QuoteStorage.getInstance(context)
// --- text font --- //
// binding.autoCompleteFont.setOnClickListener {
// // Create menu for selecting a new canteen
// PopupMenu(binding.root.context, binding.textLayoutFont).apply {
// setOnMenuItemClickListener { item ->
// item?.itemId?.let { id ->
// storage.setTypefaceStyle(id)
// }
//
// // Update the preview
// updatePreview()
// true
// }
// menu.add(0, 0, 0, getString(R.string.sansserif))
// menu.add(1, 1, 1, getString(R.string.serif))
// menu.add(2, 2, 2, getString(R.string.monospace))
// show()
// }
// }
// val fontAdapter = ArrayAdapter(
// context,
// R.layout.item_dropdown_menu,
// resources.getStringArray(R.array.text_fonts),
// )
//
// binding.autoCompleteFont.setAdapter(fontAdapter)
binding.autoCompleteFont
.setText(context.resources.getStringArray(R.array.text_fonts)[storage.getTypefaceIndex()])
binding.autoCompleteFont.setOnClickListener {
PopupMenu(binding.root.context, binding.autoCompleteFont).apply {
setOnMenuItemClickListener { item ->
item?.itemId?.let { id ->
val index = when (id) {
R.id.serif -> 1
R.id.monospace -> 2
else -> 0 // sans-serif
}
storage.setTypefaceIndex(index)
binding.autoCompleteFont
.setText(context.resources.getStringArray(R.array.text_fonts)[index])
}
// Refresh the canteen menu for the newly selected canteen
updatePreview()
true
}
inflate(R.menu.list_fonts)
show()
}
}
// --- font style --- //
binding.toggleGroupFont.apply {
check(when (storage.getTypefaceStyle()) {
1 -> R.id.toggle_button_font_bold
2 -> R.id.toggle_button_font_italic
3 -> R.id.toggle_button_font_bold_italic
else -> R.id.toggle_button_font_default
})
addOnButtonCheckedListener { _, checkedId, isChecked ->
if (isChecked) {
storage.setTypefaceStyle(when (checkedId) {
R.id.toggle_button_font_bold -> 1
R.id.toggle_button_font_italic -> 2
R.id.toggle_button_font_bold_italic -> 3
else -> 0
})
updatePreview()
}
}
}
// --- text size --- //
binding.textSize.text = storage.getInt(SettingsPreference.TEXT_SIZE, 18).toString()
binding.buttonSizeDecreaseFast.setOnClickAction(
4,
256,
isPositive = false,
isFast = true,
binding.textSize,
SettingsPreference.TEXT_SIZE,
)
binding.buttonSizeDecrease.setOnClickAction(
4,
256,
isPositive = false,
isFast = false,
binding.textSize,
SettingsPreference.TEXT_SIZE,
)
binding.buttonSizeIncrease.setOnClickAction(
4,
256,
isPositive = true,
isFast = false,
binding.textSize,
SettingsPreference.TEXT_SIZE,
)
binding.buttonSizeIncreaseFast.setOnClickAction(
4,
256,
isPositive = true,
isFast = true,
binding.textSize,
SettingsPreference.TEXT_SIZE,
)
// --- text transparency --- //
binding.textTransparency.text = storage.getInt(SettingsPreference.TEXT_TRANSPARENCY, 100).toString()
binding.buttonTextTransparencyDecreaseFast.setOnClickAction(
0,
100,
isPositive = false,
isFast = true,
binding.textTransparency,
SettingsPreference.TEXT_TRANSPARENCY,
)
binding.buttonTextTransparencyDecrease.setOnClickAction(
0,
100,
isPositive = false,
isFast = false,
binding.textTransparency,
SettingsPreference.TEXT_TRANSPARENCY,
)
binding.buttonTextTransparencyIncrease.setOnClickAction(
0,
100,
isPositive = true,
isFast = false,
binding.textTransparency,
SettingsPreference.TEXT_TRANSPARENCY,
)
binding.buttonTextTransparencyIncreaseFast.setOnClickAction(
0,
100,
isPositive = true,
isFast = true,
binding.textTransparency,
SettingsPreference.TEXT_TRANSPARENCY,
)
// --- highlight style --- //
binding.toggleGroupHighlightStyle.apply {
check(checkBackgroundIntensity(storage.getBackgroundType()))
addOnButtonCheckedListener { _, checkedId, isChecked ->
if (isChecked) {
when (checkedId) {
R.id.toggle_button_highlight_background -> {
storage.setBackgroundType(0)
checkBackgroundIntensity(0)
}
R.id.toggle_button_highlight_stroke -> {
storage.setBackgroundType(1)
checkBackgroundIntensity(1)
}
R.id.toggle_button_highlight_shadow -> {
storage.setBackgroundType(2)
checkBackgroundIntensity(2)
}
else -> {
storage.setBackgroundType(3)
checkBackgroundIntensity(3)
} // none
}
updatePreview()
}
}
}
// --- highlight intensity --- //
binding.textIntensity.text = storage.getInt(SettingsPreference.HIGHLIGHT_INTENSITY, 100).toString()
binding.buttonIntensityDecreaseFast.setOnClickAction(
0,
100,
isPositive = false,
isFast = true,
binding.textIntensity,
SettingsPreference.HIGHLIGHT_INTENSITY,
)
binding.buttonIntensityDecrease.setOnClickAction(
0,
100,
isPositive = false,
isFast = false,
binding.textIntensity,
SettingsPreference.HIGHLIGHT_INTENSITY,
)
binding.buttonIntensityIncrease.setOnClickAction(
0,
100,
isPositive = true,
isFast = false,
binding.textIntensity,
SettingsPreference.HIGHLIGHT_INTENSITY,
)
binding.buttonIntensityIncreaseFast.setOnClickAction(
0,
100,
isPositive = true,
isFast = true,
binding.textIntensity,
SettingsPreference.HIGHLIGHT_INTENSITY,
)
// --- text highlight transparency --- //
binding.textHighlightTransparency.text = storage.getInt(SettingsPreference.HIGHLIGHT_TRANSPARENCY, 100).toString()
binding.buttonHighlightTransparencyDecreaseFast.setOnClickAction(
0,
100,
isPositive = false,
isFast = true,
binding.textHighlightTransparency,
SettingsPreference.HIGHLIGHT_TRANSPARENCY,
)
binding.buttonHighlightTransparencyDecrease.setOnClickAction(
0,
100,
isPositive = false,
isFast = false,
binding.textHighlightTransparency,
SettingsPreference.HIGHLIGHT_TRANSPARENCY,
)
binding.buttonHighlightTransparencyIncrease.setOnClickAction(
0,
100,
isPositive = true,
isFast = false,
binding.textHighlightTransparency,
SettingsPreference.HIGHLIGHT_TRANSPARENCY,
)
binding.buttonHighlightTransparencyIncreaseFast.setOnClickAction(
0,
100,
isPositive = true,
isFast = true,
binding.textHighlightTransparency,
SettingsPreference.HIGHLIGHT_TRANSPARENCY,
)
// --- randomise order entries --- //
binding.switchOrderRandom.apply {
isChecked = storage.isOrderRandom()
setOnCheckedChangeListener { _, isChecked ->
storage.setIsOrderRandom(isChecked)
}
}
// --- widget position (gravity) --- //
val gravityButtons = listOf(
binding.buttonTopLeft, binding.buttonTopMiddle, binding.buttonTopRight,
binding.buttonMiddleLeft, binding.buttonMiddleMiddle, binding.buttonMiddleRight,
binding.buttonBottomLeft, binding.buttonBottomMiddle, binding.buttonBottomRight
)
setGravityButtons(gravityButtons, storage.getWidgetGravity())
gravityButtons.forEachIndexed { index, button ->
button.setOnClickListener {
storage.setWidgetGravity(index)
setGravityButtons(gravityButtons, index)
updatePreview()
}
}
/*
* Display the app's version as set in the build.gradle. Also display if the app is a
* development version, and if so, display build timestamp.
*/
@SuppressLint("SetTextI18n")
binding.appVersionText.text =
"${BuildConfig.VERSION_NAME}-${if (BuildConfig.DEBUG) "dev" else "release"}"
updatePreview()
}
private fun setGravityButtons(buttons: List<ImageButton>, gravity: Int) {
val transparent = context.getColor(android.R.color.transparent)
buttons.forEach { button ->
button.setBackgroundColor(transparent)
}
val typedValue = TypedValue()
context.theme.resolveAttribute(R.attr.colorSecContainer, typedValue, true)
@ColorInt val colorTertiary = typedValue.data
buttons[gravity].setBackgroundColor(colorTertiary)
}
/**
* Retrieves which button to check for the highlight, and sets the visibility of the intensity
* modifying layout accordingly.
*/
private fun checkBackgroundIntensity(index: Int): Int = when (index) {
0 -> { // background
binding.layoutIntensity.visibility = View.GONE
R.id.toggle_button_highlight_background
}
1 -> { // stroke
binding.layoutIntensity.visibility = View.VISIBLE
R.id.toggle_button_highlight_stroke
}
2 -> { // shadow
binding.layoutIntensity.visibility = View.VISIBLE
R.id.toggle_button_highlight_shadow
}
else -> { // none
binding.layoutIntensity.visibility = View.GONE
R.id.toggle_button_highlight_none
}
}
// TODO horrible, horrible, horrible function. but it works. fix this in the future. please.
private fun MaterialButton.setOnClickAction(
min: Int,
max: Int,
isPositive: Boolean,
isFast: Boolean,
textField: TextView,
pref: SettingsPreference,
) {
setOnClickListener {
var value = storage.getInt(pref)
if (isFast) {
if (isPositive) {
if ((value + 10) > max) {
value = max
} else {
value += 10
}
} else {
if ((value - 10) < min) {
value = min
} else {
value -= 10
}
}
} else {
if (isPositive && (value != max)) value += 1
if (!isPositive && (value != min)) value -= 1
}
storage.setInt(pref, value)
textField.text = value.toString()
updatePreview()
}
}
private fun updatePreview() {
val bitmap = CanvasText.drawText(context, true)
binding.textPreview.setImageBitmap(bitmap)
}
}