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

102 lines
3.5 KiB
Kotlin

package jp.juggler.subwaytooter.dialog
import android.app.Activity
import android.app.Dialog
import android.content.ClipboardManager
import android.view.WindowManager
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import androidx.core.view.postDelayed
import jp.juggler.subwaytooter.R
import jp.juggler.subwaytooter.databinding.DlgOpenUrlBinding
import jp.juggler.util.LogCategory
import jp.juggler.util.isEnabledAlpha
import jp.juggler.util.showToast
import jp.juggler.util.systemService
object DlgOpenUrl {
private val log = LogCategory("DlgOpenUrl")
fun show(
activity: Activity,
onEmptyError: () -> Unit = { activity.showToast(false, R.string.url_empty) },
onOK: (Dialog, String) -> Unit
) {
val allowEmpty = false
val clipboard: ClipboardManager? = systemService(activity)
val viewBinding = DlgOpenUrlBinding.inflate(activity.layoutInflater)
viewBinding.etInput.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
viewBinding.btnOk.performClick()
true
} else {
false
}
}
val dialog = Dialog(activity)
dialog.setContentView(viewBinding.root)
viewBinding.btnCancel.setOnClickListener { dialog.cancel() }
viewBinding.btnPaste.setOnClickListener { pasteTo(clipboard, viewBinding.etInput) }
viewBinding.btnOk.setOnClickListener {
val token = viewBinding.etInput.text.toString().trim { it <= ' ' }
if (token.isEmpty() && !allowEmpty) {
onEmptyError()
} else {
onOK(dialog, token)
}
}
dialog.window?.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT
)
val clipboardListener = ClipboardManager.OnPrimaryClipChangedListener {
showPasteButton(clipboard, viewBinding)
}
clipboard?.addPrimaryClipChangedListener(clipboardListener)
dialog.setOnDismissListener {
clipboard?.removePrimaryClipChangedListener(clipboardListener)
}
viewBinding.root.postDelayed(100L) {
showPasteButton(clipboard, viewBinding)
pasteTo(clipboard, viewBinding.etInput)
}
dialog.show()
}
private fun showPasteButton(clipboard: ClipboardManager?, viewBinding: DlgOpenUrlBinding) {
viewBinding.btnPaste.isEnabledAlpha = when {
clipboard == null -> false
!clipboard.hasPrimaryClip() -> false
clipboard.primaryClipDescription?.hasMimeType("text/plain") != true -> false
else -> true
}
}
private fun pasteTo(clipboard: ClipboardManager?, et: EditText) {
val text = clipboard?.getUrlFromClipboard()
?: return
val ss = et.selectionStart
val se = et.selectionEnd
et.text.replace(ss, se, text)
et.setSelection(ss, ss + text.length)
}
private fun ClipboardManager.getUrlFromClipboard(): String? {
try {
val item = primaryClip?.getItemAt(0)
item?.uri?.toString()?.let { return it }
item?.text?.toString()?.let { return it }
log.w("clip has nor uri or text.")
} catch (ex: Throwable) {
log.w(ex, "getUrlFromClipboard failed.")
}
return null
}
}