2021-05-27 04:15:59 +02:00
|
|
|
|
package jp.juggler.subwaytooter.action
|
|
|
|
|
|
|
|
|
|
import jp.juggler.subwaytooter.*
|
|
|
|
|
import jp.juggler.subwaytooter.api.*
|
|
|
|
|
import jp.juggler.subwaytooter.api.entity.*
|
|
|
|
|
import jp.juggler.subwaytooter.dialog.DlgConfirm
|
|
|
|
|
import jp.juggler.subwaytooter.dialog.pickAccount
|
|
|
|
|
import jp.juggler.subwaytooter.table.AcctColor
|
|
|
|
|
import jp.juggler.subwaytooter.table.SavedAccount
|
|
|
|
|
import jp.juggler.util.*
|
|
|
|
|
import okhttp3.Request
|
|
|
|
|
import java.util.*
|
|
|
|
|
import kotlin.math.max
|
|
|
|
|
|
|
|
|
|
// お気に入りの非同期処理
|
|
|
|
|
fun ActMain.favourite(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo: SavedAccount,
|
|
|
|
|
statusArg: TootStatus,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
crossAccountMode: CrossAccountMode,
|
|
|
|
|
callback: () -> Unit,
|
|
|
|
|
bSet: Boolean = true,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
bConfirmed: Boolean = false,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (appState.isBusyFav(accessInfo, statusArg)) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
showToast(false, R.string.wait_previous_operation)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 必要なら確認を出す
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (!bConfirmed && accessInfo.isMastodon) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
DlgConfirm.open(
|
|
|
|
|
this,
|
|
|
|
|
getString(
|
|
|
|
|
when (bSet) {
|
|
|
|
|
true -> R.string.confirm_favourite_from
|
|
|
|
|
else -> R.string.confirm_unfavourite_from
|
|
|
|
|
},
|
2021-06-20 15:12:25 +02:00
|
|
|
|
AcctColor.getNickname(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
),
|
|
|
|
|
object : DlgConfirm.Callback {
|
|
|
|
|
|
|
|
|
|
override fun onOK() {
|
|
|
|
|
favourite(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo,
|
|
|
|
|
statusArg,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
crossAccountMode,
|
|
|
|
|
callback,
|
|
|
|
|
bSet = bSet,
|
|
|
|
|
bConfirmed = true
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override var isConfirmEnabled: Boolean
|
|
|
|
|
get() = when (bSet) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
true -> accessInfo.confirm_favourite
|
|
|
|
|
else -> accessInfo.confirm_unfavourite
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
set(value) {
|
|
|
|
|
when (bSet) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
true -> accessInfo.confirm_favourite = value
|
|
|
|
|
else -> accessInfo.confirm_unfavourite = value
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.saveSetting()
|
|
|
|
|
reloadAccountSetting(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
2021-06-20 15:12:25 +02:00
|
|
|
|
appState.setBusyFav(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
// ファボ表示を更新中にする
|
2021-06-20 15:12:25 +02:00
|
|
|
|
showColumnMatchAccount(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
launchMain {
|
|
|
|
|
var resultStatus: TootStatus? = null
|
|
|
|
|
val result = runApiTask(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
progressStyle = ApiTask.PROGRESS_NONE
|
|
|
|
|
) { client ->
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val targetStatus = if (crossAccountMode.isRemote) {
|
|
|
|
|
val (result, status) = client.syncStatus(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
status ?: return@runApiTask result
|
|
|
|
|
if (status.favourited) {
|
|
|
|
|
return@runApiTask TootApiResult(getString(R.string.already_favourited))
|
|
|
|
|
}
|
|
|
|
|
status
|
|
|
|
|
} else {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
statusArg
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (accessInfo.isMisskey) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
client.request(
|
|
|
|
|
if (bSet) {
|
|
|
|
|
"/api/notes/favorites/create"
|
|
|
|
|
} else {
|
|
|
|
|
"/api/notes/favorites/delete"
|
|
|
|
|
},
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.putMisskeyApiToken().apply {
|
|
|
|
|
put("noteId", targetStatus.id.toString())
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
.toPostRequestBuilder()
|
|
|
|
|
)?.also { result ->
|
|
|
|
|
// 正常レスポンスは 204 no content
|
|
|
|
|
// 既にお気に入り済みならエラー文字列に "already favorited" が返る
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (result.response?.code == 204 ||
|
|
|
|
|
result.error?.contains("already favorited") == true ||
|
|
|
|
|
result.error?.contains("already not favorited") == true
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
// 成功した
|
2021-06-20 15:12:25 +02:00
|
|
|
|
resultStatus = targetStatus.apply { favourited = bSet }
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
client.request(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
"/api/v1/statuses/${targetStatus.id}/${if (bSet) "favourite" else "unfavourite"}",
|
2021-05-27 04:15:59 +02:00
|
|
|
|
"".toFormRequestBody().toPost()
|
|
|
|
|
)?.also { result ->
|
2021-06-20 15:12:25 +02:00
|
|
|
|
resultStatus = TootParser(this, accessInfo).status(result.jsonObject)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
appState.resetBusyFav(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
if (result != null) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
when (val newStatus = resultStatus) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
null -> showToast(true, result.error)
|
|
|
|
|
else -> {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val oldCount = statusArg.favourites_count
|
|
|
|
|
val newCount = newStatus.favourites_count
|
|
|
|
|
if (oldCount != null && newCount != null) {
|
|
|
|
|
if (accessInfo.isMisskey) {
|
|
|
|
|
newStatus.favourited = bSet
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (bSet && newStatus.favourited && newCount <= oldCount) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
// 星をつけたのにカウントが上がらないのは違和感あるので、表示をいじる
|
2021-06-20 15:12:25 +02:00
|
|
|
|
newStatus.favourites_count = oldCount + 1L
|
|
|
|
|
} else if (!bSet && !newStatus.favourited && newCount >= oldCount) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
// 星を外したのにカウントが下がらないのは違和感あるので、表示をいじる
|
|
|
|
|
// 0未満にはならない
|
2021-06-20 15:12:25 +02:00
|
|
|
|
newStatus.favourites_count =
|
|
|
|
|
if (oldCount < 1L) 0L else oldCount - 1L
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
for (column in appState.columnList) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
column.findStatus(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.apDomain,
|
|
|
|
|
newStatus.id
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) { account, status ->
|
|
|
|
|
|
|
|
|
|
// 同タンス別アカウントでもカウントは変化する
|
2021-06-20 15:12:25 +02:00
|
|
|
|
status.favourites_count = newStatus.favourites_count
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
// 同アカウントならfav状態を変化させる
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (accessInfo == account) {
|
|
|
|
|
status.favourited = newStatus.favourited
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
callback()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 結果に関わらず、更新中状態から復帰させる
|
2021-06-20 15:12:25 +02:00
|
|
|
|
showColumnMatchAccount(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// アカウントを選んでお気に入り
|
|
|
|
|
fun ActMain.favouriteFromAnotherAccount(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
timelineAccount: SavedAccount,
|
|
|
|
|
status: TootStatus?,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
status ?: return
|
|
|
|
|
launchMain {
|
|
|
|
|
pickAccount(
|
|
|
|
|
bAllowPseudo = false,
|
|
|
|
|
bAuto = false,
|
|
|
|
|
message = getString(R.string.account_picker_favourite),
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accountListArg = accountListNonPseudo(timelineAccount.apDomain)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)?.let { action_account ->
|
|
|
|
|
favourite(
|
|
|
|
|
action_account,
|
|
|
|
|
status,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
calcCrossAccountMode(timelineAccount, action_account),
|
|
|
|
|
callback = favouriteCompleteCallback
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
// お気に入りの非同期処理
|
|
|
|
|
fun ActMain.bookmark(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo: SavedAccount,
|
|
|
|
|
statusArg: TootStatus,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
crossAccountMode: CrossAccountMode,
|
|
|
|
|
callback: () -> Unit,
|
|
|
|
|
bSet: Boolean = true,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
bConfirmed: Boolean = false,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (appState.isBusyFav(accessInfo, statusArg)) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
showToast(false, R.string.wait_previous_operation)
|
|
|
|
|
return
|
|
|
|
|
}
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (accessInfo.isMisskey) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
showToast(false, R.string.misskey_account_not_supported)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 必要なら確認を出す
|
|
|
|
|
// ブックマークは解除する時だけ確認する
|
|
|
|
|
if (!bConfirmed && !bSet) {
|
|
|
|
|
DlgConfirm.openSimple(
|
|
|
|
|
this,
|
|
|
|
|
getString(
|
|
|
|
|
R.string.confirm_unbookmark_from,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
AcctColor.getNickname(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
) {
|
|
|
|
|
bookmark(
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo,
|
|
|
|
|
statusArg,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
crossAccountMode,
|
|
|
|
|
callback,
|
|
|
|
|
bSet = bSet,
|
|
|
|
|
bConfirmed = true
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
2021-06-20 15:12:25 +02:00
|
|
|
|
appState.setBusyBookmark(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
// ファボ表示を更新中にする
|
2021-06-20 15:12:25 +02:00
|
|
|
|
showColumnMatchAccount(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
launchMain {
|
|
|
|
|
var resultStatus: TootStatus? = null
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val result = runApiTask(accessInfo, progressStyle = ApiTask.PROGRESS_NONE) { client ->
|
|
|
|
|
val targetStatus = if (crossAccountMode.isRemote) {
|
|
|
|
|
val (result, status) = client.syncStatus(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
status ?: return@runApiTask result
|
|
|
|
|
if (status.bookmarked) {
|
|
|
|
|
return@runApiTask TootApiResult(getString(R.string.already_bookmarked))
|
|
|
|
|
}
|
|
|
|
|
status
|
|
|
|
|
} else {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
statusArg
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client.request(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
"/api/v1/statuses/${targetStatus.id}/${if (bSet) "bookmark" else "unbookmark"}",
|
2021-05-27 04:15:59 +02:00
|
|
|
|
"".toFormRequestBody().toPost()
|
|
|
|
|
)?.also { result ->
|
2021-06-20 15:12:25 +02:00
|
|
|
|
resultStatus = TootParser(this, accessInfo).status(result.jsonObject)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
appState.resetBusyBookmark(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
if (result != null) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
when (val newStatus = resultStatus) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
null -> showToast(true, result.error)
|
|
|
|
|
else -> {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
for (column in appState.columnList) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
column.findStatus(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.apDomain,
|
|
|
|
|
newStatus.id
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) { account, status ->
|
|
|
|
|
|
|
|
|
|
// 同アカウントならブックマーク状態を伝播する
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (accessInfo == account) {
|
|
|
|
|
status.bookmarked = newStatus.bookmarked
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
callback()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 結果に関わらず、更新中状態から復帰させる
|
2021-06-20 15:12:25 +02:00
|
|
|
|
showColumnMatchAccount(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// アカウントを選んでブックマーク
|
|
|
|
|
fun ActMain.bookmarkFromAnotherAccount(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
timelineAccount: SavedAccount,
|
|
|
|
|
status: TootStatus?,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
status ?: return
|
|
|
|
|
|
|
|
|
|
launchMain {
|
|
|
|
|
pickAccount(
|
|
|
|
|
bAllowPseudo = false,
|
|
|
|
|
bAuto = false,
|
|
|
|
|
message = getString(R.string.account_picker_bookmark),
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accountListArg = accountListNonPseudo(timelineAccount.apDomain)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)?.let { action_account ->
|
|
|
|
|
bookmark(
|
|
|
|
|
action_account,
|
|
|
|
|
status,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
calcCrossAccountMode(timelineAccount, action_account),
|
|
|
|
|
callback = bookmarkCompleteCallback
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
fun ActMain.boost(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo: SavedAccount,
|
|
|
|
|
statusArg: TootStatus,
|
|
|
|
|
statusOwner: Acct,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
crossAccountMode: CrossAccountMode,
|
|
|
|
|
bSet: Boolean = true,
|
|
|
|
|
bConfirmed: Boolean = false,
|
|
|
|
|
visibility: TootVisibility? = null,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
callback: () -> Unit,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
|
|
|
|
|
// アカウントからステータスにブースト操作を行っているなら、何もしない
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (appState.isBusyBoost(accessInfo, statusArg)) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
showToast(false, R.string.wait_previous_operation)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Mastodonは非公開トゥートをブーストできるのは本人だけ
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val isPrivateToot = accessInfo.isMastodon &&
|
|
|
|
|
statusArg.visibility == TootVisibility.PrivateFollowers
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (isPrivateToot && accessInfo.acct != statusOwner) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
showToast(false, R.string.boost_private_toot_not_allowed)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
// DMとかのブーストはAPI側がエラーを出すだろう?
|
|
|
|
|
|
|
|
|
|
// 必要なら確認を出す
|
|
|
|
|
if (!bConfirmed) {
|
|
|
|
|
DlgConfirm.open(
|
|
|
|
|
this,
|
|
|
|
|
getString(
|
|
|
|
|
when {
|
|
|
|
|
!bSet -> R.string.confirm_unboost_from
|
|
|
|
|
isPrivateToot -> R.string.confirm_boost_private_from
|
|
|
|
|
visibility == TootVisibility.PrivateFollowers -> R.string.confirm_private_boost_from
|
|
|
|
|
else -> R.string.confirm_boost_from
|
|
|
|
|
},
|
2021-06-20 15:12:25 +02:00
|
|
|
|
AcctColor.getNickname(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
),
|
|
|
|
|
object : DlgConfirm.Callback {
|
|
|
|
|
override fun onOK() {
|
|
|
|
|
boost(
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo,
|
|
|
|
|
statusArg,
|
|
|
|
|
statusOwner,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
crossAccountMode,
|
|
|
|
|
bSet = bSet,
|
|
|
|
|
bConfirmed = true,
|
|
|
|
|
visibility = visibility,
|
|
|
|
|
callback = callback,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override var isConfirmEnabled: Boolean
|
|
|
|
|
get() = when (bSet) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
true -> accessInfo.confirm_boost
|
|
|
|
|
else -> accessInfo.confirm_unboost
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
set(value) {
|
|
|
|
|
when (bSet) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
true -> accessInfo.confirm_boost = value
|
|
|
|
|
else -> accessInfo.confirm_unboost = value
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.saveSetting()
|
|
|
|
|
reloadAccountSetting(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
appState.setBusyBoost(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
// ブースト表示を更新中にする
|
2021-06-20 15:12:25 +02:00
|
|
|
|
showColumnMatchAccount(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
// misskeyは非公開トゥートをブーストできないっぽい
|
|
|
|
|
|
|
|
|
|
launchMain {
|
|
|
|
|
var resultStatus: TootStatus? = null
|
|
|
|
|
var resultUnrenoteId: EntityId? = null
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val result = runApiTask(accessInfo, progressStyle = ApiTask.PROGRESS_NONE) { client ->
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val parser = TootParser(this, accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val targetStatus = if (crossAccountMode.isRemote) {
|
|
|
|
|
val (result, status) = client.syncStatus(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
if (status == null) return@runApiTask result
|
|
|
|
|
if (status.reblogged) {
|
|
|
|
|
return@runApiTask TootApiResult(getString(R.string.already_boosted))
|
|
|
|
|
}
|
|
|
|
|
status
|
|
|
|
|
} else {
|
|
|
|
|
// 既に自タンスのステータスがある
|
2021-06-20 15:12:25 +02:00
|
|
|
|
statusArg
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (accessInfo.isMisskey) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
if (!bSet) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val myRenoteId = targetStatus.myRenoteId
|
2021-05-27 04:15:59 +02:00
|
|
|
|
?: return@runApiTask TootApiResult("missing renote id.")
|
|
|
|
|
|
|
|
|
|
client.request(
|
|
|
|
|
"/api/notes/delete",
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.putMisskeyApiToken().apply {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
put("noteId", myRenoteId.toString())
|
2021-06-20 15:12:25 +02:00
|
|
|
|
put("renoteId", targetStatus.id.toString())
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
.toPostRequestBuilder()
|
|
|
|
|
)
|
|
|
|
|
?.also {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (it.response?.code == 204) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
resultUnrenoteId = myRenoteId
|
2021-06-20 15:12:25 +02:00
|
|
|
|
}
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
client.request(
|
|
|
|
|
"/api/notes/create",
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.putMisskeyApiToken().apply {
|
|
|
|
|
put("renoteId", targetStatus.id.toString())
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
.toPostRequestBuilder()
|
|
|
|
|
)
|
|
|
|
|
?.also { result ->
|
|
|
|
|
val jsonObject = result.jsonObject
|
|
|
|
|
if (jsonObject != null) {
|
|
|
|
|
val outerStatus = parser.status(
|
|
|
|
|
jsonObject.jsonObject("createdNote")
|
|
|
|
|
?: jsonObject
|
|
|
|
|
)
|
|
|
|
|
val innerStatus = outerStatus?.reblog ?: outerStatus
|
|
|
|
|
if (outerStatus != null && innerStatus != null && outerStatus != innerStatus) {
|
|
|
|
|
innerStatus.myRenoteId = outerStatus.id
|
|
|
|
|
innerStatus.reblogged = true
|
|
|
|
|
}
|
|
|
|
|
// renoteそのものではなくrenoteされた元noteが欲しい
|
|
|
|
|
resultStatus = innerStatus
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
val b = JsonObject().apply {
|
|
|
|
|
if (visibility != null) put("visibility", visibility.strMastodon)
|
|
|
|
|
}.toPostRequestBuilder()
|
|
|
|
|
|
|
|
|
|
client.request(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
"/api/v1/statuses/${targetStatus.id}/${if (bSet) "reblog" else "unreblog"}",
|
2021-05-27 04:15:59 +02:00
|
|
|
|
b
|
|
|
|
|
)?.also { result ->
|
|
|
|
|
// reblogはreblogを表すStatusを返す
|
|
|
|
|
// unreblogはreblogしたStatusを返す
|
|
|
|
|
val s = parser.status(result.jsonObject)
|
|
|
|
|
resultStatus = s?.reblog ?: s
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
appState.resetBusyBoost(accessInfo, statusArg)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
if (result != null) {
|
|
|
|
|
val unrenoteId = resultUnrenoteId
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val newStatus = resultStatus
|
2021-05-27 04:15:59 +02:00
|
|
|
|
when {
|
|
|
|
|
// Misskeyでunrenoteに成功した
|
|
|
|
|
unrenoteId != null -> {
|
|
|
|
|
|
|
|
|
|
// 星を外したのにカウントが下がらないのは違和感あるので、表示をいじる
|
|
|
|
|
// 0未満にはならない
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val count = max(0, (statusArg.reblogs_count ?: 1) - 1)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
for (column in appState.columnList) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
column.findStatus(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.apDomain,
|
|
|
|
|
statusArg.id
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) { account, status ->
|
|
|
|
|
|
|
|
|
|
// 同タンス別アカウントでもカウントは変化する
|
|
|
|
|
status.reblogs_count = count
|
|
|
|
|
|
|
|
|
|
// 同アカウントならreblogged状態を変化させる
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (accessInfo == account && status.myRenoteId == unrenoteId) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
status.myRenoteId = null
|
|
|
|
|
status.reblogged = false
|
|
|
|
|
}
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
callback()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 処理に成功した
|
2021-06-20 15:12:25 +02:00
|
|
|
|
newStatus != null -> {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
// カウント数は遅延があるみたいなので、恣意的に表示を変更する
|
|
|
|
|
// ブーストカウント数を加工する
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val oldCount = statusArg.reblogs_count
|
|
|
|
|
val newCount = newStatus.reblogs_count
|
|
|
|
|
if (oldCount != null && newCount != null) {
|
|
|
|
|
if (bSet && newStatus.reblogged && newCount <= oldCount) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
// 星をつけたのにカウントが上がらないのは違和感あるので、表示をいじる
|
2021-06-20 15:12:25 +02:00
|
|
|
|
newStatus.reblogs_count = oldCount + 1
|
|
|
|
|
} else if (!bSet && !newStatus.reblogged && newCount >= oldCount) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
// 星を外したのにカウントが下がらないのは違和感あるので、表示をいじる
|
|
|
|
|
// 0未満にはならない
|
2021-06-20 15:12:25 +02:00
|
|
|
|
newStatus.reblogs_count = if (oldCount < 1) 0 else oldCount - 1
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
for (column in appState.columnList) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
column.findStatus(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.apDomain,
|
|
|
|
|
newStatus.id
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) { account, status ->
|
|
|
|
|
|
|
|
|
|
// 同タンス別アカウントでもカウントは変化する
|
2021-06-20 15:12:25 +02:00
|
|
|
|
status.reblogs_count = newStatus.reblogs_count
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (accessInfo == account) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
// 同アカウントならreblog状態を変化させる
|
|
|
|
|
when {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.isMastodon ->
|
|
|
|
|
status.reblogged = newStatus.reblogged
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
bSet && status.myRenoteId == null -> {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
status.myRenoteId = newStatus.myRenoteId
|
2021-05-27 04:15:59 +02:00
|
|
|
|
status.reblogged = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Misskey のunrenote時はここを通らない
|
|
|
|
|
}
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
callback()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else -> showToast(true, result.error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 結果に関わらず、更新中状態から復帰させる
|
2021-06-20 15:12:25 +02:00
|
|
|
|
showColumnMatchAccount(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun ActMain.boostFromAnotherAccount(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
timelineAccount: SavedAccount,
|
|
|
|
|
status: TootStatus?,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
status ?: return
|
|
|
|
|
launchMain {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val statusOwner = timelineAccount.getFullAcct(status.account)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
|
val isPrivateToot = timelineAccount.isMastodon &&
|
2021-05-27 04:15:59 +02:00
|
|
|
|
status.visibility == TootVisibility.PrivateFollowers
|
|
|
|
|
|
|
|
|
|
if (isPrivateToot) {
|
|
|
|
|
val list = ArrayList<SavedAccount>()
|
|
|
|
|
for (a in SavedAccount.loadAccountList(applicationContext)) {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
if (a.acct == statusOwner) list.add(a)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
if (list.isEmpty()) {
|
|
|
|
|
showToast(false, R.string.boost_private_toot_not_allowed)
|
|
|
|
|
return@launchMain
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pickAccount(
|
|
|
|
|
bAllowPseudo = false,
|
|
|
|
|
bAuto = false,
|
|
|
|
|
message = getString(R.string.account_picker_boost),
|
|
|
|
|
accountListArg = list
|
|
|
|
|
)?.let { action_account ->
|
|
|
|
|
boost(
|
|
|
|
|
action_account,
|
|
|
|
|
status,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
statusOwner,
|
|
|
|
|
calcCrossAccountMode(timelineAccount, action_account),
|
|
|
|
|
callback = boostCompleteCallback
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
pickAccount(
|
|
|
|
|
bAllowPseudo = false,
|
|
|
|
|
bAuto = false,
|
|
|
|
|
message = getString(R.string.account_picker_boost),
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accountListArg = accountListNonPseudo(timelineAccount.apDomain)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)?.let { action_account ->
|
|
|
|
|
boost(
|
|
|
|
|
action_account,
|
|
|
|
|
status,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
statusOwner,
|
|
|
|
|
calcCrossAccountMode(timelineAccount, action_account),
|
|
|
|
|
callback = boostCompleteCallback
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun ActMain.statusDelete(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo: SavedAccount,
|
|
|
|
|
statusId: EntityId,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
launchMain {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
runApiTask(accessInfo) { client ->
|
|
|
|
|
if (accessInfo.isMisskey) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
client.request(
|
|
|
|
|
"/api/notes/delete",
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.putMisskeyApiToken().apply {
|
|
|
|
|
put("noteId", statusId)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
.toPostRequestBuilder()
|
|
|
|
|
)
|
|
|
|
|
// 204 no content
|
|
|
|
|
} else {
|
|
|
|
|
client.request(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
"/api/v1/statuses/$statusId",
|
2021-05-27 04:15:59 +02:00
|
|
|
|
Request.Builder().delete()
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}?.let { result ->
|
|
|
|
|
|
|
|
|
|
if (result.jsonObject != null) {
|
|
|
|
|
showToast(false, R.string.delete_succeeded)
|
2021-06-20 15:12:25 +02:00
|
|
|
|
for (column in appState.columnList) {
|
|
|
|
|
column.onStatusRemoved(accessInfo.apDomain, statusId)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
showToast(false, result.error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
|
|
// profile pin
|
|
|
|
|
|
|
|
|
|
fun ActMain.statusPin(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo: SavedAccount,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
status: TootStatus,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
bSet: Boolean,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
launchMain {
|
|
|
|
|
var resultStatus: TootStatus? = null
|
|
|
|
|
runApiTask(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
progressPrefix = getString(R.string.profile_pin_progress)
|
|
|
|
|
) { client ->
|
|
|
|
|
client.request(
|
|
|
|
|
"/api/v1/statuses/${status.id}/${if (bSet) "pin" else "unpin"}",
|
|
|
|
|
"".toFormRequestBody().toPost()
|
|
|
|
|
)?.also { result ->
|
2021-06-20 15:12:25 +02:00
|
|
|
|
resultStatus = TootParser(this, accessInfo).status(result.jsonObject)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}?.let { result ->
|
2021-06-20 15:12:25 +02:00
|
|
|
|
when (val newStatus = resultStatus) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
null -> showToast(true, result.error)
|
|
|
|
|
else -> {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
for (column in appState.columnList) {
|
|
|
|
|
if (accessInfo == column.accessInfo) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
column.findStatus(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.apDomain,
|
|
|
|
|
newStatus.id
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) { _, status ->
|
|
|
|
|
status.pinned = bSet
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-06-20 15:12:25 +02:00
|
|
|
|
showColumnMatchAccount(accessInfo)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 投稿画面を開く。初期テキストを指定する
|
|
|
|
|
fun ActMain.statusRedraft(
|
|
|
|
|
accessInfo: SavedAccount,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
status: TootStatus,
|
|
|
|
|
) {
|
|
|
|
|
postHelper.closeAcctPopup()
|
2021-05-27 04:15:59 +02:00
|
|
|
|
|
|
|
|
|
when {
|
|
|
|
|
accessInfo.isMisskey ->
|
|
|
|
|
openActPostImpl(
|
|
|
|
|
accessInfo.db_id,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
redraftStatus = status,
|
|
|
|
|
replyStatus = status.reply
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
status.in_reply_to_id == null ->
|
|
|
|
|
openActPostImpl(
|
|
|
|
|
accessInfo.db_id,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
redraftStatus = status
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
else -> launchMain {
|
|
|
|
|
var resultStatus: TootStatus? = null
|
|
|
|
|
runApiTask(accessInfo) { client ->
|
|
|
|
|
client.request("/api/v1/statuses/${status.in_reply_to_id}")
|
|
|
|
|
?.also { resultStatus = TootParser(this, accessInfo).status(it.jsonObject) }
|
|
|
|
|
}?.let { result ->
|
2021-06-20 15:12:25 +02:00
|
|
|
|
when (val replyStatus = resultStatus) {
|
2021-05-27 04:15:59 +02:00
|
|
|
|
null -> showToast(
|
|
|
|
|
true,
|
|
|
|
|
"${getString(R.string.cant_sync_toot)} : ${result.error ?: "(no information)"}"
|
|
|
|
|
)
|
|
|
|
|
else -> openActPostImpl(
|
|
|
|
|
accessInfo.db_id,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
redraftStatus = status,
|
|
|
|
|
replyStatus = replyStatus
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun ActMain.scheduledPostDelete(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo: SavedAccount,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
item: TootScheduled,
|
|
|
|
|
bConfirmed: Boolean = false,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
callback: () -> Unit,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
val act = this@scheduledPostDelete
|
|
|
|
|
if (!bConfirmed) {
|
|
|
|
|
DlgConfirm.openSimple(
|
|
|
|
|
act,
|
|
|
|
|
getString(R.string.scheduled_status_delete_confirm)
|
|
|
|
|
) {
|
|
|
|
|
scheduledPostDelete(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
item,
|
|
|
|
|
bConfirmed = true,
|
|
|
|
|
callback = callback
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
launchMain {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
runApiTask(accessInfo) { client ->
|
2021-05-27 04:15:59 +02:00
|
|
|
|
client.request(
|
|
|
|
|
"/api/v1/scheduled_statuses/${item.id}",
|
|
|
|
|
Request.Builder().delete()
|
|
|
|
|
)
|
|
|
|
|
}?.let { result ->
|
|
|
|
|
when (val error = result.error) {
|
|
|
|
|
null -> callback()
|
|
|
|
|
else -> showToast(true, error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun ActMain.scheduledPostEdit(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo: SavedAccount,
|
|
|
|
|
item: TootScheduled,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
) {
|
|
|
|
|
launchMain {
|
|
|
|
|
var resultStatus: TootStatus? = null
|
2021-06-20 15:12:25 +02:00
|
|
|
|
runApiTask(accessInfo) { client ->
|
|
|
|
|
val replyStatusId = item.inReplyToId ?: return@runApiTask TootApiResult()
|
|
|
|
|
client.request("/api/v1/statuses/$replyStatusId")?.also { result ->
|
|
|
|
|
resultStatus = TootParser(this, accessInfo).status(result.jsonObject)
|
2021-05-27 04:15:59 +02:00
|
|
|
|
}
|
|
|
|
|
}?.let { result ->
|
|
|
|
|
when (val error = result.error) {
|
|
|
|
|
null -> openActPostImpl(
|
2021-06-20 15:12:25 +02:00
|
|
|
|
accessInfo.db_id,
|
2021-05-27 04:15:59 +02:00
|
|
|
|
scheduledStatus = item,
|
2021-06-20 15:12:25 +02:00
|
|
|
|
replyStatus = resultStatus
|
2021-05-27 04:15:59 +02:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
else -> showToast(true, error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|