2018-12-01 00:02:18 +01:00
|
|
|
package jp.juggler.util
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import android.widget.Toast
|
|
|
|
import me.drakeet.support.toast.ToastCompat
|
2020-09-09 21:46:50 +02:00
|
|
|
import java.lang.ref.WeakReference
|
2018-12-01 00:02:18 +01:00
|
|
|
|
|
|
|
object ToastUtils {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
|
|
|
private val log = LogCategory("ToastUtils")
|
|
|
|
private var refToast: WeakReference<Toast>? = null
|
|
|
|
|
|
|
|
internal fun showToastImpl(context: Context, bLong: Boolean, message: String) {
|
|
|
|
runOnMainLooper {
|
|
|
|
|
|
|
|
// 前回のトーストの表示を終了する
|
|
|
|
try {
|
|
|
|
refToast?.get()?.cancel()
|
|
|
|
} catch (ex: Throwable) {
|
|
|
|
log.trace(ex)
|
|
|
|
} finally {
|
|
|
|
refToast = null
|
|
|
|
}
|
|
|
|
|
|
|
|
// 新しいトーストを作る
|
|
|
|
try {
|
|
|
|
val duration = if (bLong) Toast.LENGTH_LONG else Toast.LENGTH_SHORT
|
|
|
|
val t = ToastCompat.makeText(context, message, duration)
|
|
|
|
t.setBadTokenListener { }
|
|
|
|
t.show()
|
|
|
|
refToast = WeakReference(t)
|
|
|
|
} catch (ex: Throwable) {
|
|
|
|
log.trace(ex)
|
|
|
|
}
|
|
|
|
|
|
|
|
// コールスタックの外側でエラーになる…
|
|
|
|
// android.view.WindowManager$BadTokenException:
|
|
|
|
// at android.view.ViewRootImpl.setView (ViewRootImpl.java:679)
|
|
|
|
// at android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:342)
|
|
|
|
// at android.view.WindowManagerImpl.addView (WindowManagerImpl.java:94)
|
|
|
|
// at android.widget.Toast$TN.handleShow (Toast.java:435)
|
|
|
|
// at android.widget.Toast$TN$2.handleMessage (Toast.java:345)
|
|
|
|
}
|
|
|
|
}
|
2018-12-01 00:02:18 +01:00
|
|
|
}
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
fun Context.showToast(bLong: Boolean, fmt: String?, vararg args: Any) {
|
|
|
|
val msg = if (fmt == null) "(null)" else if (args.isEmpty()) fmt else String.format(fmt, *args)
|
|
|
|
ToastUtils.showToastImpl(this, bLong, msg)
|
2018-12-01 00:02:18 +01:00
|
|
|
}
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
fun Context.showToast(ex: Throwable, fmt: String?, vararg args: Any) {
|
|
|
|
ToastUtils.showToastImpl(this, true, ex.withCaption(fmt, *args))
|
2018-12-01 00:02:18 +01:00
|
|
|
}
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
fun Context.showToast(bLong: Boolean, stringId: Int, vararg args: Any) {
|
|
|
|
ToastUtils.showToastImpl(this, bLong, getString(stringId, *args))
|
2018-12-01 00:02:18 +01:00
|
|
|
}
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
fun Context.showToast(ex: Throwable, stringId: Int, vararg args: Any) {
|
|
|
|
ToastUtils.showToastImpl(this, true, ex.withCaption(resources, stringId, *args))
|
2018-12-01 00:02:18 +01:00
|
|
|
}
|