102 lines
3.5 KiB
Kotlin
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
|
|
}
|
|
}
|