Fix status diffing and improve timeline performance (#2386)

* fix status & account diffing

* introduce TimelineAccount

* use TimelineAccount where possible

* improve tests

* improve ConversationEntity equals/hashcode

* fix mistake in ConversationEntity

* improve StatusViewData comparison

* improve tests

* fix typo in comment
This commit is contained in:
Konrad Pozniak 2022-03-15 21:34:57 +01:00 committed by GitHub
commit e05fdc6d7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 463 additions and 147 deletions

View file

@ -19,6 +19,7 @@ import androidx.annotation.Nullable;
import com.keylesspalace.tusky.entity.Account;
import com.keylesspalace.tusky.entity.Notification;
import com.keylesspalace.tusky.entity.TimelineAccount;
import java.util.Objects;
@ -44,11 +45,11 @@ public abstract class NotificationViewData {
public static final class Concrete extends NotificationViewData {
private final Notification.Type type;
private final String id;
private final Account account;
private final TimelineAccount account;
@Nullable
private final StatusViewData.Concrete statusViewData;
public Concrete(Notification.Type type, String id, Account account,
public Concrete(Notification.Type type, String id, TimelineAccount account,
@Nullable StatusViewData.Concrete statusViewData) {
this.type = type;
this.id = id;
@ -64,7 +65,7 @@ public abstract class NotificationViewData {
return id;
}
public Account getAccount() {
public TimelineAccount getAccount() {
return account;
}

View file

@ -22,12 +22,11 @@ import com.keylesspalace.tusky.entity.Status
/**
* Created by charlag on 11/07/2017.
*
*
* Class to represent data required to display either a notification or a placeholder.
* It is either a [StatusViewData.Concrete] or a [StatusViewData.Placeholder].
*/
sealed class StatusViewData private constructor() {
abstract val viewDataId: Long
sealed class StatusViewData {
abstract val id: String
data class Concrete(
val status: Status,
@ -49,8 +48,8 @@ sealed class StatusViewData private constructor() {
/** Whether the status meets the requirement to be collapse */
val isCollapsed: Boolean,
) : StatusViewData() {
override val viewDataId: Long
get() = status.id.hashCode().toLong()
override val id: String
get() = status.id
val content: Spanned
val spoilerText: String
@ -116,9 +115,6 @@ sealed class StatusViewData private constructor() {
}
}
val id: String
get() = status.id
/** Helper for Java */
fun copyWithStatus(status: Status): Concrete {
return copy(status = status)
@ -140,10 +136,10 @@ sealed class StatusViewData private constructor() {
}
}
data class Placeholder(val id: String, val isLoading: Boolean) : StatusViewData() {
override val viewDataId: Long
get() = id.hashCode().toLong()
}
data class Placeholder(
override val id: String,
val isLoading: Boolean
) : StatusViewData()
fun asStatusOrNull() = this as? Concrete