Add option to clear trending song (#413)
This commit is contained in:
@@ -317,6 +317,15 @@ interface Database {
|
|||||||
@RewriteQueriesToDropUnusedColumns
|
@RewriteQueriesToDropUnusedColumns
|
||||||
fun trending(now: Long = System.currentTimeMillis()): Flow<DetailedSong?>
|
fun trending(now: Long = System.currentTimeMillis()): Flow<DetailedSong?>
|
||||||
|
|
||||||
|
@Query("SELECT COUNT (*) FROM Event")
|
||||||
|
fun eventsCount(): Flow<Int>
|
||||||
|
|
||||||
|
@Query("DELETE FROM Event")
|
||||||
|
fun clearEvents()
|
||||||
|
|
||||||
|
@Query("DELETE FROM Event WHERE songId = :songId")
|
||||||
|
fun clearEventsFor(songId: String)
|
||||||
|
|
||||||
@Insert
|
@Insert
|
||||||
fun insert(event: Event)
|
fun insert(event: Event)
|
||||||
|
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ fun NonQueuedMediaItemMenu(
|
|||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onRemoveFromPlaylist: (() -> Unit)? = null,
|
onRemoveFromPlaylist: (() -> Unit)? = null,
|
||||||
onHideFromDatabase: (() -> Unit)? = null,
|
onHideFromDatabase: (() -> Unit)? = null,
|
||||||
|
onRemoveFromQuickPicks: (() -> Unit)? = null,
|
||||||
) {
|
) {
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
|
|
||||||
@@ -154,6 +155,7 @@ fun NonQueuedMediaItemMenu(
|
|||||||
onEnqueue = { binder?.player?.enqueue(mediaItem) },
|
onEnqueue = { binder?.player?.enqueue(mediaItem) },
|
||||||
onRemoveFromPlaylist = onRemoveFromPlaylist,
|
onRemoveFromPlaylist = onRemoveFromPlaylist,
|
||||||
onHideFromDatabase = onHideFromDatabase,
|
onHideFromDatabase = onHideFromDatabase,
|
||||||
|
onRemoveFromQuickPicks = onRemoveFromQuickPicks,
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -192,6 +194,7 @@ fun BaseMediaItemMenu(
|
|||||||
onRemoveFromQueue: (() -> Unit)? = null,
|
onRemoveFromQueue: (() -> Unit)? = null,
|
||||||
onRemoveFromPlaylist: (() -> Unit)? = null,
|
onRemoveFromPlaylist: (() -> Unit)? = null,
|
||||||
onHideFromDatabase: (() -> Unit)? = null,
|
onHideFromDatabase: (() -> Unit)? = null,
|
||||||
|
onRemoveFromQuickPicks: (() -> Unit)? = null,
|
||||||
) {
|
) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
|
|
||||||
@@ -232,6 +235,7 @@ fun BaseMediaItemMenu(
|
|||||||
|
|
||||||
context.startActivity(Intent.createChooser(sendIntent, null))
|
context.startActivity(Intent.createChooser(sendIntent, null))
|
||||||
},
|
},
|
||||||
|
onRemoveFromQuickPicks = onRemoveFromQuickPicks,
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -253,6 +257,7 @@ fun MediaItemMenu(
|
|||||||
onAddToPlaylist: ((Playlist, Int) -> Unit)? = null,
|
onAddToPlaylist: ((Playlist, Int) -> Unit)? = null,
|
||||||
onGoToAlbum: ((String) -> Unit)? = null,
|
onGoToAlbum: ((String) -> Unit)? = null,
|
||||||
onGoToArtist: ((String) -> Unit)? = null,
|
onGoToArtist: ((String) -> Unit)? = null,
|
||||||
|
onRemoveFromQuickPicks: (() -> Unit)? = null,
|
||||||
onShare: () -> Unit
|
onShare: () -> Unit
|
||||||
) {
|
) {
|
||||||
val (colorPalette) = LocalAppearance.current
|
val (colorPalette) = LocalAppearance.current
|
||||||
@@ -670,6 +675,17 @@ fun MediaItemMenu(
|
|||||||
onClick = onHideFromDatabase
|
onClick = onHideFromDatabase
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onRemoveFromQuickPicks?.let {
|
||||||
|
MenuEntry(
|
||||||
|
icon = R.drawable.trash,
|
||||||
|
text = "Hide from \"Quick picks\"",
|
||||||
|
onClick = {
|
||||||
|
onDismiss()
|
||||||
|
onRemoveFromQuickPicks()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import it.vfsfitvnm.vimusic.Database
|
|||||||
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
|
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
|
||||||
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
|
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
|
||||||
import it.vfsfitvnm.vimusic.R
|
import it.vfsfitvnm.vimusic.R
|
||||||
|
import it.vfsfitvnm.vimusic.query
|
||||||
import it.vfsfitvnm.vimusic.savers.DetailedSongSaver
|
import it.vfsfitvnm.vimusic.savers.DetailedSongSaver
|
||||||
import it.vfsfitvnm.vimusic.savers.InnertubeRelatedPageSaver
|
import it.vfsfitvnm.vimusic.savers.InnertubeRelatedPageSaver
|
||||||
import it.vfsfitvnm.vimusic.savers.nullableSaver
|
import it.vfsfitvnm.vimusic.savers.nullableSaver
|
||||||
@@ -75,7 +76,6 @@ import it.vfsfitvnm.youtubemusic.models.bodies.NextBody
|
|||||||
import it.vfsfitvnm.youtubemusic.requests.relatedPage
|
import it.vfsfitvnm.youtubemusic.requests.relatedPage
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.filterNotNull
|
|
||||||
import kotlinx.coroutines.flow.flowOn
|
import kotlinx.coroutines.flow.flowOn
|
||||||
|
|
||||||
@ExperimentalFoundationApi
|
@ExperimentalFoundationApi
|
||||||
@@ -98,7 +98,6 @@ fun QuickPicks(
|
|||||||
) {
|
) {
|
||||||
Database.trending()
|
Database.trending()
|
||||||
.flowOn(Dispatchers.IO)
|
.flowOn(Dispatchers.IO)
|
||||||
.filterNotNull()
|
|
||||||
.distinctUntilChanged()
|
.distinctUntilChanged()
|
||||||
.collect { value = it }
|
.collect { value = it }
|
||||||
}
|
}
|
||||||
@@ -188,6 +187,11 @@ fun QuickPicks(
|
|||||||
NonQueuedMediaItemMenu(
|
NonQueuedMediaItemMenu(
|
||||||
onDismiss = menuState::hide,
|
onDismiss = menuState::hide,
|
||||||
mediaItem = song.asMediaItem,
|
mediaItem = song.asMediaItem,
|
||||||
|
onRemoveFromQuickPicks = {
|
||||||
|
query {
|
||||||
|
Database.clearEventsFor(song.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -220,7 +224,7 @@ fun QuickPicks(
|
|||||||
menuState.display {
|
menuState.display {
|
||||||
NonQueuedMediaItemMenu(
|
NonQueuedMediaItemMenu(
|
||||||
onDismiss = menuState::hide,
|
onDismiss = menuState::hide,
|
||||||
mediaItem = song.asMediaItem,
|
mediaItem = song.asMediaItem
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -43,6 +43,13 @@ fun DatabaseSettings() {
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val (colorPalette) = LocalAppearance.current
|
val (colorPalette) = LocalAppearance.current
|
||||||
|
|
||||||
|
val eventsCount by produceSaveableState(initialValue = 0, stateSaver = autoSaver()) {
|
||||||
|
Database.eventsCount()
|
||||||
|
.flowOn(Dispatchers.IO)
|
||||||
|
.distinctUntilChanged()
|
||||||
|
.collect { value = it }
|
||||||
|
}
|
||||||
|
|
||||||
val queriesCount by produceSaveableState(initialValue = 0, stateSaver = autoSaver()) {
|
val queriesCount by produceSaveableState(initialValue = 0, stateSaver = autoSaver()) {
|
||||||
Database.queriesCount()
|
Database.queriesCount()
|
||||||
.flowOn(Dispatchers.IO)
|
.flowOn(Dispatchers.IO)
|
||||||
@@ -100,7 +107,7 @@ fun DatabaseSettings() {
|
|||||||
) {
|
) {
|
||||||
Header(title = "Database")
|
Header(title = "Database")
|
||||||
|
|
||||||
SettingsEntryGroupText(title = "SEARCH HISTORY")
|
SettingsEntryGroupText(title = "CLEANUP")
|
||||||
|
|
||||||
SettingsEntry(
|
SettingsEntry(
|
||||||
title = "Clear search history",
|
title = "Clear search history",
|
||||||
@@ -110,11 +117,18 @@ fun DatabaseSettings() {
|
|||||||
"History is empty"
|
"History is empty"
|
||||||
},
|
},
|
||||||
isEnabled = queriesCount > 0,
|
isEnabled = queriesCount > 0,
|
||||||
onClick = {
|
onClick = { query(Database::clearQueries) }
|
||||||
query {
|
)
|
||||||
Database.clearQueries()
|
|
||||||
}
|
SettingsEntry(
|
||||||
}
|
title = "Reset quick picks",
|
||||||
|
text = if (eventsCount > 0) {
|
||||||
|
"Delete $eventsCount playback events"
|
||||||
|
} else {
|
||||||
|
"Quick picks are cleared"
|
||||||
|
},
|
||||||
|
isEnabled = eventsCount > 0,
|
||||||
|
onClick = { query(Database::clearEvents) }
|
||||||
)
|
)
|
||||||
|
|
||||||
SettingsGroupSpacer()
|
SettingsGroupSpacer()
|
||||||
|
|||||||
Reference in New Issue
Block a user