diff --git a/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/BackupStep.kt b/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/BackupStep.kt
index 77ba78d..2611731 100644
--- a/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/BackupStep.kt
+++ b/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/BackupStep.kt
@@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.CloudOff
import androidx.compose.material.icons.filled.FolderOpen
-import androidx.compose.material.icons.filled.Restore
import androidx.compose.material.icons.filled.Schedule
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
@@ -20,7 +19,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
import de.jeanlucmakiola.calendula.R
import de.jeanlucmakiola.floret.components.BenefitRow
import de.jeanlucmakiola.floret.components.OnboardingScaffold
@@ -52,6 +50,7 @@ internal fun BackupStep(
OnboardingScaffold(
modifier = modifier,
progress = progress,
+ topSpacing = OnboardingSpace.lg,
hero = { IconHero(Icons.Filled.CloudOff) },
actions = {
Button(
@@ -71,13 +70,6 @@ internal fun BackupStep(
}
},
) {
- Text(
- text = stringResource(R.string.app_name).uppercase(),
- style = MaterialTheme.typography.labelLarge,
- color = MaterialTheme.colorScheme.primary,
- letterSpacing = 2.sp,
- )
- Spacer(Modifier.height(OnboardingSpace.xs))
Text(
text = stringResource(R.string.onboarding_backup_title),
style = MaterialTheme.typography.headlineMedium,
@@ -91,7 +83,7 @@ internal fun BackupStep(
textAlign = TextAlign.Center,
)
- Spacer(Modifier.height(OnboardingSpace.xl))
+ Spacer(Modifier.height(OnboardingSpace.lg))
BenefitRow(
icon = Icons.Filled.FolderOpen,
@@ -104,11 +96,5 @@ internal fun BackupStep(
title = stringResource(R.string.onboarding_backup_benefit_daily_title),
body = stringResource(R.string.onboarding_backup_benefit_daily_body),
)
- Spacer(Modifier.height(OnboardingSpace.sm))
- BenefitRow(
- icon = Icons.Filled.Restore,
- title = stringResource(R.string.onboarding_backup_benefit_restore_title),
- body = stringResource(R.string.onboarding_backup_benefit_restore_body),
- )
}
}
diff --git a/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/PermissionScreen.kt b/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/PermissionScreen.kt
index b103c5a..1be8f7f 100644
--- a/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/PermissionScreen.kt
+++ b/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/PermissionScreen.kt
@@ -10,19 +10,15 @@ import android.net.Uri
import android.provider.Settings
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowForward
import androidx.compose.material.icons.filled.CalendarMonth
import androidx.compose.material.icons.filled.Lock
-import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
@@ -32,13 +28,11 @@ import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
-import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import de.jeanlucmakiola.calendula.R
@@ -103,6 +97,7 @@ private fun RationaleContent(
OnboardingScaffold(
modifier = modifier,
progress = progress,
+ topSpacing = OnboardingSpace.lg,
hero = { BrandHero(denied = false) },
actions = {
Button(
@@ -121,16 +116,8 @@ private fun RationaleContent(
modifier = Modifier.size(20.dp),
)
}
- PrivacyFootnote()
},
) {
- Text(
- text = stringResource(R.string.app_name).uppercase(),
- style = MaterialTheme.typography.labelLarge,
- color = MaterialTheme.colorScheme.primary,
- letterSpacing = 2.sp,
- )
- Spacer(Modifier.height(OnboardingSpace.xs))
Text(
text = stringResource(R.string.permission_rationale_title),
style = MaterialTheme.typography.headlineMedium,
@@ -144,14 +131,8 @@ private fun RationaleContent(
textAlign = TextAlign.Center,
)
- Spacer(Modifier.height(OnboardingSpace.xl))
+ Spacer(Modifier.height(OnboardingSpace.lg))
- BenefitRow(
- icon = Icons.Filled.Lock,
- title = stringResource(R.string.permission_benefit_private_title),
- body = stringResource(R.string.permission_benefit_private_body),
- )
- Spacer(Modifier.height(OnboardingSpace.sm))
BenefitRow(
icon = Icons.Filled.CalendarMonth,
title = stringResource(R.string.permission_benefit_sync_title),
@@ -159,9 +140,9 @@ private fun RationaleContent(
)
Spacer(Modifier.height(OnboardingSpace.sm))
BenefitRow(
- icon = Icons.Filled.VisibilityOff,
- title = stringResource(R.string.permission_benefit_privacy_title),
- body = stringResource(R.string.permission_benefit_privacy_body),
+ icon = Icons.Filled.Lock,
+ title = stringResource(R.string.permission_benefit_private_title),
+ body = stringResource(R.string.permission_benefit_private_body),
)
}
}
@@ -215,25 +196,3 @@ private fun DeniedContent(
)
}
}
-
-@Composable
-private fun PrivacyFootnote() {
- Row(
- modifier = Modifier.fillMaxWidth().padding(top = 4.dp),
- horizontalArrangement = Arrangement.Center,
- verticalAlignment = Alignment.CenterVertically,
- ) {
- Icon(
- imageVector = Icons.Filled.Lock,
- contentDescription = null,
- tint = MaterialTheme.colorScheme.onSurfaceVariant,
- modifier = Modifier.size(14.dp),
- )
- Spacer(Modifier.width(6.dp))
- Text(
- text = stringResource(R.string.permission_privacy_footnote),
- style = MaterialTheme.typography.labelMedium,
- color = MaterialTheme.colorScheme.onSurfaceVariant,
- )
- }
-}
diff --git a/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/ReminderStep.kt b/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/ReminderStep.kt
index 55f2548..8af40d2 100644
--- a/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/ReminderStep.kt
+++ b/app/src/main/java/de/jeanlucmakiola/calendula/ui/onboarding/ReminderStep.kt
@@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.NotificationsActive
import androidx.compose.material.icons.filled.ContentCopy
-import androidx.compose.material.icons.filled.Tune
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -24,7 +23,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
import de.jeanlucmakiola.calendula.R
/**
@@ -50,6 +48,7 @@ fun ReminderStep(
OnboardingScaffold(
modifier = modifier,
progress = progress,
+ topSpacing = OnboardingSpace.lg,
hero = { IconHero(Icons.Filled.NotificationsActive) },
actions = {
Button(
@@ -75,13 +74,6 @@ fun ReminderStep(
}
},
) {
- Text(
- text = stringResource(R.string.app_name).uppercase(),
- style = MaterialTheme.typography.labelLarge,
- color = MaterialTheme.colorScheme.primary,
- letterSpacing = 2.sp,
- )
- Spacer(Modifier.height(OnboardingSpace.xs))
Text(
text = stringResource(R.string.reminder_onboarding_title),
style = MaterialTheme.typography.headlineMedium,
@@ -95,7 +87,7 @@ fun ReminderStep(
textAlign = TextAlign.Center,
)
- Spacer(Modifier.height(OnboardingSpace.xl))
+ Spacer(Modifier.height(OnboardingSpace.lg))
BenefitRow(
icon = Icons.Filled.NotificationsActive,
@@ -108,11 +100,5 @@ fun ReminderStep(
title = stringResource(R.string.reminder_benefit_duplicates_title),
body = stringResource(R.string.reminder_benefit_duplicates_body),
)
- Spacer(Modifier.height(OnboardingSpace.sm))
- BenefitRow(
- icon = Icons.Filled.Tune,
- title = stringResource(R.string.reminder_benefit_reversible_title),
- body = stringResource(R.string.reminder_benefit_reversible_body),
- )
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8e6c138..5ead759 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -18,16 +18,20 @@
See all your events, beautifully
- Calendula needs access to your calendar to show and manage your events. That\'s all it asks for up front — and nothing ever leaves your device.
+ Calendula needs access to your calendar to show and manage your events.
Grant calendar access
Calendar access denied
Calendula cannot show events without calendar access. You can grant it again in the system settings.
Open system settings
Try again
- Stays on your device
- Your calendars are read locally and never leave the phone.
+ Private by design
+ No internet permission, no telemetry — nothing ever leaves your phone.
All your calendars, together
Google, CalDAV, local — anything synced to the device just appears.
+
No tracking, ever
Zero telemetry, zero analytics, no ads.
Stays on your device · no internet permission
@@ -276,8 +280,6 @@
Backups are plain .ics files — put them somewhere that syncs, or on an SD card.
Once a day, by itself
Calendula exports your local calendars in the background. Change how often in Settings.
- Restore anytime
- Open a backup file to bring the events back — on this phone or a new one.
Choose folder and back up
Not now
What should Calendula open on?
@@ -292,6 +294,7 @@
Every reminder on your events arrives as a notification, right on time.
Using a second calendar app?
If another app also posts reminders, you\'ll see them twice — turn them off there or here.
+
Change it anytime
The switch lives in Settings, under Notifications.
Turn on reminders