2021-05-27 04:15:59 +02:00
|
|
|
package jp.juggler.subwaytooter.action
|
|
|
|
|
2021-06-21 05:03:09 +02:00
|
|
|
import android.content.Intent
|
|
|
|
import androidx.appcompat.app.AlertDialog
|
2021-05-27 04:15:59 +02:00
|
|
|
import jp.juggler.subwaytooter.*
|
2021-06-28 09:09:00 +02:00
|
|
|
import jp.juggler.subwaytooter.actmain.reloadAccountSetting
|
|
|
|
import jp.juggler.subwaytooter.actmain.showColumnMatchAccount
|
2021-05-27 04:15:59 +02:00
|
|
|
import jp.juggler.subwaytooter.api.*
|
|
|
|
import jp.juggler.subwaytooter.api.entity.*
|
2021-06-28 09:09:00 +02:00
|
|
|
import jp.juggler.subwaytooter.column.Column
|
|
|
|
import jp.juggler.subwaytooter.column.findStatus
|
|
|
|
import jp.juggler.subwaytooter.column.onScheduleDeleted
|
|
|
|
import jp.juggler.subwaytooter.column.onStatusRemoved
|
2021-06-22 10:31:51 +02:00
|
|
|
import jp.juggler.subwaytooter.dialog.ActionsDialog
|
2021-05-27 04:15:59 +02:00
|
|
|
import jp.juggler.subwaytooter.dialog.DlgConfirm
|
|
|
|
import jp.juggler.subwaytooter.dialog.pickAccount
|
|
|
|
import jp.juggler.subwaytooter.table.AcctColor
|
|
|
|
import jp.juggler.subwaytooter.table.SavedAccount
|
2021-06-22 10:31:51 +02:00
|
|
|
import jp.juggler.subwaytooter.util.emptyCallback
|
2021-05-27 04:15:59 +02:00
|
|
|
import jp.juggler.util.*
|
|
|
|
import okhttp3.Request
|
|
|
|
import java.util.*
|
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
fun ActMain.clickStatusDelete(
|
2021-06-21 05:03:09 +02:00
|
|
|
accessInfo: SavedAccount,
|
|
|
|
status: TootStatus?,
|
|
|
|
) {
|
|
|
|
status ?: return
|
|
|
|
AlertDialog.Builder(this)
|
2021-06-22 10:31:51 +02:00
|
|
|
.setMessage(getString(R.string.confirm_delete_status))
|
2021-06-21 05:03:09 +02:00
|
|
|
.setNegativeButton(R.string.cancel, null)
|
2021-06-22 10:31:51 +02:00
|
|
|
.setPositiveButton(R.string.ok) { _, _ -> statusDelete(accessInfo, status.id) }
|
2021-06-21 05:03:09 +02:00
|
|
|
.show()
|
|
|
|
}
|
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
fun ActMain.clickBookmark(accessInfo: SavedAccount, status: TootStatus, willToast: Boolean) {
|
|
|
|
if (accessInfo.isPseudo) {
|
|
|
|
bookmarkFromAnotherAccount(accessInfo, status)
|
|
|
|
} else {
|
|
|
|
// トグル動作
|
|
|
|
val bSet = !status.bookmarked
|
|
|
|
|
|
|
|
bookmark(
|
|
|
|
accessInfo,
|
|
|
|
status,
|
|
|
|
CrossAccountMode.SameAccount,
|
|
|
|
bSet = bSet,
|
|
|
|
callback = when {
|
|
|
|
!willToast -> emptyCallback
|
|
|
|
// 簡略表示なら結果をトースト表示
|
|
|
|
bSet -> bookmarkCompleteCallback
|
|
|
|
else -> unbookmarkCompleteCallback
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|
2021-06-21 05:03:09 +02:00
|
|
|
}
|
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
fun ActMain.clickFavourite(accessInfo: SavedAccount, status: TootStatus, willToast: Boolean) {
|
|
|
|
if (accessInfo.isPseudo) {
|
|
|
|
favouriteFromAnotherAccount(accessInfo, status)
|
|
|
|
} else {
|
|
|
|
// トグル動作
|
|
|
|
val bSet = !status.favourited
|
|
|
|
|
|
|
|
favourite(
|
|
|
|
accessInfo,
|
|
|
|
status,
|
|
|
|
CrossAccountMode.SameAccount,
|
|
|
|
bSet = bSet,
|
|
|
|
callback = when {
|
|
|
|
!willToast -> emptyCallback
|
|
|
|
// 簡略表示なら結果をトースト表示
|
|
|
|
bSet -> favouriteCompleteCallback
|
|
|
|
else -> unfavouriteCompleteCallback
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fun ActMain.clickScheduledToot(accessInfo: SavedAccount, item: TootScheduled, column: Column) {
|
|
|
|
ActionsDialog()
|
|
|
|
.addAction(getString(R.string.edit)) {
|
|
|
|
scheduledPostEdit(accessInfo, item)
|
|
|
|
}
|
|
|
|
.addAction(getString(R.string.delete)) {
|
|
|
|
scheduledPostDelete(accessInfo, item) {
|
|
|
|
column.onScheduleDeleted(item)
|
|
|
|
showToast(false, R.string.scheduled_post_deleted)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.show(this)
|
2021-06-21 05:03:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
fun ActMain.launchActText(intent: Intent) = arActText.launch(intent)
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
2021-05-27 04:15:59 +02:00
|
|
|
// お気に入りの非同期処理
|
|
|
|
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) {
|
2021-11-21 08:12:10 +01:00
|
|
|
DlgConfirm.open(
|
2021-05-27 04:15:59 +02:00
|
|
|
this,
|
|
|
|
getString(
|
|
|
|
R.string.confirm_unbookmark_from,
|
2021-06-20 15:12:25 +02:00
|
|
|
AcctColor.getNickname(accessInfo)
|
2021-11-21 08:12:10 +01:00
|
|
|
),
|
|
|
|
object : DlgConfirm.Callback {
|
|
|
|
override var isConfirmEnabled: Boolean
|
|
|
|
get() = accessInfo.confirm_unbookmark
|
|
|
|
set(value) {
|
|
|
|
accessInfo.confirm_unbookmark = value
|
|
|
|
accessInfo.saveSetting()
|
|
|
|
reloadAccountSetting(accessInfo)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onOK() {
|
|
|
|
bookmark(
|
|
|
|
accessInfo = accessInfo,
|
|
|
|
statusArg = statusArg,
|
|
|
|
crossAccountMode = crossAccountMode,
|
|
|
|
callback = callback,
|
|
|
|
bSet = bSet,
|
|
|
|
bConfirmed = true,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
})
|
2021-05-27 04:15:59 +02:00
|
|
|
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.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-06-21 05:03:09 +02:00
|
|
|
status: TootStatus?,
|
2021-06-20 15:12:25 +02:00
|
|
|
bSet: Boolean,
|
2021-05-27 04:15:59 +02:00
|
|
|
) {
|
2021-06-21 05:03:09 +02:00
|
|
|
status ?: return
|
|
|
|
|
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-21 05:03:09 +02:00
|
|
|
status: TootStatus?,
|
2021-06-20 15:12:25 +02:00
|
|
|
) {
|
2021-06-21 05:03:09 +02:00
|
|
|
status ?: return
|
|
|
|
|
|
|
|
completionHelper.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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|