2018-01-04 19:52:25 +01:00
|
|
|
package jp.juggler.subwaytooter.action
|
|
|
|
|
2019-02-15 02:51:22 +01:00
|
|
|
import androidx.appcompat.app.AlertDialog
|
2019-08-23 01:49:20 +02:00
|
|
|
import jp.juggler.subwaytooter.*
|
2018-01-21 17:47:13 +01:00
|
|
|
import jp.juggler.subwaytooter.api.*
|
2018-08-20 02:07:55 +02:00
|
|
|
import jp.juggler.subwaytooter.api.entity.*
|
2018-01-04 19:52:25 +01:00
|
|
|
import jp.juggler.subwaytooter.dialog.AccountPicker
|
|
|
|
import jp.juggler.subwaytooter.dialog.DlgConfirm
|
|
|
|
import jp.juggler.subwaytooter.table.AcctColor
|
|
|
|
import jp.juggler.subwaytooter.table.SavedAccount
|
|
|
|
import jp.juggler.subwaytooter.table.UserRelation
|
2018-12-01 00:02:18 +01:00
|
|
|
import jp.juggler.subwaytooter.util.EmptyCallback
|
2018-12-02 11:25:00 +01:00
|
|
|
import jp.juggler.util.*
|
2018-01-04 19:52:25 +01:00
|
|
|
|
|
|
|
object Action_Follow {
|
|
|
|
|
|
|
|
fun follow(
|
|
|
|
activity : ActMain,
|
|
|
|
pos : Int,
|
|
|
|
access_info : SavedAccount,
|
2018-05-08 10:25:02 +02:00
|
|
|
whoRef : TootAccountRef,
|
|
|
|
bFollow : Boolean = true,
|
|
|
|
bConfirmMoved : Boolean = false,
|
|
|
|
bConfirmed : Boolean = false,
|
2018-01-10 16:47:35 +01:00
|
|
|
callback : EmptyCallback? = null
|
2018-01-04 19:52:25 +01:00
|
|
|
) {
|
2018-05-18 19:08:46 +02:00
|
|
|
val who = whoRef.get()
|
2018-05-08 10:25:02 +02:00
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
if(access_info.isMe(who)) {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, R.string.it_is_you)
|
2018-01-04 19:52:25 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if(! bConfirmMoved && bFollow && who.moved != null) {
|
|
|
|
AlertDialog.Builder(activity)
|
2018-05-08 10:25:02 +02:00
|
|
|
.setMessage(
|
|
|
|
activity.getString(
|
|
|
|
R.string.jump_moved_user,
|
|
|
|
access_info.getFullAcct(who),
|
|
|
|
access_info.getFullAcct(who.moved)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.setPositiveButton(R.string.ok) { _, _ ->
|
|
|
|
Action_User.profileFromAnotherAccount(
|
|
|
|
activity,
|
|
|
|
pos,
|
|
|
|
access_info,
|
|
|
|
who.moved
|
|
|
|
)
|
|
|
|
}
|
2018-01-10 16:47:35 +01:00
|
|
|
.setNeutralButton(R.string.ignore_suggestion) { _, _ ->
|
|
|
|
follow(
|
|
|
|
activity,
|
|
|
|
pos,
|
|
|
|
access_info,
|
2018-05-08 10:25:02 +02:00
|
|
|
whoRef,
|
2018-01-10 16:47:35 +01:00
|
|
|
bFollow = bFollow,
|
|
|
|
bConfirmMoved = true, // CHANGED
|
|
|
|
bConfirmed = bConfirmed,
|
|
|
|
callback = callback
|
|
|
|
)
|
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
.setNegativeButton(android.R.string.cancel, null)
|
|
|
|
.show()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if(! bConfirmed) {
|
|
|
|
if(bFollow && who.locked) {
|
|
|
|
DlgConfirm.open(
|
|
|
|
activity,
|
2018-05-08 10:25:02 +02:00
|
|
|
activity.getString(
|
|
|
|
R.string.confirm_follow_request_who_from,
|
|
|
|
whoRef.decoded_display_name,
|
2020-02-01 14:26:57 +01:00
|
|
|
AcctColor.getNickname(access_info)
|
2018-05-08 10:25:02 +02:00
|
|
|
)
|
2018-01-04 19:52:25 +01:00
|
|
|
, object : DlgConfirm.Callback {
|
2018-05-08 10:25:02 +02:00
|
|
|
|
|
|
|
override fun onOK() {
|
|
|
|
follow(
|
|
|
|
activity,
|
|
|
|
pos,
|
|
|
|
access_info,
|
|
|
|
whoRef,
|
|
|
|
bFollow = bFollow,
|
|
|
|
bConfirmMoved = bConfirmMoved,
|
|
|
|
bConfirmed = true, // CHANGED
|
|
|
|
callback = callback
|
|
|
|
)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2018-05-08 10:25:02 +02:00
|
|
|
|
|
|
|
override var isConfirmEnabled : Boolean
|
|
|
|
get() = access_info.confirm_follow_locked
|
|
|
|
set(value) {
|
|
|
|
access_info.confirm_follow_locked = value
|
|
|
|
access_info.saveSetting()
|
|
|
|
activity.reloadAccountSetting(access_info)
|
|
|
|
}
|
|
|
|
})
|
2018-01-04 19:52:25 +01:00
|
|
|
return
|
|
|
|
} else if(bFollow) {
|
2018-05-08 10:25:02 +02:00
|
|
|
val msg = activity.getString(
|
|
|
|
R.string.confirm_follow_who_from,
|
|
|
|
whoRef.decoded_display_name,
|
2020-02-01 14:26:57 +01:00
|
|
|
AcctColor.getNickname(access_info)
|
2018-05-08 10:25:02 +02:00
|
|
|
)
|
2018-01-04 19:52:25 +01:00
|
|
|
|
|
|
|
DlgConfirm.open(
|
|
|
|
activity,
|
|
|
|
msg,
|
|
|
|
object : DlgConfirm.Callback {
|
|
|
|
|
|
|
|
override fun onOK() {
|
2018-01-10 16:47:35 +01:00
|
|
|
follow(
|
|
|
|
activity,
|
|
|
|
pos,
|
|
|
|
access_info,
|
2018-05-08 10:25:02 +02:00
|
|
|
whoRef,
|
|
|
|
bFollow = bFollow,
|
|
|
|
bConfirmMoved = bConfirmMoved,
|
|
|
|
bConfirmed = true, //CHANGED
|
|
|
|
callback = callback
|
|
|
|
)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
override var isConfirmEnabled : Boolean
|
|
|
|
get() = access_info.confirm_follow
|
|
|
|
set(value) {
|
|
|
|
access_info.confirm_follow = value
|
|
|
|
access_info.saveSetting()
|
|
|
|
activity.reloadAccountSetting(access_info)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
return
|
|
|
|
} else {
|
|
|
|
DlgConfirm.open(
|
|
|
|
activity,
|
2018-05-08 10:25:02 +02:00
|
|
|
activity.getString(
|
|
|
|
R.string.confirm_unfollow_who_from,
|
|
|
|
whoRef.decoded_display_name,
|
2020-02-01 14:26:57 +01:00
|
|
|
AcctColor.getNickname(access_info)
|
2018-05-08 10:25:02 +02:00
|
|
|
),
|
2018-01-04 19:52:25 +01:00
|
|
|
object : DlgConfirm.Callback {
|
|
|
|
|
|
|
|
override fun onOK() {
|
2018-01-10 16:47:35 +01:00
|
|
|
follow(
|
|
|
|
activity,
|
|
|
|
pos,
|
|
|
|
access_info,
|
2018-05-08 10:25:02 +02:00
|
|
|
whoRef,
|
|
|
|
bFollow = bFollow,
|
|
|
|
bConfirmMoved = bConfirmMoved,
|
|
|
|
bConfirmed = true, // CHANGED
|
|
|
|
callback = callback
|
|
|
|
)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
override var isConfirmEnabled : Boolean
|
|
|
|
get() = access_info.confirm_unfollow
|
|
|
|
set(value) {
|
|
|
|
access_info.confirm_unfollow = value
|
|
|
|
access_info.saveSetting()
|
|
|
|
activity.reloadAccountSetting(access_info)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-10 16:47:35 +01:00
|
|
|
TootTaskRunner(activity, TootTaskRunner.PROGRESS_NONE).run(access_info, object : TootTask {
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2018-08-20 02:07:55 +02:00
|
|
|
var relation : UserRelation? = null
|
2018-08-28 18:24:36 +02:00
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
override fun background(client : TootApiClient) : TootApiResult? {
|
2020-09-09 21:46:50 +02:00
|
|
|
val parser = TootParser(activity, access_info)
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2019-08-13 16:01:48 +02:00
|
|
|
var userId = who.id
|
2020-02-01 14:26:57 +01:00
|
|
|
if(who.isRemote) {
|
2020-01-08 07:47:22 +01:00
|
|
|
|
|
|
|
// リモートユーザの確認
|
|
|
|
|
|
|
|
val skipAccountSync = if(access_info.isMisskey) {
|
|
|
|
// Misskey の /users/show はリモートユーザに関して404を返すので
|
|
|
|
// userIdからリモートユーザを照合することはできない。
|
|
|
|
// ただし検索APIがエラーになるかどうかは未確認
|
|
|
|
false
|
|
|
|
} else {
|
|
|
|
// https://github.com/tateisu/SubwayTooter/issues/124
|
|
|
|
// によると、閉じたタンスのユーザを同期しようとすると検索APIがエラーを返す
|
|
|
|
// この問題を回避するため、手持ちのuserIdで照合したユーザのacctが目的のユーザと同じなら
|
|
|
|
// 検索APIを呼び出さないようにする
|
2020-02-01 14:26:57 +01:00
|
|
|
val result = client.request("/api/v1/accounts/${userId}")
|
2020-01-08 07:47:22 +01:00
|
|
|
?: return null
|
2020-02-02 15:19:57 +01:00
|
|
|
who.acct == parser.account(result.jsonObject)?.acct
|
2020-01-08 07:47:22 +01:00
|
|
|
}
|
2020-02-01 14:26:57 +01:00
|
|
|
|
|
|
|
if(! skipAccountSync) {
|
2020-01-08 07:47:22 +01:00
|
|
|
// 同タンスのIDではなかった場合、検索APIを使う
|
2020-02-02 15:19:57 +01:00
|
|
|
val (result, ar) = client.syncAccountByAcct(access_info, who.acct)
|
2020-01-08 07:47:22 +01:00
|
|
|
val user = ar?.get() ?: return result
|
|
|
|
userId = user.id
|
|
|
|
}
|
2019-08-13 16:01:48 +02:00
|
|
|
}
|
2019-09-12 19:46:00 +02:00
|
|
|
|
2019-01-19 01:37:41 +01:00
|
|
|
return if(access_info.isMisskey) {
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2019-01-19 01:37:41 +01:00
|
|
|
client.request(
|
2018-08-20 02:07:55 +02:00
|
|
|
when {
|
|
|
|
bFollow -> "/api/following/create"
|
|
|
|
else -> "/api/following/delete"
|
2019-01-19 01:37:41 +01:00
|
|
|
},
|
2020-01-07 09:03:32 +01:00
|
|
|
access_info.putMisskeyApiToken().apply {
|
|
|
|
put("userId", userId)
|
|
|
|
}
|
2019-01-19 01:37:41 +01:00
|
|
|
.toPostRequestBuilder()
|
|
|
|
)?.also { result ->
|
2018-11-01 13:48:54 +01:00
|
|
|
|
2019-01-19 01:37:41 +01:00
|
|
|
fun saveFollow(f : Boolean) {
|
|
|
|
val ur = UserRelation.load(access_info.db_id, userId)
|
|
|
|
ur.following = f
|
2019-01-28 19:02:09 +01:00
|
|
|
UserRelation.save1Misskey(
|
2019-01-19 01:37:41 +01:00
|
|
|
System.currentTimeMillis(),
|
|
|
|
access_info.db_id,
|
|
|
|
userId.toString(),
|
|
|
|
ur
|
|
|
|
)
|
|
|
|
relation = ur
|
|
|
|
}
|
2018-12-01 00:02:18 +01:00
|
|
|
|
2019-01-19 01:37:41 +01:00
|
|
|
val error = result.error
|
|
|
|
when {
|
|
|
|
// success
|
|
|
|
error == null -> saveFollow(bFollow)
|
|
|
|
|
|
|
|
// already followed/unfollowed
|
|
|
|
error.contains("already following") -> saveFollow(bFollow)
|
|
|
|
error.contains("already not following") -> saveFollow(bFollow)
|
|
|
|
|
|
|
|
// else something error
|
|
|
|
}
|
2018-11-01 13:48:54 +01:00
|
|
|
}
|
2018-08-28 18:24:36 +02:00
|
|
|
|
2018-08-20 02:07:55 +02:00
|
|
|
} else {
|
2019-08-13 16:01:48 +02:00
|
|
|
client.request(
|
|
|
|
"/api/v1/accounts/${userId}/${if(bFollow) "follow" else "unfollow"}"
|
2019-08-24 05:35:22 +02:00
|
|
|
, "".toFormRequestBody().toPost()
|
2019-08-13 16:01:48 +02:00
|
|
|
)?.also { result ->
|
|
|
|
val newRelation = parseItem(::TootRelationShip, parser, result.jsonObject)
|
|
|
|
if(newRelation != null) {
|
|
|
|
relation = saveUserRelation(access_info, newRelation)
|
2018-08-20 02:07:55 +02:00
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun handleResult(result : TootApiResult?) {
|
|
|
|
|
|
|
|
if(result == null) return // cancelled.
|
|
|
|
|
2018-01-10 16:47:35 +01:00
|
|
|
val relation = this.relation
|
2018-01-04 19:52:25 +01:00
|
|
|
if(relation != null) {
|
|
|
|
|
2018-05-08 10:25:02 +02:00
|
|
|
if(bFollow && relation.getRequested(who)) {
|
2018-01-04 19:52:25 +01:00
|
|
|
// 鍵付きアカウントにフォローリクエストを申請した状態
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, R.string.follow_requested)
|
2018-05-08 10:25:02 +02:00
|
|
|
} else if(! bFollow && relation.getRequested(who)) {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, R.string.follow_request_cant_remove_by_sender)
|
2018-01-04 19:52:25 +01:00
|
|
|
} else {
|
|
|
|
// ローカル操作成功、もしくはリモートフォロー成功
|
2018-08-20 02:07:55 +02:00
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
if(callback != null) callback()
|
|
|
|
}
|
|
|
|
|
2018-08-20 02:07:55 +02:00
|
|
|
activity.showColumnMatchAccount(access_info)
|
|
|
|
|
2019-08-24 05:35:22 +02:00
|
|
|
} else if(bFollow && who.locked && (result.response?.code ?: - 1) == 422) {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, R.string.cant_follow_locked_user)
|
2018-01-04 19:52:25 +01:00
|
|
|
} else {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, result.error)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2018-08-28 18:24:36 +02:00
|
|
|
fun deleteFollowRequest(
|
|
|
|
activity : ActMain,
|
|
|
|
pos : Int,
|
|
|
|
access_info : SavedAccount,
|
|
|
|
whoRef : TootAccountRef,
|
|
|
|
bConfirmed : Boolean = false,
|
|
|
|
callback : EmptyCallback? = null
|
|
|
|
) {
|
2018-11-01 13:48:54 +01:00
|
|
|
if(! access_info.isMisskey) {
|
2018-08-28 18:24:36 +02:00
|
|
|
follow(
|
|
|
|
activity,
|
|
|
|
pos,
|
|
|
|
access_info,
|
|
|
|
whoRef,
|
|
|
|
bFollow = false,
|
|
|
|
bConfirmed = bConfirmed,
|
|
|
|
callback = callback
|
|
|
|
)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
val who = whoRef.get()
|
|
|
|
|
|
|
|
if(access_info.isMe(who)) {
|
|
|
|
showToast(activity, false, R.string.it_is_you)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if(! bConfirmed) {
|
|
|
|
DlgConfirm.openSimple(
|
|
|
|
activity,
|
|
|
|
activity.getString(
|
|
|
|
R.string.confirm_cancel_follow_request_who_from,
|
|
|
|
whoRef.decoded_display_name,
|
2020-02-01 14:26:57 +01:00
|
|
|
AcctColor.getNickname(access_info)
|
2018-08-28 18:24:36 +02:00
|
|
|
)
|
2018-11-01 13:48:54 +01:00
|
|
|
) {
|
2018-08-28 18:24:36 +02:00
|
|
|
deleteFollowRequest(
|
|
|
|
activity,
|
|
|
|
pos,
|
|
|
|
access_info,
|
|
|
|
whoRef,
|
|
|
|
bConfirmed = true, // CHANGED
|
|
|
|
callback = callback
|
|
|
|
)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
TootTaskRunner(activity, TootTaskRunner.PROGRESS_NONE).run(access_info, object : TootTask {
|
|
|
|
|
|
|
|
var relation : UserRelation? = null
|
|
|
|
|
|
|
|
override fun background(client : TootApiClient) : TootApiResult? {
|
2018-11-01 13:48:54 +01:00
|
|
|
|
2019-01-19 01:37:41 +01:00
|
|
|
return if(access_info.isMisskey) {
|
2018-08-28 18:24:36 +02:00
|
|
|
|
|
|
|
var userId : EntityId = who.id
|
|
|
|
|
|
|
|
// リモートユーザの同期
|
2020-02-01 14:26:57 +01:00
|
|
|
if(who.isRemote) {
|
2020-02-02 15:19:57 +01:00
|
|
|
val (result, ar) = client.syncAccountByAcct(access_info, who.acct)
|
2019-01-19 01:37:41 +01:00
|
|
|
val user = ar?.get() ?: return result
|
|
|
|
userId = user.id
|
2018-08-28 18:24:36 +02:00
|
|
|
}
|
|
|
|
|
2019-01-19 01:37:41 +01:00
|
|
|
client.request(
|
2018-11-01 13:48:54 +01:00
|
|
|
"/api/following/requests/cancel"
|
2020-01-07 09:03:32 +01:00
|
|
|
, access_info.putMisskeyApiToken().apply {
|
|
|
|
put("userId", userId)
|
|
|
|
}
|
|
|
|
.toPostRequestBuilder()
|
2019-01-19 01:37:41 +01:00
|
|
|
)?.also { result ->
|
|
|
|
// parserに残ってるRelationをDBに保存する
|
|
|
|
val parser = TootParser(activity, access_info)
|
|
|
|
val user = parser.account(result.jsonObject)
|
|
|
|
if(user != null) {
|
|
|
|
relation = saveUserRelationMisskey(access_info, user.id, parser)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
TootApiResult("Mastodon has no API to cancel follow request")
|
2018-08-28 18:24:36 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun handleResult(result : TootApiResult?) {
|
|
|
|
|
|
|
|
if(result == null) return // cancelled.
|
|
|
|
|
|
|
|
val relation = this.relation
|
|
|
|
if(relation != null) {
|
|
|
|
// ローカル操作成功、もしくはリモートフォロー成功
|
|
|
|
if(callback != null) callback()
|
|
|
|
activity.showColumnMatchAccount(access_info)
|
|
|
|
} else {
|
|
|
|
showToast(activity, false, result.error)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
2020-02-01 14:26:57 +01:00
|
|
|
|
2018-08-28 18:24:36 +02:00
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
// acct で指定したユーザをリモートフォローする
|
2018-01-10 16:47:35 +01:00
|
|
|
fun followRemote(
|
|
|
|
activity : ActMain,
|
|
|
|
access_info : SavedAccount,
|
2020-02-02 15:19:57 +01:00
|
|
|
acct : Acct,
|
2018-01-10 16:47:35 +01:00
|
|
|
locked : Boolean,
|
2018-05-08 10:25:02 +02:00
|
|
|
bConfirmed : Boolean = false,
|
|
|
|
callback : EmptyCallback? = null
|
2018-01-04 19:52:25 +01:00
|
|
|
) {
|
2020-02-01 14:26:57 +01:00
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
if(access_info.isMe(acct)) {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, R.string.it_is_you)
|
2018-01-04 19:52:25 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if(! bConfirmed) {
|
|
|
|
if(locked) {
|
2018-05-08 10:25:02 +02:00
|
|
|
DlgConfirm.open(
|
|
|
|
activity,
|
|
|
|
activity.getString(
|
|
|
|
R.string.confirm_follow_request_who_from,
|
2020-02-02 15:19:57 +01:00
|
|
|
AcctColor.getNickname(acct),
|
2020-02-01 14:26:57 +01:00
|
|
|
AcctColor.getNickname(access_info)
|
2018-05-08 10:25:02 +02:00
|
|
|
),
|
|
|
|
object : DlgConfirm.Callback {
|
|
|
|
override fun onOK() {
|
|
|
|
followRemote(
|
|
|
|
activity,
|
|
|
|
access_info,
|
|
|
|
acct,
|
|
|
|
locked,
|
|
|
|
bConfirmed = true, //CHANGE
|
|
|
|
callback = callback
|
|
|
|
)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2018-05-08 10:25:02 +02:00
|
|
|
|
|
|
|
override var isConfirmEnabled : Boolean
|
|
|
|
get() = access_info.confirm_follow_locked
|
|
|
|
set(value) {
|
|
|
|
access_info.confirm_follow_locked = value
|
|
|
|
access_info.saveSetting()
|
|
|
|
activity.reloadAccountSetting(access_info)
|
|
|
|
}
|
|
|
|
})
|
2018-01-04 19:52:25 +01:00
|
|
|
return
|
|
|
|
} else {
|
2018-05-08 10:25:02 +02:00
|
|
|
DlgConfirm.open(
|
|
|
|
activity,
|
|
|
|
activity.getString(
|
|
|
|
R.string.confirm_follow_who_from,
|
2020-02-02 15:19:57 +01:00
|
|
|
AcctColor.getNickname(acct),
|
2020-02-01 14:26:57 +01:00
|
|
|
AcctColor.getNickname(access_info)
|
2018-05-08 10:25:02 +02:00
|
|
|
),
|
|
|
|
object : DlgConfirm.Callback {
|
|
|
|
|
|
|
|
override fun onOK() {
|
|
|
|
followRemote(
|
|
|
|
activity,
|
|
|
|
access_info,
|
|
|
|
acct,
|
|
|
|
locked,
|
|
|
|
bConfirmed = true, //CHANGE
|
|
|
|
callback = callback
|
|
|
|
)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2018-05-08 10:25:02 +02:00
|
|
|
|
|
|
|
override var isConfirmEnabled : Boolean
|
|
|
|
get() = access_info.confirm_follow
|
|
|
|
set(value) {
|
|
|
|
access_info.confirm_follow = value
|
|
|
|
access_info.saveSetting()
|
|
|
|
activity.reloadAccountSetting(access_info)
|
|
|
|
}
|
|
|
|
})
|
2018-01-04 19:52:25 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-10 16:47:35 +01:00
|
|
|
TootTaskRunner(activity, TootTaskRunner.PROGRESS_NONE).run(access_info, object : TootTask {
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2018-08-20 02:07:55 +02:00
|
|
|
var relation : UserRelation? = null
|
2019-08-13 16:01:48 +02:00
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
override fun background(client : TootApiClient) : TootApiResult? {
|
2018-08-28 18:24:36 +02:00
|
|
|
|
|
|
|
val parser = TootParser(activity, access_info)
|
|
|
|
|
2019-08-13 16:01:48 +02:00
|
|
|
val (r2, ar) = client.syncAccountByAcct(access_info, acct)
|
|
|
|
var user = ar?.get() ?: return r2
|
|
|
|
val userId = user.id
|
|
|
|
|
|
|
|
return if(access_info.isMisskey) {
|
|
|
|
client.request(
|
2018-08-20 02:07:55 +02:00
|
|
|
"/api/following/create",
|
2020-01-07 09:03:32 +01:00
|
|
|
access_info.putMisskeyApiToken().apply {
|
|
|
|
put("userId", userId)
|
|
|
|
}
|
2019-08-13 16:01:48 +02:00
|
|
|
.toPostRequestBuilder()
|
|
|
|
).also { result ->
|
|
|
|
if(result?.error?.contains("already following") == true
|
|
|
|
|| result?.error?.contains("already not following") == true
|
|
|
|
) {
|
|
|
|
// DBから読み直して値を変更する
|
|
|
|
this.relation = UserRelation.load(access_info.db_id, userId).apply {
|
|
|
|
following = true
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// parserに残ってるRelationをDBに保存する
|
|
|
|
user = parser.account(result?.jsonObject) ?: return result
|
|
|
|
this.relation = saveUserRelationMisskey(access_info, user.id, parser)
|
2018-08-20 02:07:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2019-08-13 16:01:48 +02:00
|
|
|
client.request(
|
|
|
|
"/api/v1/accounts/${userId}/follow"
|
2019-08-24 05:35:22 +02:00
|
|
|
, "".toFormRequestBody().toPost()
|
2019-08-13 16:01:48 +02:00
|
|
|
)?.also { result ->
|
|
|
|
val newRelation = parseItem(::TootRelationShip, parser, result.jsonObject)
|
|
|
|
if(newRelation != null) {
|
|
|
|
relation = saveUserRelation(access_info, newRelation)
|
|
|
|
}
|
2018-08-20 02:07:55 +02:00
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun handleResult(result : TootApiResult?) {
|
|
|
|
|
|
|
|
if(result == null) return // cancelled.
|
|
|
|
|
|
|
|
if(relation != null) {
|
|
|
|
|
|
|
|
activity.showColumnMatchAccount(access_info)
|
|
|
|
|
|
|
|
if(callback != null) callback()
|
|
|
|
|
2019-08-24 05:35:22 +02:00
|
|
|
} else if(locked && (result.response?.code ?: - 1) == 422) {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, R.string.cant_follow_locked_user)
|
2018-01-04 19:52:25 +01:00
|
|
|
} else {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, result.error)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
fun followFromAnotherAccount(
|
2018-01-10 16:47:35 +01:00
|
|
|
activity : ActMain,
|
|
|
|
pos : Int,
|
|
|
|
access_info : SavedAccount,
|
|
|
|
account : TootAccount?,
|
2018-05-08 10:25:02 +02:00
|
|
|
bConfirmMoved : Boolean = false
|
2018-01-04 19:52:25 +01:00
|
|
|
) {
|
|
|
|
if(account == null) return
|
|
|
|
|
|
|
|
if(! bConfirmMoved && account.moved != null) {
|
|
|
|
AlertDialog.Builder(activity)
|
2018-05-08 10:25:02 +02:00
|
|
|
.setMessage(
|
|
|
|
activity.getString(
|
|
|
|
R.string.jump_moved_user,
|
|
|
|
access_info.getFullAcct(account),
|
|
|
|
access_info.getFullAcct(account.moved)
|
|
|
|
)
|
|
|
|
)
|
2018-01-10 16:47:35 +01:00
|
|
|
.setPositiveButton(R.string.ok) { _, _ ->
|
|
|
|
Action_User.profileFromAnotherAccount(activity, pos, access_info, account.moved)
|
|
|
|
}
|
|
|
|
.setNeutralButton(R.string.ignore_suggestion) { _, _ ->
|
|
|
|
followFromAnotherAccount(
|
|
|
|
activity,
|
|
|
|
pos,
|
|
|
|
access_info,
|
|
|
|
account,
|
|
|
|
bConfirmMoved = true //CHANGED
|
|
|
|
)
|
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
.setNegativeButton(android.R.string.cancel, null)
|
|
|
|
.show()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
val who_acct = access_info.getFullAcct(account)
|
2018-01-10 16:47:35 +01:00
|
|
|
AccountPicker.pick(
|
|
|
|
activity,
|
2018-01-13 07:15:52 +01:00
|
|
|
bAuto = false,
|
|
|
|
message = activity.getString(R.string.account_picker_follow),
|
2020-09-07 14:20:11 +02:00
|
|
|
accountListArg = makeAccountListNonPseudo(activity, account.apiHost)
|
2018-01-10 16:47:35 +01:00
|
|
|
) { ai ->
|
|
|
|
followRemote(
|
|
|
|
activity,
|
|
|
|
ai,
|
|
|
|
who_acct,
|
|
|
|
account.locked,
|
|
|
|
callback = activity.follow_complete_callback
|
|
|
|
)
|
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
fun authorizeFollowRequest(
|
2018-05-08 10:25:02 +02:00
|
|
|
activity : ActMain,
|
|
|
|
access_info : SavedAccount,
|
|
|
|
whoRef : TootAccountRef,
|
|
|
|
bAllow : Boolean
|
2018-01-04 19:52:25 +01:00
|
|
|
) {
|
2018-05-18 19:08:46 +02:00
|
|
|
val who = whoRef.get()
|
2018-01-04 19:52:25 +01:00
|
|
|
if(access_info.isMe(who)) {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, R.string.it_is_you)
|
2018-01-04 19:52:25 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-01-10 16:47:35 +01:00
|
|
|
TootTaskRunner(activity).run(access_info, object : TootTask {
|
2019-09-12 19:37:30 +02:00
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
override fun background(client : TootApiClient) : TootApiResult? {
|
2019-09-12 19:46:00 +02:00
|
|
|
|
2019-09-12 19:37:30 +02:00
|
|
|
val parser = TootParser(activity, access_info)
|
2019-09-12 19:46:00 +02:00
|
|
|
|
2018-12-02 10:35:04 +01:00
|
|
|
return if(access_info.isMisskey) {
|
|
|
|
client.request(
|
2018-08-23 07:52:34 +02:00
|
|
|
"/api/following/requests/${if(bAllow) "accept" else "reject"}",
|
2020-01-07 09:03:32 +01:00
|
|
|
access_info.putMisskeyApiToken().apply {
|
|
|
|
put("userId", who.id)
|
|
|
|
}
|
2018-12-02 10:35:04 +01:00
|
|
|
.toPostRequestBuilder()
|
2019-09-12 19:37:30 +02:00
|
|
|
).also { result ->
|
|
|
|
val user = parser.account(result?.jsonObject)
|
2019-09-12 19:46:00 +02:00
|
|
|
if(user != null) {
|
2019-09-12 19:37:30 +02:00
|
|
|
// parserに残ってるRelationをDBに保存する
|
|
|
|
saveUserRelationMisskey(access_info, user.id, parser)
|
|
|
|
}
|
2019-09-12 19:46:00 +02:00
|
|
|
// 読めなくてもエラー処理は行わない
|
2019-09-12 19:37:30 +02:00
|
|
|
}
|
2018-08-28 18:24:36 +02:00
|
|
|
} else {
|
2018-12-02 10:35:04 +01:00
|
|
|
client.request(
|
|
|
|
"/api/v1/follow_requests/${who.id}/${if(bAllow) "authorize" else "reject"}",
|
2019-08-24 05:35:22 +02:00
|
|
|
"".toFormRequestBody().toPost()
|
2019-09-12 19:46:00 +02:00
|
|
|
)?.also { result ->
|
2019-09-12 19:37:30 +02:00
|
|
|
// Mastodon 3.0.0 から更新されたリレーションを返す
|
|
|
|
// https//github.com/tootsuite/mastodon/pull/11800
|
|
|
|
val newRelation = parseItem(::TootRelationShip, parser, result.jsonObject)
|
|
|
|
if(newRelation != null) {
|
|
|
|
saveUserRelation(access_info, newRelation)
|
|
|
|
}
|
2019-09-12 19:46:00 +02:00
|
|
|
// 読めなくてもエラー処理は行わない
|
2019-09-12 19:37:30 +02:00
|
|
|
}
|
2018-08-23 07:45:12 +02:00
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun handleResult(result : TootApiResult?) {
|
|
|
|
if(result == null) return // cancelled.
|
|
|
|
|
|
|
|
val jsonObject = result.jsonObject
|
|
|
|
if(jsonObject != null) {
|
|
|
|
for(column in App1.getAppState(activity).column_list) {
|
2019-08-23 01:49:20 +02:00
|
|
|
column.removeUser(access_info, ColumnType.FOLLOW_REQUESTS, who.id)
|
2018-07-16 20:19:19 +02:00
|
|
|
|
|
|
|
// 他のカラムでもフォロー状態の表示更新が必要
|
2020-02-01 19:28:16 +01:00
|
|
|
if(column.access_info == access_info
|
2019-08-23 01:49:20 +02:00
|
|
|
&& column.type != ColumnType.FOLLOW_REQUESTS
|
2018-08-20 02:07:55 +02:00
|
|
|
) {
|
2018-07-16 20:19:19 +02:00
|
|
|
column.fireRebindAdapterItems()
|
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
2018-05-08 10:25:02 +02:00
|
|
|
showToast(
|
|
|
|
activity,
|
|
|
|
false,
|
|
|
|
if(bAllow) R.string.follow_request_authorized else R.string.follow_request_rejected,
|
|
|
|
whoRef.decoded_display_name
|
|
|
|
)
|
2018-01-04 19:52:25 +01:00
|
|
|
} else {
|
2018-01-21 13:46:36 +01:00
|
|
|
showToast(activity, false, result.error)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|