mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
173 lines
No EOL
6.7 KiB
Kotlin
173 lines
No EOL
6.7 KiB
Kotlin
package com.geeksville.mesh.ui
|
|
|
|
import android.content.Context
|
|
import android.os.Bundle
|
|
import android.view.LayoutInflater
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import android.widget.EditText
|
|
import android.widget.ImageView
|
|
import androidx.core.widget.addTextChangedListener
|
|
import androidx.fragment.app.activityViewModels
|
|
import androidx.lifecycle.asLiveData
|
|
import androidx.recyclerview.widget.ItemTouchHelper
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
import com.geeksville.mesh.android.Logging
|
|
import com.geeksville.mesh.R
|
|
import com.geeksville.mesh.database.entity.QuickChatAction
|
|
import com.geeksville.mesh.databinding.QuickChatSettingsFragmentBinding
|
|
import com.geeksville.mesh.model.UIViewModel
|
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
import com.google.android.material.switchmaterial.SwitchMaterial
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
import java.util.*
|
|
|
|
@AndroidEntryPoint
|
|
class QuickChatSettingsFragment : ScreenFragment("Quick Chat Settings"), Logging {
|
|
private var _binding: QuickChatSettingsFragmentBinding? = null
|
|
|
|
private val binding get() = _binding!!
|
|
|
|
private val model: UIViewModel by activityViewModels()
|
|
|
|
private lateinit var actions: List<QuickChatAction>
|
|
|
|
override fun onCreateView(
|
|
inflater: LayoutInflater, container: ViewGroup?,
|
|
savedInstanceState: Bundle?
|
|
): View {
|
|
_binding = QuickChatSettingsFragmentBinding.inflate(inflater, container, false)
|
|
return binding.root
|
|
}
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
binding.quickChatSettingsCreateButton.setOnClickListener {
|
|
val builder = createEditDialog(requireContext(), getString(R.string.quick_chat_new))
|
|
|
|
builder.builder.setPositiveButton(R.string.add) { _, _ ->
|
|
|
|
val name = builder.nameInput.text.toString().trim()
|
|
val message = builder.messageInput.text.toString()
|
|
if (builder.isNotEmpty())
|
|
model.addQuickChatAction(
|
|
name, message,
|
|
if (builder.modeSwitch.isChecked) QuickChatAction.Mode.Instant else QuickChatAction.Mode.Append
|
|
)
|
|
}
|
|
|
|
val dialog = builder.builder.create()
|
|
dialog.show()
|
|
}
|
|
|
|
val quickChatActionAdapter =
|
|
QuickChatActionAdapter(requireContext(), { action: QuickChatAction ->
|
|
val builder = createEditDialog(requireContext(), getString(R.string.quick_chat_edit))
|
|
builder.nameInput.setText(action.name)
|
|
builder.messageInput.setText(action.message)
|
|
val isInstant = action.mode == QuickChatAction.Mode.Instant
|
|
builder.modeSwitch.isChecked = isInstant
|
|
builder.instantImage.visibility = if (isInstant) View.VISIBLE else View.INVISIBLE
|
|
|
|
builder.builder.setNegativeButton(R.string.delete) { _, _ ->
|
|
model.deleteQuickChatAction(action)
|
|
}
|
|
builder.builder.setPositiveButton(R.string.save) { _, _ ->
|
|
if (builder.isNotEmpty()) {
|
|
model.updateQuickChatAction(
|
|
action,
|
|
builder.nameInput.text.toString(),
|
|
builder.messageInput.text.toString(),
|
|
if (builder.modeSwitch.isChecked) QuickChatAction.Mode.Instant else QuickChatAction.Mode.Append
|
|
)
|
|
}
|
|
}
|
|
val dialog = builder.builder.create()
|
|
dialog.show()
|
|
}, { fromPos, toPos ->
|
|
Collections.swap(actions, fromPos, toPos)
|
|
}, {
|
|
model.updateActionPositions(actions)
|
|
})
|
|
|
|
val dragCallback =
|
|
DragManageAdapter(quickChatActionAdapter, ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0)
|
|
val helper = ItemTouchHelper(dragCallback)
|
|
|
|
binding.quickChatSettingsView.apply {
|
|
this.layoutManager = LinearLayoutManager(requireContext())
|
|
this.adapter = quickChatActionAdapter
|
|
helper.attachToRecyclerView(this)
|
|
}
|
|
|
|
model.quickChatActions.asLiveData().observe(viewLifecycleOwner) { actions ->
|
|
actions?.let {
|
|
quickChatActionAdapter.setActions(actions)
|
|
this.actions = actions
|
|
}
|
|
}
|
|
}
|
|
|
|
data class DialogBuilder(
|
|
val builder: MaterialAlertDialogBuilder,
|
|
val nameInput: EditText,
|
|
val messageInput: EditText,
|
|
val modeSwitch: SwitchMaterial,
|
|
val instantImage: ImageView
|
|
) {
|
|
fun isNotEmpty(): Boolean = nameInput.text.isNotEmpty() and messageInput.text.isNotEmpty()
|
|
}
|
|
|
|
private fun getMessageName(message: String): String {
|
|
return if (message.length <= 3) {
|
|
message.uppercase()
|
|
} else {
|
|
buildString {
|
|
append(message.first().uppercase())
|
|
append(message[message.length / 2].uppercase())
|
|
append(message.last().uppercase())
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun createEditDialog(context: Context, title: String): DialogBuilder {
|
|
val builder = MaterialAlertDialogBuilder(context)
|
|
builder.setTitle(title)
|
|
|
|
val layout =
|
|
LayoutInflater.from(requireContext()).inflate(R.layout.dialog_add_quick_chat, null)
|
|
|
|
val nameInput: EditText = layout.findViewById(R.id.addQuickChatName)
|
|
val messageInput: EditText = layout.findViewById(R.id.addQuickChatMessage)
|
|
val modeSwitch: SwitchMaterial = layout.findViewById(R.id.addQuickChatMode)
|
|
val instantImage: ImageView = layout.findViewById(R.id.addQuickChatInsant)
|
|
instantImage.visibility = if (modeSwitch.isChecked) View.VISIBLE else View.INVISIBLE
|
|
|
|
var nameHasChanged = false
|
|
|
|
modeSwitch.setOnCheckedChangeListener { _, _ ->
|
|
if (modeSwitch.isChecked) {
|
|
modeSwitch.setText(R.string.quick_chat_instant)
|
|
instantImage.visibility = View.VISIBLE
|
|
} else {
|
|
modeSwitch.setText(R.string.quick_chat_append)
|
|
instantImage.visibility = View.INVISIBLE
|
|
}
|
|
}
|
|
|
|
messageInput.addTextChangedListener { text ->
|
|
if (!nameHasChanged) {
|
|
nameInput.setText(getMessageName(text.toString()))
|
|
}
|
|
}
|
|
|
|
nameInput.addTextChangedListener {
|
|
if (nameInput.isFocused) nameHasChanged = true
|
|
}
|
|
|
|
builder.setView(layout)
|
|
|
|
return DialogBuilder(builder, nameInput, messageInput, modeSwitch, instantImage)
|
|
}
|
|
} |