diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/ConferenceService.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/ConferenceService.kt index 8823a368f..d14043c5e 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/ConferenceService.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/ConferenceService.kt @@ -30,6 +30,7 @@ class ConferenceService( private val storage: ApplicationStorage, private val localNotificationService: LocalNotificationService, private val scope: CoroutineScope, + private val flags: Flags, logger: Logger, ) { companion object { @@ -317,6 +318,11 @@ class ConferenceService( sessionId: SessionId, title: String, ) { + if (!flags.supportsLocalNotifications) { + taggedLogger.log { "Local notifications are disabled, skipping schedule" } + return + } + val now = timeProvider.now() val reminderTime = start - 5.minutes diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/Flags.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/Flags.kt index 833384375..6706b8f2f 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/Flags.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/Flags.kt @@ -6,7 +6,8 @@ import kotlinx.serialization.Serializable @Serializable data class Flags( val enableBackOnMainScreens: Boolean = true, - val supportsNotifications: Boolean = true, + val supportsLocalNotifications: Boolean = true, + val supportsRemoteNotifications: Boolean = true, val rippleEnabled: Boolean = true, val redirectFeedbackToSessionPage: Boolean = false, val hideKeyboardOnDrag: Boolean = false, diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation/KotlinConfNavHost.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation/KotlinConfNavHost.kt index c43df2c31..23deed799 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation/KotlinConfNavHost.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation/KotlinConfNavHost.kt @@ -267,7 +267,8 @@ fun NavGraphBuilder.startScreens( startDestination = StartPrivacyNoticeScreen ) { composable { - val skipNotifications = LocalFlags.current.supportsNotifications.not() + val skipNotifications = + !(LocalFlags.current.supportsLocalNotifications || LocalFlags.current.supportsRemoteNotifications) AppPrivacyNoticePrompt( onRejectNotice = { navController.navigate(if (skipNotifications) MainScreen else StartNotificationsScreen) { diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/DeveloperMenuScreen.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/DeveloperMenuScreen.kt index 2ab1c3a01..d3bf8b9bd 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/DeveloperMenuScreen.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/DeveloperMenuScreen.kt @@ -106,10 +106,17 @@ fun DeveloperMenuScreen( ) SettingsItem( - title = "Supports notifications", - note = "Whether this device should display notification settings", - enabled = flags.supportsNotifications, - onToggle = { flags = flags.copy(supportsNotifications = it) } + title = "Supports local notifications", + note = "Whether this device can display local notification settings (such as sessions)", + enabled = flags.supportsLocalNotifications, + onToggle = { flags = flags.copy(supportsLocalNotifications = it) } + ) + + SettingsItem( + title = "Supports remote notifications", + note = "Whether this device can display remote notification settings (such as news)", + enabled = flags.supportsRemoteNotifications, + onToggle = { flags = flags.copy(supportsRemoteNotifications = it) } ) SettingsItem( diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/NotificationSettings.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/NotificationSettings.kt index 1b4d08b9a..dc39b7038 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/NotificationSettings.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/NotificationSettings.kt @@ -14,6 +14,8 @@ import kotlinconfapp.shared.generated.resources.notifications_schedule_update_ti import kotlinconfapp.shared.generated.resources.notifications_session_reminders_description import kotlinconfapp.shared.generated.resources.notifications_session_reminders_title import org.jetbrains.compose.resources.stringResource +import org.jetbrains.kotlinconf.Flags +import org.jetbrains.kotlinconf.LocalFlags import org.jetbrains.kotlinconf.NotificationSettings import org.jetbrains.kotlinconf.ui.components.SettingsItem @@ -26,29 +28,34 @@ fun NotificationSettings( Column( verticalArrangement = Arrangement.spacedBy(8.dp) ) { - SettingsItem( - title = stringResource(Res.string.notifications_session_reminders_title), - enabled = notificationSettings.sessionReminders, - onToggle = { enabled -> onChangeSettings(notificationSettings.copy(sessionReminders = enabled)) }, - note = stringResource(Res.string.notifications_session_reminders_description), - ) - SettingsItem( - title = stringResource(Res.string.notifications_schedule_update_title), - enabled = notificationSettings.scheduleUpdates, - onToggle = { enabled -> onChangeSettings(notificationSettings.copy(scheduleUpdates = enabled)) }, - note = stringResource(Res.string.notifications_schedule_update_description), - ) - SettingsItem( - title = stringResource(Res.string.notifications_kotlinconf_news_title), - enabled = notificationSettings.kotlinConfNews, - onToggle = { enabled -> onChangeSettings(notificationSettings.copy(kotlinConfNews = enabled)) }, - note = stringResource(Res.string.notifications_kotlinconf_news_description), - ) - SettingsItem( - title = stringResource(Res.string.notifications_jetbrains_news_title), - enabled = notificationSettings.jetBrainsNews, - onToggle = { enabled -> onChangeSettings(notificationSettings.copy(jetBrainsNews = enabled)) }, - note = stringResource(Res.string.notifications_jetbrains_news_description), - ) + if (LocalFlags.current.supportsLocalNotifications) { + SettingsItem( + title = stringResource(Res.string.notifications_session_reminders_title), + enabled = notificationSettings.sessionReminders, + onToggle = { enabled -> onChangeSettings(notificationSettings.copy(sessionReminders = enabled)) }, + note = stringResource(Res.string.notifications_session_reminders_description), + ) + SettingsItem( + title = stringResource(Res.string.notifications_schedule_update_title), + enabled = notificationSettings.scheduleUpdates, + onToggle = { enabled -> onChangeSettings(notificationSettings.copy(scheduleUpdates = enabled)) }, + note = stringResource(Res.string.notifications_schedule_update_description), + ) + } + + if (LocalFlags.current.supportsRemoteNotifications) { + SettingsItem( + title = stringResource(Res.string.notifications_kotlinconf_news_title), + enabled = notificationSettings.kotlinConfNews, + onToggle = { enabled -> onChangeSettings(notificationSettings.copy(kotlinConfNews = enabled)) }, + note = stringResource(Res.string.notifications_kotlinconf_news_description), + ) + SettingsItem( + title = stringResource(Res.string.notifications_jetbrains_news_title), + enabled = notificationSettings.jetBrainsNews, + onToggle = { enabled -> onChangeSettings(notificationSettings.copy(jetBrainsNews = enabled)) }, + note = stringResource(Res.string.notifications_jetbrains_news_description), + ) + } } } diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/SettingsScreen.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/SettingsScreen.kt index 87505dab3..89f1a7bfe 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/SettingsScreen.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/SettingsScreen.kt @@ -130,7 +130,7 @@ private fun SettingsScreenImpl( Spacer(Modifier.height(24.dp)) - if (LocalFlags.current.supportsNotifications) { + if (LocalFlags.current.supportsLocalNotifications || LocalFlags.current.supportsRemoteNotifications) { val notificationSettings = viewModel.notificationSettings.collectAsStateWithLifecycle().value if (notificationSettings != null) { SectionHeading(stringResource(AppRes.string.settings_notifications_title)) @@ -138,7 +138,7 @@ private fun SettingsScreenImpl( notificationSettings = notificationSettings, onChangeSettings = { newSettings -> viewModel.setNotificationSettings(newSettings) - } + }, ) } } diff --git a/shared/src/jsMain/kotlin/org/jetbrains/kotlinconf/main.js.kt b/shared/src/jsMain/kotlin/org/jetbrains/kotlinconf/main.js.kt index 55205294f..b006ba680 100644 --- a/shared/src/jsMain/kotlin/org/jetbrains/kotlinconf/main.js.kt +++ b/shared/src/jsMain/kotlin/org/jetbrains/kotlinconf/main.js.kt @@ -21,7 +21,8 @@ fun main() { }, platformModule = platformModule, flags = Flags( - supportsNotifications = supportsNotifications + supportsLocalNotifications = supportsNotifications, + supportsRemoteNotifications = false, ), ) diff --git a/shared/src/jvmMain/kotlin/org/jetbrains/kotlinconf/main.kt b/shared/src/jvmMain/kotlin/org/jetbrains/kotlinconf/main.kt index a6a429a2a..917792e94 100644 --- a/shared/src/jvmMain/kotlin/org/jetbrains/kotlinconf/main.kt +++ b/shared/src/jvmMain/kotlin/org/jetbrains/kotlinconf/main.kt @@ -31,7 +31,14 @@ class JvmLogger : Logger { } fun main() { - initApp(JvmLogger(), platformModule, Flags(supportsNotifications = false)) + initApp( + platformLogger = JvmLogger(), + platformModule = platformModule, + flags = Flags( + supportsLocalNotifications = true, + supportsRemoteNotifications = true, + ) + ) System.setProperty("apple.awt.application.appearance", "system") diff --git a/shared/src/wasmJsMain/kotlin/org/jetbrains/kotlinconf/main.wasm.kt b/shared/src/wasmJsMain/kotlin/org/jetbrains/kotlinconf/main.wasm.kt index b11406056..aae758f7f 100644 --- a/shared/src/wasmJsMain/kotlin/org/jetbrains/kotlinconf/main.wasm.kt +++ b/shared/src/wasmJsMain/kotlin/org/jetbrains/kotlinconf/main.wasm.kt @@ -16,7 +16,7 @@ private val jsJodaTz = JsJodaTimeZoneModule fun main() { initCoil() - val supportsNotifications = window["supportsNotifications"] as? Boolean ?: false + val supportsLocalNotifications = window["supportsNotifications"] as? Boolean ?: false initApp( platformLogger = object : Logger { override fun log(tag: String, lazyMessage: () -> String) { @@ -25,7 +25,8 @@ fun main() { }, platformModule = platformModule, flags = Flags( - supportsNotifications = supportsNotifications + supportsLocalNotifications = supportsLocalNotifications, + supportsRemoteNotifications = false, ), )