only check once for filters v2 availability (#4539)

Instead of calling the endpoint every time filters are needed, it will
be called only once and the result cached. This will result in quite
some requests less on instances supporting v2.

I also tested v1 filters and made some small improvements. We should
[remove filters v1
support](https://github.com/tuskyapp/Tusky/issues/4538) some time in the
future though.
This commit is contained in:
Konrad Pozniak 2024-07-03 21:18:09 +02:00 committed by GitHub
commit 8a57bcc3f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 1470 additions and 127 deletions

View file

@ -18,7 +18,9 @@
package com.keylesspalace.tusky
import androidx.test.ext.junit.runners.AndroidJUnit4
import at.connyduck.calladapter.networkresult.NetworkResult
import com.keylesspalace.tusky.components.filters.EditFilterActivity
import com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository
import com.keylesspalace.tusky.entity.Attachment
import com.keylesspalace.tusky.entity.Filter
import com.keylesspalace.tusky.entity.FilterV1
@ -26,14 +28,20 @@ import com.keylesspalace.tusky.entity.Poll
import com.keylesspalace.tusky.entity.PollOption
import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.network.FilterModel
import com.keylesspalace.tusky.network.MastodonApi
import java.time.Instant
import java.util.Date
import kotlinx.coroutines.runBlocking
import okhttp3.ResponseBody.Companion.toResponseBody
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.robolectric.annotation.Config
import retrofit2.HttpException
import retrofit2.Response
@Config(sdk = [28])
@RunWith(AndroidJUnit4::class)
@ -43,12 +51,11 @@ class FilterV1Test {
@Before
fun setup() {
filterModel = FilterModel()
val filters = listOf(
FilterV1(
id = "123",
phrase = "badWord",
context = listOf(FilterV1.HOME),
context = listOf(Filter.Kind.HOME.kind),
expiresAt = null,
irreversible = false,
wholeWord = false
@ -56,7 +63,7 @@ class FilterV1Test {
FilterV1(
id = "123",
phrase = "badWholeWord",
context = listOf(FilterV1.HOME, FilterV1.PUBLIC),
context = listOf(Filter.Kind.HOME.kind, Filter.Kind.PUBLIC.kind),
expiresAt = null,
irreversible = false,
wholeWord = true
@ -64,7 +71,7 @@ class FilterV1Test {
FilterV1(
id = "123",
phrase = "@twitter.com",
context = listOf(FilterV1.HOME),
context = listOf(Filter.Kind.HOME.kind),
expiresAt = null,
irreversible = false,
wholeWord = true
@ -72,7 +79,7 @@ class FilterV1Test {
FilterV1(
id = "123",
phrase = "#hashtag",
context = listOf(FilterV1.HOME),
context = listOf(Filter.Kind.HOME.kind),
expiresAt = null,
irreversible = false,
wholeWord = true
@ -80,7 +87,7 @@ class FilterV1Test {
FilterV1(
id = "123",
phrase = "expired",
context = listOf(FilterV1.HOME),
context = listOf(Filter.Kind.HOME.kind),
expiresAt = Date.from(Instant.now().minusSeconds(10)),
irreversible = false,
wholeWord = true
@ -88,7 +95,7 @@ class FilterV1Test {
FilterV1(
id = "123",
phrase = "unexpired",
context = listOf(FilterV1.HOME),
context = listOf(Filter.Kind.HOME.kind),
expiresAt = Date.from(Instant.now().plusSeconds(3600)),
irreversible = false,
wholeWord = true
@ -96,14 +103,27 @@ class FilterV1Test {
FilterV1(
id = "123",
phrase = "href",
context = listOf(FilterV1.HOME),
context = listOf(Filter.Kind.HOME.kind),
expiresAt = null,
irreversible = false,
wholeWord = false
)
)
filterModel.initWithFilters(filters)
val api: MastodonApi = mock {
onBlocking { getFiltersV1() } doReturn NetworkResult.success(filters)
onBlocking { getFilters() } doReturn NetworkResult.failure(
HttpException(Response.error<Any>(404, "".toResponseBody()))
)
}
val instanceInfoRepo: InstanceInfoRepository = mock {
onBlocking { isFilterV2Supported() } doReturn false
}
filterModel = FilterModel(instanceInfoRepo, api)
runBlocking {
filterModel.init(Filter.Kind.HOME)
}
}
@Test

View file

@ -8,6 +8,7 @@ import androidx.test.platform.app.InstrumentationRegistry
import at.connyduck.calladapter.networkresult.NetworkResult
import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.appstore.StatusChangedEvent
import com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository
import com.keylesspalace.tusky.components.timeline.fakeStatus
import com.keylesspalace.tusky.components.timeline.fakeStatusViewData
import com.keylesspalace.tusky.db.AccountManager
@ -81,8 +82,11 @@ class ViewThreadViewModelTest {
api = mock {
onBlocking { getFilters() } doReturn NetworkResult.success(emptyList())
}
val instanceInfoRepo: InstanceInfoRepository = mock {
onBlocking { isFilterV2Supported() } doReturn false
}
eventHub = EventHub()
val filterModel = FilterModel()
val filterModel = FilterModel(instanceInfoRepo, api)
val timelineCases = TimelineCases(api, eventHub)
val accountManager: AccountManager = mock {
on { activeAccount } doReturn AccountEntity(