2018-01-04 19:52:25 +01:00
|
|
|
|
package jp.juggler.subwaytooter
|
|
|
|
|
|
|
|
|
|
import android.app.Activity
|
2021-05-22 11:07:23 +02:00
|
|
|
|
import android.app.AlertDialog
|
2018-01-04 19:52:25 +01:00
|
|
|
|
import android.content.Intent
|
2019-01-18 16:33:53 +01:00
|
|
|
|
import android.graphics.Color
|
2018-01-04 19:52:25 +01:00
|
|
|
|
import android.media.RingtoneManager
|
|
|
|
|
import android.os.Bundle
|
|
|
|
|
import android.widget.CompoundButton
|
2020-09-08 02:50:08 +02:00
|
|
|
|
import androidx.appcompat.app.AppCompatActivity
|
2018-01-04 19:52:25 +01:00
|
|
|
|
import com.jrummyapps.android.colorpicker.ColorPickerDialog
|
|
|
|
|
import com.jrummyapps.android.colorpicker.ColorPickerDialogListener
|
2023-01-14 21:37:23 +01:00
|
|
|
|
import jp.juggler.subwaytooter.databinding.ActHighlightEditBinding
|
2018-01-04 19:52:25 +01:00
|
|
|
|
import jp.juggler.subwaytooter.table.HighlightWord
|
2023-02-04 21:52:26 +01:00
|
|
|
|
import jp.juggler.subwaytooter.table.daoHighlightWord
|
2023-01-13 13:22:25 +01:00
|
|
|
|
import jp.juggler.util.backPressed
|
2023-02-04 21:52:26 +01:00
|
|
|
|
import jp.juggler.util.coroutine.launchAndShowError
|
2023-01-13 13:22:25 +01:00
|
|
|
|
import jp.juggler.util.data.decodeJsonObject
|
|
|
|
|
import jp.juggler.util.data.mayUri
|
|
|
|
|
import jp.juggler.util.data.notEmpty
|
|
|
|
|
import jp.juggler.util.data.notZero
|
|
|
|
|
import jp.juggler.util.log.LogCategory
|
|
|
|
|
import jp.juggler.util.log.showToast
|
2023-01-14 21:37:23 +01:00
|
|
|
|
import jp.juggler.util.long
|
|
|
|
|
import jp.juggler.util.string
|
|
|
|
|
import jp.juggler.util.ui.*
|
2019-01-18 16:33:53 +01:00
|
|
|
|
import org.jetbrains.anko.textColor
|
2018-01-04 19:52:25 +01:00
|
|
|
|
|
2018-01-21 13:46:36 +01:00
|
|
|
|
class ActHighlightWordEdit
|
2021-05-22 00:03:16 +02:00
|
|
|
|
: AppCompatActivity(),
|
|
|
|
|
ColorPickerDialogListener,
|
|
|
|
|
CompoundButton.OnCheckedChangeListener {
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
|
|
|
|
|
internal val log = LogCategory("ActHighlightWordEdit")
|
|
|
|
|
|
|
|
|
|
private const val COLOR_DIALOG_ID_TEXT = 1
|
|
|
|
|
private const val COLOR_DIALOG_ID_BACKGROUND = 2
|
|
|
|
|
|
2021-05-22 11:07:23 +02:00
|
|
|
|
private const val STATE_ITEM = "item"
|
|
|
|
|
private const val EXTRA_ITEM_ID = "itemId"
|
|
|
|
|
private const val EXTRA_INITIAL_TEXT = "initialText"
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
fun createIntent(activity: Activity, itemId: Long) =
|
2021-05-22 11:07:23 +02:00
|
|
|
|
Intent(activity, ActHighlightWordEdit::class.java).apply {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
putExtra(EXTRA_ITEM_ID, itemId)
|
2021-05-22 11:07:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
fun createIntent(activity: Activity, initialText: String) =
|
2021-05-22 00:03:16 +02:00
|
|
|
|
Intent(activity, ActHighlightWordEdit::class.java).apply {
|
2021-05-22 11:07:23 +02:00
|
|
|
|
putExtra(EXTRA_INITIAL_TEXT, initialText)
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal lateinit var item: HighlightWord
|
|
|
|
|
|
2023-01-14 21:37:23 +01:00
|
|
|
|
private val views by lazy {
|
|
|
|
|
ActHighlightEditBinding.inflate(layoutInflater)
|
|
|
|
|
}
|
2021-05-22 00:03:16 +02:00
|
|
|
|
|
|
|
|
|
private var bBusy = false
|
|
|
|
|
|
2022-08-06 00:52:31 +02:00
|
|
|
|
private val arNotificationSound = ActivityResultHandler(log) { r ->
|
2023-01-13 13:22:25 +01:00
|
|
|
|
r.decodeRingtonePickerResult?.let { uri ->
|
2022-08-06 00:52:31 +02:00
|
|
|
|
item.sound_uri = uri.toString()
|
|
|
|
|
item.sound_type = HighlightWord.SOUND_TYPE_CUSTOM
|
|
|
|
|
showSound()
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
2023-01-13 13:22:25 +01:00
|
|
|
|
backPressed {
|
2022-12-26 16:04:32 +01:00
|
|
|
|
AlertDialog.Builder(this)
|
|
|
|
|
.setCancelable(true)
|
|
|
|
|
.setMessage(R.string.discard_changes)
|
|
|
|
|
.setPositiveButton(R.string.no, null)
|
|
|
|
|
.setNegativeButton(R.string.yes) { _, _ -> finish() }
|
|
|
|
|
.show()
|
|
|
|
|
}
|
2021-05-22 00:03:16 +02:00
|
|
|
|
super.onCreate(savedInstanceState)
|
2022-08-06 00:52:31 +02:00
|
|
|
|
arNotificationSound.register(this)
|
2021-05-22 00:03:16 +02:00
|
|
|
|
App1.setActivityTheme(this)
|
|
|
|
|
initUI()
|
|
|
|
|
|
2021-05-22 11:07:23 +02:00
|
|
|
|
setResult(RESULT_CANCELED)
|
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
launchAndShowError {
|
|
|
|
|
fun loadData(): HighlightWord? {
|
|
|
|
|
savedInstanceState?.getString(STATE_ITEM)
|
|
|
|
|
?.decodeJsonObject()
|
|
|
|
|
?.let { return HighlightWord(it) }
|
2021-05-22 00:03:16 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
intent?.string(EXTRA_INITIAL_TEXT)
|
|
|
|
|
?.let { return HighlightWord(it) }
|
2021-05-22 11:07:23 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
intent?.long(EXTRA_ITEM_ID)
|
|
|
|
|
?.let { return daoHighlightWord.load(it) }
|
2021-05-22 11:07:23 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
return null
|
|
|
|
|
}
|
2021-05-22 11:07:23 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
val item = loadData()
|
|
|
|
|
if (item == null) {
|
|
|
|
|
log.d("missing source data")
|
|
|
|
|
finish()
|
|
|
|
|
return@launchAndShowError
|
|
|
|
|
}
|
2021-05-22 00:03:16 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
this@ActHighlightWordEdit.item = item
|
2021-05-22 11:07:23 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
views.etName.setText(item.name)
|
|
|
|
|
showSound()
|
|
|
|
|
showColor()
|
|
|
|
|
}
|
2021-05-22 11:07:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onSaveInstanceState(outState: Bundle) {
|
|
|
|
|
super.onSaveInstanceState(outState)
|
|
|
|
|
try {
|
|
|
|
|
// ui may not initialized yet.
|
|
|
|
|
uiToData()
|
2021-06-20 15:12:25 +02:00
|
|
|
|
} catch (ex: Throwable) {
|
|
|
|
|
log.e(ex, "uiToData failed.")
|
2021-05-22 11:07:23 +02:00
|
|
|
|
}
|
2021-06-20 15:12:25 +02:00
|
|
|
|
item.encodeJson().toString().let { outState.putString(STATE_ITEM, it) }
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun initUI() {
|
2023-01-14 21:37:23 +01:00
|
|
|
|
setContentView(views.root)
|
|
|
|
|
setSupportActionBar(views.toolbar)
|
|
|
|
|
setNavigationBack(views.toolbar)
|
|
|
|
|
fixHorizontalMargin(views.llContent)
|
|
|
|
|
|
|
|
|
|
views.swSound.setOnCheckedChangeListener(this)
|
|
|
|
|
views.swSpeech.setOnCheckedChangeListener(this)
|
|
|
|
|
|
|
|
|
|
setSwitchColor(views.swSound)
|
|
|
|
|
setSwitchColor(views.swSpeech)
|
|
|
|
|
|
|
|
|
|
views.btnDiscard.setOnClickListener { finish() }
|
|
|
|
|
views.btnSave.setOnClickListener { save() }
|
|
|
|
|
views.btnTextColorEdit.setOnClickListener {
|
|
|
|
|
openColorPicker(
|
|
|
|
|
COLOR_DIALOG_ID_TEXT,
|
|
|
|
|
item.color_fg
|
|
|
|
|
)
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
2023-01-14 21:37:23 +01:00
|
|
|
|
views.btnTextColorReset.setOnClickListener {
|
|
|
|
|
item.color_fg = 0
|
|
|
|
|
showColor()
|
|
|
|
|
}
|
|
|
|
|
views.btnBackgroundColorEdit.setOnClickListener {
|
|
|
|
|
openColorPicker(
|
|
|
|
|
COLOR_DIALOG_ID_BACKGROUND,
|
|
|
|
|
item.color_bg
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
views.btnBackgroundColorReset.setOnClickListener {
|
|
|
|
|
item.color_bg = 0
|
|
|
|
|
showColor()
|
|
|
|
|
}
|
|
|
|
|
views.btnNotificationSoundEdit.setOnClickListener { openNotificationSoundPicker() }
|
|
|
|
|
views.btnNotificationSoundReset.setOnClickListener {
|
|
|
|
|
item.sound_uri = null
|
|
|
|
|
item.sound_type = when {
|
|
|
|
|
views.swSound.isChecked -> HighlightWord.SOUND_TYPE_DEFAULT
|
|
|
|
|
else -> HighlightWord.SOUND_TYPE_NONE
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
2023-01-14 21:37:23 +01:00
|
|
|
|
showSound()
|
|
|
|
|
}
|
|
|
|
|
views.btnNotificationSoundTest.setOnClickListener {
|
|
|
|
|
ActHighlightWordList.sound(this, item)
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) {
|
|
|
|
|
if (bBusy) return
|
2021-05-22 11:07:23 +02:00
|
|
|
|
uiToData()
|
2023-01-14 21:37:23 +01:00
|
|
|
|
showSound()
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
private fun openColorPicker(id: Int, initialColor: Int) {
|
2021-05-22 00:03:16 +02:00
|
|
|
|
val builder = ColorPickerDialog.newBuilder()
|
|
|
|
|
.setDialogType(ColorPickerDialog.TYPE_CUSTOM)
|
|
|
|
|
.setAllowPresets(true)
|
|
|
|
|
.setShowAlphaSlider(id == COLOR_DIALOG_ID_BACKGROUND)
|
|
|
|
|
.setDialogId(id)
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (initialColor != 0) builder.setColor(initialColor)
|
2021-05-22 00:03:16 +02:00
|
|
|
|
|
|
|
|
|
builder.show(this)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onDialogDismissed(dialogId: Int) {}
|
|
|
|
|
|
2021-11-20 13:16:56 +01:00
|
|
|
|
override fun onColorSelected(dialogId: Int, newColor: Int) {
|
2021-05-22 00:03:16 +02:00
|
|
|
|
when (dialogId) {
|
2021-11-20 13:16:56 +01:00
|
|
|
|
COLOR_DIALOG_ID_TEXT -> item.color_fg = newColor or Color.BLACK
|
|
|
|
|
COLOR_DIALOG_ID_BACKGROUND -> item.color_bg = newColor.notZero() ?: 0x01000000
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
2021-05-22 11:07:23 +02:00
|
|
|
|
showColor()
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
private fun showSound() {
|
2021-05-22 11:07:23 +02:00
|
|
|
|
bBusy = true
|
|
|
|
|
try {
|
2023-01-14 21:37:23 +01:00
|
|
|
|
val isSoundEnabled = item.sound_type != HighlightWord.SOUND_TYPE_NONE
|
|
|
|
|
views.btnNotificationSoundTest.isEnabledAlpha = isSoundEnabled
|
|
|
|
|
views.swSound.isChecked = isSoundEnabled
|
|
|
|
|
views.swSpeech.isChecked = item.speech != 0
|
2021-05-22 11:07:23 +02:00
|
|
|
|
} finally {
|
|
|
|
|
bBusy = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
private fun showColor() {
|
2021-05-22 11:07:23 +02:00
|
|
|
|
bBusy = true
|
|
|
|
|
try {
|
2023-01-14 21:37:23 +01:00
|
|
|
|
views.etName.setBackgroundColor(item.color_bg) // may 0
|
|
|
|
|
views.etName.textColor =
|
|
|
|
|
item.color_fg.notZero() ?: attrColor(android.R.attr.textColorPrimary)
|
2021-05-22 11:07:23 +02:00
|
|
|
|
} finally {
|
|
|
|
|
bBusy = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-22 00:03:16 +02:00
|
|
|
|
private fun openNotificationSoundPicker() {
|
|
|
|
|
val intent = Intent(RingtoneManager.ACTION_RINGTONE_PICKER)
|
|
|
|
|
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION)
|
|
|
|
|
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, R.string.notification_sound)
|
|
|
|
|
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false)
|
|
|
|
|
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false)
|
|
|
|
|
|
|
|
|
|
item.sound_uri.mayUri()?.let { uri ->
|
|
|
|
|
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, uri)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val chooser = Intent.createChooser(intent, getString(R.string.notification_sound))
|
2021-05-22 11:07:23 +02:00
|
|
|
|
arNotificationSound.launch(chooser)
|
|
|
|
|
}
|
2021-05-22 00:03:16 +02:00
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
private fun uiToData() {
|
2023-01-14 21:37:23 +01:00
|
|
|
|
item.name = views.etName.text.toString().trim { it <= ' ' || it == ' ' }
|
2021-05-22 00:03:16 +02:00
|
|
|
|
|
2021-05-22 11:07:23 +02:00
|
|
|
|
item.sound_type = when {
|
2023-01-14 21:37:23 +01:00
|
|
|
|
!views.swSound.isChecked -> HighlightWord.SOUND_TYPE_NONE
|
2021-05-22 11:07:23 +02:00
|
|
|
|
item.sound_uri?.notEmpty() == null -> HighlightWord.SOUND_TYPE_DEFAULT
|
|
|
|
|
else -> HighlightWord.SOUND_TYPE_CUSTOM
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-14 21:37:23 +01:00
|
|
|
|
item.speech = when (views.swSpeech.isChecked) {
|
2021-05-22 11:07:23 +02:00
|
|
|
|
false -> 0
|
|
|
|
|
else -> 1
|
|
|
|
|
}
|
2021-05-22 00:03:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
private fun save() {
|
2023-02-04 21:52:26 +01:00
|
|
|
|
launchAndShowError {
|
|
|
|
|
uiToData()
|
|
|
|
|
val name = item.name
|
2021-05-22 11:07:23 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
if (name.isNullOrBlank()) {
|
|
|
|
|
showToast(true, R.string.cant_leave_empty_keyword)
|
|
|
|
|
return@launchAndShowError
|
|
|
|
|
}
|
2021-05-22 11:07:23 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
val other = daoHighlightWord.load(name)
|
|
|
|
|
if (other != null && other.id != item.id) {
|
|
|
|
|
showToast(true, R.string.cant_save_duplicated_keyword)
|
|
|
|
|
return@launchAndShowError
|
|
|
|
|
}
|
2021-05-22 11:07:23 +02:00
|
|
|
|
|
2023-02-04 21:52:26 +01:00
|
|
|
|
daoHighlightWord.save(applicationContext, item)
|
|
|
|
|
App1.getAppState(applicationContext).enableSpeech()
|
|
|
|
|
showToast(false, R.string.saved)
|
|
|
|
|
setResult(RESULT_OK)
|
|
|
|
|
finish()
|
|
|
|
|
}
|
2021-05-22 11:07:23 +02:00
|
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
|
}
|