SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/ActNickname.kt

237 lines
7.9 KiB
Kotlin
Raw Normal View History

package jp.juggler.subwaytooter
import android.app.Activity
import android.content.Intent
2024-03-17 11:05:30 +01:00
import android.graphics.Color
import android.media.RingtoneManager
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import androidx.appcompat.app.AppCompatActivity
2024-03-17 11:05:30 +01:00
import com.jrummyapps.android.colorpicker.dialogColorPicker
import jp.juggler.subwaytooter.api.entity.Acct
2022-08-11 09:51:49 +02:00
import jp.juggler.subwaytooter.databinding.ActNicknameBinding
import jp.juggler.subwaytooter.table.AcctColor
import jp.juggler.subwaytooter.table.daoAcctColor
import jp.juggler.util.backPressed
import jp.juggler.util.boolean
import jp.juggler.util.coroutine.launchAndShowError
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.string
2024-03-17 11:05:30 +01:00
import jp.juggler.util.ui.ActivityResultHandler
import jp.juggler.util.ui.attrColor
import jp.juggler.util.ui.decodeRingtonePickerResult
import jp.juggler.util.ui.hideKeyboard
import jp.juggler.util.ui.isEnabledAlpha
import jp.juggler.util.ui.setNavigationBack
import jp.juggler.util.ui.vg
import org.jetbrains.anko.backgroundColor
import org.jetbrains.anko.textColor
2024-03-17 11:05:30 +01:00
class ActNickname : AppCompatActivity(), View.OnClickListener {
companion object {
private val log = LogCategory("ActNickname")
internal const val EXTRA_ACCT_ASCII = "acctAscii"
internal const val EXTRA_ACCT_PRETTY = "acctPretty"
internal const val EXTRA_SHOW_NOTIFICATION_SOUND = "show_notification_sound"
fun createIntent(
activity: Activity,
fullAcct: Acct,
bShowNotificationSound: Boolean,
) = Intent(activity, ActNickname::class.java).apply {
putExtra(EXTRA_ACCT_ASCII, fullAcct.ascii)
putExtra(EXTRA_ACCT_PRETTY, fullAcct.pretty)
putExtra(EXTRA_SHOW_NOTIFICATION_SOUND, bShowNotificationSound)
}
}
2022-08-11 09:51:49 +02:00
private val views by lazy {
ActNicknameBinding.inflate(layoutInflater)
}
private val acctAscii by lazy {
intent?.string(EXTRA_ACCT_ASCII)!!
}
private val acctPretty by lazy {
intent?.string(EXTRA_ACCT_PRETTY)!!
}
private val showNotificationSound by lazy {
intent?.boolean(EXTRA_SHOW_NOTIFICATION_SOUND) ?: false
}
private var colorFg = 0
private var colorBg = 0
private var notificationSoundUri: String? = null
private var loadingBusy = false
private val arNotificationSound = ActivityResultHandler(log) { r ->
r.decodeRingtonePickerResult?.let { uri ->
notificationSoundUri = uri.toString()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
2022-09-10 23:09:26 +02:00
backPressed {
setResult(RESULT_OK)
finish()
}
arNotificationSound.register(this)
App1.setActivityTheme(this)
initUI()
load()
}
private fun initUI() {
setContentView(views.root)
setSupportActionBar(views.toolbar)
setNavigationBack(views.toolbar)
supportActionBar?.subtitle = getString(
when {
showNotificationSound -> R.string.nickname_and_color_and_notification_sound
else -> R.string.nickname_and_color
}
)
fixHorizontalMargin(views.llContent)
2022-08-11 09:51:49 +02:00
views.btnTextColorEdit.setOnClickListener(this)
views.btnTextColorReset.setOnClickListener(this)
views.btnBackgroundColorEdit.setOnClickListener(this)
views.btnBackgroundColorReset.setOnClickListener(this)
views.btnSave.setOnClickListener(this)
views.btnDiscard.setOnClickListener(this)
views.btnNotificationSoundEdit.setOnClickListener(this)
views.btnNotificationSoundReset.setOnClickListener(this)
views.btnNotificationSoundEdit.isEnabledAlpha = false
views.btnNotificationSoundReset.isEnabledAlpha = false
views.etNickname.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(
s: CharSequence,
start: Int,
count: Int,
after: Int,
) {
}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable) {
show()
}
})
}
private fun load() {
loadingBusy = true
views.llNotificationSound.vg(showNotificationSound)
2022-08-11 09:51:49 +02:00
views.tvAcct.text = acctPretty
val ac = daoAcctColor.load(acctAscii)
colorBg = ac.colorBg
colorFg = ac.colorFg
2022-08-11 09:51:49 +02:00
views.etNickname.setText(ac.nickname)
notificationSoundUri = ac.notificationSound
loadingBusy = false
show()
}
private fun save() {
if (loadingBusy) return
launchAndShowError {
daoAcctColor.save(
System.currentTimeMillis(),
AcctColor(
acctAscii = acctAscii,
nicknameSave = views.etNickname.text.toString().trim { it <= ' ' },
colorFg = colorFg,
colorBg = colorBg,
notificationSoundSaved = notificationSoundUri ?: "",
)
)
}
}
private fun show() {
2022-08-11 09:51:49 +02:00
val s = views.etNickname.text.toString().trim { it <= ' ' }
views.tvPreview.text = s.notEmpty() ?: acctPretty
views.tvPreview.textColor = colorFg.notZero() ?: attrColor(R.attr.colorTimeSmall)
views.tvPreview.backgroundColor = colorBg
}
override fun onClick(v: View) {
when (v.id) {
2024-03-17 11:05:30 +01:00
R.id.btnTextColorEdit -> launchAndShowError {
2022-08-11 09:51:49 +02:00
views.etNickname.hideKeyboard()
2024-03-17 11:05:30 +01:00
colorFg = Color.BLACK or dialogColorPicker(
colorInitial = colorFg.notZero(),
alphaEnabled = false
)
show()
}
R.id.btnTextColorReset -> {
colorFg = 0
show()
}
2024-03-17 11:05:30 +01:00
R.id.btnBackgroundColorEdit -> launchAndShowError {
2022-08-11 09:51:49 +02:00
views.etNickname.hideKeyboard()
2024-03-17 11:05:30 +01:00
colorBg = Color.BLACK or dialogColorPicker(
colorInitial = colorBg.notZero(),
alphaEnabled = false,
)
show()
}
R.id.btnBackgroundColorReset -> {
colorBg = 0
show()
}
R.id.btnSave -> {
save()
setResult(Activity.RESULT_OK)
finish()
}
R.id.btnDiscard -> {
setResult(Activity.RESULT_CANCELED)
finish()
}
R.id.btnNotificationSoundEdit -> openNotificationSoundPicker()
R.id.btnNotificationSoundReset -> notificationSoundUri = ""
}
}
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)
notificationSoundUri.mayUri()?.let {
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, it)
}
val chooser = Intent.createChooser(intent, getString(R.string.notification_sound))
arNotificationSound.launch(chooser)
}
}