投稿ボタン連打対策

This commit is contained in:
tateisu 2018-06-28 18:15:31 +09:00
parent 3b5882c1bb
commit a1119b7225
5 changed files with 65 additions and 31 deletions

View File

@ -21,10 +21,11 @@ import jp.juggler.subwaytooter.table.SavedAccount
- TootApiClientからの進捗イベントをProgressDialogに伝達します
*/
@Suppress("DEPRECATION","MemberVisibilityCanPrivate")
@Suppress("DEPRECATION", "MemberVisibilityCanPrivate")
class TootTaskRunner(
context : Context,
private val progress_style : Int = PROGRESS_SPINNER
private val progress_style : Int = PROGRESS_SPINNER,
private val progressSetupCallback : (progress : ProgressDialogEx) -> Unit = { _ -> }
) : TootApiCallback {
companion object {
@ -41,7 +42,7 @@ class TootTaskRunner(
}
private class ProgressInfo {
// HORIZONTALスタイルの場合、初期メッセージがないと後からメッセージを指定しても表示されない
internal var message = " "
internal var isIndeterminate = true
@ -53,11 +54,16 @@ class TootTaskRunner(
private class MyTask(
private val runner : TootTaskRunner
) : AsyncTask<Void, Void, TootApiResult?>() {
var isActive :Boolean = true
var isActive : Boolean = true
override fun doInBackground(vararg voids : Void) : TootApiResult? {
val callback = runner.callback
return if( callback == null) TootApiResult("callback is null") else callback.background(runner.client)
return if(callback == null) {
TootApiResult("callback is null")
} else {
callback.background(runner.client)
}
}
override fun onCancelled(result : TootApiResult?) {
@ -86,40 +92,42 @@ class TootTaskRunner(
private val proc_progress_message = object : Runnable {
override fun run() {
synchronized(this) {
if( progress?.isShowing == true ){
if(progress?.isShowing == true) {
showProgressMessage()
}
}
}
}
init {
this.refContext = WeakReference(context)
this.handler = Handler()
this.client = TootApiClient(context, callback=this)
this.client = TootApiClient(context, callback = this)
this.task = MyTask(this)
}
val isActive : Boolean
get()= task.isActive
get() = task.isActive
fun run(callback : TootTask) {
fun run(callback : TootTask) : TootTaskRunner {
openProgress()
this.callback = callback
task.executeOnExecutor(App1.task_executor)
return this
}
fun run(access_info : SavedAccount, callback : TootTask) {
client.account =access_info
run(callback)
fun run(access_info : SavedAccount, callback : TootTask) : TootTaskRunner {
client.account = access_info
return run(callback)
}
fun run(instance : String, callback : TootTask) {
fun run(instance : String, callback : TootTask) : TootTaskRunner {
client.instance = instance
run(callback)
return run(callback)
}
fun progressPrefix(s : String) : TootTaskRunner {
@ -131,7 +139,7 @@ class TootTaskRunner(
// implements TootApiClient.Callback
override val isApiCancelled : Boolean
get()= task.isCancelled
get() = task.isCancelled
override fun publishApiProgress(s : String) {
synchronized(this) {
@ -163,6 +171,7 @@ class TootTaskRunner(
progress.setCancelable(true)
progress.setOnCancelListener { task.cancel(true) }
progress.setProgressStyle(progress_style)
progressSetupCallback(progress)
showProgressMessage()
progress.show()
}
@ -182,12 +191,12 @@ class TootTaskRunner(
val message = info.message.trim { it <= ' ' }
val progress_prefix = this.progress_prefix
progress .setMessage(
if( progress_prefix == null || progress_prefix.isEmpty() ) {
progress.setMessage(
if(progress_prefix == null || progress_prefix.isEmpty()) {
message
}else if( message.isEmpty()) {
} else if(message.isEmpty()) {
progress_prefix
}else {
} else {
"$progress_prefix\n$message"
}
)

View File

@ -2,6 +2,7 @@ package jp.juggler.subwaytooter.util
import android.content.SharedPreferences
import android.os.Handler
import android.os.SystemClock
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.text.*
@ -74,6 +75,10 @@ class PostHelper(
var emojiMapCustom : HashMap<String, CustomEmoji>? = null
var redraft_status_id : Long = 0L
private var last_post_tapped : Long = 0L
var last_post_task : TootTaskRunner? = null
fun post(
account : SavedAccount,
bConfirmTag : Boolean = false,
@ -194,22 +199,41 @@ class PostHelper(
return
}
TootTaskRunner(activity).run(account, object : TootTask {
// 確認を終えたらボタン連打判定
val now = SystemClock.elapsedRealtime()
val delta = now - last_post_tapped
last_post_tapped = now
if(delta < 1000L) {
showToast(activity, false, R.string.post_button_tapped_repeatly)
return
}
if(last_post_task?.isActive == true) {
showToast(activity, false, R.string.post_button_tapped_repeatly)
return
}
// 全ての確認を終えたらバックグラウンドでの処理を開始する
last_post_task = TootTaskRunner(activity
, progressSetupCallback = { progressDialog ->
progressDialog.setCanceledOnTouchOutside(false)
}
).run(account, object : TootTask {
internal var status : TootStatus? = null
var status : TootStatus? = null
internal var instance_tmp : TootInstance? = null
var instance_tmp : TootInstance? = null
internal var credential_tmp : TootAccount? = null
var credential_tmp : TootAccount? = null
internal fun getInstanceInformation(client : TootApiClient) : TootApiResult? {
fun getInstanceInformation(client : TootApiClient) : TootApiResult? {
val result = client.request("/api/v1/instance")
instance_tmp =
parseItem(::TootInstance, TootParser(activity, account), result?.jsonObject)
return result
}
internal fun getCredential(client : TootApiClient) : TootApiResult? {
fun getCredential(client : TootApiClient) : TootApiResult? {
val result = client.request("/api/v1/accounts/verify_credentials")
credential_tmp = TootParser(activity, account).account(result?.jsonObject)
return result
@ -218,7 +242,7 @@ class PostHelper(
override fun background(client : TootApiClient) : TootApiResult? {
var result : TootApiResult?
// 元の投稿を削除する
if(redraft_status_id != 0L) {
result = client.request(
@ -226,7 +250,7 @@ class PostHelper(
Request.Builder().delete()
)
log.d("delete redraft. result=$result")
Thread.sleep(2000L)
}
@ -238,7 +262,7 @@ class PostHelper(
instance = instance_tmp ?: return r2
account.instance = instance
}
if(TootStatus.VISIBILITY_WEB_SETTING == visibility) {
visibility_checked = if(instance.versionGE(TootInstance.VERSION_1_6)) {
null
@ -251,8 +275,6 @@ class PostHelper(
}
}
val json = JSONObject()
try {
json.put(

View File

@ -687,6 +687,7 @@
<string name="delete_base_status_before_toot">Delete based status before post. All of favourites,boosts will be lost. Replies will be disconnected. Media attachments will not kept on Mastodon pre-2.4.1 . Are you sure?</string>
<string name="notification_tl_font_size">Notification TL font size (unit:sp. leave empty to default. app restart required)</string>
<string name="notification_tl_icon_size">Notification TL icon size (unit:dp. default:32. app restart required)</string>
<string name="post_button_tapped_repeatly">Post button was tapped repeatedly</string>
<!--<string name="abc_action_bar_home_description">Revenir à l\'accueil</string>-->
<!--<string name="abc_action_bar_home_description_format">%1$s, %2$s</string>-->

View File

@ -965,5 +965,6 @@
<string name="delete_base_status_before_toot">元トゥートを削除して投稿します。お気に入りとブーストは失われます。返信は切断されます。マストドン2.4.1未満の場合は添付メディアは維持されません。よろしいですか?</string>
<string name="notification_tl_font_size">通知TLのフォントサイズ (単位:sp。空欄でデフォルト。アプリ再起動が必要)</string>
<string name="notification_tl_icon_size">通知TLのアイコンサイズ (単位:dp。デフォルト:32。アプリ再起動が必要)</string>
<string name="post_button_tapped_repeatly">投稿ボタンの連打を検出</string>
</resources>

View File

@ -672,4 +672,5 @@
<string name="delete_base_status_before_toot">Delete based status before post. All of favourites,boosts will be lost. Replies will be disconnected. Media attachments will not kept on Mastodon pre-2.4.1 . Are you sure?</string>
<string name="notification_tl_font_size">Notification TL font size (unit:sp. leave empty to default. app restart required)</string>
<string name="notification_tl_icon_size">Notification TL icon size (unit:dp. default:32. app restart required)</string>
<string name="post_button_tapped_repeatly">Post button was tapped repeatedly</string>
</resources>