Skip to content

Commit 799ec86

Browse files
Store opened media in the history
1 parent f9da2a1 commit 799ec86

File tree

6 files changed

+61
-10
lines changed

6 files changed

+61
-10
lines changed

data/src/commonMain/kotlin/com/mrboomdev/awery/data/database/dao/HistoryDao.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.mrboomdev.awery.data.database.entity.DBHistoryItem
55

66
@Dao
77
interface HistoryDao {
8-
@Insert(onConflict = OnConflictStrategy.IGNORE)
8+
@Insert(onConflict = OnConflictStrategy.REPLACE)
99
suspend fun add(media: DBHistoryItem)
1010

1111
@Delete

data/src/commonMain/kotlin/com/mrboomdev/awery/data/settings/AwerySettings.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ object AwerySettings {
2828

2929
val aweryServerInstance by setting("http://awery.mrboomdev.ru:80")
3030
val aweryServerToken by setting("")
31+
val mediaHistory by setting(true)
3132
val darkTheme by setting(DarkTheme.AUTO)
3233
val primaryColor by setting(-1L)
3334
val amoledTheme by setting(false)

ui/src/androidMain/kotlin/com/mrboomdev/awery/ui/screens/media/MediaScreen.android.kt

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ import com.mrboomdev.awery.core.Awery
4444
import com.mrboomdev.awery.core.utils.LoadingStatus
4545
import com.mrboomdev.awery.core.utils.replaceAll
4646
import com.mrboomdev.awery.core.utils.toCalendar
47+
import com.mrboomdev.awery.data.database.database
48+
import com.mrboomdev.awery.data.database.entity.DBHistoryItem
49+
import com.mrboomdev.awery.data.database.history
50+
import com.mrboomdev.awery.data.settings.AwerySettings
4751
import com.mrboomdev.awery.extension.loaders.getBanner
4852
import com.mrboomdev.awery.extension.loaders.getLargePoster
4953
import com.mrboomdev.awery.extension.sdk.Media
@@ -54,20 +58,38 @@ import com.mrboomdev.awery.ui.components.toast
5458
import com.mrboomdev.awery.ui.effects.BackEffect
5559
import com.mrboomdev.awery.ui.popups.BookmarkMediaDialog
5660
import com.mrboomdev.awery.ui.utils.*
61+
import kotlinx.coroutines.Dispatchers
5762
import kotlinx.coroutines.launch
63+
import kotlinx.serialization.json.Json
5864
import org.jetbrains.compose.resources.painterResource
5965
import org.jetbrains.compose.resources.pluralStringResource
6066
import org.jetbrains.compose.resources.stringResource
6167
import java.util.*
68+
import kotlin.time.Clock
69+
import kotlin.time.ExperimentalTime
6270

6371
private val SHADOW_COLOR = Color(0xee000000)
6472

73+
@OptIn(ExperimentalTime::class)
6574
@Composable
6675
actual fun MediaScreen(
6776
destination: Routes.Media,
6877
viewModel: MediaScreenViewModel,
6978
contentPadding: PaddingValues
7079
) {
80+
RememberLaunchedEffect(Unit) {
81+
if(AwerySettings.mediaHistory.value) {
82+
launch(Dispatchers.IO) {
83+
Awery.database.history.media.add(DBHistoryItem(
84+
extensionId = destination.extensionId,
85+
mediaId = destination.media.id,
86+
media = Json.encodeToString(destination.media),
87+
date = Clock.System.now().toEpochMilliseconds()
88+
))
89+
}
90+
}
91+
}
92+
7193
if(Awery.isTv) TvMediaScreen(destination, viewModel)
7294
else DefaultMediaScreen(destination, viewModel, contentPadding)
7395
}
@@ -77,9 +99,9 @@ private fun TvMediaScreen(
7799
destination: Routes.Media,
78100
viewModel: MediaScreenViewModel
79101
) {
80-
val coroutineScope = rememberCoroutineScope()
81-
val pagerState = rememberPagerState { 2 }
82-
val media by viewModel.media.collectAsState()
102+
val coroutineScope = rememberCoroutineScope()
103+
val pagerState = rememberPagerState { 2 }
104+
val media by viewModel.media.collectAsState()
83105

84106
Box(Modifier.fillMaxSize()) {
85107
AsyncImage(

ui/src/commonMain/kotlin/com/mrboomdev/awery/ui/components/Toaster.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,12 @@ fun ToasterContainer(
6868
modifier = Modifier
6969
.padding(4.dp)
7070
.background(MaterialTheme.colorScheme.surfaceContainerHigh, RoundedCornerShape(8.dp))
71-
.thenIf(toast.onClick != null) { clickable(onClick = toast.onClick!!) }
72-
.fillMaxWidth()
71+
.thenIf(toast.onClick != null) {
72+
clickable(onClick = {
73+
toast.onClick!!
74+
state.dismiss(toast)
75+
})
76+
}.fillMaxWidth()
7377
.padding(horizontal = 16.dp, vertical = 12.dp),
7478
horizontalArrangement = Arrangement.spacedBy(8.dp),
7579
verticalAlignment = Alignment.CenterVertically

ui/src/commonMain/kotlin/com/mrboomdev/awery/ui/utils/ComposeUtils.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import androidx.compose.ui.Alignment
66
import androidx.compose.ui.platform.LocalDensity
77
import androidx.compose.ui.text.style.TextAlign
88
import androidx.compose.ui.unit.Dp
9+
import kotlinx.coroutines.CoroutineScope
910

1011
@Composable
1112
fun RememberLaunchedEffect(
1213
key1: Any?,
13-
block: suspend () -> Unit
14+
block: suspend CoroutineScope.() -> Unit
1415
) {
1516
var didExecute by rememberSaveable(key1) { mutableStateOf(false) }
1617

ui/src/desktopMain/kotlin/com/mrboomdev/awery/ui/screens/media/MediaScreen.desktop.kt

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,25 @@ import androidx.compose.ui.unit.dp
1919
import androidx.compose.ui.window.Dialog
2020
import androidx.compose.ui.window.DialogProperties
2121
import coil3.compose.AsyncImage
22+
import com.mrboomdev.awery.core.Awery
23+
import com.mrboomdev.awery.data.database.database
24+
import com.mrboomdev.awery.data.database.entity.DBHistoryItem
25+
import com.mrboomdev.awery.data.database.history
26+
import com.mrboomdev.awery.data.settings.AwerySettings
2227
import com.mrboomdev.awery.extension.loaders.getBanner
2328
import com.mrboomdev.awery.extension.loaders.getPoster
2429
import com.mrboomdev.awery.extension.sdk.Media
2530
import com.mrboomdev.awery.ui.Routes
2631
import com.mrboomdev.awery.ui.components.LocalToaster
2732
import com.mrboomdev.awery.ui.components.toast
2833
import com.mrboomdev.awery.ui.screens.GalleryScreen
34+
import com.mrboomdev.awery.ui.utils.RememberLaunchedEffect
2935
import com.mrboomdev.awery.ui.utils.collapse
36+
import kotlinx.coroutines.Dispatchers
3037
import kotlinx.coroutines.launch
38+
import kotlinx.serialization.json.Json
39+
import kotlin.time.Clock
40+
import kotlin.time.ExperimentalTime
3141

3242
@Composable
3343
actual fun MediaScreen(
@@ -36,7 +46,7 @@ actual fun MediaScreen(
3646
contentPadding: PaddingValues
3747
) = DesktopMediaScreen(destination, viewModel)
3848

39-
@OptIn(ExperimentalMaterial3Api::class)
49+
@OptIn(ExperimentalMaterial3Api::class, ExperimentalTime::class)
4050
@Composable
4151
private fun DesktopMediaScreen(
4252
destination: Routes.Media,
@@ -49,8 +59,8 @@ private fun DesktopMediaScreen(
4959
}
5060

5161
val infoHeaderBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(snapAnimationSpec = null)
52-
val coroutineScope = rememberCoroutineScope()
53-
val pagerState = rememberPagerState { tabs.count() }
62+
val coroutineScope = rememberCoroutineScope()
63+
val pagerState = rememberPagerState { tabs.count() }
5464
var showGallery by rememberSaveable { mutableStateOf(false) }
5565
val toaster = LocalToaster.current
5666

@@ -88,6 +98,19 @@ private fun DesktopMediaScreen(
8898
)
8999
}
90100
}
101+
102+
RememberLaunchedEffect(Unit) {
103+
if(AwerySettings.mediaHistory.value) {
104+
launch(Dispatchers.IO) {
105+
Awery.database.history.media.add(DBHistoryItem(
106+
extensionId = destination.extensionId,
107+
mediaId = destination.media.id,
108+
media = Json.encodeToString(destination.media),
109+
date = Clock.System.now().toEpochMilliseconds()
110+
))
111+
}
112+
}
113+
}
91114

92115
Box(
93116
modifier = Modifier.fillMaxSize(),

0 commit comments

Comments
 (0)