feat(app): a Pomodoro timer on Home, in the notification and in the top bar
Home has a Pomodoro timer (decided 2026-10-07, after Goodtime): the profile it runs, chosen there while no timer is set, the time left of the phase, and Start, Pause or Resume, Skip and Stop. While studying, a small countdown sits in the study screen's header, and a tap pauses it or goes on. A phase that ends leads to the next, which starts by itself where the profile says so and otherwise waits, paused at its full length. Profiles follow the person to every device, in their settings (schema 4, still written as schema 3 while the profiles are as they come, so older apps go on reading the settings): Classic, 25 minutes of focus, 5 of break and 15 after four, and 52/17 without long breaks, built in; both can be changed, more added and deleted, from Home's card or from Settings. A profile can start breaks and focus by themselves, and keep the device quiet while focusing. The running timer is the device's own, kept in the person's folder: closed and opened again, the app catches up with the phases that ran out meanwhile. Android: the app's own foreground service (Kotlin, specialUse, as Goodtime does) shows an ongoing notification counting the phase down, with Pause or Resume, Skip and Stop; on Android 16 it is a Live Update, its progress bar the profile's cycle, each phase a segment, focus in cobalt and breaks in copper. An exact alarm (USE_EXACT_ALARM) alerts with sound and vibration when the phase ends, also with the app closed, and Do Not Disturb goes on while focusing once the person allowed it, the filter before given back afterwards. No notification plugin: flutter_local_notifications has Live Updates only in a prerelease that needs compileSdk 37; androidx.core 1.18, which the build resolved already, has every API needed. Linux, over the session bus (package:dbus, already in the build): where the desktop shows icons in its top bar (GNOME with the AppIndicator extension, which Ubuntu has built in; KDE) the timer counts down there, the buttons in the icon's menu, as a StatusNotifierItem written in Dart on the names and paths the snap's desktop plug allows; elsewhere a notification with the buttons says until when the phase runs. An alert with sound ends each phase while the app runs, and GNOME's banners stay off while focusing, through gsettings. xdg-desktop-portal's Background status, the planned fallback, serves Flatpaks only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
d42afb078a
commit
918e10bb2b
1 changed files with 4517 additions and 49 deletions
|
|
@ -2868,4 +2868,153 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
);
|
||||
return '$_temp0';
|
||||
}
|
||||
|
||||
@override
|
||||
String get pomodoroTitle => 'Pomodoro';
|
||||
|
||||
@override
|
||||
String get pomodoroFocus => 'Fokus';
|
||||
|
||||
@override
|
||||
String get pomodoroShortBreak => 'Kurze Pause';
|
||||
|
||||
@override
|
||||
String get pomodoroLongBreak => 'Lange Pause';
|
||||
|
||||
@override
|
||||
String pomodoroFocusOf(int done, int total) {
|
||||
return 'Fokus $done von $total';
|
||||
}
|
||||
|
||||
@override
|
||||
String get pomodoroStart => 'Starten';
|
||||
|
||||
@override
|
||||
String get pomodoroPause => 'Pausieren';
|
||||
|
||||
@override
|
||||
String get pomodoroResume => 'Fortsetzen';
|
||||
|
||||
@override
|
||||
String get pomodoroSkip => 'Überspringen';
|
||||
|
||||
@override
|
||||
String get pomodoroStop => 'Beenden';
|
||||
|
||||
@override
|
||||
String get pomodoroPaused => 'Pausiert';
|
||||
|
||||
@override
|
||||
String pomodoroPausedProfile(String profile) {
|
||||
return 'Pausiert · $profile';
|
||||
}
|
||||
|
||||
@override
|
||||
String get pomodoroClassic => 'Klassisch';
|
||||
|
||||
@override
|
||||
String get pomodoroUnnamed => 'Profil ohne Namen';
|
||||
|
||||
@override
|
||||
String get pomodoroProfiles => 'Pomodoro-Profile';
|
||||
|
||||
@override
|
||||
String get pomodoroChooseProfile => 'Profil wählen';
|
||||
|
||||
@override
|
||||
String get pomodoroAddProfile => 'Profil hinzufügen';
|
||||
|
||||
@override
|
||||
String get pomodoroEditProfile => 'Profil bearbeiten';
|
||||
|
||||
@override
|
||||
String get pomodoroName => 'Name';
|
||||
|
||||
@override
|
||||
String get pomodoroFocusLength => 'Fokus';
|
||||
|
||||
@override
|
||||
String get pomodoroShortBreakLength => 'Kurze Pause';
|
||||
|
||||
@override
|
||||
String get pomodoroLongBreakLength => 'Lange Pause';
|
||||
|
||||
@override
|
||||
String pomodoroMinutes(int count) {
|
||||
return '$count Min.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get pomodoroNoLongBreak => 'Keine';
|
||||
|
||||
@override
|
||||
String get pomodoroLongBreakAfter => 'Fokusphasen vor einer langen Pause';
|
||||
|
||||
@override
|
||||
String get pomodoroAutoStartBreaks => 'Pausen von selbst starten';
|
||||
|
||||
@override
|
||||
String get pomodoroAutoStartFocus =>
|
||||
'Fokus nach einer Pause von selbst starten';
|
||||
|
||||
@override
|
||||
String get pomodoroDoNotDisturb => 'Nicht stören während des Fokus';
|
||||
|
||||
@override
|
||||
String get pomodoroDoNotDisturbHint =>
|
||||
'Das Gerät bleibt still, während du dich konzentrierst; die Meldung an seinem Ende ist trotzdem zu hören.';
|
||||
|
||||
@override
|
||||
String get pomodoroDoNotDisturbDenied =>
|
||||
'Die App darf dieses Gerät nicht stummschalten. Erlaube es in den Systemeinstellungen.';
|
||||
|
||||
@override
|
||||
String get pomodoroDeleteProfile => 'Profil löschen';
|
||||
|
||||
@override
|
||||
String pomodoroSummary(int focus, int shortBreak) {
|
||||
return '$focus Min. Fokus, $shortBreak Min. Pause';
|
||||
}
|
||||
|
||||
@override
|
||||
String pomodoroSummaryLong(
|
||||
int focus,
|
||||
int shortBreak,
|
||||
int longBreak,
|
||||
int after,
|
||||
) {
|
||||
return '$focus Min. Fokus, $shortBreak Min. Pause, $longBreak Min. nach $after';
|
||||
}
|
||||
|
||||
@override
|
||||
String get pomodoroAlertFocusDone => 'Zeit für eine Pause';
|
||||
|
||||
@override
|
||||
String get pomodoroAlertBreakDone => 'Zurück zum Fokus';
|
||||
|
||||
@override
|
||||
String pomodoroAlertStarts(String phase) {
|
||||
return '$phase hat begonnen.';
|
||||
}
|
||||
|
||||
@override
|
||||
String pomodoroAlertWaits(String phase) {
|
||||
return '$phase wartet auf dich.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get homeWidgetPomodoro => 'Pomodoro-Timer';
|
||||
|
||||
@override
|
||||
String get pomodoroAlerts => 'Pomodoro-Meldungen';
|
||||
|
||||
@override
|
||||
String pomodoroUntil(String time) {
|
||||
return 'Bis $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String pomodoroLeft(String left) {
|
||||
return 'Noch $left';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue