├── web
├── manifest.json
├── favicon.png
└── icons
│ ├── Icon-192.png
│ ├── Icon-512.png
│ ├── Icon-maskable-192.png
│ └── Icon-maskable-512.png
├── fastlane
└── metadata
│ └── android
│ └── en-US
│ ├── title.txt
│ ├── images
│ ├── tvBanner.png
│ ├── featureGraphic.png
│ ├── promoGraphic.png
│ ├── icon.png
│ └── phoneScreenshots
│ │ ├── 1.png
│ │ ├── 10.png
│ │ ├── 2.png
│ │ ├── 3.png
│ │ ├── 4.png
│ │ ├── 5.png
│ │ ├── 6.png
│ │ ├── 7.png
│ │ ├── 8.png
│ │ └── 9.png
│ ├── short_description.txt
│ ├── changelogs
│ ├── 7.txt
│ ├── 8.txt
│ ├── 9.txt
│ ├── 3.txt
│ ├── 14.txt
│ ├── 5.txt
│ ├── 13.txt
│ ├── 4.txt
│ ├── 6.txt
│ ├── 11.txt
│ └── 10.txt
│ └── full_description.txt
├── android
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ ├── example
│ │ │ │ │ └── todoflutter
│ │ │ │ │ │ ├── AlarmReceiver.java
│ │ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ │ └── NotificationActionReceiver.java
│ │ │ │ │ └── todoapp
│ │ │ │ │ └── todoflutter
│ │ │ │ │ ├── AlarmReceiver.java
│ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ └── NotificationActionReceiver.java
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ ├── trudido
│ │ │ │ │ └── app
│ │ │ │ │ │ ├── TodoWidgetService.kt
│ │ │ │ │ │ ├── TaskStatusStore.kt
│ │ │ │ │ │ ├── ShowNotificationReceiver.kt
│ │ │ │ │ │ ├── BootCompletedReceiver.kt
│ │ │ │ │ │ ├── MissedReminderCatchUp.kt
│ │ │ │ │ │ ├── PendingActionStore.kt
│ │ │ │ │ │ ├── DeferredReminderWork.kt
│ │ │ │ │ │ ├── NotificationActionReceiver.kt
│ │ │ │ │ │ ├── DeferredReminderWorker.kt
│ │ │ │ │ │ ├── LateAlarmTracker.kt
│ │ │ │ │ │ ├── ScheduledNotificationsStore.kt
│ │ │ │ │ │ ├── TaskFileHandler.kt
│ │ │ │ │ │ └── PermissionsHelper.kt
│ │ │ │ │ └── todoapp
│ │ │ │ │ └── todoflutter
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── PendingActionStore.kt
│ │ │ │ │ ├── NotificationActionReceiver.kt
│ │ │ │ │ ├── PermissionsHelper.kt
│ │ │ │ │ ├── README_LEGACY.txt
│ │ │ │ │ ├── ShowNotificationReceiver.kt
│ │ │ │ │ ├── NotificationScheduler.kt
│ │ │ │ │ ├── TaskStatusStore.kt
│ │ │ │ │ └── ExactAlarmPermissionHelper.kt
│ │ │ └── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_background.png
│ │ │ │ ├── ic_launcher_foreground.png
│ │ │ │ └── ic_launcher_monochrome.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_background.png
│ │ │ │ ├── ic_launcher_foreground.png
│ │ │ │ └── ic_launcher_monochrome.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_background.png
│ │ │ │ ├── ic_launcher_foreground.png
│ │ │ │ └── ic_launcher_monochrome.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_background.png
│ │ │ │ ├── ic_launcher_foreground.png
│ │ │ │ └── ic_launcher_monochrome.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_background.png
│ │ │ │ ├── ic_launcher_foreground.png
│ │ │ │ └── ic_launcher_monochrome.png
│ │ │ │ ├── values
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ │ ├── values-night
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ │ ├── layout
│ │ │ │ └── activity_main.xml
│ │ │ │ ├── xml
│ │ │ │ └── file_paths.xml
│ │ │ │ ├── mipmap-anydpi-v26
│ │ │ │ └── ic_launcher.xml
│ │ │ │ └── drawable
│ │ │ │ └── launch_background.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── proguard-rules.pro
│ └── build.gradle.kts
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── gradle.properties
├── build.gradle.kts
└── settings.gradle.kts
├── assets
├── icon
│ ├── 1.png
│ └── 2.png
├── imagefiles
│ ├── 1.png
│ ├── 2.png
│ ├── 3.png
│ ├── 4.png
│ ├── 5.png
│ ├── 6.png
│ ├── 7.png
│ ├── 8.png
│ ├── 9.png
│ ├── 10.png
│ ├── trudicon.png
│ └── trudiconRound.png
└── getitongithub.png
├── analysis_options.yaml
├── .gitmodules
├── android_icon_backups
├── mipmap-hdpi-20251126131522
│ ├── ic_launcher.png
│ └── launcher_icon.png
├── mipmap-mdpi-20251126131522
│ ├── ic_launcher.png
│ └── launcher_icon.png
├── mipmap-xhdpi-20251126131522
│ ├── ic_launcher.png
│ └── launcher_icon.png
├── mipmap-xxhdpi-20251126131522
│ ├── ic_launcher.png
│ └── launcher_icon.png
├── mipmap-xxxhdpi-20251126131522
│ ├── ic_launcher.png
│ └── launcher_icon.png
├── drawable-hdpi-20251126131522
│ └── ic_launcher_foreground.png
├── drawable-mdpi-20251126131522
│ └── ic_launcher_foreground.png
├── drawable-xhdpi-20251126131522
│ └── ic_launcher_foreground.png
├── drawable-xxhdpi-20251126131522
│ └── ic_launcher_foreground.png
├── drawable-xxxhdpi-20251126131522
│ └── ic_launcher_foreground.png
├── drawable-20251126131522
│ ├── ic_launcher_background.xml
│ ├── app_icon.xml
│ ├── ic_check.xml
│ ├── launch_background.xml
│ ├── ic_notification.xml
│ ├── ic_snooze.xml
│ ├── ic_launcher_foreground.xml
│ └── ic_launcher_monochrome.xml
├── mipmap-anydpi-v26-20251126131522
│ ├── launcher_icon.xml
│ └── ic_launcher.xml
└── drawable-v21-20251126131522
│ └── launch_background.xml
├── .github
├── FUNDING.yml
└── workflows
│ ├── build.yml
│ └── crowdin-sync.yml
├── devtools_options.yaml
├── lib
├── models
│ ├── duration_adapter.dart
│ ├── statistics.dart
│ ├── app_error.dart
│ ├── note.g.dart
│ ├── folder.g.dart
│ ├── note_folder.g.dart
│ ├── todo.g.dart
│ ├── note.dart
│ └── note_folder.dart
├── widgets
│ ├── time_picker_form_field.dart
│ ├── search_bar.dart
│ ├── battery_optimization_nudge.dart
│ ├── alarm_settings_watcher.dart
│ ├── app_error_boundary.dart
│ ├── reminder_components.dart
│ ├── link_embed_builder.dart
│ └── system_permission_dialogs.dart
├── services
│ ├── new_notification_service.dart
│ ├── task_import_export_service.dart
│ ├── todo_provider.dart
│ ├── battery_optimization_service.dart
│ ├── late_alarm_nudge_service.dart
│ ├── exact_alarm_permission.dart
│ ├── lifecycle_sync_observer.dart
│ ├── app_refresh_service.dart
│ ├── text_scale_service.dart
│ ├── haptic_feedback_service.dart
│ ├── category_migration_service.dart
│ ├── vault_password_service.dart
│ ├── navigation_service.dart
│ ├── permissions_channel.dart
│ ├── template_provider.dart
│ └── files_channel.dart
├── screens
│ └── permissions_page.dart
├── providers
│ ├── alarm_settings_providers.dart
│ ├── clock.dart
│ └── app_providers.dart
├── utils
│ ├── formatters.dart
│ ├── responsive_size.dart
│ ├── encryption_helper.dart
│ └── week_start_utils.dart
├── repositories
│ ├── folder_repository.dart
│ ├── folder_template_repository.dart
│ └── task_repository.dart
├── theme
│ └── solarized_colors.dart
└── use_cases
│ └── folder_template_use_cases.dart
├── BUILD_INFO.md
├── fdroid
└── com.trudido.app.yml
└── .gitignore
/web/manifest.json:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Trudido
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/tvBanner.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/featureGraphic.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/promoGraphic.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/todoflutter/AlarmReceiver.java:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/todoflutter/MainActivity.java:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/todoapp/todoflutter/AlarmReceiver.java:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/todoapp/todoflutter/MainActivity.java:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/trudido/app/TodoWidgetService.kt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/todoflutter/NotificationActionReceiver.java:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/todoapp/todoflutter/NotificationActionReceiver.java:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Empty proguard rules - let R8 handle optimization
2 |
--------------------------------------------------------------------------------
/web/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/web/favicon.png
--------------------------------------------------------------------------------
/assets/icon/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/icon/1.png
--------------------------------------------------------------------------------
/assets/icon/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/icon/2.png
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/todoapp/todoflutter/MainActivity.kt:
--------------------------------------------------------------------------------
1 | // (removed legacy content)
2 |
--------------------------------------------------------------------------------
/assets/imagefiles/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/1.png
--------------------------------------------------------------------------------
/assets/imagefiles/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/2.png
--------------------------------------------------------------------------------
/assets/imagefiles/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/3.png
--------------------------------------------------------------------------------
/assets/imagefiles/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/4.png
--------------------------------------------------------------------------------
/assets/imagefiles/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/5.png
--------------------------------------------------------------------------------
/assets/imagefiles/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/6.png
--------------------------------------------------------------------------------
/assets/imagefiles/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/7.png
--------------------------------------------------------------------------------
/assets/imagefiles/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/8.png
--------------------------------------------------------------------------------
/assets/imagefiles/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/9.png
--------------------------------------------------------------------------------
/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/todoapp/todoflutter/PendingActionStore.kt:
--------------------------------------------------------------------------------
1 | // (removed legacy content)
2 |
--------------------------------------------------------------------------------
/assets/getitongithub.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/getitongithub.png
--------------------------------------------------------------------------------
/assets/imagefiles/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/10.png
--------------------------------------------------------------------------------
/assets/imagefiles/trudicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/trudicon.png
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | analyzer:
2 | exclude:
3 | - submodules/**
4 | errors:
5 | deprecated_member_use: ignore
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | Privacy-friendly, open-source to-do list app. No ads, no tracking.
--------------------------------------------------------------------------------
/web/icons/Icon-maskable-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/web/icons/Icon-maskable-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-maskable-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/web/icons/Icon-maskable-512.png
--------------------------------------------------------------------------------
/assets/imagefiles/trudiconRound.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/assets/imagefiles/trudiconRound.png
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "submodules/flutter"]
2 | path = submodules/flutter
3 | url = https://github.com/flutter/flutter.git
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #ffffff
4 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-hdpi-20251126131522/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-hdpi-20251126131522/ic_launcher.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-mdpi-20251126131522/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-mdpi-20251126131522/ic_launcher.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/10.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/9.png
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/todoapp/todoflutter/NotificationActionReceiver.kt:
--------------------------------------------------------------------------------
1 | @file:Suppress("unused")
2 | package com.todoapp.todoflutter
3 |
4 | class NotificationActionReceiver
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-hdpi-20251126131522/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-hdpi-20251126131522/launcher_icon.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-mdpi-20251126131522/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-mdpi-20251126131522/launcher_icon.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-xhdpi-20251126131522/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-xhdpi-20251126131522/ic_launcher.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-xxhdpi-20251126131522/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-xxhdpi-20251126131522/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-xhdpi-20251126131522/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-xhdpi-20251126131522/launcher_icon.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-xxhdpi-20251126131522/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-xxhdpi-20251126131522/launcher_icon.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-xxxhdpi-20251126131522/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-xxxhdpi-20251126131522/ic_launcher.png
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-xxxhdpi-20251126131522/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/mipmap-xxxhdpi-20251126131522/launcher_icon.png
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | liberapay: dominikmuellr
2 |
3 | github: [dominikmuellr]
4 |
5 | ko_fi: dominikmuellr
6 |
7 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
8 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-hdpi-20251126131522/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/drawable-hdpi-20251126131522/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android_icon_backups/drawable-mdpi-20251126131522/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/drawable-mdpi-20251126131522/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android_icon_backups/drawable-xhdpi-20251126131522/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/drawable-xhdpi-20251126131522/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android_icon_backups/drawable-xxhdpi-20251126131522/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/drawable-xxhdpi-20251126131522/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/todoapp/todoflutter/PermissionsHelper.kt:
--------------------------------------------------------------------------------
1 | package com.todoapp.todoflutter
2 |
3 | // Legacy placeholder; real implementation moved to com.trudido.app
4 | object PermissionsHelper
5 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-xxxhdpi-20251126131522/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dominikmuellr/trudido/HEAD/android_icon_backups/drawable-xxxhdpi-20251126131522/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/devtools_options.yaml:
--------------------------------------------------------------------------------
1 | description: This file stores settings for Dart & Flutter DevTools.
2 | documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
3 | extensions:
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/7.txt:
--------------------------------------------------------------------------------
1 | Version 1.0.7 (build 7):
2 | - Bumped app version from 1.0.6 to 1.0.7 (build 7)
3 | - Minor fixes and translations updates
4 | - See full changelog in app release notes
5 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/8.txt:
--------------------------------------------------------------------------------
1 | Version 1.0.8 (build 8):
2 | - Bumped app version from 1.0.7 to 1.0.8 (build 8)
3 | - Minor fixes and translations updates
4 | - See full changelog in app release notes
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #121212
5 |
6 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-20251126131522/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/xml/file_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | zipStoreBase=GRADLE_USER_HOME
4 | zipStorePath=wrapper/dists
5 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
6 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/todoapp/todoflutter/README_LEGACY.txt:
--------------------------------------------------------------------------------
1 | This package (com.todoapp.todoflutter) is deprecated and retained only as stubs.
2 | All active Android components migrated to com.trudido.app.
3 | Safe to delete once confirmed no lingering references in code or manifests.
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/todoapp/todoflutter/ShowNotificationReceiver.kt:
--------------------------------------------------------------------------------
1 | package com.todoapp.todoflutter
2 |
3 | import android.content.BroadcastReceiver
4 | import android.content.Context
5 | import android.content.Intent
6 | import androidx.core.app.NotificationManagerCompat
7 |
8 | // (removed legacy content)
9 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 | .cxx/
9 |
10 | # Remember to never publicly share your keystore.
11 | # See https://flutter.dev/to/reference-keystore
12 | key.properties
13 | **/*.keystore
14 | **/*.jks
15 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
5 | # Disable Kotlin incremental compilation to avoid cache issues
6 | kotlin.incremental=false
7 | kotlin.incremental.android=false
8 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/todoapp/todoflutter/NotificationScheduler.kt:
--------------------------------------------------------------------------------
1 | // Deprecated duplicate legacy file retained temporarily. Not referenced by manifest.
2 | @file:Suppress("unused", "UNUSED_PARAMETER")
3 | package com.todoapp.todoflutter
4 |
5 | object NotificationScheduler {
6 | // Intentionally empty duplicate placeholder.
7 | }
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/9.txt:
--------------------------------------------------------------------------------
1 | Version 1.0.9 (build 9):
2 | - Added Material 3 expandable FAB menu with tab-specific actions
3 | - Implemented Vault Note creation directly from FAB menu
4 | - Enhanced animations with staggered pop-up effects
5 | - Improved user flow for vault folder creation
6 | - See full changelog in app release notes
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-anydpi-v26-20251126131522/launcher_icon.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-20251126131522/app_icon.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-20251126131522/ic_check.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/android_icon_backups/mipmap-anydpi-v26-20251126131522/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-20251126131522/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/3.txt:
--------------------------------------------------------------------------------
1 | Visual Enhancements:
2 | - App name now uses primary theme color
3 | - Themed folder dropdown dividers
4 | - Updated filter icon (tune → filter_alt)
5 | - Greeting text uses theme primary/secondary colors
6 | - Consistent Material Design 3 theming
7 |
8 | Bug Fixes:
9 | - Language mapping corrections (French/German swap fixed)
10 | - Template popup menu crashes resolved
11 | - Name clearing behavior improved
12 | - Greeting hint text logic enhanced
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/14.txt:
--------------------------------------------------------------------------------
1 | Version 1.2.3 - Calendar & UI Improvements
2 |
3 | • Added "Week Starts On" setting - choose Sunday, Monday, Saturday, or any day as the first day of week for all calendars and date pickers
4 | • Fixed Android 3-button navigation bar overlapping note content in the Quill editor
5 | • Navigation bar now matches app theme color instead of staying blue
6 | • Added swipe-from-edge gesture to open navigation drawer (works with 3-button nav)
7 | • Improved FAB positioning on devices with 3-button navigation bar
8 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-v21-20251126131522/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/5.txt:
--------------------------------------------------------------------------------
1 | Calendar Enhancements:
2 | - Long-press or double-tap any calendar day to create a task with that date
3 | - Date is now automatically prefilled when creating tasks from calendar
4 | - "Add task" button in empty calendar days
5 | - Optimized priority indicators (2 bars max to prevent overflow)
6 | - Individual task bars sorted by priority (high → medium → low → none)
7 |
8 | User Experience:
9 | - Improved calendar interaction with intuitive gestures
10 | - Better visual hierarchy in calendar view
11 | - Cleaner date selection workflow
12 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/13.txt:
--------------------------------------------------------------------------------
1 | Version 1.2.2 - Calendar Sync & Update Checker Fixes
2 |
3 | • Fixed calendar sync duplicate events - tasks are no longer exported multiple times
4 | • Fixed imported calendar events being re-exported (prevents duplicates)
5 | • Fixed all-day event timezone issue - dates now sync correctly
6 | • Added "Remove Duplicate Events" maintenance option
7 | • Added "Delete All Trudido Events" option for calendar cleanup
8 | • Switched update checker to GitHub Atom feed (unlimited checks, no rate limits)
9 | • Update dialog now opens browser to download instead of in-app download
10 |
--------------------------------------------------------------------------------
/android/build.gradle.kts:
--------------------------------------------------------------------------------
1 | allprojects {
2 | repositories {
3 | google()
4 | mavenCentral()
5 | }
6 | }
7 |
8 | val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
9 | rootProject.layout.buildDirectory.value(newBuildDir)
10 |
11 | subprojects {
12 | val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
13 | project.layout.buildDirectory.value(newSubprojectBuildDir)
14 | }
15 | subprojects {
16 | project.evaluationDependsOn(":app")
17 | }
18 |
19 | tasks.register("clean") {
20 | delete(rootProject.layout.buildDirectory)
21 | }
22 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-20251126131522/ic_notification.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-20251126131522/ic_snooze.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-20251126131522/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
12 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/4.txt:
--------------------------------------------------------------------------------
1 | New Features:
2 | - Smart priority system with "None" option - cleaner default state
3 | - Beautiful priority chips with color coding (High/Medium/Low)
4 | - Time display on tasks - see exact due times, not just dates
5 | - Priority selector bottom sheet - no more cycling through options
6 | - Draggable theme & language selectors - expand to see all options
7 |
8 | Visual Improvements:
9 | - Priority chips only show when set (less clutter)
10 | - Overdue tasks highlighted in red
11 | - Time formatting with icons (🕒 for scheduled, 📅 for dates)
12 | - Theme-aware color chips adapt to your selected theme
13 |
14 | TASKS_DATA_KEYechnical:
15 | - Improved task display architecture
16 | - Better Material Design 3 integration
17 | - Enhanced bottom sheet interactions
18 |
--------------------------------------------------------------------------------
/android_icon_backups/drawable-20251126131522/ic_launcher_monochrome.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/lib/models/duration_adapter.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 |
18 |
--------------------------------------------------------------------------------
/lib/widgets/time_picker_form_field.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 |
18 |
--------------------------------------------------------------------------------
/lib/services/new_notification_service.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 |
18 |
--------------------------------------------------------------------------------
/lib/services/task_import_export_service.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 |
18 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/trudido/app/TaskStatusStore.kt:
--------------------------------------------------------------------------------
1 | package com.trudido.app
2 |
3 | import android.content.Context
4 |
5 | object TaskStatusStore {
6 | private const val PREFS = "task_status_store"
7 | private const val COMPLETED_SET = "completed_set"
8 | private fun prefs(ctx: Context) = ctx.getSharedPreferences(PREFS, Context.MODE_PRIVATE)
9 | fun isCompleted(ctx: Context, taskId: String): Boolean = (prefs(ctx).getString(COMPLETED_SET, "") ?: "").split('|').contains(taskId)
10 | fun markCompleted(ctx: Context, taskId: String) {
11 | val p = prefs(ctx)
12 | val raw = p.getString(COMPLETED_SET, "") ?: ""
13 | if (raw.split('|').contains(taskId)) return
14 | val updated = if (raw.isBlank()) taskId else "$raw|$taskId"
15 | p.edit().putString(COMPLETED_SET, updated).apply()
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/android/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | val flutterSdkPath = run {
3 | val properties = java.util.Properties()
4 | file("local.properties").inputStream().use { properties.load(it) }
5 | val flutterSdkPath = properties.getProperty("flutter.sdk")
6 | require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
7 | flutterSdkPath
8 | }
9 |
10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
11 |
12 | repositories {
13 | google()
14 | mavenCentral()
15 | gradlePluginPortal()
16 | }
17 | }
18 |
19 | plugins {
20 | id("dev.flutter.flutter-plugin-loader") version "1.0.0"
21 | id("com.android.application") version "8.9.1" apply false
22 | id("org.jetbrains.kotlin.android") version "2.1.0" apply false
23 | }
24 |
25 | include(":app")
26 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/trudido/app/ShowNotificationReceiver.kt:
--------------------------------------------------------------------------------
1 | package com.trudido.app
2 |
3 | import android.content.BroadcastReceiver
4 | import android.content.Context
5 | import android.content.Intent
6 |
7 | class ShowNotificationReceiver : BroadcastReceiver() {
8 | override fun onReceive(context: Context, intent: Intent) {
9 | val taskId = intent.getStringExtra("taskId") ?: return
10 | val title = intent.getStringExtra("title") ?: "Task Reminder"
11 | val body = intent.getStringExtra("body") ?: ""
12 | val scheduledAt = intent.getLongExtra("scheduledAt", 0L)
13 | if (scheduledAt > 0) LateAlarmTracker.recordFire(context, scheduledAt)
14 | val notif = NotificationScheduler.buildNotification(context, taskId, title, body)
15 | androidx.core.app.NotificationManagerCompat.from(context).notify(taskId.hashCode(), notif)
16 | // Update group summary after posting
17 | NotificationScheduler.updateGroupSummary(context)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/lib/models/statistics.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 | // Deprecated: This file is retained only as an empty stub to avoid stale imports during
18 | // migration. All statistics logic moved to TaskStatistics in controllers/task_controller.dart.
19 | // Remove this file once no external references remain.
20 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/todoapp/todoflutter/TaskStatusStore.kt:
--------------------------------------------------------------------------------
1 | package com.todoapp.todoflutter
2 |
3 | import android.content.Context
4 |
5 | /** Stores minimal task status flags for idempotent native actions. */
6 | object TaskStatusStore {
7 | private const val PREFS = "task_status_store"
8 | private const val COMPLETED_SET = "completed_set" // pipe-separated list
9 |
10 | private fun prefs(ctx: Context) = ctx.getSharedPreferences(PREFS, Context.MODE_PRIVATE)
11 |
12 | fun isCompleted(ctx: Context, taskId: String): Boolean {
13 | val raw = prefs(ctx).getString(COMPLETED_SET, "") ?: ""
14 | return raw.split('|').contains(taskId)
15 | }
16 |
17 | fun markCompleted(ctx: Context, taskId: String) {
18 | val p = prefs(ctx)
19 | val raw = p.getString(COMPLETED_SET, "") ?: ""
20 | if (raw.split('|').contains(taskId)) return
21 | val updated = if (raw.isBlank()) taskId else raw + "|" + taskId
22 | p.edit().putString(COMPLETED_SET, updated).apply()
23 | }
24 | // (removed legacy content)
25 | }
26 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/6.txt:
--------------------------------------------------------------------------------
1 | Repeatable Tasks Feature:
2 | - Create tasks that repeat daily, weekly, or monthly
3 | - Custom repeat patterns (e.g., every 2 days, every 3 weeks)
4 | - Select specific days for weekly repeats (Mon, Wed, Fri, etc.)
5 | - Optional end date for recurring tasks
6 | - Automatic creation of next occurrence when completing recurring tasks
7 | - Visual indicators showing which tasks are recurring
8 | - Calendar view displays recurring tasks on all relevant dates
9 |
10 | Calendar Enhancements:
11 | - Long-press or double-tap any calendar day to create a task with that date
12 | - Date is now automatically prefilled when creating tasks from calendar
13 | - "Add task" button in empty calendar days
14 | - Optimized priority indicators (2 bars max to prevent overflow)
15 | - Individual task bars sorted by priority (high → medium → low → none)
16 |
17 | User Experience:
18 | - Improved calendar interaction with intuitive gestures
19 | - Better visual hierarchy in calendar view
20 | - Cleaner date selection workflow
21 | - Enhanced task management with recurring patterns
22 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | Trudido is a privacy-friendly, open-source to-do list app built with Flutter. Organize your tasks, set reminders, and manage your daily life with a simple, intuitive interface. Trudido is designed for users who value transparency and control over their data—no ads, no tracking, and no unnecessary permissions.
2 |
3 | Features:
4 | - Add, edit, and delete tasks quickly
5 | - Organize tasks with categories and priorities
6 | - Set reminders to never miss important deadlines
7 | - Attach notes to tasks for extra details
8 | - Customizable themes including dark mode
9 | - Multilingual support for a global audience
10 | - Works offline—your data stays on your device
11 |
12 | Why Trudido?
13 | Trudido is lightweight, fast, and respects your privacy. All features are available without registration or cloud accounts. Perfect for students, professionals, and anyone who wants a reliable, distraction-free task manager.
14 |
15 | Trudido is free and open-source. Get organized and stay productive—your way!
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/11.txt:
--------------------------------------------------------------------------------
1 | Version 1.2.0 - Video & Media Enhancement Update
2 |
3 | 🎥 Video Features:
4 | - Added video recording capability via slash menu
5 | - Full video playback with tap-to-play/pause controls
6 | - Video progress bar with scrubbing support
7 | - Video thumbnails in note previews (first frame extraction)
8 |
9 | 📸 Photo Enhancements:
10 | - Tap photos to view fullscreen with pinch-to-zoom
11 | - Swipe to dismiss fullscreen viewer
12 | - Pan and zoom support (0.5x - 4x)
13 |
14 | 📅 Date Display Improvements:
15 | - More compact date format in note previews
16 | - European format (24-hour time, day before month)
17 | - Smart relative dates (Today, Yesterday, day names)
18 |
19 | 🎨 UI Improvements:
20 | - Small media thumbnails in note preview instead of emojis
21 | - Media-only notes now show "Media" as title instead of placeholder
22 | - Separated Photo and Video options in slash menu
23 |
24 | 🔧 Technical Updates:
25 | - Updated minSdk to 24 for better media support
26 | - Added video_player and video_thumbnail packages
27 | - Improved error handling for media operations
28 |
--------------------------------------------------------------------------------
/BUILD_INFO.md:
--------------------------------------------------------------------------------
1 | # Build information
2 |
3 | ## Repository commit
4 |
5 | Full commit: 39c4217ce576487945d98f0013d055e1bf82b60e
6 | Short commit: 39c4217
7 | Commit summary: bumb up version number to v1.0.7
8 | Commit date: Thu Oct 23 13:20:38 2025 +0200
9 | Tag(s) pointing at commit: v1.0.7
10 |
11 | ## Flutter environment
12 |
13 | Flutter binary: /c/dev/flutter/bin/flutter
14 | Flutter version (on build machine):
15 | Flutter 3.35.5 • channel stable • https://github.com/flutter/flutter.git
16 | Framework • revision ac4e799d23 (4 weeks ago) • 2025-09-26 12:05:09 -0700
17 | Engine • hash 0274ead41f6265309f36e9d74bc8c559becd5345 (revision d3d45dcf25) (26 days ago) • 2025-09-26 16:45:18.000Z
18 | Tools • Dart 3.9.2 • DevTools 2.48.0
19 |
20 | ## Build command & artifacts
21 |
22 | Working directory: D:/projects/todoflutter
23 | Suggested build command used: flutter build apk --release --build-name=1.0.7 --build-number=7
24 | APK artifacts found:
25 |
26 | - build/app/outputs/flutter-apk/app-release.apk (26150396 bytes)
27 | - build/app/outputs/flutter-apk/app-release.apk.sha1
28 |
29 | ## Notes
30 |
31 | This file is auto-generated by a tooling step. If you want this metadata to be included in future builds, consider adding a `build_info` section to `pubspec.yaml` or committing this file at release time.
32 |
--------------------------------------------------------------------------------
/lib/services/todo_provider.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 | // Deprecated legacy todo_provider.dart (stub)
18 | // All functionality migrated to:
19 | // - tasksProvider & TaskController (controllers/task_controller.dart)
20 | // - filter providers (providers/filter_providers.dart)
21 | // This file remains only to avoid broken imports during transition. Remove any
22 | // imports of this file; it will be deleted in a future cleanup.
23 |
24 | void deprecatedTodoProviderFileDoNotUse() {
25 | throw UnimplementedError(
26 | 'todo_provider.dart is deprecated. Use new providers.',
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/lib/screens/permissions_page.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 | import 'package:flutter/material.dart';
18 |
19 | /// (Legacy stub) This page was replaced by UnifiedSettingsPage.
20 | @Deprecated('Use UnifiedSettingsPage instead. Will be removed after v1.1.0.')
21 | class PermissionsPage extends StatelessWidget {
22 | const PermissionsPage({super.key});
23 | @override
24 | Widget build(BuildContext context) {
25 | assert(() {
26 | debugPrint(
27 | '[PermissionsPage] This legacy page is deprecated. Use UnifiedSettingsPage instead.',
28 | );
29 | return true;
30 | }());
31 | return const SizedBox.shrink();
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/lib/services/battery_optimization_service.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 | /// (Legacy stub) Use SystemSettingsService instead.
18 | @Deprecated('Replaced by SystemSettingsService. Will be removed after v1.1.0.')
19 | class BatteryOptimizationService {
20 | BatteryOptimizationService._();
21 | static final instance = BatteryOptimizationService._();
22 | Never _deprecated() => throw UnimplementedError(
23 | 'BatteryOptimizationService removed. Use SystemSettingsService.',
24 | );
25 | Future isIgnoringOptimizations() async => _deprecated();
26 | Future openSettings() async => _deprecated();
27 | bool get hasAcknowledged => false;
28 | Future setAcknowledged() async => _deprecated();
29 | }
30 |
--------------------------------------------------------------------------------
/lib/models/app_error.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 | /// Unified application error types for consistent error handling & logging.
18 | enum AppErrorType {
19 | storageRead,
20 | storageWrite,
21 | serialization,
22 | deserialization,
23 | notFound,
24 | validation,
25 | unknown,
26 | }
27 |
28 | /// Simple wrapper exception carrying a type and context message.
29 | class AppError implements Exception {
30 | final AppErrorType type;
31 | final String message;
32 | final Object? cause;
33 | final StackTrace? stackTrace;
34 |
35 | const AppError(this.type, this.message, {this.cause, this.stackTrace});
36 |
37 | @override
38 | String toString() =>
39 | 'AppError(type: $type, message: $message, cause: $cause)';
40 | }
41 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/trudido/app/BootCompletedReceiver.kt:
--------------------------------------------------------------------------------
1 | package com.trudido.app
2 |
3 | import android.content.BroadcastReceiver
4 | import android.content.Context
5 | import android.content.Intent
6 | import android.util.Log
7 |
8 | /** Restores scheduled notifications after device reboot. */
9 | class BootCompletedReceiver : BroadcastReceiver() {
10 | override fun onReceive(context: Context, intent: Intent?) {
11 | if (intent?.action != Intent.ACTION_BOOT_COMPLETED) return
12 | val now = System.currentTimeMillis()
13 | val items = ScheduledNotificationsStore.all(context)
14 | var restored = 0
15 | for (item in items) {
16 | // Skip past-due > 30 min; show immediately if within 30 min grace
17 | val delta = item.triggerTime - now
18 | if (delta <= 0) {
19 | if (now - item.triggerTime <= 30 * 60 * 1000) {
20 | NotificationScheduler.showNow(context, item.taskId, item.title, item.body)
21 | } else {
22 | // Drop very old reminder
23 | ScheduledNotificationsStore.remove(context, item.taskId)
24 | }
25 | } else {
26 | val requestCode = item.taskId.hashCode()
27 | NotificationScheduler.scheduleExact(context, item.taskId, item.title, item.body, item.triggerTime, requestCode)
28 | restored++
29 | }
30 | }
31 | Log.i("BootCompletedReceiver", "Processed reboot restore items=${items.size} restored=$restored")
32 | }
33 | }
--------------------------------------------------------------------------------
/lib/services/late_alarm_nudge_service.dart:
--------------------------------------------------------------------------------
1 | // Trudido - A privacy-focused todo and notes app
2 | // Copyright (C) 2025 Dominik Müller
3 | //
4 | // This program is free software: you can redistribute it and/or modify
5 | // it under the terms of the GNU General Public License as published by
6 | // the Free Software Foundation, either version 3 of the License, or
7 | // (at your option) any later version.
8 | //
9 | // This program is distributed in the hope that it will be useful,
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | // GNU General Public License for more details.
13 | //
14 | // You should have received a copy of the GNU General Public License
15 | // along with this program. If not, see .
16 |
17 | import 'dart:async';
18 | import 'package:flutter/foundation.dart';
19 | import 'package:flutter/services.dart';
20 |
21 | /// Bridges to native LateAlarmTracker to see if a battery optimization nudge should appear.
22 | class LateAlarmNudgeService {
23 | LateAlarmNudgeService._();
24 | static final instance = LateAlarmNudgeService._();
25 |
26 | static const _channel = MethodChannel('app.perms');
27 |
28 | Future consumePromptIfNeeded() async {
29 | try {
30 | final r = await _channel.invokeMethod('consumeLateAlarmPrompt');
31 | return r == true;
32 | } catch (e, st) {
33 | debugPrint(
34 | '[LateAlarmNudgeService] consumePromptIfNeeded error: $e\n$st',
35 | );
36 | return false;
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/trudido/app/MissedReminderCatchUp.kt:
--------------------------------------------------------------------------------
1 | package com.trudido.app
2 |
3 | import android.content.Context
4 | import android.util.Log
5 |
6 | /** Scans persisted scheduled notifications and reconciles any that are past-due. */
7 | object MissedReminderCatchUp {
8 | private const val GRACE_MS = 30 * 60 * 1000L // 30 minutes show-now grace
9 | private const val MAX_STALE_MS = 12 * 60 * 60 * 1000L // drop if older than 12h
10 |
11 | fun run(context: Context) {
12 | val now = System.currentTimeMillis()
13 | val items = ScheduledNotificationsStore.all(context)
14 | var shown = 0
15 | var dropped = 0
16 | for (item in items) {
17 | val delta = item.triggerTime - now
18 | if (delta <= 0) {
19 | val age = now - item.triggerTime
20 | if (age <= GRACE_MS) {
21 | NotificationScheduler.showNow(context, item.taskId, item.title, item.body)
22 | ScheduledNotificationsStore.remove(context, item.taskId)
23 | shown++
24 | } else if (age > MAX_STALE_MS) {
25 | ScheduledNotificationsStore.remove(context, item.taskId)
26 | dropped++
27 | } else {
28 | // Keep for potential manual review (still future catch-up logic); no action
29 | }
30 | }
31 | }
32 | if (shown > 0 || dropped > 0) {
33 | Log.i("MissedReminderCatchUp", "shown=$shown dropped=$dropped total=${items.size}")
34 | }
35 | }
36 | }
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/trudido/app/PendingActionStore.kt:
--------------------------------------------------------------------------------
1 | package com.trudido.app
2 |
3 | import android.content.Context
4 | import org.json.JSONArray
5 | import org.json.JSONObject
6 | import android.util.Log
7 |
8 | object PendingActionStore {
9 | private const val PREFS = "notification_actions"
10 | private const val KEY = "pending"
11 | fun addAction(context: Context, data: Map) {
12 | val prefs = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE)
13 | val existing = prefs.getString(KEY, null)
14 | val arr = if (existing != null) JSONArray(existing) else JSONArray()
15 | val obj = JSONObject()
16 | data.forEach { (k, v) -> obj.put(k, v) }
17 | arr.put(obj)
18 | prefs.edit().putString(KEY, arr.toString()).apply()
19 | Log.d("PendingActionStore", "Added action ${data["type"]} taskId=${data["taskId"]} newSize=${arr.length()}")
20 | }
21 | fun getPendingActions(context: Context): List