SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/action/Action_List.kt

221 lines
7.8 KiB
Kotlin
Raw Normal View History

package jp.juggler.subwaytooter.action
import android.app.Dialog
import jp.juggler.subwaytooter.ActMain
import jp.juggler.subwaytooter.R
2021-06-28 09:09:00 +02:00
import jp.juggler.subwaytooter.actmain.addColumn
import jp.juggler.subwaytooter.api.TootParser
2021-06-22 10:31:51 +02:00
import jp.juggler.subwaytooter.api.entity.MisskeyAntenna
import jp.juggler.subwaytooter.api.entity.TimelineItem
import jp.juggler.subwaytooter.api.entity.TootList
import jp.juggler.subwaytooter.api.entity.parseItem
import jp.juggler.subwaytooter.api.runApiTask
2021-06-28 09:09:00 +02:00
import jp.juggler.subwaytooter.column.ColumnType
import jp.juggler.subwaytooter.column.onListListUpdated
import jp.juggler.subwaytooter.column.onListNameUpdated
2022-05-29 15:38:21 +02:00
import jp.juggler.subwaytooter.dialog.DlgConfirm.confirm
import jp.juggler.subwaytooter.dialog.DlgTextInput
import jp.juggler.subwaytooter.dialog.actionsDialog
import jp.juggler.subwaytooter.table.SavedAccount
import jp.juggler.util.coroutine.launchAndShowError
import jp.juggler.util.coroutine.launchMain
import jp.juggler.util.data.buildJsonObject
import jp.juggler.util.log.showToast
import jp.juggler.util.network.toPostRequestBuilder
import jp.juggler.util.network.toPutRequestBuilder
import jp.juggler.util.ui.dismissSafe
import okhttp3.Request
2021-06-22 10:31:51 +02:00
fun ActMain.clickListTl(pos: Int, accessInfo: SavedAccount, item: TimelineItem?) {
when (item) {
is TootList -> addColumn(pos, accessInfo, ColumnType.LIST_TL, item.id)
is MisskeyAntenna -> addColumn(pos, accessInfo, ColumnType.MISSKEY_ANTENNA_TL, item.id)
}
}
fun ActMain.clickListMoreButton(pos: Int, accessInfo: SavedAccount, item: TimelineItem?) {
when (item) {
is TootList -> {
launchAndShowError {
actionsDialog(item.title) {
action(getString(R.string.list_timeline)) {
addColumn(pos, accessInfo, ColumnType.LIST_TL, item.id)
}
action(getString(R.string.list_member)) {
addColumn(
false,
pos,
accessInfo,
ColumnType.LIST_MEMBER,
item.id
)
}
action(getString(R.string.rename)) {
listRename(accessInfo, item)
}
action(getString(R.string.delete)) {
listDelete(accessInfo, item)
}
2021-06-22 10:31:51 +02:00
}
}
2021-06-22 10:31:51 +02:00
}
is MisskeyAntenna -> {
// XXX
}
}
}
fun interface ListOnCreatedCallback {
fun onCreated(list: TootList)
}
// リストを作成する
fun ActMain.listCreate(
accessInfo: SavedAccount,
title: String,
callback: ListOnCreatedCallback?,
) {
launchMain {
var resultList: TootList? = null
runApiTask(accessInfo) { client ->
if (accessInfo.isMisskey) {
client.request(
"/api/users/lists/create",
accessInfo.putMisskeyApiToken().apply {
put("title", title)
put("name", title)
}
.toPostRequestBuilder()
)
} else {
client.request(
"/api/v1/lists",
buildJsonObject {
put("title", title)
}.toPostRequestBuilder()
)
}?.also { result ->
client.publishApiProgress(getString(R.string.parsing_response))
resultList = parseItem(
::TootList,
TootParser(this, accessInfo),
result.jsonObject
)
}
}?.let { result ->
when (val list = resultList) {
null -> showToast(false, result.error)
else -> {
for (column in appState.columnList) {
column.onListListUpdated(accessInfo)
}
showToast(false, R.string.list_created)
callback?.onCreated(list)
}
}
}
}
}
// リストを削除する
fun ActMain.listDelete(
accessInfo: SavedAccount,
list: TootList,
bConfirmed: Boolean = false,
) {
2022-05-29 15:38:21 +02:00
launchAndShowError {
if (!bConfirmed) {
confirm(R.string.list_delete_confirm, list.title)
}
runApiTask(accessInfo) { client ->
if (accessInfo.isMisskey) {
client.request(
"/api/users/lists/delete",
accessInfo.putMisskeyApiToken().apply {
put("listId", list.id)
}
.toPostRequestBuilder()
)
// 204 no content
} else {
client.request(
"/api/v1/lists/${list.id}",
Request.Builder().delete()
)
}
}?.let { result ->
when (result.jsonObject) {
null -> showToast(false, result.error)
else -> {
for (column in appState.columnList) {
column.onListListUpdated(accessInfo)
}
showToast(false, R.string.delete_succeeded)
}
}
}
}
}
fun ActMain.listRename(
accessInfo: SavedAccount,
item: TootList,
) {
DlgTextInput.show(
this,
getString(R.string.rename),
item.title,
callback = object : DlgTextInput.Callback {
override fun onEmptyError() {
showToast(false, R.string.list_name_empty)
}
override fun onOK(dialog: Dialog, text: String) {
launchMain {
var resultList: TootList? = null
runApiTask(accessInfo) { client ->
if (accessInfo.isMisskey) {
client.request(
"/api/users/lists/update",
accessInfo.putMisskeyApiToken().apply {
put("listId", item.id)
put("title", text)
}.toPostRequestBuilder()
)
} else {
client.request(
"/api/v1/lists/${item.id}",
buildJsonObject {
put("title", text)
}.toPutRequestBuilder()
)
}?.also { result ->
client.publishApiProgress(getString(R.string.parsing_response))
resultList = parseItem(
::TootList,
TootParser(this, accessInfo),
result.jsonObject
)
}
}?.let { result ->
when (val list = resultList) {
null -> showToast(false, result.error)
else -> {
for (column in appState.columnList) {
column.onListNameUpdated(accessInfo, list)
}
dialog.dismissSafe()
}
}
}
}
}
}
)
}