SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/column/ColumnSpec.kt

183 lines
6.5 KiB
Kotlin

package jp.juggler.subwaytooter.column
import jp.juggler.subwaytooter.api.entity.Acct
import jp.juggler.subwaytooter.api.entity.EntityId
import jp.juggler.subwaytooter.api.entity.Host
import jp.juggler.subwaytooter.table.SavedAccount
import jp.juggler.util.JsonObject
import jp.juggler.util.LogCategory
private val log = LogCategory("ColumnSpec")
object ColumnSpec {
@Suppress("UNCHECKED_CAST")
private inline fun <reified T> getParamAt(params: Array<out Any>, idx: Int): T {
return params[idx] as T
}
private fun getParamEntityId(
params: Array<out Any>,
@Suppress("SameParameterValue") idx: Int,
): EntityId =
when (val o = params[idx]) {
is EntityId -> o
is String -> EntityId(o)
else -> error("getParamEntityId [$idx] bad type. $o")
}
private fun getParamString(params: Array<out Any>, idx: Int): String =
when (val o = params[idx]) {
is String -> o
is EntityId -> o.toString()
is Host -> o.ascii
is Acct -> o.ascii
else -> error("getParamString [$idx] bad type. $o")
}
private fun getParamJsonObject(params: Array<out Any>, idx: Int): JsonObject =
when (val o = params[idx]) {
is JsonObject -> o
else -> error("getParamJsonObject [$idx] bad type. $o")
}
@Suppress("UNCHECKED_CAST")
private inline fun <reified T> getParamAtNullable(params: Array<out Any>, idx: Int): T? {
if (idx >= params.size) return null
return params[idx] as T
}
fun decode(column: Column, params: Array<out Any>) {
column.run {
when (type) {
ColumnType.CONVERSATION,
ColumnType.CONVERSATION_WITH_REFERENCE,
ColumnType.BOOSTED_BY,
ColumnType.FAVOURITED_BY,
ColumnType.LOCAL_AROUND,
ColumnType.FEDERATED_AROUND,
ColumnType.ACCOUNT_AROUND,
-> statusId = getParamEntityId(params, 0)
ColumnType.STATUS_HISTORY -> {
statusId = getParamEntityId(params, 0)
originalStatus = getParamJsonObject(params, 1)
}
ColumnType.PROFILE, ColumnType.LIST_TL, ColumnType.LIST_MEMBER,
ColumnType.MISSKEY_ANTENNA_TL,
-> profileId = getParamEntityId(params, 0)
ColumnType.HASHTAG ->
hashtag = getParamString(params, 0)
ColumnType.HASHTAG_FROM_ACCT -> {
hashtag = getParamString(params, 0)
hashtagAcct = getParamString(params, 1)
}
ColumnType.NOTIFICATION_FROM_ACCT -> {
hashtagAcct = getParamString(params, 0)
}
ColumnType.SEARCH -> {
searchQuery = getParamString(params, 0)
searchResolve = getParamAt(params, 1)
}
ColumnType.SEARCH_MSP, ColumnType.SEARCH_TS, ColumnType.SEARCH_NOTESTOCK ->
searchQuery = getParamString(params, 0)
ColumnType.INSTANCE_INFORMATION ->
instanceUri = getParamString(params, 0)
ColumnType.PROFILE_DIRECTORY -> {
instanceUri = getParamString(params, 0)
searchResolve = true
}
ColumnType.DOMAIN_TIMELINE -> {
instanceUri = getParamString(params, 0)
}
else -> {
}
}
}
}
fun isSameSpec(
column: Column,
ai: SavedAccount,
type: ColumnType,
params: Array<out Any>,
): Boolean {
if (type != column.type || ai != column.accessInfo) return false
return try {
when (type) {
ColumnType.PROFILE,
ColumnType.LIST_TL,
ColumnType.LIST_MEMBER,
ColumnType.MISSKEY_ANTENNA_TL,
-> column.profileId == getParamEntityId(params, 0)
ColumnType.CONVERSATION,
ColumnType.CONVERSATION_WITH_REFERENCE,
ColumnType.BOOSTED_BY,
ColumnType.FAVOURITED_BY,
ColumnType.LOCAL_AROUND,
ColumnType.FEDERATED_AROUND,
ColumnType.ACCOUNT_AROUND,
ColumnType.STATUS_HISTORY,
-> column.statusId == getParamEntityId(params, 0)
ColumnType.HASHTAG -> {
(getParamString(params, 0) == column.hashtag) &&
((getParamAtNullable<String>(params, 1) ?: "") == column.hashtagAny) &&
((getParamAtNullable<String>(params, 2) ?: "") == column.hashtagAll) &&
((getParamAtNullable<String>(params, 3) ?: "") == column.hashtagNone)
}
ColumnType.HASHTAG_FROM_ACCT -> {
(getParamString(params, 0) == column.hashtag) &&
((getParamAtNullable<String>(params, 1) ?: "") == column.hashtagAcct)
}
ColumnType.NOTIFICATION_FROM_ACCT -> {
((getParamAtNullable<String>(params, 0) ?: "") == column.hashtagAcct)
}
ColumnType.SEARCH ->
getParamString(params, 0) == column.searchQuery &&
getParamAtNullable<Boolean>(params, 1) == column.searchResolve
ColumnType.SEARCH_MSP,
ColumnType.SEARCH_TS,
ColumnType.SEARCH_NOTESTOCK,
->
getParamString(params, 0) == column.searchQuery
ColumnType.INSTANCE_INFORMATION ->
getParamString(params, 0) == column.instanceUri
ColumnType.PROFILE_DIRECTORY ->
getParamString(params, 0) == column.instanceUri &&
getParamAtNullable<String>(params, 1) == column.searchQuery &&
getParamAtNullable<Boolean>(params, 2) == column.searchResolve
ColumnType.DOMAIN_TIMELINE ->
getParamString(params, 0) == column.instanceUri
else -> true
}
} catch (ex: Throwable) {
log.e(ex, "isSameSpec failed.")
false
}
}
}