2021-06-28 09:09:00 +02:00
|
|
|
package jp.juggler.subwaytooter.column
|
2018-01-04 19:52:25 +01:00
|
|
|
|
|
|
|
import android.content.Context
|
2018-11-19 23:46:14 +01:00
|
|
|
import android.content.SharedPreferences
|
2019-08-23 01:49:20 +02:00
|
|
|
import android.util.SparseArray
|
2019-04-28 13:30:47 +02:00
|
|
|
import androidx.appcompat.app.AppCompatActivity
|
2021-06-28 09:09:00 +02:00
|
|
|
import jp.juggler.subwaytooter.*
|
2018-01-04 19:52:25 +01:00
|
|
|
import jp.juggler.subwaytooter.api.*
|
|
|
|
import jp.juggler.subwaytooter.api.entity.*
|
2021-06-28 09:09:00 +02:00
|
|
|
import jp.juggler.subwaytooter.columnviewholder.ColumnViewHolder
|
2021-11-06 04:00:29 +01:00
|
|
|
import jp.juggler.subwaytooter.pref.PrefI
|
2020-12-21 03:13:03 +01:00
|
|
|
import jp.juggler.subwaytooter.streaming.*
|
2018-03-15 17:23:43 +01:00
|
|
|
import jp.juggler.subwaytooter.table.*
|
2018-12-01 00:02:18 +01:00
|
|
|
import jp.juggler.subwaytooter.util.BucketList
|
|
|
|
import jp.juggler.subwaytooter.util.ScrollPosition
|
|
|
|
import jp.juggler.util.*
|
2018-12-07 01:50:11 +01:00
|
|
|
import okhttp3.Handshake
|
2018-06-11 02:33:01 +02:00
|
|
|
import java.util.*
|
2018-08-25 13:59:57 +02:00
|
|
|
import java.util.concurrent.ConcurrentLinkedQueue
|
2018-08-16 21:58:30 +02:00
|
|
|
import java.util.concurrent.atomic.AtomicBoolean
|
2019-04-28 13:30:47 +02:00
|
|
|
import java.util.concurrent.atomic.AtomicInteger
|
2018-08-25 13:59:57 +02:00
|
|
|
import java.util.concurrent.atomic.AtomicLong
|
2019-08-29 18:16:21 +02:00
|
|
|
|
2021-05-17 21:55:53 +02:00
|
|
|
enum class ColumnPagingType { Default, Cursor, Offset, None, }
|
|
|
|
|
|
|
|
enum class ProfileTab(val id: Int, val ct: ColumnType) {
|
|
|
|
Status(0, ColumnType.TabStatus),
|
|
|
|
Following(1, ColumnType.TabFollowing),
|
|
|
|
Followers(2, ColumnType.TabFollowers)
|
|
|
|
}
|
|
|
|
|
|
|
|
enum class HeaderType(val viewType: Int) {
|
|
|
|
Profile(1), Search(2), Instance(3), Filter(4), ProfileDirectory(5),
|
|
|
|
}
|
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
class Column(
|
2021-06-20 15:12:25 +02:00
|
|
|
val appState: AppState,
|
2020-12-21 03:13:03 +01:00
|
|
|
val context: Context,
|
2021-06-20 15:12:25 +02:00
|
|
|
val accessInfo: SavedAccount,
|
2020-12-21 03:13:03 +01:00
|
|
|
typeId: Int,
|
2021-06-20 15:12:25 +02:00
|
|
|
val columnId: String,
|
2018-01-12 10:01:25 +01:00
|
|
|
) {
|
2020-12-06 21:19:02 +01:00
|
|
|
companion object {
|
|
|
|
internal const val LOOP_TIMEOUT = 10000L
|
|
|
|
internal const val LOOP_READ_ENOUGH = 30 // フィルタ後のデータ数がコレ以上ならループを諦めます
|
|
|
|
internal const val RELATIONSHIP_LOAD_STEP = 40
|
|
|
|
internal const val ACCT_DB_STEP = 100
|
|
|
|
internal const val MISSKEY_HASHTAG_LIMIT = 30
|
2021-05-17 21:33:28 +02:00
|
|
|
internal const val HASHTAG_ELLIPSIZE = 26
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
val typeMap: SparseArray<ColumnType> = SparseArray()
|
|
|
|
|
|
|
|
internal var showOpenSticker = false
|
|
|
|
|
|
|
|
internal const val QUICK_FILTER_ALL = 0
|
|
|
|
internal const val QUICK_FILTER_MENTION = 1
|
|
|
|
internal const val QUICK_FILTER_FAVOURITE = 2
|
|
|
|
internal const val QUICK_FILTER_BOOST = 3
|
|
|
|
internal const val QUICK_FILTER_FOLLOW = 4
|
|
|
|
internal const val QUICK_FILTER_REACTION = 5
|
|
|
|
internal const val QUICK_FILTER_VOTE = 6
|
|
|
|
internal const val QUICK_FILTER_POST = 7
|
|
|
|
|
|
|
|
fun loadAccount(context: Context, src: JsonObject): SavedAccount {
|
2021-05-17 16:13:04 +02:00
|
|
|
val account_db_id = src.long(ColumnEncoder.KEY_ACCOUNT_ROW_ID) ?: -1L
|
2020-12-06 21:19:02 +01:00
|
|
|
return if (account_db_id >= 0) {
|
|
|
|
SavedAccount.loadAccount(context, account_db_id)
|
2021-06-20 15:12:25 +02:00
|
|
|
?: error("missing account")
|
2020-12-06 21:19:02 +01:00
|
|
|
} else {
|
|
|
|
SavedAccount.na
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-21 03:13:03 +01:00
|
|
|
// private val channelIdSeed = AtomicInteger(0)
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
// より古いデータの取得に使う
|
|
|
|
internal val reMaxId = """[&?]max_id=([^&?;\s]+)""".asciiPattern()
|
|
|
|
|
|
|
|
// より新しいデータの取得に使う
|
2021-05-17 16:13:04 +02:00
|
|
|
val reMinId = """[&?](min_id|since_id)=([^&?;\s]+)""".asciiPattern()
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
val COLUMN_REGEX_FILTER_DEFAULT: (CharSequence?) -> Boolean = { false }
|
|
|
|
|
2021-05-17 15:03:23 +02:00
|
|
|
var defaultColorHeaderBg = 0
|
|
|
|
var defaultColorHeaderName = 0
|
|
|
|
var defaultColorHeaderPageNumber = 0
|
2020-12-06 21:19:02 +01:00
|
|
|
var defaultColorContentBg = 0
|
2021-05-17 15:03:23 +02:00
|
|
|
var defaultColorContentAcct = 0
|
|
|
|
var defaultColorContentText = 0
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
fun reloadDefaultColor(activity: AppCompatActivity, pref: SharedPreferences) {
|
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
defaultColorHeaderBg = PrefI.ipCcdHeaderBg(pref).notZero()
|
2021-01-04 02:11:45 +01:00
|
|
|
?: activity.attrColor(R.attr.color_column_header)
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
defaultColorHeaderName = PrefI.ipCcdHeaderFg(pref).notZero()
|
2021-01-04 02:11:45 +01:00
|
|
|
?: activity.attrColor(R.attr.colorColumnHeaderName)
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
defaultColorHeaderPageNumber = PrefI.ipCcdHeaderFg(pref).notZero()
|
2021-01-04 02:11:45 +01:00
|
|
|
?: activity.attrColor(R.attr.colorColumnHeaderPageNumber)
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
defaultColorContentBg = PrefI.ipCcdContentBg(pref)
|
2020-12-06 21:19:02 +01:00
|
|
|
// may zero
|
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
defaultColorContentAcct = PrefI.ipCcdContentAcct(pref).notZero()
|
2021-01-04 02:11:45 +01:00
|
|
|
?: activity.attrColor(R.attr.colorTimeSmall)
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-22 10:31:51 +02:00
|
|
|
defaultColorContentText = PrefI.ipCcdContentText(pref).notZero()
|
2021-01-04 02:11:45 +01:00
|
|
|
?: activity.attrColor(R.attr.colorContentText)
|
2020-12-06 21:19:02 +01:00
|
|
|
}
|
2020-12-21 03:13:03 +01:00
|
|
|
|
|
|
|
private val internalIdSeed = AtomicInteger(0)
|
2020-12-06 21:19:02 +01:00
|
|
|
}
|
|
|
|
|
2020-12-21 03:13:03 +01:00
|
|
|
// カラムオブジェクトの識別に使うID。
|
|
|
|
val internalId = internalIdSeed.incrementAndGet()
|
|
|
|
|
2020-12-06 21:19:02 +01:00
|
|
|
val type = ColumnType.parse(typeId)
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var dontClose = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var withAttachment = false
|
|
|
|
internal var withHighlight = false
|
|
|
|
internal var dontShowBoost = false
|
|
|
|
internal var dontShowReply = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var dontShowNormalToot = false
|
|
|
|
internal var dontShowNonPublicToot = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var dontShowFavourite = false // 通知カラムのみ
|
|
|
|
internal var dontShowFollow = false // 通知カラムのみ
|
|
|
|
internal var dontShowReaction = false // 通知カラムのみ
|
|
|
|
internal var dontShowVote = false // 通知カラムのみ
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var quickFilter = QUICK_FILTER_ALL
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-11-06 04:00:29 +01:00
|
|
|
internal var showMediaDescription = true
|
|
|
|
|
2020-12-21 03:13:03 +01:00
|
|
|
@Volatile
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var dontStreaming = false
|
2020-12-21 03:13:03 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var dontAutoRefresh = false
|
|
|
|
internal var hideMediaDefault = false
|
|
|
|
internal var systemNotificationNotRelated = false
|
|
|
|
internal var instanceLocal = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var enableSpeech = false
|
|
|
|
internal var useOldApi = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var regexText: String = ""
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var headerBgColor = 0
|
|
|
|
internal var headerFgColor = 0
|
|
|
|
internal var columnBgColor = 0
|
|
|
|
internal var acctColor = 0
|
|
|
|
internal var contentColor = 0
|
|
|
|
internal var columnBgImage = ""
|
|
|
|
internal var columnBgImageAlpha = 1f
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var profileTab = ProfileTab.Status
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var statusId: EntityId? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
// プロフカラムではアカウントのID。リストカラムではリストのID
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var profileId: EntityId? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var searchQuery = ""
|
|
|
|
internal var searchResolve = false
|
|
|
|
internal var remoteOnly = false
|
|
|
|
internal var instanceUri = ""
|
|
|
|
internal var hashtag = ""
|
|
|
|
internal var hashtagAny = ""
|
|
|
|
internal var hashtagAll = ""
|
|
|
|
internal var hashtagNone = ""
|
|
|
|
internal var hashtagAcct = ""
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var languageFilter: JsonObject? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
// 告知のリスト
|
|
|
|
internal var announcements: MutableList<TootAnnouncement>? = null
|
|
|
|
|
|
|
|
// 表示中の告知
|
|
|
|
internal var announcementId: EntityId? = null
|
|
|
|
|
|
|
|
// 告知を閉じた時刻, 0なら閉じていない
|
|
|
|
internal var announcementHideTime = 0L
|
|
|
|
|
|
|
|
// 告知データを更新したタイミング
|
|
|
|
internal var announcementUpdated = 0L
|
|
|
|
|
|
|
|
// プロフカラムでのアカウント情報
|
|
|
|
@Volatile
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var whoAccount: TootAccountRef? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
// プロフカラムでのfeatured tag 情報(Mastodon3.3.0)
|
|
|
|
@Volatile
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var whoFeaturedTags: List<TootTag>? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
// リストカラムでのリスト情報
|
|
|
|
@Volatile
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var listInfo: TootList? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
// アンテナカラムでのリスト情報
|
|
|
|
@Volatile
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var antennaInfo: MisskeyAntenna? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
// 「インスタンス情報」カラムに表示するインスタンス情報
|
|
|
|
// (SavedAccount中のインスタンス情報とは異なるので注意)
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var instanceInformation: TootInstance? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
internal var handshake: Handshake? = null
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var scrollSave: ScrollPosition? = null
|
|
|
|
var lastViewingItemId: EntityId? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal val isDispose = AtomicBoolean()
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2020-12-21 03:13:03 +01:00
|
|
|
@Volatile
|
2020-12-06 21:19:02 +01:00
|
|
|
internal var bFirstInitialized = false
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
var filterReloadRequired = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// カラムを閉じた後のnotifyDataSetChangedのタイミングで、add/removeされる順序が期待通りにならないので
|
|
|
|
// 参照を1つだけ持つのではなく、リストを保持して先頭の要素を使うことにする
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
val listViewHolder = LinkedList<ColumnViewHolder>()
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
internal var lastTask: ColumnTask? = null
|
|
|
|
|
2020-12-21 03:13:03 +01:00
|
|
|
@Volatile
|
2020-12-06 21:19:02 +01:00
|
|
|
internal var bInitialLoading: Boolean = false
|
2020-12-21 03:13:03 +01:00
|
|
|
|
|
|
|
@Volatile
|
2020-12-06 21:19:02 +01:00
|
|
|
internal var bRefreshLoading: Boolean = false
|
|
|
|
|
|
|
|
internal var mInitialLoadingError: String = ""
|
|
|
|
internal var mRefreshLoadingError: String = ""
|
|
|
|
internal var mRefreshLoadingErrorTime: Long = 0L
|
|
|
|
internal var mRefreshLoadingErrorPopupState: Int = 0
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal var taskProgress: String? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal val listData = BucketList<TimelineItem>()
|
|
|
|
internal val duplicateMap = DuplicateMap()
|
2021-05-17 21:33:28 +02:00
|
|
|
|
2020-12-06 21:19:02 +01:00
|
|
|
@Volatile
|
2021-06-20 15:12:25 +02:00
|
|
|
var columnRegexFilter = COLUMN_REGEX_FILTER_DEFAULT
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
@Volatile
|
2021-05-17 15:03:23 +02:00
|
|
|
var keywordFilterTrees: FilterTrees? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
@Volatile
|
2021-05-17 15:03:23 +02:00
|
|
|
var favMuteSet: HashSet<Acct>? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
@Volatile
|
2021-06-20 15:12:25 +02:00
|
|
|
var highlightTrie: WordTrieTree? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
|
|
|
// タイムライン中のデータの始端と終端
|
|
|
|
// misskeyは
|
|
|
|
internal var idRecent: EntityId? = null
|
|
|
|
internal var idOld: EntityId? = null
|
|
|
|
internal var offsetNext: Int = 0
|
|
|
|
internal var pagingType: ColumnPagingType = ColumnPagingType.Default
|
|
|
|
|
|
|
|
var bRefreshingTop: Boolean = false
|
|
|
|
|
|
|
|
// ListViewの表示更新が追いつかないとスクロール位置が崩れるので
|
|
|
|
// 一定時間より短期間にはデータ更新しないようにする
|
2021-06-20 15:12:25 +02:00
|
|
|
val lastShowStreamData = AtomicLong(0L)
|
|
|
|
val streamDataQueue = ConcurrentLinkedQueue<TimelineItem>()
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2020-12-22 00:49:26 +01:00
|
|
|
@Volatile
|
2021-05-17 16:13:04 +02:00
|
|
|
var bPutGap: Boolean = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-05-17 15:03:23 +02:00
|
|
|
var cacheHeaderDesc: String? = null
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2020-12-22 00:49:26 +01:00
|
|
|
// DMカラム更新時に新APIの利用に成功したなら真
|
2021-05-17 10:37:39 +02:00
|
|
|
internal var useConversationSummaries = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2020-12-22 00:49:26 +01:00
|
|
|
// DMカラムのストリーミングイベントで新形式のイベントを利用できたなら真
|
|
|
|
internal var useConversationSummaryStreaming = false
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2020-12-22 00:49:26 +01:00
|
|
|
////////////////////////////////////////////////////////////////
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-05-17 21:55:53 +02:00
|
|
|
val procMergeStreamingMessage =
|
|
|
|
Runnable { this@Column.mergeStreamingMessage() }
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2020-12-22 00:49:26 +01:00
|
|
|
val streamCallback = object : StreamCallback {
|
2021-05-17 21:55:53 +02:00
|
|
|
override fun onStreamStatusChanged(status: StreamStatus) =
|
|
|
|
this@Column.onStreamStatusChanged(status)
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-05-17 21:55:53 +02:00
|
|
|
override fun onTimelineItem(item: TimelineItem, channelId: String?, stream: JsonArray?) =
|
|
|
|
this@Column.onStreamingTimelineItem(item)
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-05-18 16:35:54 +02:00
|
|
|
override fun onEmojiReactionNotification(notification: TootNotification) =
|
|
|
|
runOnMainLooperForStreamingEvent { this@Column.updateEmojiReactionByApiResponse(notification.status) }
|
|
|
|
|
|
|
|
override fun onEmojiReactionEvent(reaction: TootReaction) =
|
|
|
|
runOnMainLooperForStreamingEvent { this@Column.updateEmojiReactionByEvent(reaction) }
|
2020-12-21 03:13:03 +01:00
|
|
|
|
2021-05-17 21:55:53 +02:00
|
|
|
override fun onNoteUpdated(ev: MisskeyNoteUpdate, channelId: String?) =
|
|
|
|
runOnMainLooperForStreamingEvent { this@Column.onMisskeyNoteUpdated(ev) }
|
2020-12-21 03:13:03 +01:00
|
|
|
|
2021-05-17 21:55:53 +02:00
|
|
|
override fun onAnnouncementUpdate(item: TootAnnouncement) =
|
|
|
|
runOnMainLooperForStreamingEvent { this@Column.onAnnouncementUpdate(item) }
|
2021-05-17 07:03:18 +02:00
|
|
|
|
2021-05-17 21:55:53 +02:00
|
|
|
override fun onAnnouncementDelete(id: EntityId) =
|
|
|
|
runOnMainLooperForStreamingEvent { this@Column.onAnnouncementDelete(id) }
|
2020-12-21 03:13:03 +01:00
|
|
|
|
2021-05-17 21:55:53 +02:00
|
|
|
override fun onAnnouncementReaction(reaction: TootReaction) =
|
|
|
|
runOnMainLooperForStreamingEvent { this@Column.onAnnouncementReaction(reaction) }
|
2020-12-22 00:49:26 +01:00
|
|
|
}
|
|
|
|
|
2021-05-17 21:33:28 +02:00
|
|
|
// create from column spec
|
2020-12-22 00:49:26 +01:00
|
|
|
internal constructor(
|
2021-06-20 15:12:25 +02:00
|
|
|
appState: AppState,
|
|
|
|
accessInfo: SavedAccount,
|
2020-12-22 00:49:26 +01:00
|
|
|
type: Int,
|
2021-06-20 15:12:25 +02:00
|
|
|
vararg params: Any,
|
2020-12-22 00:49:26 +01:00
|
|
|
) : this(
|
2021-06-20 15:12:25 +02:00
|
|
|
appState = appState,
|
|
|
|
context = appState.context,
|
|
|
|
accessInfo = accessInfo,
|
2021-05-17 21:33:28 +02:00
|
|
|
typeId = type,
|
2021-06-20 15:12:25 +02:00
|
|
|
columnId = ColumnEncoder.generateColumnId()
|
2020-12-22 00:49:26 +01:00
|
|
|
) {
|
2021-05-17 21:55:53 +02:00
|
|
|
ColumnSpec.decode(this, params)
|
2020-12-22 00:49:26 +01:00
|
|
|
}
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
internal constructor(appState: AppState, src: JsonObject) : this(
|
|
|
|
appState,
|
|
|
|
appState.context,
|
|
|
|
loadAccount(appState.context, src),
|
2021-05-17 16:13:04 +02:00
|
|
|
src.optInt(ColumnEncoder.KEY_TYPE),
|
|
|
|
ColumnEncoder.decodeColumnId(src)
|
2020-12-22 00:49:26 +01:00
|
|
|
) {
|
2021-05-17 21:33:28 +02:00
|
|
|
ColumnEncoder.decode(this, src)
|
2020-12-06 21:19:02 +01:00
|
|
|
}
|
|
|
|
|
2020-12-22 00:49:26 +01:00
|
|
|
override fun hashCode(): Int = internalId
|
|
|
|
|
|
|
|
override fun equals(other: Any?): Boolean = this === other
|
|
|
|
|
2020-12-06 21:19:02 +01:00
|
|
|
internal fun dispose() {
|
2021-06-20 15:12:25 +02:00
|
|
|
isDispose.set(true)
|
|
|
|
appState.streamManager.updateStreamingColumns()
|
2020-12-06 21:19:02 +01:00
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
for (vh in listViewHolder) {
|
2020-12-06 21:19:02 +01:00
|
|
|
try {
|
|
|
|
vh.listView.adapter = null
|
|
|
|
} catch (ignored: Throwable) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
init {
|
2021-06-20 15:12:25 +02:00
|
|
|
ColumnEncoder.registerColumnId(columnId, this)
|
2020-12-06 21:19:02 +01:00
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|