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

246 lines
8.3 KiB
Kotlin
Raw Normal View History

package jp.juggler.subwaytooter
import android.app.Activity
import android.content.Intent
import android.media.RingtoneManager
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import androidx.annotation.ColorInt
import androidx.appcompat.app.AppCompatActivity
import com.jrummyapps.android.colorpicker.ColorPickerDialog
import com.jrummyapps.android.colorpicker.ColorPickerDialogListener
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
import jp.juggler.util.ui.*
import org.jetbrains.anko.backgroundColor
import org.jetbrains.anko.textColor
class ActNickname : AppCompatActivity(), View.OnClickListener, ColorPickerDialogListener {
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(
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) {
val builder: ColorPickerDialog.Builder
when (v.id) {
R.id.btnTextColorEdit -> {
2022-08-11 09:51:49 +02:00
views.etNickname.hideKeyboard()
builder = ColorPickerDialog.newBuilder()
.setDialogType(ColorPickerDialog.TYPE_CUSTOM)
.setAllowPresets(true)
.setShowAlphaSlider(false)
.setDialogId(1)
if (colorFg != 0) builder.setColor(colorFg)
builder.show(this)
}
R.id.btnTextColorReset -> {
colorFg = 0
show()
}
R.id.btnBackgroundColorEdit -> {
2022-08-11 09:51:49 +02:00
views.etNickname.hideKeyboard()
builder = ColorPickerDialog.newBuilder()
.setDialogType(ColorPickerDialog.TYPE_CUSTOM)
.setAllowPresets(true)
.setShowAlphaSlider(false)
.setDialogId(2)
if (colorBg != 0) builder.setColor(colorBg)
builder.show(this)
}
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 = ""
}
}
2021-11-20 13:16:56 +01:00
override fun onColorSelected(dialogId: Int, @ColorInt newColor: Int) {
when (dialogId) {
2021-11-20 13:16:56 +01:00
1 -> colorFg = -0x1000000 or newColor
2 -> colorBg = -0x1000000 or newColor
}
show()
}
override fun onDialogDismissed(dialogId: Int) {}
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)
}
}