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

246 lines
8.3 KiB
Kotlin

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
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)
}
}
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)
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)
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)
views.tvAcct.text = acctPretty
val ac = daoAcctColor.load(acctAscii)
colorBg = ac.colorBg
colorFg = ac.colorFg
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() {
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 -> {
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 -> {
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 = ""
}
}
override fun onColorSelected(dialogId: Int, @ColorInt newColor: Int) {
when (dialogId) {
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)
}
}