Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
f7ff5db
[PlayQueue] Fix incorrect UI states of PlayQueue items
TobiGr Dec 20, 2025
a7b226c
[Player] Use original audio language by default
TobiGr Dec 22, 2025
49aaaeb
Feat: opus metadata encoding (#12974)
mira-x Jan 3, 2026
5cefafa
Prepare for version 0.28.1 (1006)
TobiGr Dec 21, 2025
23b7f21
Fix crash on screen rotation while entering SoundCloud import URL
siddhesh-06 Jan 3, 2026
a3673f8
Used requireArguments instead of getArguments
siddhesh-06 Jan 4, 2026
9998d99
Allow dragging boorkmarked playlist in both directions
dustdfg Jan 6, 2026
02e559e
Commit all the playlist changes to db immediately
dustdfg Jan 5, 2026
8f071bc
Update extractor to latest version
TobiGr Jan 6, 2026
635e6a5
Merge pull request #13008 from dustdfg/playlist_normal_drag
TobiGr Jan 6, 2026
d4a124a
Merge pull request #12931 from TobiGr/fix/audio-lang
TobiGr Jan 7, 2026
952a126
Revert Google Material Components to 1.11.0
absurdlylongusername Jan 7, 2026
680235a
Merge pull request #12922 from TobiGr/enqueue-ui
TobiGr Jan 7, 2026
1eeba8d
Remove file orphaned for long time
dustdfg Jan 7, 2026
418e341
Removed restoreInstanceState and resultServiceIntent condition
siddhesh-06 Jan 8, 2026
dc5c5b6
Fix download resume corruption when server returns HTTP 200
jloutsch Jan 6, 2026
cafb139
Merge pull request #12995 from siddhesh-06/siddhesh-06/fix/crash-on-s…
TobiGr Jan 9, 2026
d5d92e8
Fix crash on screen rotation while entering SoundCloud import URL
siddhesh-06 Jan 3, 2026
381b383
Used requireArguments instead of getArguments
siddhesh-06 Jan 4, 2026
a83762c
Removed restoreInstanceState and resultServiceIntent condition
siddhesh-06 Jan 8, 2026
df92431
Translated using Weblate (Bengali (India))
weblate Jan 9, 2026
27b8a72
Fixed length of changelogs
TobiGr Jan 9, 2026
3323868
Translated using Weblate (Bengali (India))
weblate Jan 9, 2026
11467a7
Fixed length of changelogs
TobiGr Jan 9, 2026
fc39bff
Remove script for fastlane check
TobiGr Jan 9, 2026
9ba89d4
Remove script for fastlane check
TobiGr Jan 9, 2026
5d7a3f9
Update extractor to v0.25.0
TobiGr Jan 11, 2026
8e389c4
Translated using Weblate (Polish)
weblate Jan 11, 2026
56489e5
Translated using Weblate (Polish)
weblate Jan 11, 2026
4f0e62e
Misc small kotlin based refactors
dustdfg Jan 11, 2026
98a1e65
Merge pull request #12926 from TeamNewPipe/release-0-28.1
TobiGr Jan 11, 2026
6c5d58b
Fix minify step of release build by ignoring two classes
TobiGr Jan 11, 2026
b892318
Merge pull request #13038 from TobiGr/fix/minify
TobiGr Jan 11, 2026
4ed2b97
Merge branch 'master' into dev
TobiGr Jan 11, 2026
914feef
Fix playlist item dragging video to only neighbor positions
dustdfg Jan 12, 2026
77d62de
Merge pull request #13049 from dustdfg/playlist_bug
TobiGr Jan 12, 2026
7dc3828
ci: fix shell injection in backport workflow
RinZ27 Jan 13, 2026
2f063a7
Merge pull request #13052 from RinZ27/fix/ci-shell-injection
TobiGr Jan 13, 2026
402f43e
Fixed a bug that prevented the display of multiple empty playlists
dustdfg Jan 13, 2026
4ef5aa7
Merge pull request #13055 from dustdfg/playlist_add_empty
TobiGr Jan 15, 2026
7d95ec7
Merge pull request #13019 from dustdfg/orphaned_again
theimpulson Jan 19, 2026
3ab4142
Update NewPipe Extractor, checkstyle and sonarqube to latest versions
TobiGr Dec 23, 2025
16415d1
Update more dependencies to latest stable release
theimpulson Jan 19, 2026
40d7dcf
Update Gradle to 9.3.0
theimpulson Jan 22, 2026
bcb7469
Run checkstyle with JDK 21
theimpulson Jan 22, 2026
eec3ac1
Merge pull request #12936 from TobiGr/uddate-extractor
theimpulson Jan 22, 2026
675dbd3
Merge pull request #13036 from dustdfg/kotlin_misc_refactor
theimpulson Jan 23, 2026
ed4b77b
ktlint: Set codestyle and ignore function naming for Composable
theimpulson Jan 21, 2026
f23d8ef
ktlint: Order imports in lexicographic order
theimpulson Jan 21, 2026
2c808b0
ktlint: Fix ktlint_standard_annotation violations
theimpulson Jan 21, 2026
0641c19
ktlint: Fix multi-line if-else violations
theimpulson Jan 21, 2026
247cbf3
ktlint: Drop non-required violation supressions
theimpulson Jan 21, 2026
d6f3dee
ktlint: Drop unused semi-colons
theimpulson Jan 21, 2026
c76d14d
ktlint: Drop unused trailing commas
theimpulson Jan 21, 2026
80a543e
ktlint: Fix violation related to comment placement
theimpulson Jan 21, 2026
c60339f
ktlint: Drop non-required violation supression
theimpulson Jan 21, 2026
6190db7
ktlint: Fix violations regarding statement wrapping
theimpulson Jan 21, 2026
dcb2460
ktlint: Fix spacing-between-declarations-with-comments violations
theimpulson Jan 21, 2026
e86846b
ktlint: Fix spacing-between-declarations-with-annotations violations
theimpulson Jan 21, 2026
ea105e9
ktlint: Drop non-required violation supressions again
theimpulson Jan 21, 2026
555cd3a
ktlint: Fix standard_kdoc violations
theimpulson Jan 21, 2026
1466dd1
ktlint: Fix indentation violations
theimpulson Jan 21, 2026
81fd089
ktlint: Fix block comment violations
theimpulson Jan 21, 2026
ff2390b
ktlint: Fix enum wrapping violations
theimpulson Jan 21, 2026
9b7874f
ktlint: Fix blank-line-between-when-conditions violations
theimpulson Jan 21, 2026
7d5647b
ktlint: Fix standard_argument-list-wrapping violations
theimpulson Jan 21, 2026
81ddd5a
ktlint: Fix no-empty-first-line-in-method-block violations
theimpulson Jan 21, 2026
eb97366
ktlint: Drop non-required violation supression
theimpulson Jan 21, 2026
8c5f13a
ktlint: Fix function-signature violations
theimpulson Jan 21, 2026
6b2a1ce
ktlint: Fix function-literal violations
theimpulson Jan 21, 2026
8ac8424
ktlint: Drop unused chain-method-continuation violation supression
theimpulson Jan 21, 2026
2fd2822
ktlint: Drop non-required backing-property-naming supression
theimpulson Jan 22, 2026
460cadf
Merge pull request #13081 from TeamNewPipe/ktlint
theimpulson Jan 23, 2026
394a7f6
Merge branch 'dev' into refactor
theimpulson Jan 26, 2026
2376a83
Fix all ktlint violations and merge issues
theimpulson Jan 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 3 additions & 30 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,40 +6,13 @@
root = true

[*.{kt,kts}]
ktlint_code_style = android_studio
# https://pinterest.github.io/ktlint/latest/rules/standard/#function-naming
ktlint_function_naming_ignore_when_annotated_with = Composable
ktlint_standard_annotation = disabled
ktlint_standard_argument-list-wrapping = disabled
ktlint_standard_backing-property-naming = disabled
ktlint_standard_blank-line-before-declaration = disabled
ktlint_standard_blank-line-between-when-conditions = disabled
ktlint_standard_chain-method-continuation = disabled

ktlint_standard_class-signature = disabled
ktlint_standard_comment-wrapping = disabled
ktlint_standard_enum-wrapping = disabled
ktlint_standard_function-expression-body = disabled
ktlint_standard_function-literal = disabled
ktlint_standard_function-signature = disabled
ktlint_standard_indent = disabled
ktlint_standard_kdoc = disabled
ktlint_standard_max-line-length = disabled
ktlint_standard_mixed-condition-operators = disabled
ktlint_standard_multiline-expression-wrapping = disabled
ktlint_standard_multiline-if-else = disabled
ktlint_standard_no-blank-line-in-list = disabled
ktlint_standard_no-consecutive-comments = disabled
ktlint_standard_no-empty-first-line-in-class-body = disabled
ktlint_standard_no-empty-first-line-in-method-block = disabled
ktlint_standard_no-line-break-after-else = disabled
ktlint_standard_no-semi = disabled
ktlint_standard_no-single-line-block-comment = disabled
ktlint_standard_package-name = disabled
ktlint_standard_parameter-list-wrapping = disabled
ktlint_standard_property-naming = disabled
ktlint_standard_spacing-between-declarations-with-annotations = disabled
ktlint_standard_spacing-between-declarations-with-comments = disabled
ktlint_standard_statement-wrapping = disabled
ktlint_standard_string-template-indent = disabled
ktlint_standard_trailing-comma-on-call-site = disabled
ktlint_standard_trailing-comma-on-declaration-site = disabled
ktlint_standard_try-catch-finally-spacing = disabled
ktlint_standard_when-entry-bracing = disabled
4 changes: 3 additions & 1 deletion .github/workflows/backport-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ jobs:
- uses: actions/checkout@v4
- name: Get backport metadata
# the target branch is the first argument after `/backport`
env:
COMMENT_BODY: ${{ github.event.comment.body }}
run: |
set -euo pipefail
body="${{ github.event.comment.body }}"
body="$COMMENT_BODY"
line=${body%%$'\n'*} # Get the first line
if [[ $line =~ ^/backport[[:space:]]+([^[:space:]]+) ]]; then
Expand Down
11 changes: 9 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ android {
minSdk = 23
targetSdk = 35

versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1005
versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1006

versionName = "0.28.0"
versionName = "0.28.1"
System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it }

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
Expand Down Expand Up @@ -140,6 +140,13 @@ ksp {
// Custom dependency configuration for ktlint
val ktlint by configurations.creating

// https://checkstyle.org/#JRE_and_JDK
tasks.withType<Checkstyle>().configureEach {
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(21)
}
}

checkstyle {
configDirectory = rootProject.file("checkstyle")
isIgnoreFailures = false
Expand Down
5 changes: 5 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
-dontwarn javax.script.**
-keep class jdk.dynalink.** { *; }
-dontwarn jdk.dynalink.**
# Rules for jsoup
# Ignore intended-to-be-optional re2j classes - only needed if using re2j for jsoup regex
# jsoup safely falls back to JDK regex if re2j not on classpath, but has concrete re2j refs
# See https://github.com/jhy/jsoup/issues/2459 - may be resolved in future, then this may be removed
-dontwarn com.google.re2j.**

## Rules for ExoPlayer
-keep class com.google.android.exoplayer2.** { *; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,28 +176,32 @@ class DatabaseMigrationTest {

databaseInV7.run {
insert(
"search_history", SQLiteDatabase.CONFLICT_FAIL,
"search_history",
SQLiteDatabase.CONFLICT_FAIL,
ContentValues().apply {
put("service_id", serviceId)
put("search", defaultSearch1)
}
)
insert(
"search_history", SQLiteDatabase.CONFLICT_FAIL,
"search_history",
SQLiteDatabase.CONFLICT_FAIL,
ContentValues().apply {
put("service_id", serviceId)
put("search", defaultSearch2)
}
)
insert(
"search_history", SQLiteDatabase.CONFLICT_FAIL,
"search_history",
SQLiteDatabase.CONFLICT_FAIL,
ContentValues().apply {
put("service_id", otherServiceId)
put("search", defaultSearch1)
}
)
insert(
"search_history", SQLiteDatabase.CONFLICT_FAIL,
"search_history",
SQLiteDatabase.CONFLICT_FAIL,
ContentValues().apply {
put("service_id", otherServiceId)
put("search", defaultSearch2)
Expand All @@ -207,13 +211,17 @@ class DatabaseMigrationTest {
}

testHelper.runMigrationsAndValidate(
AppDatabase.DATABASE_NAME, Migrations.DB_VER_8,
true, Migrations.MIGRATION_7_8
AppDatabase.DATABASE_NAME,
Migrations.DB_VER_8,
true,
Migrations.MIGRATION_7_8
)

testHelper.runMigrationsAndValidate(
AppDatabase.DATABASE_NAME, Migrations.DB_VER_9,
true, Migrations.MIGRATION_8_9
AppDatabase.DATABASE_NAME,
Migrations.DB_VER_9,
true,
Migrations.MIGRATION_8_9
)

val migratedDatabaseV8 = getMigratedDatabase()
Expand All @@ -235,41 +243,47 @@ class DatabaseMigrationTest {
val remoteUid2: Long
databaseInV8.run {
localUid1 = insert(
"playlists", SQLiteDatabase.CONFLICT_FAIL,
"playlists",
SQLiteDatabase.CONFLICT_FAIL,
ContentValues().apply {
put("name", DEFAULT_NAME + "1")
put("is_thumbnail_permanent", false)
put("thumbnail_stream_id", -1)
}
)
localUid2 = insert(
"playlists", SQLiteDatabase.CONFLICT_FAIL,
"playlists",
SQLiteDatabase.CONFLICT_FAIL,
ContentValues().apply {
put("name", DEFAULT_NAME + "2")
put("is_thumbnail_permanent", false)
put("thumbnail_stream_id", -1)
}
)
delete(
"playlists", "uid = ?",
"playlists",
"uid = ?",
Array(1) { localUid1 }
)
remoteUid1 = insert(
"remote_playlists", SQLiteDatabase.CONFLICT_FAIL,
"remote_playlists",
SQLiteDatabase.CONFLICT_FAIL,
ContentValues().apply {
put("service_id", DEFAULT_SERVICE_ID)
put("url", DEFAULT_URL)
}
)
remoteUid2 = insert(
"remote_playlists", SQLiteDatabase.CONFLICT_FAIL,
"remote_playlists",
SQLiteDatabase.CONFLICT_FAIL,
ContentValues().apply {
put("service_id", DEFAULT_SECOND_SERVICE_ID)
put("url", DEFAULT_SECOND_URL)
}
)
delete(
"remote_playlists", "uid = ?",
"remote_playlists",
"uid = ?",
Array(1) { remoteUid2 }
)
close()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import android.content.Context
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import io.reactivex.rxjava3.core.Single
import java.io.IOException
import java.time.OffsetDateTime
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
Expand All @@ -20,9 +22,6 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity
import org.schabi.newpipe.extractor.ServiceList
import org.schabi.newpipe.extractor.channel.ChannelInfo
import org.schabi.newpipe.extractor.stream.StreamType
import java.io.IOException
import java.time.OffsetDateTime
import kotlin.streams.toList

class FeedDAOTest {
private lateinit var db: AppDatabase
Expand All @@ -41,14 +40,21 @@ class FeedDAOTest {
private val stream7 = StreamEntity(7, serviceId, "https://youtube.com/watch?v=7", "stream 7", StreamType.VIDEO_STREAM, 1000, "channel-4", "https://youtube.com/channel/4", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-10", OffsetDateTime.parse("2023-08-10T00:00:00Z"))

private val allStreams = listOf(
stream1, stream2, stream3, stream4, stream5, stream6, stream7
stream1,
stream2,
stream3,
stream4,
stream5,
stream6,
stream7
)

@Before
fun createDb() {
val context = ApplicationProvider.getApplicationContext<Context>()
db = Room.inMemoryDatabaseBuilder(
context, AppDatabase::class.java
context,
AppDatabase::class.java
).build()
feedDAO = db.feedDAO()
streamDAO = db.streamDAO()
Expand All @@ -65,7 +71,10 @@ class FeedDAOTest {
fun testUnlinkStreamsOlderThan_KeepOne() {
setupUnlinkDelete("2023-08-15T00:00:00Z")
val streams = feedDAO.getStreams(
FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null
FeedGroupEntity.GROUP_ALL_ID,
includePlayed = true,
includePartiallyPlayed = true,
null
)
.blockingGet()
val allowedStreams = listOf(stream3, stream5, stream6, stream7)
Expand All @@ -76,7 +85,10 @@ class FeedDAOTest {
fun testUnlinkStreamsOlderThan_KeepMultiple() {
setupUnlinkDelete("2023-08-01T00:00:00Z")
val streams = feedDAO.getStreams(
FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null
FeedGroupEntity.GROUP_ALL_ID,
includePlayed = true,
includePartiallyPlayed = true,
null
)
.blockingGet()
val allowedStreams = listOf(stream3, stream4, stream5, stream6, stream7)
Expand Down Expand Up @@ -112,7 +124,7 @@ class FeedDAOTest {
SubscriptionEntity.from(ChannelInfo(serviceId, "1", "https://youtube.com/channel/1", "https://youtube.com/channel/1", "channel-1")),
SubscriptionEntity.from(ChannelInfo(serviceId, "2", "https://youtube.com/channel/2", "https://youtube.com/channel/2", "channel-2")),
SubscriptionEntity.from(ChannelInfo(serviceId, "3", "https://youtube.com/channel/3", "https://youtube.com/channel/3", "channel-3")),
SubscriptionEntity.from(ChannelInfo(serviceId, "4", "https://youtube.com/channel/4", "https://youtube.com/channel/4", "channel-4")),
SubscriptionEntity.from(ChannelInfo(serviceId, "4", "https://youtube.com/channel/4", "https://youtube.com/channel/4", "channel-4"))
)
)
feedDAO.insertAll(
Expand All @@ -123,7 +135,7 @@ class FeedDAOTest {
FeedEntity(4, 2),
FeedEntity(5, 2),
FeedEntity(6, 3),
FeedEntity(7, 4),
FeedEntity(7, 4)
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import android.os.Parcelable
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import java.io.IOException
import java.net.SocketTimeoutException
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNull
Expand All @@ -16,8 +18,6 @@ import org.schabi.newpipe.R
import org.schabi.newpipe.extractor.ServiceList
import org.schabi.newpipe.extractor.exceptions.ParsingException
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException
import java.io.IOException
import java.net.SocketTimeoutException

/**
* Instrumented tests for {@link ErrorInfo}.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package org.schabi.newpipe.local.history

import androidx.test.core.app.ApplicationProvider
import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.time.ZoneOffset
import org.assertj.core.api.Assertions.assertThat
import org.junit.After
import org.junit.Assert.assertEquals
Expand All @@ -11,9 +14,6 @@ import org.schabi.newpipe.database.AppDatabase
import org.schabi.newpipe.database.history.model.SearchHistoryEntry
import org.schabi.newpipe.testUtil.TestDatabase
import org.schabi.newpipe.testUtil.TrampolineSchedulerRule
import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.time.ZoneOffset

class HistoryRecordManagerTest {

Expand Down Expand Up @@ -54,7 +54,7 @@ class HistoryRecordManagerTest {
SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 0, search = "A"),
SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = "A"),
SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 1, search = "B"),
SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 0, search = "B"),
SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 0, search = "B")
)

// make sure all 4 were inserted
Expand Down Expand Up @@ -85,7 +85,7 @@ class HistoryRecordManagerTest {
val entries = listOf(
SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A"),
SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = "B"),
SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 0, search = "C"),
SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 0, search = "C")
)

// make sure all 3 were inserted
Expand All @@ -98,7 +98,6 @@ class HistoryRecordManagerTest {
}

private fun insertShuffledRelatedSearches(relatedSearches: Collection<SearchHistoryEntry>) {

// shuffle to make sure the order of items returned by queries depends only on
// SearchHistoryEntry.creationDate, not on the actual insertion time, so that we can
// verify that the `ORDER BY` clause does its job
Expand All @@ -121,7 +120,7 @@ class HistoryRecordManagerTest {
RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places)
RELATED_SEARCHES_ENTRIES[4].search, // B
RELATED_SEARCHES_ENTRIES[5].search, // AA
RELATED_SEARCHES_ENTRIES[2].search, // BA
RELATED_SEARCHES_ENTRIES[2].search // BA
)
}

Expand All @@ -136,7 +135,7 @@ class HistoryRecordManagerTest {
SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = "A"),
SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 3, search = "A"),
SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = "A"),
SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 2, search = "AA"),
SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 2, search = "AA")
)
insertShuffledRelatedSearches(relatedSearches)

Expand All @@ -153,7 +152,7 @@ class HistoryRecordManagerTest {
assertThat(searches).containsExactly(
RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places)
RELATED_SEARCHES_ENTRIES[5].search, // AA
RELATED_SEARCHES_ENTRIES[1].search, // BA
RELATED_SEARCHES_ENTRIES[1].search // BA
)

// also make sure that the string comparison is case insensitive
Expand All @@ -171,7 +170,7 @@ class HistoryRecordManagerTest {
SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = "A"),
SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = "B"),
SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 2, search = "AA"),
SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A"),
SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A")
)
}
}
Loading