1801 Commits

Author SHA1 Message Date
c824b100b6 Make the clock agenda's calendars and row count configurable
The agenda part filtered calendars through the search settings and always
collapsed after four rows. It now has its own selection: an exclusion set
(`clockWidgetCalendarPartExcludedCalendars`, empty = all) that is added to the
search settings' exclusions, because the picker only offers calendars those
settings leave enabled.

The row cap is `clockWidgetCalendarPartMaxRows` (1..8, default 4); the agenda
shows that many events and then a "+N more events" row if more are left, so
with the default five events now render as four rows plus "+1 more event"
instead of three plus "+2".

Both are configured in `ConfigureCalendarPart`, shown by the clock sheet while
the Events part is enabled: a slider, a Calendars row that expands into a
colour-tinted checkbox per calendar, and a button to Settings -> Search ->
Calendar (new `ROUTE_SEARCH_CALENDARS`) for calendars the search settings
disable. A missing calendar permission shows a banner with a Grant button.

New setting fields default to the previous behaviour, so no datastore
migration is needed.
2026-09-17 08:56:55 +02:00
61f3424de5 Stop the weather worker pinning location for providers that manage it
Some checks failed
Trigger F-Droid repository rebuild / trigger (release) Has been cancelled
Breezy Weather resolves its own location and pushes weather updates, but
WeatherUpdateWorker only looked at autoLocation before requesting a location.
BreezyWeatherProvider.getWeatherData() is a noop that always returns null, so
the worker then returned Result.retry() forever and never set lastUpdate -
which meant the update interval check could never short-circuit it either.

Every attempt called getLastKnownLocation(), which registers GPS *and* network
listeners at a one second interval and held them for up to ten minutes, so the
location stack never idled. On the phone this showed up as ~46k delivered fixes,
`*location*` wakelocks held ~99% of the time and Doze never engaging at all.

- expose the selected provider's managedLocation in WeatherSettingsData
- skip and cancel the weather work for providers that manage their own location
- give up on a fix after two minutes instead of ten
- LocationsRepository: don't collect the location flow when location search is
  off or not permitted. As a combineTransform argument it was always collected,
  so every search query registered GPS and network listeners for up to 30s.

Bump to 1.40.2-typing.8 (versionCode 2026091201).
2026-09-12 15:19:10 +02:00
05c7f0f60d Show the next alarm 24 hours ahead, not 8
Some checks failed
Trigger F-Droid repository rebuild / trigger (release) Has been cancelled
An alarm set for the next morning left the dynamic zone before it was visible:
at 22:00 an alarm at 06:00 is eight hours away, so the part only appeared while
the phone was unlikely to be looked at. The window is now 24 hours, and the
setting summary says so (also in Danish; the other translations still say 8 and
will follow upstream).

Verified on the Titan 2 that Chrono (com.vicolo.chrono) registers its alarms the
way this part reads them: dumpsys alarm lists them as "Alarm clock" entries with
a showIntent pointing at Chrono, and AlarmManager.nextAlarmClock returns the
earliest one, so ACTION_NEXT_ALARM_CLOCK_CHANGED keeps the part up to date.
Tapping it opens Chrono as well - SHOW_ALARMS, SET_ALARM and SHOW_TIMERS all
resolve to com.vicolo.chrono/.MainActivity.
2026-09-11 12:30:05 +02:00
6ae31fe92b Show an agenda in the clock widget's dynamic zone, with multiple slots
The dynamic zone showed exactly one part: the highest ranked of the enabled
ones. It now shows up to `clockWidgetDynamicZoneSlots` of them (default 1),
adjustable with a slider in the clock widget settings whose maximum is the
number of enabled parts. `ClockWidgetVM.getActiveParts()` returns that sorted
list, and both clock layouts render it (stacked under the clock, or next to it
in the horizontal layout).

On top of that the zone has an "Events" part (`clockWidgetCalendarPart`, off by
default) that shows today's agenda: events that are still running or upcoming
today, plus today's all-day events. At most four rows; when there are more, the
last row is a "+N more events" hint that opens the calendar app. Tapping a row
opens the event through `CalendarEvent.launch()`.

A row is three fixed-width columns that are pure layout, not drawn: a dot in the
calendar's colour, the time, and the title (ellipsized when it does not fit).
Times are always times, never dates - an all-day event renders "all-day" - and
the block is centred under the clock. The columns line up across rows, and the
time is left-aligned within its column.

The part ranks 70 when an event is running or starts within half an hour, 30
while events are left today and 0 on an empty day, so the date keeps the slot
when there is nothing to show. It reloads itself through a ContentObserver on
CalendarContract.Events and a 15 minute ticker, because unlike the calendar
widget it is on screen all the time. Tasks (`CalendarEvent.isTask`) are filtered
out for now; a tasks part can reuse this once tasks are configured.

Verified on the Titan 2: with the part enabled and three slots, the home screen
shows the agenda (two all-day events and a timed one) above the date part.
2026-09-11 12:25:09 +02:00
0f53f7ecdf Open the search when typing on a physical keyboard
Some checks failed
Trigger F-Droid repository rebuild / trigger (release) Has been cancelled
Typing on a physical keyboard while the home screen is shown now opens the
search page and inserts the typed character, so the launcher can be used
without touching the screen. It works for any printable key, appends the
characters in order even when the user types faster than the launcher can
recompose, and the search bar can still be tapped to edit the query with
the on-screen keyboard as usual.

While the search is driven by the keyboard, the search bar's text field is
left unfocused on purpose: a focused text field would make the system show
the on-screen keyboard, which is not wanted when there is a physical
keyboard. The handler therefore inserts and deletes characters itself,
including backspace and enter (to launch the best match).

The behaviour is controlled by a new "Search on typing" preference in
Settings -> Search, which is enabled by default.

Implementation notes:
- The key events are intercepted in SharedLauncherActivity.dispatchKeyEvent,
  which is the only place that sees hardware key events while no view has
  focus. The scaffold installs the handler while it is shown.
- Key events are not forwarded to the search bar's text field, so the
  characters are inserted into the search view model directly.
- SearchBar keeps a TextFieldValue instead of a String so that the cursor
  moves to the end of the text when the value is changed from the outside.
  Without this the next typed character ended up in front of the text.
2026-09-10 11:45:14 +02:00
Yunjonue
7fd4a6ae74 Translated using Weblate (Russian)
Currently translated at 91.5% (825 of 901 strings)

Translation: Kvaesitso/i18n
2026-09-07 15:29:42 +00:00
Yunjonue
3cafcdc6e3 Translated using Weblate (Russian)
Currently translated at 90.4% (815 of 901 strings)

Translation: Kvaesitso/i18n
2026-09-07 05:53:47 +00:00
summoner001
d46c93c57f Translated using Weblate (Hungarian)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-29 07:57:06 +00:00
summoner001
f713a2532f Translated using Weblate (Hungarian)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-29 07:42:18 +00:00
MM20
85a68a7e7e Merge branch 'main' of github.com:MM2-0/Kvaesitso 2026-08-23 17:55:13 +02:00
MM20
17f8906f26 add setting to exclude apps from shortcuts search 2026-08-23 17:55:08 +02:00
Tim Tsai
55a673c01a Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.3% (895 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-23 13:27:39 +00:00
MM20
61c43650ba update google sans font 2026-08-22 18:48:28 +02:00
Wari
6b5d8e48ac Translated using Weblate (Thai)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-19 16:10:26 +00:00
Wari
2d98f37543 Translated using Weblate (Thai)
Currently translated at 99.8% (900 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-19 16:09:55 +00:00
Wari
e896eba65a Translated using Weblate (Thai)
Currently translated at 99.8% (900 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-19 16:09:21 +00:00
Wari
582e48fbd0 Translated using Weblate (Thai)
Currently translated at 99.8% (900 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-19 16:08:51 +00:00
Wari
069eafb7e1 Translated using Weblate (Thai)
Currently translated at 99.5% (897 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-19 15:51:52 +00:00
Wari
086bac02d7 Translated using Weblate (Thai)
Currently translated at 93.5% (843 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-19 15:16:56 +00:00
Wari
0af18b9050 Translated using Weblate (Thai)
Currently translated at 91.0% (820 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-19 14:01:22 +00:00
MM20
32adda9bb4 Merge branch 'main' of github.com:MM2-0/Kvaesitso 2026-08-16 15:38:46 +02:00
MM20
37ccc83e7c remove accompanist libraries and compose icons 2026-08-16 15:36:16 +02:00
MM20
64dc66aadb Update dependencies, change java version to 11, update Gradle 2026-08-12 23:42:41 +02:00
sephirothnight
6d695801e0 Translated using Weblate (French)
Currently translated at 92.2% (143 of 155 strings)

Translation: Kvaesitso/units
2026-08-12 02:23:11 +00:00
Fatih Yılmaz
1b6dde1804 Translated using Weblate (Turkish)
Currently translated at 98.3% (886 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-10 00:34:08 +00:00
Fatih Yılmaz
8d03ab7b11 Translated using Weblate (Swedish)
Currently translated at 32.6% (294 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-10 00:34:08 +00:00
lenify
f55417df01 Translated using Weblate (Belarusian)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-05 15:18:47 +00:00
lenify
8371a762b5 Translated using Weblate (Belarusian)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-05 14:49:00 +00:00
lenify
b506a956bb Translated using Weblate (Belarusian (be_MASCULINE))
Currently translated at 4.7% (43 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-05 14:48:52 +00:00
lenify
b4f3707db7 Translated using Weblate (Belarusian (be_FEMININE))
Currently translated at 4.7% (43 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-05 14:48:52 +00:00
lenify
ccece95e9f Translated using Weblate (Belarusian)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-05 14:48:52 +00:00
axeuskie
aa3d9b0d61 Translated using Weblate (French)
Currently translated at 99.6% (898 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-04 14:34:19 +00:00
lenify
4d374eb1bd Translated using Weblate (Belarusian (be_MASCULINE))
Currently translated at 4.6% (42 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-04 05:06:04 +00:00
lenify
1368efbe60 Translated using Weblate (Belarusian (be_FEMININE))
Currently translated at 4.6% (42 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-04 05:06:03 +00:00
lenify
8b3d95b1dd Translated using Weblate (Belarusian)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-04 05:06:03 +00:00
lenify
a87d55f211 Translated using Weblate (Belarusian)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-03 17:02:45 +00:00
axeuskie
adb30d7ea6 Translated using Weblate (French)
Currently translated at 99.6% (898 of 901 strings)

Translation: Kvaesitso/i18n
2026-08-03 16:06:05 +00:00
afawfaef
2c92118691 Translated using Weblate (Ukrainian)
Currently translated at 34.6% (312 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-31 18:53:41 +00:00
Weblate user 238
a1a49a5fa9 Translated using Weblate (Norwegian Bokmål)
Currently translated at 79.9% (720 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-24 15:52:34 +00:00
Weblate user 238
2e97051ef7 Translated using Weblate (Norwegian Bokmål)
Currently translated at 77.5% (699 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-24 13:37:04 +00:00
anexcellentusername
55176e4afe Translated using Weblate (Norwegian Bokmål)
Currently translated at 72.5% (654 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-24 12:31:23 +00:00
anexcellentusername
3f71bbf3ad Translated using Weblate (Norwegian Bokmål)
Currently translated at 72.4% (653 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-24 12:30:57 +00:00
anexcellentusername
a69167d35d Translated using Weblate (Norwegian Bokmål)
Currently translated at 71.6% (646 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-24 12:24:22 +00:00
Luciana Fidilio-Allende
6d84300b6c Translated using Weblate (Spanish)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-21 18:53:02 +00:00
MM20
b39c92d72f Merge branch 'main' of github.com:MM2-0/Kvaesitso 2026-07-19 21:39:47 +02:00
MM20
f5269845c8 fix crash when locking hidden private space 2026-07-19 21:39:34 +02:00
MM20
3f4deead1b (refactor) refactor ProfileManager class 2026-07-19 18:27:59 +02:00
unsigned char
5d358856f1 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.5% (897 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-16 02:42:10 +00:00
ofermar
aa4a94ff32 Translated using Weblate (Hebrew)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-07 05:14:03 +00:00
ofermar
3e2999561d Translated using Weblate (Hebrew)
Currently translated at 100.0% (901 of 901 strings)

Translation: Kvaesitso/i18n
2026-07-07 05:13:23 +00:00