Commit Graph

4218 Commits

Author SHA1 Message Date
5c1e9c5bf2 Handle physical keyboard keys on the scaffold state that is rendered
Some checks failed
Trigger F-Droid repository rebuild / trigger (release) Has been cancelled
Build Nightly APK / build (push) Has been cancelled
The key event handler was installed on the activity together with the state
instance it captured, so it could keep talking to a state that is no longer the
one that is drawn. That happens in practice: the scaffold state is recreated
when one of its rememberSaveable keys changes, which it does right after the
launcher starts (the window is measured, and the state is restored after the
configuration change), and the activity then still holds the handler of the
previous state. Typing on the home screen set the search query and started the
page transition on the detached state, so the search page never appeared, while
the query showed up in the search bar.

The handler is now created without the state as a key and asks for the current
state through a provider, and the activity's handler is refreshed on every
composition instead of only when the handler instance changes.

Verified on the Titan 2: typing on the home screen opens the search page with
the character inserted, further characters append, the text field stays
unfocused and the on-screen keyboard stays hidden.
v1.40.2-typing.4
2026-09-10 21:44:46 +02:00
e004862b00 Bump version to 1.40.2-typing.3
Some checks failed
Trigger F-Droid repository rebuild / trigger (release) Has been cancelled
Fixes on top of -typing.2: the widget configure activity crash, the search bar
keeping the keyboard focus (and the IME) on the home screen after an app switch,
and the TextFieldValue update in SearchBar moving out of the composition.
v1.40.2-typing.3
2026-09-10 20:46:11 +02:00
ff3cab9531 Keep the search bar from holding the keyboard focus on the home screen
Returning to the launcher from another app left the search bar's text field
focused, with the on-screen keyboard up. Typing on the physical keyboard then
went into the search bar - the IME commits characters to the focused text field
- while the search results never appeared, because the key event handler
deliberately leaves keys alone while the text field has the focus. Coming home
looked like the launcher had stopped responding to the keyboard; it happens with
a freshly started launcher and a plain app switch, with no search ever opened.

Give that focus up again one frame after the launcher is resumed, and hide the
on-screen keyboard, as long as the home screen is what is shown. Only on a
resume (pauseTime > 0), so that a search component used as the home screen can
still focus itself when the launcher starts.

Also set isSearchBarFocused back to false when the text field loses the focus,
like upstream does. LauncherSearchBar requests focus whenever that flag is true,
so only ever setting it to true made the text field focus itself again after it
had been unfocused - which is what kept the on-screen keyboard around.

Clear the search query before resetting the page in the resume path, so that a
stale query is gone even if the page transition is interrupted.

Note: the focus fix is a workaround for the framework/IME handing the focus back
to the text field; it is not verified on the device yet.
2026-09-10 20:41:05 +02:00
79f229de6d SearchBar: adopt outside text changes in a side effect
SearchBar keeps a TextFieldValue so that the cursor ends up behind text that was
changed from the outside (a search started by typing on a physical keyboard, or
a reset search). That value was updated during composition, which is an
anti-pattern: the value read earlier in the same composition is what gets drawn,
so the write only schedules another recomposition pass of the search bar - and
it can be dropped entirely if the composition does not complete.

Do the same update in a SideEffect, after the composition. No behaviour change
for the user.
2026-09-10 20:41:01 +02:00
73c3683740 Don't crash when a widget has no configure activity
A widget can advertise WIDGET_FEATURE_RECONFIGURABLE without providing a
configure activity (or the app providing it was uninstalled since). Tapping
"Configure widget" then made
AppWidgetHost.startAppWidgetConfigureActivityForResult throw, which killed the
launcher:

  android.content.ActivityNotFoundException: No Activity found to handle null
    at android.app.Activity.startIntentSenderForResult
    at android.appwidget.AppWidgetHost.startAppWidgetConfigureActivityForResult
    at ConfigureWidgetSheetKt.ConfigureAppWidget$lambda$10$1$0(ConfigureWidgetSheet.kt:812)

This happened three times on the Titan 2 on 2026-09-10 (19:55, 19:57 and 20:03,
the last one 28 seconds after boot). Catch ActivityNotFoundException, and
SecurityException for a configure activity that refuses to be started, and log
instead. Upstream main still has the same unguarded call.
2026-09-10 20:40:57 +02:00
e17903f40f Clear the search when the launcher is left, end keyboard search on dismiss
Some checks failed
Trigger F-Droid repository rebuild / trigger (release) Has been cancelled
Two fixes on top of the type-to-search feature:

- The search no longer survives leaving the launcher. Upstream only resets the
  search when the launcher was in the background for more than five seconds, so
  a quick app switch or a fast return from a launched app left the old query on
  screen. The search page is now always reset, whatever the pause was.
- Dismissing the search page ends the keyboard driven search. Without that the
  flag stayed set, so opening the search later (gesture or search bar) did not
  focus the text field and the soft keyboard stayed away.

Version 1.40.2-typing.2.
v1.40.2-typing.2
2026-09-10 12:03:00 +02:00
75f869c094 Add notes for this fork (type-to-search design, build, release, install) 2026-09-10 11:59:00 +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.
v1.40.2-typing.1
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
MM20
32170cfc48 show badges in iconless app list
close #1982
2026-08-30 17:04:59 +02:00
MM20
4dff3b5ee6 make dropdown menus scrollable
fix #1906
2026-08-30 16:53:22 +02:00
MM20
9b8b083515 open calendar app and weather app in new task
fix #1963
2026-08-30 16:14:23 +02:00
MM20
5bd8b832f4 calendar widget: open calendar at selected date 2026-08-30 16:12:03 +02:00
MM20
d446d86127 always open custom intent quick actions in new task
close #1967
2026-08-30 16:08:35 +02: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
728795d7bc refactor media integration settings to use lazy items 2026-08-23 18:28:32 +02: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
MM20
bd37261cbe Merge branch 'main' of github.com:MM2-0/Kvaesitso 2026-08-21 16:14:38 +02:00
Charlie
fa4b19c15a precache app shortcuts (#1972) 2026-08-21 16:14:23 +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
37f738b129 Remove unused code 2026-08-16 15:52:54 +02: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
MM20
057de087e9 Use all system locales to determine default currencies 2026-08-11 21:48:20 +02:00
MM20
c255894f3b allowlist belarusian in form of address preference 2026-08-11 00:00:52 +02: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