Compare commits

...

130 commits

Author SHA1 Message Date
abf57760e9
fix bug in widget resizing logic, see #207
Some checks failed
Android CI / build (push) Has been cancelled
2025-06-30 11:53:51 +02:00
b9792e9942
0.2.3
Some checks failed
Android CI / build (push) Has been cancelled
2025-06-24 21:37:34 +02:00
Too Late (bot)
dd3ba74f75
Translations update from Toolate (#200)
* Translated using Weblate (German)

Currently translated at 83.8% (249 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/de/

* Translated using Weblate (Spanish)

Currently translated at 81.4% (242 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/es/

* Translated using Weblate (French)

Currently translated at 54.8% (163 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/fr/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 96.9% (288 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.2% (277 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.2% (277 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/

* Translated using Weblate (Turkish)

Currently translated at 53.1% (158 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/tr/

* Translated using Weblate (Italian)

Currently translated at 97.6% (290 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/

* Translated using Weblate (Japanese)

Currently translated at 58.9% (175 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ja/

* Translated using Weblate (Lithuanian)

Currently translated at 31.9% (95 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/lt/

* Translated using Weblate (Lithuanian)

Currently translated at 31.9% (95 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/lt/

* Translated using Weblate (Arabic)

Currently translated at 97.3% (289 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ar/

* Translated using Weblate (Dutch)

Currently translated at 93.9% (279 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/nl/

* Translated using Weblate (Polish)

Currently translated at 82.4% (245 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pl/

* Translated using Weblate (Polish)

Currently translated at 82.4% (245 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pl/

* Update translation files

Updated by "Remove blank strings" add-on in Weblate.

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/

* Translated using Weblate (Spanish)

Currently translated at 94.2% (280 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/es/

* Translated using Weblate (Spanish)

Currently translated at 94.2% (280 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/es/

* Translated using Weblate (Polish)

Currently translated at 88.5% (263 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pl/

* Translated using Weblate (Polish)

Currently translated at 4.0% (1 of 25 strings)

Translation: jrpie-Launcher/metadata
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/pl/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 97.9% (291 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/

* Translated using Weblate (Italian)

Currently translated at 100.0% (297 of 297 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/

---------

Co-authored-by: Vossa Excelencia <nationalistic.tention@hele.win>
Co-authored-by: Lukas Hamm <ideallygrey@tuta.io>
Co-authored-by: AsLoLoks <asloloks@proton.me>
Co-authored-by: rimopa <rimopapomir@gmail.com>
Co-authored-by: example <example666@users.noreply.toolate.othing.xyz>
Co-authored-by: Julian Malinowski <malinian@users.noreply.toolate.othing.xyz>
Co-authored-by: class0068 <monkeyotw@proton.me>
Co-authored-by: Vladi69 <vladimirogalante@yahoo.it>
2025-06-24 21:35:40 +02:00
3a7dcbc201
allow markdown in bug report template (see #199)
Some checks failed
Android CI / build (push) Has been cancelled
2025-06-15 11:40:00 +02:00
98756892f3
update docs/security.md
Some checks failed
Android CI / build (push) Has been cancelled
2025-06-09 15:52:26 +02:00
ab86a913c1
update docs/security.md 2025-06-09 15:49:09 +02:00
407de3bdce
fix links 2025-06-09 15:45:57 +02:00
c676b92036
update docs/examples/wallpapers.md 2025-06-09 15:41:15 +02:00
2cf8870c5d
add docs/security.md 2025-06-09 15:38:41 +02:00
ce34e9cfdd
add docs/examples/wallpaper.md
Some checks are pending
Android CI / build (push) Waiting to run
2025-06-08 16:41:57 +02:00
919108bbd0
fix: stop longPressHandler when activity finishes
Some checks failed
Android CI / build (push) Has been cancelled
2025-06-05 12:02:37 +02:00
ce939111d0
fixed italian translation
Some checks failed
Android CI / build (push) Has been cancelled
2025-05-29 19:29:05 +02:00
Too Late (bot)
33dd3ef3c2
Translations update from Toolate (#175)
* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.6% (288 of 289 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (289 of 289 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ar/

* Translated using Weblate (Italian)

Currently translated at 100.0% (290 of 290 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (290 of 290 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/

---------

Co-authored-by: class0068 <monkeyotw@proton.me>
Co-authored-by: abdelbasset jabrane <cehiwa4149@oronny.com>
Co-authored-by: Vladi69 <vladimirogalante@yahoo.it>
Co-authored-by: renar <opensource.tjxzm@aleeas.com>
2025-05-29 19:18:01 +02:00
Luke Wass
1d793c485e
Improve documentation (#190)
* fix grammar
2025-05-29 17:16:05 +02:00
04a2b4d248
merge #193 - codebase improvements
Co-authored-by: Luke Wass <wassupluke@gmail.com>

Squashed commit of the following:

commit 075b4a5353cedea531ec6ebefa60d92de82e8e21
Author: Josia Pietsch <git@jrpie.de>
Date:   Thu May 29 15:34:23 2025 +0200

    some changes

commit ced2e30531
Author: Luke Wass <wassupluke@gmail.com>
Date:   Thu May 29 00:18:21 2025 -0500

    remove unused imports/functions/variables, improve naming convention, remove unused widget context

commit 956ad9795c
Author: Luke Wass <wassupluke@gmail.com>
Date:   Wed May 28 22:40:05 2025 -0500

    add contentDescriptions, ignore unspeakable sections, minor code reorganization

commit cb793860c0
Author: Luke Wass <wassupluke@gmail.com>
Date:   Wed May 28 21:03:03 2025 -0500

    remove empty method

commit 893de14c79
Author: Luke Wass <wassupluke@gmail.com>
Date:   Tue May 27 22:56:03 2025 -0500

    Simplify constructors by removing unused init parameters; clean up handle list type declaration

commit 39164d2e54
Author: Luke Wass <wassupluke@gmail.com>
Date:   Tue May 27 22:54:16 2025 -0500

    Refactor getAppWidgetProviders to use explicit lambda parameter names for clarity

commit 8e53ef0ebe
Author: Luke Wass <wassupluke@gmail.com>
Date:   Tue May 27 22:52:21 2025 -0500

    improve naming convention

commit 8c2a266c22
Author: Luke Wass <wassupluke@gmail.com>
Date:   Tue May 27 22:50:55 2025 -0500

    remove unused resources

commit be03af8ac6
Author: Luke Wass <wassupluke@gmail.com>
Date:   Tue May 27 22:50:33 2025 -0500

    fix table format
2025-05-29 15:48:41 +02:00
15d36eeff4
delete appwidgethost when resetting settings
Some checks failed
Android CI / build (push) Has been cancelled
2025-05-26 14:34:42 +02:00
3c2efe04de
Merge branch 'master' of https://github.com/jrpie/launcher 2025-05-26 14:33:04 +02:00
Luke Wass
d33f250a56
fix cardView shadow clipping (#188)
* fix cardView shadow clipping

* decrease margin above cardView
2025-05-26 13:26:13 +02:00
23c5973501
Merge pull request #182 from wassupluke/improve-tutorial
Some checks are pending
Android CI / build (push) Waiting to run
Add visual cues and interactive styling to the settings fragment
2025-05-25 10:56:04 +00:00
394f66dde9
change card background in light theme 2025-05-25 12:54:54 +02:00
8f3a8539cb
explain background settings (#144) 2025-05-25 03:10:17 +02:00
059480fad1
Merge pull request #183 from wassupluke/improve-documentation
Some checks are pending
Android CI / build (push) Waiting to run
pull in hedgedoc content
2025-05-24 22:39:36 +00:00
3b70416b66
implement #181 2025-05-24 23:00:55 +02:00
Luke Wass
4f71011b1a
fix formatting 2025-05-24 15:20:13 -05:00
Luke Wass
e9585fa4dd
pull in hedgedoc content 2025-05-24 15:04:18 -05:00
85a7ed24ab
add documentation button 2025-05-24 21:08:45 +02:00
dfaec30fac
Merge branch 'master' of https://github.com/jrpie/launcher 2025-05-24 20:55:03 +02:00
1d10d65adb
update documentation 2025-05-24 20:41:37 +02:00
71193a2e50
fixed typo 2025-05-24 20:34:15 +02:00
580644f9d4
add documentation of app drawer 2025-05-24 20:29:01 +02:00
ea5a4ad7bf
add example to docs 2025-05-24 19:30:15 +02:00
f94c2b5962
add example to docs 2025-05-24 19:24:48 +02:00
ac1639b77e
add termux example to docs (see #147 and #149)
Some checks are pending
Android CI / build (push) Waiting to run
2025-05-24 19:01:15 +02:00
e4c7ad0994
prepare docs/ for hugo ssg (see #176) 2025-05-24 17:40:32 +02:00
c07ab0e029
prevent crash when unable to access widgetproviderinfo 2025-05-24 13:31:00 +02:00
Luke Wass
a56cc772f7 Add visual cues and interactive styling to the settings fragment 2025-05-20 11:58:12 -05:00
7783d26d4c
Merge pull request #179 from wassupluke/widget-list-spacing
Some checks failed
Android CI / build (push) Has been cancelled
Improve widget list layout
2025-05-20 12:32:41 +00:00
Luke Wass
ba3255d9ec Improve widget list layout 2025-05-19 16:34:56 -05:00
dd3a2e91bd
0.2.2
Some checks failed
Android CI / build (push) Has been cancelled
2025-05-17 13:00:16 +02:00
118efd0b62
Merge pull request #166 from toolatebot/weblate-jrpie-launcher-launcher
Translations update from Toolate
2025-05-17 10:54:51 +00:00
3cfd403b94
Merge pull request #171 from wassupluke/translate-lt
more translations
2025-05-17 10:54:28 +00:00
bd7df4f6a0
(try to) fix #172 2025-05-17 12:39:18 +02:00
31a9049861
try to mitigate #172 2025-05-17 11:42:21 +02:00
Luke Wass
013b835ed8 more translations 2025-05-16 02:53:31 -05:00
renar
271850f75a Translated using Weblate (Italian)
Currently translated at 100.0% (280 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/
2025-05-16 00:07:19 +00:00
5f847a8d40
enable widget interaction by default on widget panels
Some checks failed
Android CI / build (push) Has been cancelled
2025-05-15 20:55:15 +02:00
eaece8e334
fix #168 2025-05-15 20:51:45 +02:00
91c9952f7c
Merge pull request #159 from toolatebot/weblate-jrpie-launcher-launcher
Some checks failed
Android CI / build (push) Has been cancelled
Translations update from Toolate
2025-05-13 15:59:52 +02:00
04330ff407
add crash handler 2025-05-13 15:57:18 +02:00
Anonymous
916a272e8f Translated using Weblate (Arabic)
Currently translated at 98.9% (277 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ar/
2025-05-13 07:21:58 +00:00
Anonymous
520e7d5c0d Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (277 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/
2025-05-13 07:21:58 +00:00
renar
374b688ddf Translated using Weblate (Dutch)
Currently translated at 100.0% (280 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/nl/
2025-05-12 15:07:19 +00:00
renar
12986c15b3 Translated using Weblate (Italian)
Currently translated at 99.6% (279 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/
2025-05-12 15:07:19 +00:00
class0068
070d232681 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 98.9% (277 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-05-12 15:07:19 +00:00
renar
ede651525b Translated using Weblate (German)
Currently translated at 88.9% (249 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/de/
2025-05-12 15:07:19 +00:00
Anonymous
435ce32fbd Translated using Weblate (Arabic)
Currently translated at 99.2% (278 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ar/
2025-05-12 15:07:19 +00:00
Anonymous
6dfdb09cf6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.2% (278 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/
2025-05-12 15:07:19 +00:00
7a874ef89f
0.2.1
Some checks are pending
Android CI / build (push) Waiting to run
2025-05-12 16:36:17 +02:00
33ccea8cbc
fix #162 - place new widgets in free area if possible 2025-05-12 16:33:59 +02:00
30e9fcd20f
show number of widgets for widget panel 2025-05-12 16:05:15 +02:00
8173993601
add debug info widget in debug mode 2025-05-12 15:37:18 +02:00
5f2d0aa426
Merge pull request #158 from wassupluke/copy-on-version-tap
add clipboard function to version number
2025-05-12 15:07:05 +02:00
22e44ca9f2
fix #160 - consistent position of widget container 2025-05-12 15:01:33 +02:00
23bc58806c
fix #161 - draw shadow around widget control elements 2025-05-12 13:47:21 +02:00
1ba7479469
fix #156 - show popup over widget 2025-05-12 13:46:45 +02:00
b5b65a4c42
catch IllegalArgumentException when accessing torch 2025-05-12 13:42:04 +02:00
4d61557a70
fix #155 - close button not working in SelectWidgetActivity
Some checks are pending
Android CI / build (push) Waiting to run
2025-05-12 13:03:54 +02:00
Luke Wass
6aa95eedf2 add clipboard function to version number 2025-05-10 12:30:23 -05:00
62d69330b0
0.2.0
Some checks failed
Android CI / build (push) Has been cancelled
2025-05-10 17:17:08 +02:00
d806342a83
Merge pull request #140 from toolatebot/weblate-jrpie-launcher-launcher
Translations update from Toolate
2025-05-10 16:18:16 +02:00
061f3a1e77
fix problem with multiple WidgetOverlayViews 2025-05-10 16:04:42 +02:00
renar
37c28e89d8 Translated using Weblate (Dutch)
Currently translated at 100.0% (280 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/nl/
2025-05-10 00:07:19 +00:00
abdelbasset jabrane
29e551684e Translated using Weblate (Arabic)
Currently translated at 100.0% (280 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ar/
2025-05-10 00:07:19 +00:00
toolatebot
e6625e55c3 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/
2025-05-10 00:07:19 +00:00
AsLoLoks
e9f32eae3b Translated using Weblate (Polish)
Currently translated at 88.2% (247 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pl/
2025-05-10 00:07:19 +00:00
AsLoLoks
2ed14e7e56 Translated using Weblate (Polish)
Currently translated at 0.0% (0 of 22 strings)

Translation: jrpie-Launcher/metadata
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/pl/
2025-05-10 00:07:19 +00:00
AsLoLoks
37362f0b3b Translated using Weblate (Polish)
Currently translated at 76.0% (213 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pl/
2025-05-10 00:07:19 +00:00
toolatebot
284df4ab4d Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/
2025-05-10 00:07:19 +00:00
AsLoLoks
6bb2222c17 Translated using Weblate (Polish)
Currently translated at 18.9% (53 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pl/
2025-05-10 00:07:19 +00:00
AsLoLoks
271c48e264 Added translation using Weblate (Polish) 2025-05-10 00:07:19 +00:00
Vossa Excelencia
3ac1794e14 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (280 of 280 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/
2025-05-10 00:07:19 +00:00
class0068
0f92e6cd98 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (259 of 259 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-05-10 00:07:19 +00:00
Nicola Bortoletto
bcf722ae34 Translated using Weblate (Italian)
Currently translated at 100.0% (259 of 259 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/
2025-05-10 00:07:19 +00:00
Vladi69
aabc607ed6 Translated using Weblate (Italian)
Currently translated at 99.6% (257 of 258 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/
2025-05-10 00:07:19 +00:00
Vladi69
68eb59a934 Translated using Weblate (Italian)
Currently translated at 4.5% (1 of 22 strings)

Translation: jrpie-Launcher/metadata
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/it/
2025-05-10 00:07:19 +00:00
Vladi69
3d4bddbb4c Translated using Weblate (Italian)
Currently translated at 98.0% (253 of 258 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/
2025-05-10 00:07:19 +00:00
Vladi69
b9fa079048 Translated using Weblate (Italian)
Currently translated at 87.9% (227 of 258 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/
2025-05-10 00:07:19 +00:00
Sven van de Lagemaat
ba2c117eb5 Translated using Weblate (Dutch)
Currently translated at 14.2% (3 of 21 strings)

Translation: jrpie-Launcher/metadata
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/nl/
2025-05-10 00:07:19 +00:00
Sven van de Lagemaat
f5b8953601 Added translation using Weblate (Dutch) 2025-05-10 00:07:19 +00:00
24e90deb62
improve widget management
Some checks are pending
Android CI / build (push) Waiting to run
2025-05-10 00:52:56 +02:00
08ec3988fd
improve documentation 2025-05-10 00:12:24 +02:00
49785e66f2
improved documentation 2025-05-09 23:54:23 +02:00
106254664d
fix #151 - move alpha slider to the top to clarify that the format is ARGB not RGBA 2025-05-09 21:31:58 +02:00
Luke Wass
6d271970fe fix links 2025-04-30 22:39:03 -05:00
Luke Wass
8f9f8ac928 improve codestyle 2025-04-30 22:34:28 -05:00
Luke Wass
b2b823446f remove stray .gitmodules after wiki deletion 2025-04-30 20:34:06 -05:00
Luke Wass
f615510256 migrate wiki to docs directory 2025-04-30 20:26:05 -05:00
Luke Wass
f484228191 add wiki 2025-04-29 22:19:08 -05:00
a4fcdf60c7
add widget panels (see #44)
Some checks failed
Android CI / build (push) Has been cancelled
2025-04-26 21:52:21 +02:00
ffaaba7abb
fix #145
Some checks failed
Android CI / build (push) Has been cancelled
2025-04-25 11:25:00 +02:00
e7a06c443d
add support for app widgets (see #44)
Some checks are pending
Android CI / build (push) Waiting to run
2025-04-24 14:37:44 +02:00
077bd1ce44
add option to hide keyboard when scrolling (cf. #142)
Some checks failed
Android CI / build (push) Has been cancelled
2025-04-23 01:51:58 +02:00
22633bdac3
try to fix #138
Some checks failed
Android CI / build (push) Has been cancelled
2025-04-15 19:24:23 +02:00
4f795289d5
improve English translation 2025-04-15 18:55:13 +02:00
2774b74d9d
0.1.4 2025-04-15 18:38:00 +02:00
3d49ec16a7
Merge pull request #132 from toolatebot/weblate-jrpie-launcher-launcher
Some checks failed
Android CI / build (push) Has been cancelled
Translations update from Toolate
2025-04-13 16:27:29 +02:00
letterhaven
a0b2417363 Translated using Weblate (Arabic)
Currently translated at 99.6% (257 of 258 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ar/
2025-04-13 14:07:19 +00:00
letterhaven
20a01e9f03 Added translation using Weblate (Arabic) 2025-04-13 14:07:19 +00:00
Lukas Hamm
24250ad345 Translated using Weblate (Lithuanian)
Currently translated at 5.4% (14 of 258 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/lt/
2025-04-13 14:07:18 +00:00
Lukas Hamm
7cce425339 Added translation using Weblate (Lithuanian) 2025-04-13 14:07:18 +00:00
class0068
0877ca6772 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 14.2% (3 of 21 strings)

Translation: jrpie-Launcher/metadata
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/zh_Hans/
2025-04-13 14:07:18 +00:00
class0068
03a9833b51 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (258 of 258 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-04-13 14:07:18 +00:00
Vossa Excelencia
ce65741717 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (258 of 258 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/
2025-04-13 14:07:18 +00:00
class0068
c085087e1e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (257 of 257 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-04-13 14:07:18 +00:00
class0068
cbd23159da Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 98.8% (254 of 257 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-04-13 14:07:18 +00:00
Vossa Excelencia
940e5785dc Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (254 of 254 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/
2025-04-13 14:07:18 +00:00
class0068
14ffbd1f6c Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (254 of 254 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-04-13 14:07:18 +00:00
Vossa Excelencia
bfc84b57ca Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (254 of 254 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/
2025-04-13 14:07:18 +00:00
T
8b1963f3e1 Translated using Weblate (Spanish)
Currently translated at 98.0% (249 of 254 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/es/
2025-04-13 14:07:18 +00:00
toolatebot
4f801427a4 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/
2025-04-13 14:07:18 +00:00
class0068
8a487eb4c7 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (254 of 254 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-04-13 14:07:18 +00:00
class0068
e6dd2634ae Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (254 of 254 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-04-13 14:07:18 +00:00
0441b3fd3d
set max width for choose app button; change label from scegliere l'applicazione to scegliere in Italian
Some checks are pending
Android CI / build (push) Waiting to run
2025-04-13 14:54:11 +02:00
e7c1d28576
upgrade AGP 2025-04-13 14:40:57 +02:00
653d16b269
new action: launch other launchers
Some checks failed
Android CI / build (push) Has been cancelled
2025-03-29 21:09:15 +01:00
5d695ec0ea
fix #135 2025-03-29 18:45:53 +01:00
b4608ef153
add new action: show recent apps
Some checks failed
Android CI / build (push) Has been cancelled
2025-03-24 13:21:58 +01:00
8e140e2e69
rename tab "Apps" to "Actions" and "Volume Up/Down" to "Volume Up/Down Key"
Some checks failed
Android CI / build (push) Has been cancelled
2025-03-20 16:23:01 +01:00
7fc58fe384
0.1.3 2025-03-20 15:52:12 +01:00
54409b6312
fix #133 2025-03-20 14:55:22 +01:00
132 changed files with 6443 additions and 634 deletions

View file

@ -13,7 +13,6 @@ body:
label: Describe the Bug
description: What happened?
placeholder: A clear and concise description of what the bug is.
render: markdown
validations:
required: true
- type: textarea
@ -21,7 +20,6 @@ body:
attributes:
label: Expected Behavior
description: What did you expect to happen instead?
render: markdown
validations:
required: false
- type: textarea
@ -29,7 +27,6 @@ body:
attributes:
label: To Reproduce
description: What steps are required to reproduce the bug?
render: markdown
placeholder: |
Steps to reproduce the behavior:
1. Go to '...'
@ -45,6 +42,5 @@ body:
description: |
What device are you using? Adding this information helps to reproduce the bug.
You can copy this from µLauncher > Settings > Meta > Report Bug.
render: markdown
validations:
required: false

View file

@ -1,9 +1,25 @@
#!/bin/bash
export JAVA_HOME="/usr/lib/jvm/java-23-openjdk/"
# This script builds all variants of µLauncher to create a release, namely:
# - app-release.apk (GitHub release; used by F-Droid for reproducible builds)
# - launcher-accrescent.apks (Accrescent)
# - app-release.aab (Play Store)
# This is only intended to work on my (@jrpie) computer.
# To use this script for building a fork you need to:
# - install bundletool.jar and
# - create a keystore and modify the variables below accordingly
export JAVA_HOME="/usr/lib/jvm/java-21-openjdk/"
OUTPUT_DIR="$HOME/launcher-release"
BUILD_TOOLS_DIR="$HOME/Android/Sdk/build-tools/35.0.0"
# keystore for the default release
KEYSTORE="$HOME/data/keys/launcher_jrpie.jks"
# keystore for the default accrescent release
KEYSTORE_ACCRESCENT="$HOME/data/keys/launcher_jrpie_accrescent.jks"
# keepassxc-password is a custom script to fetch passwords from my password manager
KEYSTORE_PASS=$(keepassxc-password "android_keys/launcher")
KEYSTORE_ACCRESCENT_PASS=$(keepassxc-password "android_keys/launcher-accrescent")
@ -11,12 +27,11 @@ if [[ $(git status --porcelain) ]]; then
echo "There are uncommitted changes."
read -p "Continue anyway? (y/n) " -n 1 -r
echo # (optional) move to a new line
echo
if ! [[ $REPLY =~ ^[Yy]$ ]]
then
exit 1
fi
fi
rm -rf "$OUTPUT_DIR"

View file

@ -23,8 +23,8 @@ android {
minSdkVersion 21
targetSdkVersion 35
compileSdk 35
versionCode 42
versionName "0.1.2"
versionCode 48
versionName "0.2.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@ -106,6 +106,7 @@ dependencies {
implementation 'com.google.android.material:material:1.12.0'
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
implementation "eu.jonahbauer:android-preference-annotations:1.1.2"
implementation 'androidx.activity:activity:1.10.1'
annotationProcessor "eu.jonahbauer:android-preference-annotations:1.1.2"
annotationProcessor "com.android.databinding:compiler:$android_plugin_version"
testImplementation 'junit:junit:4.13.2'

View file

@ -8,6 +8,7 @@
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.ACCESS_HIDDEN_PROFILES" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application
android:name=".Application"
@ -19,6 +20,21 @@
android:supportsRtl="true"
android:theme="@style/launcherBaseTheme"
tools:ignore="UnusedAttribute">
<activity
android:name=".ui.widgets.manage.ManageWidgetPanelsActivity"
android:exported="false" />
<activity
android:name=".ui.widgets.WidgetPanelActivity"
android:exported="false" />
<activity
android:name=".ui.widgets.manage.ManageWidgetsActivity"
android:configChanges="orientation|screenSize"
android:exported="false"
android:theme="@style/launcherHomeTheme" />
<activity
android:name=".ui.widgets.manage.SelectWidgetActivity"
android:exported="false" />
<activity
android:name=".ui.PinShortcutActivity"
android:autoRemoveFromRecents="true"
@ -66,6 +82,9 @@
<activity
android:name=".ui.LegalInfoActivity"
android:exported="false" />
<activity
android:name=".ui.ReportCrashActivity"
android:exported="false" />
<receiver
android:name=".actions.lock.LauncherDeviceAdmin"
@ -85,7 +104,7 @@
<service
android:name=".actions.lock.LauncherAccessibilityService"
android:exported="true"
android:label="@string/accessibility_service_name"
android:label="@string/app_name"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
@ -96,5 +115,4 @@
android:resource="@xml/accessibility_service_config" />
</service>
</application>
</manifest>

View file

@ -12,6 +12,8 @@ import android.os.Build.VERSION_CODES
import android.os.UserHandle
import androidx.core.content.ContextCompat
import androidx.lifecycle.MutableLiveData
import android.appwidget.AppWidgetHost
import android.appwidget.AppWidgetManager
import androidx.preference.PreferenceManager
import de.jrpie.android.launcher.actions.TorchManager
import de.jrpie.android.launcher.apps.AbstractAppInfo
@ -23,10 +25,17 @@ import de.jrpie.android.launcher.preferences.resetPreferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlin.system.exitProcess
const val APP_WIDGET_HOST_ID = 42
class Application : android.app.Application() {
val apps = MutableLiveData<List<AbstractDetailedAppInfo>>()
val privateSpaceLocked = MutableLiveData<Boolean>()
lateinit var appWidgetHost: AppWidgetHost
lateinit var appWidgetManager: AppWidgetManager
private val profileAvailabilityBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
@ -98,15 +107,23 @@ class Application : android.app.Application() {
// TODO Error: Invalid resource ID 0x00000000.
// DynamicColors.applyToActivitiesIfAvailable(this)
Thread.setDefaultUncaughtExceptionHandler { _, throwable ->
sendCrashNotification(this@Application, throwable)
exitProcess(1)
}
if (Build.VERSION.SDK_INT >= VERSION_CODES.M) {
torchManager = TorchManager(this)
}
appWidgetHost = AppWidgetHost(this.applicationContext, APP_WIDGET_HOST_ID)
appWidgetManager = AppWidgetManager.getInstance(this.applicationContext)
val preferences = PreferenceManager.getDefaultSharedPreferences(this)
LauncherPreferences.init(preferences, this.resources)
// Try to restore old preferences
migratePreferencesToNewVersion(this)
@ -144,6 +161,8 @@ class Application : android.app.Application() {
removeUnusedShortcuts(this)
}
loadApps()
createNotificationChannels(this)
}
fun getCustomAppNames(): HashMap<AbstractAppInfo, String> {

View file

@ -38,6 +38,8 @@ import androidx.core.net.toUri
const val LOG_TAG = "Launcher"
const val REQUEST_SET_DEFAULT_HOME = 42
fun isDefaultHomeScreen(context: Context): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val roleManager = context.getSystemService(RoleManager::class.java)
@ -59,11 +61,12 @@ fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
&& context is Activity
&& !isDefault // using role manager only works when µLauncher is not already the default.
&& checkDefault // using role manager only works when µLauncher is not already the default.
) {
val roleManager = context.getSystemService(RoleManager::class.java)
context.startActivity(
roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME)
context.startActivityForResult(
roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME),
REQUEST_SET_DEFAULT_HOME
)
return
}
@ -220,4 +223,14 @@ fun copyToClipboard(context: Context, text: String) {
val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("Debug Info", text)
clipboardManager.setPrimaryClip(clipData)
}
}
fun writeEmail(context: Context, to: String, subject: String, text: String) {
val intent = Intent(Intent.ACTION_SENDTO)
intent.setData("mailto:".toUri())
intent.putExtra(Intent.EXTRA_EMAIL, arrayOf(to))
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, text)
context.startActivity(Intent.createChooser(intent, context.getString(R.string.send_email)))
}

View file

@ -0,0 +1,87 @@
package de.jrpie.android.launcher
import android.app.Activity
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.util.Log
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import de.jrpie.android.launcher.ui.EXTRA_CRASH_LOG
import de.jrpie.android.launcher.ui.ReportCrashActivity
import java.io.PrintWriter
import java.io.StringWriter
import kotlin.random.Random
private val NOTIFICATION_CHANNEL_CRASH = "launcher:crash"
fun createNotificationChannels(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(
NOTIFICATION_CHANNEL_CRASH,
context.getString(R.string.notification_channel_crash),
NotificationManager.IMPORTANCE_HIGH
)
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notificationChannel)
}
}
fun requestNotificationPermission(activity: Activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
return
}
val permission =
(activity.checkSelfPermission(android.Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED)
if (!permission) {
ActivityCompat.requestPermissions(
activity,
arrayOf( android.Manifest.permission.POST_NOTIFICATIONS ),
1
)
}
}
fun sendCrashNotification(context: Context, throwable: Throwable) {
val stringWriter = StringWriter()
val printWriter = PrintWriter(stringWriter)
throwable.printStackTrace(printWriter)
val intent = Intent(context, ReportCrashActivity::class.java)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.putExtra(EXTRA_CRASH_LOG, stringWriter.toString())
val pendingIntent = PendingIntent.getActivity(
context,
Random.nextInt(),
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_CRASH)
.setSmallIcon(R.drawable.baseline_bug_report_24)
.setContentTitle(context.getString(R.string.notification_crash_title))
.setContentText(context.getString(R.string.notification_crash_explanation))
.setContentIntent(pendingIntent)
.setAutoCancel(false)
.setPriority(NotificationCompat.PRIORITY_HIGH)
val notificationManager = NotificationManagerCompat.from(context)
try {
notificationManager.notify(
0,
builder.build()
)
} catch (e: SecurityException) {
Log.e("Crash Notification", "Could not send notification")
}
}

View file

@ -6,14 +6,18 @@ import android.content.SharedPreferences.Editor
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.widget.Toast
import androidx.core.content.edit
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.preferences.LauncherPreferences
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import androidx.core.content.edit
/**
* Represents an action that can be bound to a [Gesture].
* There are four types of actions: [AppAction], [ShortcutAction], [LauncherAction] and [WidgetPanelAction]
*/
@Serializable
sealed interface Action {
fun invoke(context: Context, rect: Rect? = null): Boolean
@ -21,6 +25,10 @@ sealed interface Action {
fun getIcon(context: Context): Drawable?
fun isAvailable(context: Context): Boolean
fun showConfigurationDialog(context: Context, onSuccess: (Action) -> Unit) {
onSuccess(this)
}
// Can the action be used to reach µLauncher settings?
fun canReachSettings(): Boolean

View file

@ -11,7 +11,9 @@ import android.view.KeyEvent
import android.widget.Toast
import androidx.appcompat.content.res.AppCompatResources
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.BuildConfig
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService
import de.jrpie.android.launcher.apps.AppFilter
import de.jrpie.android.launcher.apps.hidePrivateSpaceWhenLocked
import de.jrpie.android.launcher.apps.isPrivateSpaceSupported
@ -132,6 +134,14 @@ enum class LauncherAction(
R.drawable.baseline_settings_applications_24,
::expandSettingsPanel
),
RECENT_APPS(
"recent_apps",
R.string.list_other_recent_apps,
R.drawable.baseline_apps_24,
LauncherAccessibilityService::openRecentApps,
false,
{ _ -> BuildConfig.USE_ACCESSIBILITY_SERVICE }
),
LOCK_SCREEN(
"lock_screen",
R.string.list_other_lock_screen,
@ -142,7 +152,13 @@ enum class LauncherAction(
"toggle_torch",
R.string.list_other_torch,
R.drawable.baseline_flashlight_on_24,
::toggleTorch
::toggleTorch,
),
LAUNCH_OTHER_LAUNCHER(
"launcher_other_launcher",
R.string.list_other_launch_other_launcher,
R.drawable.baseline_home_24,
::launchOtherLauncher
),
NOP("nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {});
@ -248,6 +264,15 @@ private fun expandSettingsPanel(context: Context) {
}
}
private fun launchOtherLauncher(context: Context) {
context.startActivity(
Intent.createChooser(
Intent(Intent.ACTION_MAIN).also { it.addCategory(Intent.CATEGORY_HOME) },
context.getString(R.string.list_other_launch_other_launcher)
)
)
}
private fun openSettings(context: Context) {
context.startActivity(Intent(context, SettingsActivity::class.java))
}

View file

@ -1,7 +1,6 @@
package de.jrpie.android.launcher.actions
import android.content.Context
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager
import android.os.Build
@ -78,7 +77,8 @@ class TorchManager(context: Context) {
cameraManager.setTorchMode(camera, !torchEnabled)
}
} catch (e: CameraAccessException) {
} catch (e: Exception) {
// CameraAccessException, IllegalArgumentException
Toast.makeText(
context,
context.getString(R.string.alert_torch_access_exception),

View file

@ -0,0 +1,91 @@
package de.jrpie.android.launcher.actions
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.core.content.res.ResourcesCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.ui.widgets.WidgetPanelActivity
import de.jrpie.android.launcher.ui.widgets.manage.EXTRA_PANEL_ID
import de.jrpie.android.launcher.ui.widgets.manage.WidgetPanelsRecyclerAdapter
import de.jrpie.android.launcher.widgets.WidgetPanel
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
@SerialName("action:panel")
class WidgetPanelAction(val widgetPanelId: Int) : Action {
override fun invoke(context: Context, rect: Rect?): Boolean {
if (context is WidgetPanelActivity) {
if (context.widgetPanelId == widgetPanelId) {
context.finish()
return true
}
}
if (WidgetPanel.byId(this.widgetPanelId) == null) {
Toast.makeText(context, R.string.alert_widget_panel_not_found, Toast.LENGTH_LONG).show()
} else {
context.startActivity(Intent(context, WidgetPanelActivity::class.java).also {
it.putExtra(EXTRA_PANEL_ID, this.widgetPanelId)
})
}
return true
}
override fun label(context: Context): String {
return WidgetPanel.byId(widgetPanelId)?.label
?: context.getString(R.string.list_other_open_widget_panel)
}
override fun isAvailable(context: Context): Boolean {
return true
}
override fun canReachSettings(): Boolean {
return false
}
override fun getIcon(context: Context): Drawable? {
return ResourcesCompat.getDrawable(
context.resources,
R.drawable.baseline_widgets_24,
context.theme
)
}
override fun showConfigurationDialog(context: Context, onSuccess: (Action) -> Unit) {
AlertDialog.Builder(context, R.style.AlertDialogCustom).apply {
setTitle(R.string.dialog_select_widget_panel_title)
setNegativeButton(R.string.dialog_cancel) { _, _ -> }
setView(R.layout.dialog_select_widget_panel)
}.create().also { it.show() }.also { alertDialog ->
val infoTextView =
alertDialog.findViewById<TextView>(R.id.dialog_select_widget_panel_info)
alertDialog.findViewById<RecyclerView>(R.id.dialog_select_widget_panel_recycler)
?.apply {
setHasFixedSize(true)
layoutManager = LinearLayoutManager(alertDialog.context)
adapter =
WidgetPanelsRecyclerAdapter(alertDialog.context, false) { widgetPanel ->
onSuccess(WidgetPanelAction(widgetPanel.id))
alertDialog.dismiss()
}
if (adapter?.itemCount == 0) {
infoTextView?.visibility = View.VISIBLE
}
}
}
true
}
}

View file

@ -22,26 +22,44 @@ class LauncherAccessibilityService : AccessibilityService() {
companion object {
private const val TAG = "Launcher Accessibility"
private const val ACTION_REQUEST_ENABLE = "ACTION_REQUEST_ENABLE"
const val ACTION_LOCK_SCREEN = "ACTION_LOCK_SCREEN"
const val ACTION_RECENT_APPS = "ACTION_RECENT_APPS"
fun lockScreen(context: Context) {
private fun invoke(context: Context, action: String, failureMessageRes: Int) {
try {
context.startService(
Intent(
context,
LauncherAccessibilityService::class.java
).apply {
action = ACTION_LOCK_SCREEN
this.action = action
})
} catch (e: Exception) {
} catch (_: Exception) {
Toast.makeText(
context,
context.getString(R.string.alert_lock_screen_failed),
context.getString(failureMessageRes),
Toast.LENGTH_LONG
).show()
}
}
fun lockScreen(context: Context) {
if (!isEnabled(context)) {
showEnableDialog(context)
} else {
invoke(context, ACTION_LOCK_SCREEN, R.string.alert_lock_screen_failed)
}
}
fun openRecentApps(context: Context) {
if (!isEnabled(context)) {
showEnableDialog(context)
} else {
invoke(context, ACTION_RECENT_APPS, R.string.alert_recent_apps_failed)
}
}
fun isEnabled(context: Context): Boolean {
val enabledServices = Settings.Secure.getString(
context.contentResolver,
@ -58,7 +76,7 @@ class LauncherAccessibilityService : AccessibilityService() {
setView(R.layout.dialog_consent_accessibility)
setTitle(R.string.dialog_consent_accessibility_title)
setPositiveButton(R.string.dialog_consent_accessibility_ok) { _, _ ->
lockScreen(context)
invoke(context, ACTION_REQUEST_ENABLE, R.string.alert_enable_accessibility_failed)
}
setNegativeButton(R.string.dialog_cancel) { _, _ -> }
}.create().also { it.show() }.apply {
@ -94,7 +112,9 @@ class LauncherAccessibilityService : AccessibilityService() {
}
when (action) {
ACTION_REQUEST_ENABLE -> {} // do nothing
ACTION_LOCK_SCREEN -> handleLockScreen()
ACTION_RECENT_APPS -> performGlobalAction(GLOBAL_ACTION_RECENTS)
}
}
return super.onStartCommand(intent, flags, startId)

View file

@ -8,6 +8,8 @@ import de.jrpie.android.launcher.actions.lock.LockMethod;
import de.jrpie.android.launcher.preferences.serialization.MapAbstractAppInfoStringPreferenceSerializer;
import de.jrpie.android.launcher.preferences.serialization.SetAbstractAppInfoPreferenceSerializer;
import de.jrpie.android.launcher.preferences.serialization.SetPinnedShortcutInfoPreferenceSerializer;
import de.jrpie.android.launcher.preferences.serialization.SetWidgetPanelSerializer;
import de.jrpie.android.launcher.preferences.serialization.SetWidgetSerializer;
import de.jrpie.android.launcher.preferences.theme.Background;
import de.jrpie.android.launcher.preferences.theme.ColorTheme;
import de.jrpie.android.launcher.preferences.theme.Font;
@ -72,6 +74,7 @@ import eu.jonahbauer.android.preference.annotations.Preferences;
@Preference(name = "search_auto_launch", type = boolean.class, defaultValue = "true"),
@Preference(name = "search_web", type = boolean.class, description = "false"),
@Preference(name = "search_auto_open_keyboard", type = boolean.class, defaultValue = "true"),
@Preference(name = "search_auto_close_keyboard", type = boolean.class, defaultValue = "false"),
}),
@PreferenceGroup(name = "enabled_gestures", prefix = "settings_enabled_gestures_", suffix = "_key", value = {
@Preference(name = "double_swipe", type = boolean.class, defaultValue = "true"),
@ -81,5 +84,9 @@ import eu.jonahbauer.android.preference.annotations.Preferences;
@PreferenceGroup(name = "actions", prefix = "settings_actions_", suffix = "_key", value = {
@Preference(name = "lock_method", type = LockMethod.class, defaultValue = "DEVICE_ADMIN"),
}),
@PreferenceGroup(name = "widgets", prefix = "settings_widgets_", suffix= "_key", value = {
@Preference(name = "widgets", type = Set.class, serializer = SetWidgetSerializer.class),
@Preference(name = "custom_panels", type = Set.class, serializer = SetWidgetPanelSerializer.class)
}),
})
public final class LauncherPreferences$Config {}

View file

@ -4,21 +4,30 @@ import android.content.Context
import android.util.Log
import de.jrpie.android.launcher.BuildConfig
import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.apps.AppInfo
import de.jrpie.android.launcher.apps.AbstractAppInfo
import de.jrpie.android.launcher.apps.AbstractAppInfo.Companion.INVALID_USER
import de.jrpie.android.launcher.apps.AppInfo
import de.jrpie.android.launcher.apps.DetailedAppInfo
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion1
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion100
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion2
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion3
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion4
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersionUnknown
import de.jrpie.android.launcher.sendCrashNotification
import de.jrpie.android.launcher.ui.HomeActivity
import de.jrpie.android.launcher.widgets.ClockWidget
import de.jrpie.android.launcher.widgets.DebugInfoWidget
import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition
import de.jrpie.android.launcher.widgets.generateInternalId
import de.jrpie.android.launcher.widgets.getAppWidgetHost
/* Current version of the structure of preferences.
* Increase when breaking changes are introduced and write an appropriate case in
* `migratePreferencesToNewVersion`
*/
const val PREFERENCE_VERSION = 4
const val PREFERENCE_VERSION = 101
const val UNKNOWN_PREFERENCE_VERSION = -1
private const val TAG = "Launcher - Preferences"
@ -40,18 +49,28 @@ fun migratePreferencesToNewVersion(context: Context) {
}
1 -> {
migratePreferencesFromVersion1()
migratePreferencesFromVersion1(context)
Log.i(TAG, "migration of preferences complete (1 -> ${PREFERENCE_VERSION}).")
}
2 -> {
migratePreferencesFromVersion2()
migratePreferencesFromVersion2(context)
Log.i(TAG, "migration of preferences complete (2 -> ${PREFERENCE_VERSION}).")
}
3 -> {
migratePreferencesFromVersion3()
migratePreferencesFromVersion3(context)
Log.i(TAG, "migration of preferences complete (3 -> ${PREFERENCE_VERSION}).")
}
// There was a bug where instead of the preference version the app version was written.
in 4..99 -> {
migratePreferencesFromVersion4(context)
Log.i(TAG, "migration of preferences complete (4 -> ${PREFERENCE_VERSION}).")
}
100 -> {
migratePreferencesFromVersion100(context)
Log.i(TAG, "migration of preferences complete (100 -> ${PREFERENCE_VERSION}).")
}
else -> {
Log.w(
TAG,
@ -63,6 +82,7 @@ fun migratePreferencesToNewVersion(context: Context) {
}
} catch (e: Exception) {
Log.e(TAG, "Unable to restore preferences:\n${e.stackTrace}")
sendCrashNotification(context, e)
resetPreferences(context)
}
}
@ -71,18 +91,45 @@ fun resetPreferences(context: Context) {
Log.i(TAG, "Resetting preferences")
LauncherPreferences.clear()
LauncherPreferences.internal().versionCode(PREFERENCE_VERSION)
context.getAppWidgetHost().deleteHost()
LauncherPreferences.widgets().widgets(
setOf(
ClockWidget(
generateInternalId(),
WidgetPosition(1, 3, 10, 4),
WidgetPanel.HOME.id
)
)
)
if (BuildConfig.DEBUG) {
LauncherPreferences.widgets().widgets(
LauncherPreferences.widgets().widgets().also {
it.add(
DebugInfoWidget(
generateInternalId(),
WidgetPosition(1, 1, 10, 4),
WidgetPanel.HOME.id
)
)
}
)
}
val hidden: MutableSet<AbstractAppInfo> = mutableSetOf()
val launcher = DetailedAppInfo.fromAppInfo(
AppInfo(
BuildConfig.APPLICATION_ID,
HomeActivity::class.java.name,
INVALID_USER
), context
)
launcher?.getRawInfo()?.let { hidden.add(it) }
Log.i(TAG,"Hiding ${launcher?.getRawInfo()}")
if (!BuildConfig.DEBUG) {
val launcher = DetailedAppInfo.fromAppInfo(
AppInfo(
BuildConfig.APPLICATION_ID,
HomeActivity::class.java.name,
INVALID_USER
), context
)
launcher?.getRawInfo()?.let { hidden.add(it) }
Log.i(TAG, "Hiding ${launcher?.getRawInfo()}")
}
LauncherPreferences.apps().hidden(hidden)
Action.resetToDefaultActions(context)

View file

@ -1,11 +1,13 @@
package de.jrpie.android.launcher.preferences.legacy
import android.content.Context
import androidx.core.content.edit
import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.actions.AppAction
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.actions.LauncherAction
import de.jrpie.android.launcher.apps.AppInfo
import de.jrpie.android.launcher.apps.AbstractAppInfo.Companion.INVALID_USER
import de.jrpie.android.launcher.apps.AppInfo
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION
import kotlinx.serialization.Serializable
@ -13,7 +15,6 @@ import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.json.JSONException
import org.json.JSONObject
import androidx.core.content.edit
@Serializable
@ -129,7 +130,7 @@ private fun migrateAction(key: String) {
* Migrate preferences from version 1 (used until version j-0.0.18) to the current format
* (see [PREFERENCE_VERSION])
*/
fun migratePreferencesFromVersion1() {
fun migratePreferencesFromVersion1(context: Context) {
assert(LauncherPreferences.internal().versionCode() == 1)
Gesture.entries.forEach { g -> migrateAction(g.id) }
migrateAppInfoSet(LauncherPreferences.apps().keys().hidden())
@ -137,5 +138,5 @@ fun migratePreferencesFromVersion1() {
migrateAppInfoStringMap(LauncherPreferences.apps().keys().customNames())
LauncherPreferences.internal().versionCode(2)
migratePreferencesFromVersion2()
migratePreferencesFromVersion2(context)
}

View file

@ -0,0 +1,39 @@
package de.jrpie.android.launcher.preferences.legacy
import android.content.Context
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION
import de.jrpie.android.launcher.widgets.ClockWidget
import de.jrpie.android.launcher.widgets.DebugInfoWidget
import de.jrpie.android.launcher.widgets.generateInternalId
import de.jrpie.android.launcher.widgets.updateWidget
fun migratePreferencesFromVersion100(context: Context) {
assert(PREFERENCE_VERSION == 101)
assert(LauncherPreferences.internal().versionCode() == 100)
val widgets = LauncherPreferences.widgets().widgets() ?: setOf()
widgets.forEach { widget ->
when (widget) {
is ClockWidget -> {
val id = widget.id
val newId = generateInternalId()
(context.applicationContext as Application).appWidgetHost.deleteAppWidgetId(id)
widget.delete(context)
widget.id = newId
updateWidget(widget)
}
is DebugInfoWidget -> {
val id = widget.id
val newId = generateInternalId()
(context.applicationContext as Application).appWidgetHost.deleteAppWidgetId(id)
widget.delete(context)
widget.id = newId
updateWidget(widget)
}
else -> {}
}
}
LauncherPreferences.internal().versionCode(101)
}

View file

@ -1,5 +1,6 @@
package de.jrpie.android.launcher.preferences.legacy
import android.content.Context
import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.actions.LauncherAction
@ -11,10 +12,10 @@ import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION
* Migrate preferences from version 2 (used until version 0.0.21) to the current format
* (see [PREFERENCE_VERSION])
*/
fun migratePreferencesFromVersion2() {
fun migratePreferencesFromVersion2(context: Context) {
assert(LauncherPreferences.internal().versionCode() == 2)
// previously there was no setting for this
Action.setActionForGesture(Gesture.BACK, LauncherAction.CHOOSE)
LauncherPreferences.internal().versionCode(3)
migratePreferencesFromVersion3()
migratePreferencesFromVersion3(context)
}

View file

@ -1,17 +1,17 @@
package de.jrpie.android.launcher.preferences.legacy
import android.content.Context
import android.content.SharedPreferences
import android.content.SharedPreferences.Editor
import de.jrpie.android.launcher.apps.AppInfo
import androidx.core.content.edit
import de.jrpie.android.launcher.apps.AbstractAppInfo
import de.jrpie.android.launcher.apps.AppInfo
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION
import de.jrpie.android.launcher.preferences.serialization.MapAbstractAppInfoStringPreferenceSerializer
import de.jrpie.android.launcher.preferences.serialization.SetAbstractAppInfoPreferenceSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import java.util.HashSet
import androidx.core.content.edit
/**
* Migrate preferences from version 3 (used until version 0.0.23) to the current format
@ -70,8 +70,7 @@ private fun migrateMapAppInfoString(key: String, preferences: SharedPreferences,
}
}
fun migratePreferencesFromVersion3() {
assert(PREFERENCE_VERSION == 4)
fun migratePreferencesFromVersion3(context: Context) {
assert(LauncherPreferences.internal().versionCode() == 3)
val preferences = LauncherPreferences.getSharedPreferences()
@ -82,4 +81,5 @@ fun migratePreferencesFromVersion3() {
}
LauncherPreferences.internal().versionCode(4)
migratePreferencesFromVersion4(context)
}

View file

@ -0,0 +1,24 @@
package de.jrpie.android.launcher.preferences.legacy
import android.content.Context
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.widgets.ClockWidget
import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition
import de.jrpie.android.launcher.widgets.generateInternalId
fun migratePreferencesFromVersion4(context: Context) {
assert(LauncherPreferences.internal().versionCode() < 100)
LauncherPreferences.widgets().widgets(
setOf(
ClockWidget(
generateInternalId(),
WidgetPosition(1, 3, 10, 4),
WidgetPanel.HOME.id
)
)
)
LauncherPreferences.internal().versionCode(100)
migratePreferencesFromVersion100(context)
}

View file

@ -3,10 +3,10 @@ package de.jrpie.android.launcher.preferences.legacy
import android.content.Context
import android.content.SharedPreferences
import android.util.Log
import androidx.core.content.edit
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.preferences.theme.Background
import de.jrpie.android.launcher.preferences.theme.ColorTheme
import androidx.core.content.edit
private fun migrateStringPreference(
@ -392,5 +392,5 @@ fun migratePreferencesFromVersionUnknown(context: Context) {
LauncherPreferences.internal().versionCode(1)
Log.i(TAG, "migrated preferences to version 1.")
migratePreferencesFromVersion1()
migratePreferencesFromVersion1(context)
}

View file

@ -4,6 +4,8 @@ package de.jrpie.android.launcher.preferences.serialization
import de.jrpie.android.launcher.apps.AbstractAppInfo
import de.jrpie.android.launcher.apps.PinnedShortcutInfo
import de.jrpie.android.launcher.widgets.Widget
import de.jrpie.android.launcher.widgets.WidgetPanel
import eu.jonahbauer.android.preference.annotations.serializer.PreferenceSerializationException
import eu.jonahbauer.android.preference.annotations.serializer.PreferenceSerializer
import kotlinx.serialization.Serializable
@ -28,6 +30,40 @@ class SetAbstractAppInfoPreferenceSerializer :
}
}
@Suppress("UNCHECKED_CAST")
class SetWidgetSerializer :
PreferenceSerializer<java.util.Set<Widget>?, java.util.Set<java.lang.String>?> {
@Throws(PreferenceSerializationException::class)
override fun serialize(value: java.util.Set<Widget>?): java.util.Set<java.lang.String>? {
return value?.map(Widget::serialize)
?.toHashSet() as? java.util.Set<java.lang.String>
}
@Throws(PreferenceSerializationException::class)
override fun deserialize(value: java.util.Set<java.lang.String>?): java.util.Set<Widget>? {
return value?.map(java.lang.String::toString)?.map(Widget::deserialize)
?.toHashSet() as? java.util.Set<Widget>
}
}
@Suppress("UNCHECKED_CAST")
class SetWidgetPanelSerializer :
PreferenceSerializer<java.util.Set<WidgetPanel>?, java.util.Set<java.lang.String>?> {
@Throws(PreferenceSerializationException::class)
override fun serialize(value: java.util.Set<WidgetPanel>?): java.util.Set<java.lang.String>? {
return value?.map(WidgetPanel::serialize)
?.toHashSet() as? java.util.Set<java.lang.String>
}
@Throws(PreferenceSerializationException::class)
override fun deserialize(value: java.util.Set<java.lang.String>?): java.util.Set<WidgetPanel>? {
return value?.map(java.lang.String::toString)?.map(WidgetPanel::deserialize)
?.toHashSet() as? java.util.Set<WidgetPanel>
}
}
@Suppress("UNCHECKED_CAST")
class SetPinnedShortcutInfoPreferenceSerializer :
PreferenceSerializer<java.util.Set<PinnedShortcutInfo>?, java.util.Set<java.lang.String>?> {

View file

@ -1,5 +1,6 @@
package de.jrpie.android.launcher.ui
import android.app.Activity
import android.content.Context
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
@ -38,10 +39,17 @@ fun ImageView.transformGrayscale(grayscale: Boolean) {
}
// Taken from https://stackoverflow.com/a/50743764/12787264
// Taken from https://stackoverflow.com/a/50743764
fun View.openSoftKeyboard(context: Context) {
this.requestFocus()
// open the soft keyboard
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
(context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
// https://stackoverflow.com/a/17789187
fun closeSoftKeyboard(activity: Activity) {
activity.currentFocus?.let { focus ->
(activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
.hideSoftInputFromWindow( focus.windowToken, 0 )
}
}

View file

@ -1,26 +1,18 @@
package de.jrpie.android.launcher.ui
import android.annotation.SuppressLint
import android.content.SharedPreferences
import android.content.res.Resources
import android.os.Build
import android.os.Bundle
import android.util.DisplayMetrics
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.window.OnBackInvokedDispatcher
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.actions.LauncherAction
import de.jrpie.android.launcher.databinding.HomeBinding
import de.jrpie.android.launcher.databinding.ActivityHomeBinding
import de.jrpie.android.launcher.openTutorial
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.tutorial.TutorialActivity
import java.util.Locale
import de.jrpie.android.launcher.ui.util.LauncherGestureActivity
/**
* [HomeActivity] is the actual application Launcher,
@ -34,10 +26,9 @@ import java.util.Locale
* - Setting global variables (preferences etc.)
* - Opening the [TutorialActivity] on new installations
*/
class HomeActivity : UIObject, AppCompatActivity() {
class HomeActivity : UIObject, LauncherGestureActivity() {
private lateinit var binding: HomeBinding
private lateinit var touchGestureDetector: TouchGestureDetector
private lateinit var binding: ActivityHomeBinding
private var sharedPreferencesListener =
SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey ->
@ -45,67 +36,32 @@ class HomeActivity : UIObject, AppCompatActivity() {
prefKey?.startsWith("display.") == true
) {
recreate()
} else if (prefKey?.startsWith("action.") == true) {
updateSettingsFallbackButtonVisibility()
} else if (prefKey == LauncherPreferences.widgets().keys().widgets()) {
binding.homeWidgetContainer.updateWidgets(this@HomeActivity,
LauncherPreferences.widgets().widgets()
)
}
if (prefKey?.startsWith("action.") == true) {
updateSettingsFallbackButtonVisibility()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super<AppCompatActivity>.onCreate(savedInstanceState)
super<LauncherGestureActivity>.onCreate(savedInstanceState)
super<UIObject>.onCreate()
val displayMetrics = DisplayMetrics()
@Suppress("deprecation") // required to support API < 30
windowManager.defaultDisplay.getMetrics(displayMetrics)
val width = displayMetrics.widthPixels
val height = displayMetrics.heightPixels
touchGestureDetector = TouchGestureDetector(
this,
width,
height,
LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f
)
// Initialise layout
binding = HomeBinding.inflate(layoutInflater)
binding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(binding.root)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
binding.root.setOnApplyWindowInsetsListener { _, windowInsets ->
@Suppress("deprecation") // required to support API 29
val insets = windowInsets.systemGestureInsets
touchGestureDetector.setSystemGestureInsets(insets)
windowInsets
}
}
// Handle back key / gesture on Android 13+, cf. onKeyDown()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
onBackInvokedDispatcher.registerOnBackInvokedCallback(
OnBackInvokedDispatcher.PRIORITY_OVERLAY
) {
handleBack()
}
}
binding.buttonFallbackSettings.setOnClickListener {
LauncherAction.SETTINGS.invoke(this)
}
}
override fun onStart() {
super<AppCompatActivity>.onStart()
super<LauncherGestureActivity>.onStart()
super<UIObject>.onStart()
// If the tutorial was not finished, start it
@ -126,7 +82,6 @@ class HomeActivity : UIObject, AppCompatActivity() {
}
}
private fun updateSettingsFallbackButtonVisibility() {
// If µLauncher settings can not be reached from any action bound to an enabled gesture,
// show the fallback button.
@ -141,129 +96,46 @@ class HomeActivity : UIObject, AppCompatActivity() {
}
}
private fun initClock() {
val locale = Locale.getDefault()
val dateVisible = LauncherPreferences.clock().dateVisible()
val timeVisible = LauncherPreferences.clock().timeVisible()
var dateFMT = "yyyy-MM-dd"
var timeFMT = "HH:mm"
if (LauncherPreferences.clock().showSeconds()) {
timeFMT += ":ss"
}
if (LauncherPreferences.clock().localized()) {
dateFMT = android.text.format.DateFormat.getBestDateTimePattern(locale, dateFMT)
timeFMT = android.text.format.DateFormat.getBestDateTimePattern(locale, timeFMT)
}
var upperFormat = dateFMT
var lowerFormat = timeFMT
var upperVisible = dateVisible
var lowerVisible = timeVisible
if (LauncherPreferences.clock().flipDateTime()) {
upperFormat = lowerFormat.also { lowerFormat = upperFormat }
upperVisible = lowerVisible.also { lowerVisible = upperVisible }
}
binding.homeUpperView.isVisible = upperVisible
binding.homeLowerView.isVisible = lowerVisible
binding.homeUpperView.setTextColor(LauncherPreferences.clock().color())
binding.homeLowerView.setTextColor(LauncherPreferences.clock().color())
binding.homeLowerView.format24Hour = lowerFormat
binding.homeUpperView.format24Hour = upperFormat
binding.homeLowerView.format12Hour = lowerFormat
binding.homeUpperView.format12Hour = upperFormat
override fun getTheme(): Resources.Theme {
return modifyTheme(super.getTheme())
}
override fun getTheme(): Resources.Theme {
val mTheme = modifyTheme(super.getTheme())
mTheme.applyStyle(R.style.backgroundWallpaper, true)
LauncherPreferences.clock().font().applyToTheme(mTheme)
LauncherPreferences.theme().colorTheme().applyToTheme(
mTheme,
LauncherPreferences.theme().textShadow()
)
return mTheme
override fun onPause() {
try {
(application as Application).appWidgetHost.stopListening()
} catch (e: Exception) {
// Throws a NullPointerException on Android 12 an earlier, see #172
e.printStackTrace()
}
super.onPause()
}
override fun onResume() {
super.onResume()
touchGestureDetector.edgeWidth =
LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f
initClock()
updateSettingsFallbackButtonVisibility()
binding.homeWidgetContainer.updateWidgets(this@HomeActivity,
LauncherPreferences.widgets().widgets()
)
(application as Application).appWidgetHost.startListening()
}
override fun onDestroy() {
LauncherPreferences.getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener)
super.onDestroy()
}
@SuppressLint("GestureBackNavigation")
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
when (keyCode) {
KeyEvent.KEYCODE_BACK -> {
// Only used pre Android 13, cf. onBackInvokedDispatcher
handleBack()
}
KeyEvent.KEYCODE_VOLUME_UP -> {
if (Action.forGesture(Gesture.VOLUME_UP) == LauncherAction.VOLUME_UP) {
// Let the OS handle the key event. This works better with some custom ROMs
// and apps like Samsung Sound Assistant.
return false
}
Gesture.VOLUME_UP(this)
}
KeyEvent.KEYCODE_VOLUME_DOWN -> {
if (Action.forGesture(Gesture.VOLUME_DOWN) == LauncherAction.VOLUME_DOWN) {
// see above
return false
}
Gesture.VOLUME_DOWN(this)
}
}
return true
}
override fun onTouchEvent(event: MotionEvent): Boolean {
touchGestureDetector.onTouchEvent(event)
return true
}
override fun setOnClicks() {
binding.homeUpperView.setOnClickListener {
if (LauncherPreferences.clock().flipDateTime()) {
Gesture.TIME(this)
} else {
Gesture.DATE(this)
}
}
binding.homeLowerView.setOnClickListener {
if (LauncherPreferences.clock().flipDateTime()) {
Gesture.DATE(this)
} else {
Gesture.TIME(this)
}
}
}
private fun handleBack() {
override fun handleBack() {
Gesture.BACK(this)
}
override fun getRootView(): View {
return binding.root
}
override fun isHomeScreen(): Boolean {
return true
}

View file

@ -1,7 +1,6 @@
package de.jrpie.android.launcher.ui
import android.app.AlertDialog
import android.app.Service
import android.content.Context
import android.content.pm.LauncherApps
import android.content.pm.LauncherApps.PinItemRequest
@ -45,11 +44,25 @@ class PinShortcutActivity : AppCompatActivity(), UIObject {
binding = ActivityPinShortcutBinding.inflate(layoutInflater)
setContentView(binding.root)
val launcherApps = getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
val launcherApps = getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps
val request = launcherApps.getPinItemRequest(intent)
this.request = request
if (request == null || request.requestType != PinItemRequest.REQUEST_TYPE_SHORTCUT) {
if (request == null) {
finish()
return
}
if (request.requestType == PinItemRequest.REQUEST_TYPE_APPWIDGET) {
// TODO handle app widgets
request.getAppWidgetProviderInfo(this)
// startActivity()
finish()
return
}
if (request.requestType != PinItemRequest.REQUEST_TYPE_SHORTCUT) {
finish()
return
}

View file

@ -0,0 +1,57 @@
package de.jrpie.android.launcher.ui
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.copyToClipboard
import de.jrpie.android.launcher.databinding.ActivityReportCrashBinding
import de.jrpie.android.launcher.getDeviceInfo
import de.jrpie.android.launcher.openInBrowser
import de.jrpie.android.launcher.writeEmail
const val EXTRA_CRASH_LOG = "crashLog"
class ReportCrashActivity : AppCompatActivity() {
// We don't know what caused the crash, so this Activity should use as little functionality as possible.
// In particular it is not a UIObject (and hence looks quite ugly)
private lateinit var binding: ActivityReportCrashBinding
private var report: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Initialise layout
binding = ActivityReportCrashBinding.inflate(layoutInflater)
setContentView(binding.root)
setTitle(R.string.report_crash_title)
setSupportActionBar(binding.reportCrashAppbar)
supportActionBar?.setDisplayHomeAsUpEnabled(false)
report = intent.getStringExtra(EXTRA_CRASH_LOG)
binding.reportCrashButtonCopy.setOnClickListener {
copyToClipboard(this,
"Device Info:\n${getDeviceInfo()}\n\nCrash Log:\n${report}")
}
binding.reportCrashButtonMail.setOnClickListener {
writeEmail(
this,
getString(R.string.settings_meta_report_bug_mail),
"Crash in μLauncher",
"Hi!\nUnfortunately, μLauncher crashed:\n" +
"\nDevice Info\n\n${getDeviceInfo()}\n\n" +
"\nCrash Log\n\n${report}\n" +
"\nAdditional Information\n\n" +
"[Please add additional information: What did you do when the crash happened? Do you know how to trigger it? ... ]"
)
}
binding.reportCrashButtonReport.setOnClickListener {
openInBrowser(
getString(R.string.settings_meta_report_bug_link),
this
)
}
}
}

View file

@ -5,8 +5,10 @@ import android.graphics.Insets
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.util.DisplayMetrics
import android.view.MotionEvent
import android.view.ViewConfiguration
import android.view.WindowManager
import androidx.annotation.RequiresApi
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.preferences.LauncherPreferences
@ -15,10 +17,11 @@ import kotlin.math.max
import kotlin.math.min
import kotlin.math.tan
@Suppress("PrivatePropertyName")
class TouchGestureDetector(
private val context: Context,
val width: Int,
val height: Int,
var width: Int,
var height: Int,
var edgeWidth: Float
) {
private val ANGULAR_THRESHOLD = tan(Math.PI / 6)
@ -32,13 +35,13 @@ class TouchGestureDetector(
private val MIN_TRIANGLE_HEIGHT = 250
private val longPressHandler = Handler(Looper.getMainLooper())
private var systemGestureInsetTop = 100
private var systemGestureInsetBottom = 0
private var systemGestureInsetLeft = 0
private var systemGestureInsetRight = 0
private val longPressHandler = Handler(Looper.getMainLooper())
data class Vector(val x: Float, val y: Float) {
fun absSquared(): Float {
@ -319,6 +322,14 @@ class TouchGestureDetector(
}
}
fun updateScreenSize(windowManager: WindowManager) {
val displayMetrics = DisplayMetrics()
@Suppress("deprecation") // required to support API < 30
windowManager.defaultDisplay.getMetrics(displayMetrics)
width = displayMetrics.widthPixels
height = displayMetrics.heightPixels
}
@RequiresApi(Build.VERSION_CODES.Q)
fun setSystemGestureInsets(insets: Insets) {
systemGestureInsetTop = insets.top

View file

@ -10,6 +10,7 @@ import android.view.WindowInsets
import android.view.WindowInsetsController
import android.view.WindowManager
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.preferences.theme.Background
/**
* An interface implemented by every [Activity], Fragment etc. in Launcher.
@ -65,8 +66,14 @@ interface UIObject {
theme,
LauncherPreferences.theme().textShadow()
)
LauncherPreferences.theme().background().applyToTheme(theme)
LauncherPreferences.theme().font().applyToTheme(theme)
if (isHomeScreen()) {
Background.TRANSPARENT.applyToTheme(theme)
LauncherPreferences.clock().font().applyToTheme(theme)
} else {
LauncherPreferences.theme().background().applyToTheme(theme)
LauncherPreferences.theme().font().applyToTheme(theme)
}
return theme
}

View file

@ -237,9 +237,4 @@ class AppsRecyclerAdapter(
appFilter.favoritesVisibility = v
updateAppsList()
}
fun setHiddenAppsVisibility(v: AppFilter.Companion.AppSetVisibility) {
appFilter.hiddenVisibility = v
updateAppsList()
}
}

View file

@ -11,13 +11,16 @@ import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.apps.AppFilter
import de.jrpie.android.launcher.databinding.ListAppsBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.UIObject
import de.jrpie.android.launcher.ui.closeSoftKeyboard
import de.jrpie.android.launcher.ui.list.ListActivity
import de.jrpie.android.launcher.ui.openSoftKeyboard
import kotlin.math.absoluteValue
/**
@ -90,6 +93,19 @@ class ListFragmentApps : Fragment(), UIObject {
}
}
adapter = appsRecyclerAdapter
if (LauncherPreferences.functionality().searchAutoCloseKeyboard()) {
addOnScrollListener(object : RecyclerView.OnScrollListener() {
var totalDy: Int = 0
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
totalDy += dy
if (totalDy.absoluteValue > 100) {
totalDy = 0
closeSoftKeyboard(requireActivity())
}
}
})
}
}
binding.listAppsSearchview.setOnQueryTextListener(object :

View file

@ -11,6 +11,7 @@ import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.actions.LauncherAction
import de.jrpie.android.launcher.actions.WidgetPanelAction
import de.jrpie.android.launcher.ui.list.ListActivity
/**
@ -23,8 +24,10 @@ import de.jrpie.android.launcher.ui.list.ListActivity
class OtherRecyclerAdapter(val activity: Activity) :
RecyclerView.Adapter<OtherRecyclerAdapter.ViewHolder>() {
private val othersList: Array<LauncherAction> =
LauncherAction.entries.filter { it.isAvailable(activity) }.toTypedArray()
private val othersList: Array<Action> =
LauncherAction.entries.filter { it.isAvailable(activity) }
.plus(WidgetPanelAction(-1))
.toTypedArray()
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
@ -36,10 +39,12 @@ class OtherRecyclerAdapter(val activity: Activity) :
val pos = bindingAdapterPosition
val content = othersList[pos]
activity.finish()
val gestureId = (activity as? ListActivity)?.forGesture ?: return
val gesture = Gesture.byId(gestureId) ?: return
Action.setActionForGesture(gesture, content)
content.showConfigurationDialog(activity) { configuredAction ->
Action.setActionForGesture(gesture, configuredAction)
activity.finish()
}
}
init {
@ -48,11 +53,11 @@ class OtherRecyclerAdapter(val activity: Activity) :
}
override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
val otherLabel = activity.getString(othersList[i].label)
val icon = othersList[i].icon
val otherLabel = othersList[i].label(activity)
val icon = othersList[i].getIcon(activity)
viewHolder.textView.text = otherLabel
viewHolder.iconView.setImageResource(icon)
viewHolder.iconView.setImageDrawable(icon)
}
override fun getItemCount(): Int {

View file

@ -109,7 +109,7 @@ class SettingsActivity : AppCompatActivity(), UIObject {
}
private val TAB_TITLES = arrayOf(
R.string.settings_tab_app,
R.string.settings_tab_actions,
R.string.settings_tab_launcher,
R.string.settings_tab_meta
)

View file

@ -11,6 +11,8 @@ import de.jrpie.android.launcher.actions.openAppsList
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.preferences.theme.ColorTheme
import de.jrpie.android.launcher.setDefaultHomeScreen
import de.jrpie.android.launcher.ui.widgets.manage.ManageWidgetPanelsActivity
import de.jrpie.android.launcher.ui.widgets.manage.ManageWidgetsActivity
/**
@ -81,6 +83,22 @@ class SettingsFragmentLauncher : PreferenceFragmentCompat() {
true
}
val manageWidgets = findPreference<androidx.preference.Preference>(
LauncherPreferences.widgets().keys().widgets()
)
manageWidgets?.setOnPreferenceClickListener {
startActivity(Intent(requireActivity(), ManageWidgetsActivity::class.java))
true
}
val manageWidgetPanels = findPreference<androidx.preference.Preference>(
LauncherPreferences.widgets().keys().customPanels()
)
manageWidgetPanels?.setOnPreferenceClickListener {
startActivity(Intent(requireActivity(), ManageWidgetPanelsActivity::class.java))
true
}
val hiddenApps = findPreference<androidx.preference.Preference>(
LauncherPreferences.apps().keys().hidden()
)

View file

@ -79,6 +79,9 @@ class SettingsFragmentMeta : Fragment(), UIObject {
// view code
bindURL(binding.settingsMetaButtonViewCode, R.string.settings_meta_link_github)
// view documentation
bindURL(binding.settingsMetaButtonViewDocs, R.string.settings_meta_link_docs)
// report a bug
binding.settingsMetaButtonReportBug.setOnClickListener {
val deviceInfo = getDeviceInfo()
@ -132,7 +135,12 @@ class SettingsFragmentMeta : Fragment(), UIObject {
startActivity(Intent(this.context, LegalInfoActivity::class.java))
}
// version
binding.settingsMetaTextVersion.text = BuildConfig.VERSION_NAME
binding.settingsMetaTextVersion.setOnClickListener {
val deviceInfo = getDeviceInfo()
copyToClipboard(requireContext(), deviceInfo)
}
}
}

View file

@ -5,9 +5,9 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import de.jrpie.android.launcher.BuildConfig.VERSION_CODE
import de.jrpie.android.launcher.databinding.Tutorial5FinishBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.requestNotificationPermission
import de.jrpie.android.launcher.setDefaultHomeScreen
import de.jrpie.android.launcher.ui.UIObject
@ -31,8 +31,10 @@ class TutorialFragment5Finish : Fragment(), UIObject {
override fun onStart() {
super<Fragment>.onStart()
super<UIObject>.onStart()
requestNotificationPermission(requireActivity())
}
override fun setOnClicks() {
super.setOnClicks()
binding.tutorialFinishButtonStart.setOnClickListener { finishTutorial() }
@ -42,9 +44,9 @@ class TutorialFragment5Finish : Fragment(), UIObject {
if (!LauncherPreferences.internal().started()) {
LauncherPreferences.internal().started(true)
LauncherPreferences.internal().startedTime(System.currentTimeMillis() / 1000L)
LauncherPreferences.internal().versionCode(VERSION_CODE)
}
context?.let { setDefaultHomeScreen(it, checkDefault = true) }
activity?.finish()
}
}

View file

@ -0,0 +1,104 @@
package de.jrpie.android.launcher.ui.util
import android.annotation.SuppressLint
import android.app.Activity
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.window.OnBackInvokedDispatcher
import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.actions.LauncherAction
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.TouchGestureDetector
/**
* An activity with a [TouchGestureDetector] as well as handling of volume and back keys set up.
*/
abstract class LauncherGestureActivity: Activity() {
protected var touchGestureDetector: TouchGestureDetector? = null
override fun onTouchEvent(event: MotionEvent): Boolean {
touchGestureDetector?.onTouchEvent(event)
return true
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Handle back key / gesture on Android 13+, cf. onKeyDown()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
onBackInvokedDispatcher.registerOnBackInvokedCallback(
OnBackInvokedDispatcher.PRIORITY_OVERLAY
) {
handleBack()
}
}
}
override fun onResume() {
super.onResume()
/* This should be initialized in onCreate()
However on some devices there seems to be a bug where the touchGestureDetector
is not working properly after resuming the app.
Reinitializing the touchGestureDetector every time the app is resumed might help to fix that.
(see issue #138)
*/
touchGestureDetector = TouchGestureDetector(
this, 0, 0,
LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f
).also {
it.updateScreenSize(windowManager)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
getRootView()?.setOnApplyWindowInsetsListener { _, windowInsets ->
@Suppress("deprecation") // required to support API 29
val insets = windowInsets.systemGestureInsets
touchGestureDetector?.setSystemGestureInsets(insets)
windowInsets
}
}
}
@SuppressLint("GestureBackNavigation")
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
when (keyCode) {
KeyEvent.KEYCODE_BACK -> {
// Only used pre Android 13, cf. onBackInvokedDispatcher
handleBack()
}
KeyEvent.KEYCODE_VOLUME_UP -> {
if (Action.forGesture(Gesture.VOLUME_UP) == LauncherAction.VOLUME_UP) {
// Let the OS handle the key event. This works better with some custom ROMs
// and apps like Samsung Sound Assistant.
return false
}
Gesture.VOLUME_UP(this)
}
KeyEvent.KEYCODE_VOLUME_DOWN -> {
if (Action.forGesture(Gesture.VOLUME_DOWN) == LauncherAction.VOLUME_DOWN) {
// see above
return false
}
Gesture.VOLUME_DOWN(this)
}
}
return true
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
touchGestureDetector?.updateScreenSize(windowManager)
}
protected abstract fun getRootView(): View?
protected abstract fun handleBack()
}

View file

@ -0,0 +1,79 @@
package de.jrpie.android.launcher.ui.widgets
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.databinding.WidgetClockBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.widgets.WidgetPanel
import java.util.Locale
class ClockView(context: Context, attrs: AttributeSet? = null, val appWidgetId: Int, val panelId: Int): ConstraintLayout(context, attrs) {
constructor(context: Context, attrs: AttributeSet?): this(context, attrs, WidgetPanel.HOME.id, -1)
val binding: WidgetClockBinding = WidgetClockBinding.inflate(LayoutInflater.from(context), this, true)
init {
initClock()
setOnClicks()
}
private fun initClock() {
val locale = Locale.getDefault()
val dateVisible = LauncherPreferences.clock().dateVisible()
val timeVisible = LauncherPreferences.clock().timeVisible()
var dateFMT = "yyyy-MM-dd"
var timeFMT = "HH:mm"
if (LauncherPreferences.clock().showSeconds()) {
timeFMT += ":ss"
}
if (LauncherPreferences.clock().localized()) {
dateFMT = android.text.format.DateFormat.getBestDateTimePattern(locale, dateFMT)
timeFMT = android.text.format.DateFormat.getBestDateTimePattern(locale, timeFMT)
}
var upperFormat = dateFMT
var lowerFormat = timeFMT
var upperVisible = dateVisible
var lowerVisible = timeVisible
if (LauncherPreferences.clock().flipDateTime()) {
upperFormat = lowerFormat.also { lowerFormat = upperFormat }
upperVisible = lowerVisible.also { lowerVisible = upperVisible }
}
binding.clockUpperView.isVisible = upperVisible
binding.clockLowerView.isVisible = lowerVisible
binding.clockUpperView.setTextColor(LauncherPreferences.clock().color())
binding.clockLowerView.setTextColor(LauncherPreferences.clock().color())
binding.clockLowerView.format24Hour = lowerFormat
binding.clockUpperView.format24Hour = upperFormat
binding.clockLowerView.format12Hour = lowerFormat
binding.clockUpperView.format12Hour = upperFormat
}
private fun setOnClicks() {
binding.clockUpperView.setOnClickListener {
if (LauncherPreferences.clock().flipDateTime()) {
Gesture.TIME(context)
} else {
Gesture.DATE(context)
}
}
binding.clockLowerView.setOnClickListener {
if (LauncherPreferences.clock().flipDateTime()) {
Gesture.DATE(context)
} else {
Gesture.TIME(context)
}
}
}
}

View file

@ -0,0 +1,17 @@
package de.jrpie.android.launcher.ui.widgets
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import de.jrpie.android.launcher.databinding.WidgetDebugInfoBinding
import de.jrpie.android.launcher.getDeviceInfo
class DebugInfoView(context: Context, attrs: AttributeSet? = null, val appWidgetId: Int): ConstraintLayout(context, attrs) {
val binding: WidgetDebugInfoBinding = WidgetDebugInfoBinding.inflate(LayoutInflater.from(context), this, true)
init {
binding.debugInfoText.text = getDeviceInfo()
}
}

View file

@ -0,0 +1,144 @@
package de.jrpie.android.launcher.ui.widgets
import android.app.Activity
import android.content.Context
import android.graphics.PointF
import android.graphics.RectF
import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent
import android.view.View
import android.view.View.MeasureSpec.makeMeasureSpec
import android.view.ViewGroup
import androidx.core.graphics.contains
import androidx.core.view.size
import de.jrpie.android.launcher.widgets.Widget
import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition
import kotlin.math.max
/**
* This only works in an Activity, not AppCompatActivity
*/
open class WidgetContainerView(
var widgetPanelId: Int,
context: Context,
attrs: AttributeSet? = null
) : ViewGroup(context, attrs) {
constructor(context: Context, attrs: AttributeSet) : this(WidgetPanel.HOME.id, context, attrs)
var widgetViewById = HashMap<Int, View>()
open fun updateWidgets(activity: Activity, widgets: Collection<Widget>?) {
synchronized(widgetViewById) {
if (widgets == null) {
return
}
Log.i("WidgetContainer", "updating ${activity.localClassName}")
widgetViewById.forEach { removeView(it.value) }
widgetViewById.clear()
widgets.filter { it.panelId == widgetPanelId }.forEach { widget ->
widget.createView(activity)?.let {
addView(it, LayoutParams(widget.position))
widgetViewById[widget.id] = it
}
}
}
}
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
if (ev == null) {
return false
}
val position = PointF(ev.x, ev.y)
return widgetViewById.filter {
RectF(
it.value.x,
it.value.y,
it.value.x + it.value.width,
it.value.y + it.value.height
).contains(position) == true
}.any {
Widget.byId(it.key)?.allowInteraction == false
}
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
var maxHeight = suggestedMinimumHeight
var maxWidth = suggestedMinimumWidth
val mWidth = MeasureSpec.getSize(widthMeasureSpec)
val mHeight = MeasureSpec.getSize(heightMeasureSpec)
(0..<size).map { getChildAt(it) }.forEach {
val position = (it.layoutParams as LayoutParams).position.getAbsoluteRect(mWidth, mHeight)
it.measure(makeMeasureSpec(position.width(), MeasureSpec.EXACTLY), makeMeasureSpec(position.height(), MeasureSpec.EXACTLY))
}
// Find rightmost and bottom-most child
(0..<size).map { getChildAt(it) }.filter { it.visibility != GONE }.forEach {
val position = (it.layoutParams as LayoutParams).position.getAbsoluteRect(mWidth, mHeight)
maxWidth = max(maxWidth, position.left + it.measuredWidth)
maxHeight = max(maxHeight, position.top + it.measuredHeight)
}
setMeasuredDimension(
resolveSizeAndState(maxWidth.toInt(), widthMeasureSpec, 0),
resolveSizeAndState(maxHeight.toInt(), heightMeasureSpec, 0)
)
}
/**
* Returns a set of layout parameters with a width of
* [ViewGroup.LayoutParams.WRAP_CONTENT],
* a height of [ViewGroup.LayoutParams.WRAP_CONTENT]
* and with the coordinates (0, 0).
*/
override fun generateDefaultLayoutParams(): ViewGroup.LayoutParams {
return LayoutParams(WidgetPosition(0,0,1,1))
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
for (i in 0..<size) {
val child = getChildAt(i)
val lp = child.layoutParams as LayoutParams
val position = lp.position.getAbsoluteRect(r - l, b - t)
child.layout(position.left, position.top, position.right, position.bottom)
child.layoutParams.width = position.width()
child.layoutParams.height = position.height()
}
}
override fun generateLayoutParams(attrs: AttributeSet?): ViewGroup.LayoutParams {
return LayoutParams(context, attrs)
}
// Override to allow type-checking of LayoutParams.
override fun checkLayoutParams(p: ViewGroup.LayoutParams?): Boolean {
return p is LayoutParams
}
override fun generateLayoutParams(p: ViewGroup.LayoutParams?): ViewGroup.LayoutParams {
return LayoutParams(p)
}
override fun shouldDelayChildPressedState(): Boolean {
return false
}
companion object {
class LayoutParams : ViewGroup.LayoutParams {
var position = WidgetPosition(0,0,4,4)
constructor(position: WidgetPosition) : super(WRAP_CONTENT, WRAP_CONTENT) {
this.position = position
}
constructor(c: Context, attrs: AttributeSet?) : super(c, attrs)
constructor(source: ViewGroup.LayoutParams?) : super(source)
}
}
}

View file

@ -0,0 +1,93 @@
package de.jrpie.android.launcher.ui.widgets
import android.content.res.Resources
import android.os.Bundle
import android.view.View
import androidx.core.view.ViewCompat
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.databinding.ActivityWidgetPanelBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.UIObject
import de.jrpie.android.launcher.ui.util.LauncherGestureActivity
import de.jrpie.android.launcher.ui.widgets.manage.EXTRA_PANEL_ID
import de.jrpie.android.launcher.widgets.WidgetPanel
class WidgetPanelActivity : LauncherGestureActivity(), UIObject {
var binding: ActivityWidgetPanelBinding? = null
var widgetPanelId: Int = WidgetPanel.HOME.id
override fun onCreate(savedInstanceState: Bundle?) {
super<LauncherGestureActivity>.onCreate(savedInstanceState)
super<UIObject>.onCreate()
val binding = ActivityWidgetPanelBinding.inflate(layoutInflater)
setContentView(binding.root)
widgetPanelId = intent.getIntExtra(EXTRA_PANEL_ID, WidgetPanel.HOME.id)
// The widget container should extend below the status and navigation bars,
// so let's set an empty WindowInsetsListener to prevent it from being moved.
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
windowInsets
}
binding.widgetPanelWidgetContainer.widgetPanelId = widgetPanelId
binding.widgetPanelWidgetContainer.updateWidgets(
this,
LauncherPreferences.widgets().widgets()
)
}
override fun getTheme(): Resources.Theme {
val mTheme = modifyTheme(super.getTheme())
mTheme.applyStyle(R.style.backgroundWallpaper, true)
LauncherPreferences.clock().font().applyToTheme(mTheme)
LauncherPreferences.theme().colorTheme().applyToTheme(
mTheme,
LauncherPreferences.theme().textShadow()
)
return mTheme
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus && LauncherPreferences.display().hideNavigationBar()) {
hideNavigationBar()
}
}
override fun onStart() {
super<LauncherGestureActivity>.onStart()
super<UIObject>.onStart()
}
override fun onPause() {
try {
(application as Application).appWidgetHost.stopListening()
} catch (e: Exception) {
// Throws a NullPointerException on Android 12 an earlier, see #172
e.printStackTrace()
}
super.onPause()
}
override fun onResume() {
super.onResume()
(application as Application).appWidgetHost.startListening()
}
override fun getRootView(): View? {
return binding?.root
}
override fun handleBack() {
finish()
}
override fun isHomeScreen(): Boolean {
return true
}
}

View file

@ -0,0 +1,105 @@
package de.jrpie.android.launcher.ui.widgets.manage
import android.annotation.SuppressLint
import android.content.Intent
import android.content.SharedPreferences
import android.content.res.Resources
import android.os.Bundle
import android.widget.EditText
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.databinding.ActivityManageWidgetPanelsBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.UIObject
import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.updateWidgetPanel
class ManageWidgetPanelsActivity : AppCompatActivity(), UIObject {
@SuppressLint("NotifyDataSetChanged")
private val sharedPreferencesListener =
SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey ->
if (
prefKey == LauncherPreferences.widgets().keys().customPanels()
|| prefKey == LauncherPreferences.widgets().keys().widgets()
) {
viewAdapter.widgetPanels =
(LauncherPreferences.widgets().customPanels() ?: setOf()).toTypedArray()
viewAdapter.notifyDataSetChanged()
}
}
private lateinit var binding: ActivityManageWidgetPanelsBinding
private lateinit var viewAdapter: WidgetPanelsRecyclerAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super<AppCompatActivity>.onCreate(savedInstanceState)
super<UIObject>.onCreate()
binding = ActivityManageWidgetPanelsBinding.inflate(layoutInflater)
setContentView(binding.main)
val viewManager = LinearLayoutManager(this)
viewAdapter = WidgetPanelsRecyclerAdapter(this, true) { widgetPanel ->
startActivity(
Intent(
this@ManageWidgetPanelsActivity,
ManageWidgetsActivity::class.java
).also {
it.putExtra(EXTRA_PANEL_ID, widgetPanel.id)
})
}
binding.manageWidgetPanelsRecycler.apply {
setHasFixedSize(true)
layoutManager = viewManager
adapter = viewAdapter
}
binding.manageWidgetPanelsClose.setOnClickListener { finish() }
binding.manageWidgetPanelsAddPanel.setOnClickListener {
AlertDialog.Builder(this@ManageWidgetPanelsActivity, R.style.AlertDialogCustom).apply {
setTitle(R.string.dialog_create_widget_panel_title)
setNegativeButton(R.string.dialog_cancel) { _, _ -> }
setPositiveButton(R.string.dialog_ok) { dialogInterface, _ ->
val panelId = WidgetPanel.allocateId()
val label = (dialogInterface as? AlertDialog)
?.findViewById<EditText>(R.id.dialog_create_widget_panel_edit_text)?.text?.toString()
?: (getString(R.string.widget_panel_default_name, panelId))
updateWidgetPanel(WidgetPanel(panelId, label))
}
setView(R.layout.dialog_create_widget_panel)
}.create().also { it.show() }.apply {
findViewById<EditText>(R.id.dialog_create_widget_panel_edit_text)
?.setText(
getString(
R.string.widget_panel_default_name,
WidgetPanel.allocateId()
)
)
}
}
}
override fun onStart() {
super<AppCompatActivity>.onStart()
super<UIObject>.onStart()
LauncherPreferences.getSharedPreferences()
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
}
override fun onPause() {
LauncherPreferences.getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener)
super.onPause()
}
override fun getTheme(): Resources.Theme {
return modifyTheme(super.getTheme())
}
override fun setOnClicks() {
binding.manageWidgetPanelsClose.setOnClickListener { finish() }
}
}

View file

@ -0,0 +1,211 @@
package de.jrpie.android.launcher.ui.widgets.manage
import android.app.Activity
import android.appwidget.AppWidgetManager
import android.content.Intent
import android.content.SharedPreferences
import android.content.res.Resources
import android.os.Bundle
import android.util.Log
import android.view.ViewGroup
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.databinding.ActivityManageWidgetsBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.UIObject
import de.jrpie.android.launcher.widgets.AppWidget
import de.jrpie.android.launcher.widgets.GRID_SIZE
import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition
import kotlin.math.max
import kotlin.math.roundToInt
// http://coderender.blogspot.com/2012/01/hosting-android-widgets-my.html
const val REQUEST_CREATE_APPWIDGET = 1
const val REQUEST_PICK_APPWIDGET = 2
const val EXTRA_PANEL_ID = "widgetPanelId"
// We can't use AppCompatActivity, since some AppWidgets don't work there.
class ManageWidgetsActivity : UIObject, Activity() {
private var panelId: Int = WidgetPanel.HOME.id
private lateinit var binding: ActivityManageWidgetsBinding
private var sharedPreferencesListener =
SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey ->
if (prefKey == LauncherPreferences.widgets().keys().widgets()) {
binding.manageWidgetsContainer.updateWidgets(
this,
LauncherPreferences.widgets().widgets()
)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super<Activity>.onCreate(savedInstanceState)
super<UIObject>.onCreate()
binding = ActivityManageWidgetsBinding.inflate(layoutInflater)
setContentView(binding.root)
panelId = intent.extras?.getInt(EXTRA_PANEL_ID, WidgetPanel.HOME.id) ?: WidgetPanel.HOME.id
binding.manageWidgetsButtonAdd.setOnClickListener {
selectWidget()
}
// The widget container should extend below the status and navigation bars,
// so let's set an empty WindowInsetsListener to prevent it from being moved.
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
windowInsets
}
// The button must not be placed under the navigation bar
ViewCompat.setOnApplyWindowInsetsListener(binding.manageWidgetsButtonAdd) { v, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
v.updateLayoutParams<ViewGroup.MarginLayoutParams> {
leftMargin = insets.left
bottomMargin = insets.bottom
rightMargin = insets.right
}
WindowInsetsCompat.CONSUMED
}
binding.manageWidgetsContainer.let {
it.widgetPanelId = panelId
it.updateWidgets(this, LauncherPreferences.widgets().widgets())
}
}
override fun onStart() {
super<Activity>.onStart()
super<UIObject>.onStart()
LauncherPreferences.getSharedPreferences()
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
}
override fun onPause() {
try {
(application as Application).appWidgetHost.stopListening()
} catch (e: Exception) {
// Throws a NullPointerException on Android 12 an earlier, see #172
e.printStackTrace()
}
super.onPause()
}
override fun onResume() {
super.onResume()
(application as Application).appWidgetHost.startListening()
binding.manageWidgetsContainer.updateWidgets(
this,
LauncherPreferences.widgets().widgets()
)
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus && LauncherPreferences.display().hideNavigationBar()) {
hideNavigationBar()
}
}
override fun getTheme(): Resources.Theme {
return modifyTheme(super.getTheme())
}
override fun onDestroy() {
LauncherPreferences.getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener)
super.onDestroy()
}
private fun selectWidget() {
startActivityForResult(
Intent(this, SelectWidgetActivity::class.java).also {
it.putExtra(
EXTRA_PANEL_ID,
panelId
)
}, REQUEST_PICK_APPWIDGET
)
}
private fun createWidget(data: Intent) {
Log.i("Launcher", "creating widget")
val appWidgetManager = (application as Application).appWidgetManager
val appWidgetHost = (application as Application).appWidgetHost
val appWidgetId = data.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: return
val display = windowManager.defaultDisplay
val widgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId)
if (widgetInfo == null) {
Log.w("Launcher", "can't access widget")
appWidgetHost.deleteAppWidgetId(appWidgetId)
return
}
val position = WidgetPosition.findFreeSpace(
WidgetPanel.byId(panelId),
max(3, (GRID_SIZE * (widgetInfo.minWidth) / display.width.toFloat()).roundToInt()),
max(3, (GRID_SIZE * (widgetInfo.minHeight) / display.height.toFloat()).roundToInt())
)
val widget = AppWidget(appWidgetId, position, panelId, widgetInfo)
LauncherPreferences.widgets().widgets(
(LauncherPreferences.widgets().widgets() ?: HashSet()).also {
it.add(widget)
}
)
}
private fun configureWidget(data: Intent) {
val extras = data.extras
val appWidgetId = extras!!.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
val widget = AppWidget(appWidgetId, panelId = panelId)
if (widget.isConfigurable(this)) {
widget.configure(this, REQUEST_CREATE_APPWIDGET)
} else {
createWidget(data)
}
}
override fun onActivityResult(
requestCode: Int, resultCode: Int,
data: Intent?
) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_PICK_APPWIDGET) {
configureWidget(data!!)
} else if (requestCode == REQUEST_CREATE_APPWIDGET) {
createWidget(data!!)
}
} else if (resultCode == RESULT_CANCELED && data != null) {
val appWidgetId =
data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
if (appWidgetId != -1) {
AppWidget(appWidgetId).delete(this)
}
}
}
/**
* For a better preview, [ManageWidgetsActivity] should behave exactly like [HomeActivity]
*/
override fun isHomeScreen(): Boolean {
return true
}
}

View file

@ -0,0 +1,175 @@
package de.jrpie.android.launcher.ui.widgets.manage
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProviderInfo
import android.content.Intent
import android.content.res.Resources
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.databinding.ActivitySelectWidgetBinding
import de.jrpie.android.launcher.ui.UIObject
import de.jrpie.android.launcher.widgets.ClockWidget
import de.jrpie.android.launcher.widgets.LauncherAppWidgetProvider
import de.jrpie.android.launcher.widgets.LauncherClockWidgetProvider
import de.jrpie.android.launcher.widgets.LauncherWidgetProvider
import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition
import de.jrpie.android.launcher.widgets.bindAppWidgetOrRequestPermission
import de.jrpie.android.launcher.widgets.generateInternalId
import de.jrpie.android.launcher.widgets.getAppWidgetProviders
import de.jrpie.android.launcher.widgets.updateWidget
private const val REQUEST_WIDGET_PERMISSION = 29
/**
* This activity lets the user pick an app widget to add.
* It provides an interface similar to [android.appwidget.AppWidgetManager.ACTION_APPWIDGET_PICK],
* but shows more information and also shows widgets from other user profiles.
*/
class SelectWidgetActivity : AppCompatActivity(), UIObject {
lateinit var binding: ActivitySelectWidgetBinding
var widgetPanelId: Int = WidgetPanel.HOME.id
private fun tryBindWidget(info: LauncherWidgetProvider) {
when (info) {
is LauncherAppWidgetProvider -> {
val widgetId =
(applicationContext as Application).appWidgetHost.allocateAppWidgetId()
if (bindAppWidgetOrRequestPermission(
this,
info.info,
widgetId,
REQUEST_WIDGET_PERMISSION
)
) {
setResult(
RESULT_OK,
Intent().also {
it.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)
it.putExtra(EXTRA_PANEL_ID, widgetPanelId)
}
)
finish()
}
}
is LauncherClockWidgetProvider -> {
updateWidget(ClockWidget(generateInternalId(), WidgetPosition(0, 4, 12, 3), widgetPanelId))
finish()
}
}
}
override fun onStart() {
super<AppCompatActivity>.onStart()
super<UIObject>.onStart()
}
override fun onCreate(savedInstanceState: Bundle?) {
super<AppCompatActivity>.onCreate(savedInstanceState)
super<UIObject>.onCreate()
binding = ActivitySelectWidgetBinding.inflate(layoutInflater)
setContentView(binding.root)
widgetPanelId = intent.getIntExtra(EXTRA_PANEL_ID, WidgetPanel.HOME.id)
val viewManager = LinearLayoutManager(this)
val viewAdapter = SelectWidgetRecyclerAdapter()
binding.selectWidgetRecycler.apply {
setHasFixedSize(false)
layoutManager = viewManager
adapter = viewAdapter
}
binding.selectWidgetClose.setOnClickListener {
setResult(RESULT_CANCELED)
finish()
}
}
override fun getTheme(): Resources.Theme {
return modifyTheme(super.getTheme())
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_WIDGET_PERMISSION && resultCode == RESULT_OK) {
data ?: return
val provider = (data.getSerializableExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER) as? AppWidgetProviderInfo) ?: return
tryBindWidget(LauncherAppWidgetProvider(provider))
}
}
inner class SelectWidgetRecyclerAdapter() :
RecyclerView.Adapter<SelectWidgetRecyclerAdapter.ViewHolder>() {
private val widgets = getAppWidgetProviders(this@SelectWidgetActivity).toTypedArray()
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
var textView: TextView = itemView.findViewById(R.id.list_widgets_row_name)
var descriptionView: TextView = itemView.findViewById(R.id.list_widgets_row_description)
var iconView: ImageView = itemView.findViewById(R.id.list_widgets_row_icon)
var previewView: ImageView = itemView.findViewById(R.id.list_widgets_row_preview)
override fun onClick(v: View) {
tryBindWidget(widgets[bindingAdapterPosition])
}
init {
itemView.setOnClickListener(this)
}
}
override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
val label = widgets[i].loadLabel(this@SelectWidgetActivity)
val description = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
widgets[i].loadDescription(this@SelectWidgetActivity)
} else {
""
}
val preview =
widgets[i].loadPreviewImage(this@SelectWidgetActivity)
val icon =
widgets[i].loadIcon(this@SelectWidgetActivity)
viewHolder.textView.text = label
viewHolder.descriptionView.text = description
viewHolder.descriptionView.visibility =
if (description?.isEmpty() == false) { View.VISIBLE } else { View.GONE }
viewHolder.iconView.setImageDrawable(icon)
viewHolder.previewView.setImageDrawable(preview)
viewHolder.previewView.visibility =
if (preview != null) { View.VISIBLE } else { View.GONE }
viewHolder.previewView.requestLayout()
}
override fun getItemCount(): Int {
return widgets.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val view: View = inflater.inflate(R.layout.list_widgets_row, parent, false)
return ViewHolder(view)
}
}
}

View file

@ -0,0 +1,220 @@
package de.jrpie.android.launcher.ui.widgets.manage
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.graphics.Point
import android.graphics.Rect
import android.graphics.RectF
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.util.AttributeSet
import android.view.HapticFeedbackConstants
import android.view.MotionEvent
import android.view.View
import android.view.ViewConfiguration
import androidx.core.graphics.contains
import androidx.core.graphics.minus
import androidx.core.graphics.toRect
import de.jrpie.android.launcher.ui.widgets.WidgetContainerView
import de.jrpie.android.launcher.widgets.GRID_SIZE
import de.jrpie.android.launcher.widgets.Widget
import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition
import de.jrpie.android.launcher.widgets.updateWidget
/**
* A variant of the [WidgetContainerView] which allows to manage widgets.
*/
class WidgetManagerView(widgetPanelId: Int, context: Context, attrs: AttributeSet? = null) :
WidgetContainerView(widgetPanelId, context, attrs) {
constructor(context: Context, attrs: AttributeSet?) : this(WidgetPanel.HOME.id, context, attrs)
val touchSlop: Int
val touchSlopSquare: Int
val longPressTimeout: Long
private var overlayViewById = HashMap<Int, WidgetOverlayView>()
init {
val configuration = ViewConfiguration.get(context)
touchSlop = configuration.scaledTouchSlop
touchSlopSquare = touchSlop * touchSlop
longPressTimeout = ViewConfiguration.getLongPressTimeout().toLong()
}
enum class EditMode(val resize: (dx: Int, dy: Int, screenWidth: Int, screenHeight: Int, rect: Rect) -> Rect) {
MOVE({ dx, dy, sw, sh, rect ->
val cdx = dx.coerceIn(-rect.left, sw - rect.right)
val cdy = dy.coerceIn(-rect.top, sh - rect.bottom)
Rect(rect.left + cdx, rect.top + cdy, rect.right + cdx, rect.bottom + cdy)
}),
TOP({ _, dy, _, sh, rect ->
val range = (-rect.top)..(rect.bottom - rect.top - (2 * sh / GRID_SIZE) + 5)
if (range.isEmpty()) {
rect
} else {
Rect(rect.left, rect.top + dy.coerceIn(range), rect.right, rect.bottom)
}
}),
BOTTOM({ _, dy, _, sh, rect ->
val range = ((2 * sh / GRID_SIZE) + 5 + rect.top - rect.bottom)..(sh - rect.bottom)
if (range.isEmpty()) {
rect
} else {
Rect(rect.left, rect.top, rect.right, rect.bottom + dy.coerceIn(range))
}
}),
LEFT({ dx, _, sw, _, rect ->
val range = (-rect.left)..(rect.right - rect.left - (2 * sw / GRID_SIZE) + 5)
if (range.isEmpty()) {
rect
} else {
Rect(rect.left + dx.coerceIn(range), rect.top, rect.right, rect.bottom)
}
}),
RIGHT({ dx, _, sw, _, rect ->
val range = ((2 * sw / GRID_SIZE) + 5 + rect.left - rect.right)..(sw - rect.right)
if (range.isEmpty()) {
rect
} else {
Rect(rect.left, rect.top, rect.right + dx.coerceIn(range), rect.bottom)
}
}),
}
private var selectedWidgetOverlayView: WidgetOverlayView? = null
private var selectedWidgetView: View? = null
private var currentGestureStart: Point? = null
private var startWidgetPosition: Rect? = null
private var lastPosition = Rect()
private val longPressHandler = Handler(Looper.getMainLooper())
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
return true
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event == null) {
return false
}
synchronized(this) {
if (event.actionMasked == MotionEvent.ACTION_DOWN) {
val start = Point(event.x.toInt(), event.y.toInt())
currentGestureStart = start
val view = overlayViewById.asIterable()
.map { it.value }.firstOrNull { overlayView ->
RectF(
overlayView.x,
overlayView.y,
overlayView.x + overlayView.width,
overlayView.y + overlayView.height
)
.toRect()
.contains(start)
} ?: return true
val position =
(view.layoutParams as Companion.LayoutParams).position.getAbsoluteRect(
width,
height
)
selectedWidgetOverlayView = view
selectedWidgetView = widgetViewById[view.widgetId]
startWidgetPosition = position
val positionInView = start.minus(Point(position.left, position.top))
view.mode =
view.getHandles().firstOrNull { it.position.contains(positionInView) }?.mode
?: EditMode.MOVE
longPressHandler.postDelayed({
synchronized(this@WidgetManagerView) {
view.showPopupMenu()
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
endInteraction()
}
}, longPressTimeout)
}
if (event.actionMasked == MotionEvent.ACTION_MOVE ||
event.actionMasked == MotionEvent.ACTION_UP
) {
val distanceX = event.x - (currentGestureStart?.x ?: return true)
val distanceY = event.y - (currentGestureStart?.y ?: return true)
if (distanceX * distanceX + distanceY * distanceY > touchSlopSquare) {
longPressHandler.removeCallbacksAndMessages(null)
}
val view = selectedWidgetOverlayView ?: return true
val start = startWidgetPosition ?: return true
val absoluteNewPosition = (view.mode ?: return true).resize(
distanceX.toInt(),
distanceY.toInt(),
width, height,
start
)
val newPosition = WidgetPosition.fromAbsoluteRect(
absoluteNewPosition, width, height
)
if (absoluteNewPosition != lastPosition) {
lastPosition = absoluteNewPosition
(view.layoutParams as Companion.LayoutParams).position = newPosition
(selectedWidgetView?.layoutParams as? Companion.LayoutParams)?.position =
newPosition
requestLayout()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
view.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_PRESS)
}
}
if (event.actionMasked == MotionEvent.ACTION_UP) {
val id = selectedWidgetOverlayView?.widgetId ?: return true
val widget = Widget.byId(id) ?: return true
widget.position = newPosition
endInteraction()
updateWidget(widget)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
view.performHapticFeedback(HapticFeedbackConstants.GESTURE_END)
}
}
}
}
return true
}
private fun endInteraction() {
synchronized(this) {
longPressHandler.removeCallbacksAndMessages(null)
startWidgetPosition = null
selectedWidgetOverlayView?.mode = null
}
}
override fun onDetachedFromWindow() {
endInteraction()
super.onDetachedFromWindow()
}
override fun updateWidgets(activity: Activity, widgets: Collection<Widget>?) {
super.updateWidgets(activity, widgets)
synchronized(overlayViewById) {
overlayViewById.forEach { removeView(it.value) }
overlayViewById.clear()
widgets?.filter { it.panelId == widgetPanelId }?.forEach { widget ->
WidgetOverlayView(activity).let {
it.widgetId = widget.id
addView(it)
(it.layoutParams as Companion.LayoutParams).position = widget.position
overlayViewById[widget.id] = it
}
}
}
}
}

View file

@ -0,0 +1,137 @@
package de.jrpie.android.launcher.ui.widgets.manage
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu
import androidx.core.graphics.toRectF
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.widgets.Widget
import de.jrpie.android.launcher.widgets.updateWidget
private const val HANDLE_SIZE = 100
private const val HANDLE_EDGE_SIZE = (1.2 * HANDLE_SIZE).toInt()
/**
* An overlay to show configuration options for a widget in [WidgetManagerView]
*/
class WidgetOverlayView : ViewGroup {
private val paint = Paint()
private val handlePaint = Paint()
private val selectedHandlePaint = Paint()
private val popupAnchor = View(context)
var mode: WidgetManagerView.EditMode? = null
class Handle(val mode: WidgetManagerView.EditMode, val position: Rect)
init {
addView(popupAnchor)
setWillNotDraw(false)
handlePaint.style = Paint.Style.STROKE
handlePaint.color = Color.WHITE
handlePaint.strokeWidth = 2f
handlePaint.setShadowLayer(10f,0f,0f, Color.BLACK)
selectedHandlePaint.style = Paint.Style.FILL_AND_STROKE
selectedHandlePaint.setARGB(100, 255, 255, 255)
handlePaint.setShadowLayer(10f,0f,0f, Color.BLACK)
paint.style = Paint.Style.STROKE
paint.color = Color.WHITE
paint.setShadowLayer(10f,0f,0f, Color.BLACK)
}
private var preview: Drawable? = null
var widgetId: Int = -1
set(newId) {
field = newId
preview = Widget.byId(widgetId)?.getPreview(context)
}
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
context,
attrs,
defStyle
)
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
getHandles().forEach {
if (it.mode == mode) {
canvas.drawRoundRect(it.position.toRectF(), 5f, 5f, selectedHandlePaint)
} else {
canvas.drawRoundRect(it.position.toRectF(), 5f, 5f, handlePaint)
}
}
val bounds = getBounds()
canvas.drawRoundRect(bounds.toRectF(), 5f, 5f, paint)
if (mode == null) {
return
}
//preview?.bounds = bounds
//preview?.draw(canvas)
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
popupAnchor.layout(0,0,0,0)
}
fun showPopupMenu() {
val widget = Widget.byId(widgetId)?: return
val menu = PopupMenu(context, popupAnchor)
menu.menu.let {
it.add(
context.getString(R.string.widget_menu_remove)
).setOnMenuItemClickListener { _ ->
Widget.byId(widgetId)?.delete(context)
return@setOnMenuItemClickListener true
}
it.add(
if (widget.allowInteraction) {
context.getString(R.string.widget_menu_disable_interaction)
} else {
context.getString(R.string.widget_menu_enable_interaction)
}
).setOnMenuItemClickListener { _ ->
widget.allowInteraction = !widget.allowInteraction
updateWidget(widget)
return@setOnMenuItemClickListener true
}
}
menu.show()
}
fun getHandles(): List<Handle> {
return listOf(
Handle(WidgetManagerView.EditMode.TOP,
Rect(HANDLE_EDGE_SIZE, 0, width - HANDLE_EDGE_SIZE, HANDLE_SIZE)),
Handle(WidgetManagerView.EditMode.BOTTOM,
Rect(HANDLE_EDGE_SIZE, height - HANDLE_SIZE, width - HANDLE_EDGE_SIZE, height)),
Handle(WidgetManagerView.EditMode.LEFT,
Rect(0, HANDLE_EDGE_SIZE, HANDLE_SIZE, height - HANDLE_EDGE_SIZE)),
Handle(WidgetManagerView.EditMode.RIGHT,
Rect(width - HANDLE_SIZE, HANDLE_EDGE_SIZE, width, height - HANDLE_EDGE_SIZE))
)
}
private fun getBounds(): Rect {
return Rect(0,0, width, height)
}
}

View file

@ -0,0 +1,104 @@
package de.jrpie.android.launcher.ui.widgets.manage
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.PopupMenu
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.RecyclerView
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.updateWidgetPanel
class WidgetPanelsRecyclerAdapter(
val context: Context,
val showMenu: Boolean = false,
val onSelectWidgetPanel: (WidgetPanel) -> Unit
) :
RecyclerView.Adapter<WidgetPanelsRecyclerAdapter.ViewHolder>() {
var widgetPanels = (LauncherPreferences.widgets().customPanels() ?: setOf()).toTypedArray()
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var labelView: TextView = itemView.findViewById(R.id.list_widget_panels_label)
var infoView: TextView = itemView.findViewById(R.id.list_widget_panels_info)
}
override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
viewHolder.labelView.text = widgetPanels[i].label
val numWidgets = widgetPanels[i].getWidgets().size
viewHolder.infoView.text = context.resources.getQuantityString(
R.plurals.widget_panel_number_of_widgets,
numWidgets, numWidgets
)
viewHolder.itemView.setOnClickListener {
onSelectWidgetPanel(widgetPanels[i])
}
if (showMenu) {
viewHolder.itemView.setOnLongClickListener {
showOptionsPopup(
viewHolder,
widgetPanels[i]
)
}
}
}
@Suppress("SameReturnValue")
private fun showOptionsPopup(
viewHolder: ViewHolder,
widgetPanel: WidgetPanel
): Boolean {
//create the popup menu
val popup = PopupMenu(context, viewHolder.labelView)
popup.menu.add(R.string.manage_widget_panels_delete).setOnMenuItemClickListener { _ ->
widgetPanel.delete(context)
true
}
popup.menu.add(R.string.manage_widget_panels_rename).setOnMenuItemClickListener { _ ->
AlertDialog.Builder(context, R.style.AlertDialogCustom).apply {
setNegativeButton(R.string.dialog_cancel) { _, _ -> }
setPositiveButton(R.string.dialog_ok) { dialogInterface, _ ->
var newLabel = (dialogInterface as? AlertDialog)
?.findViewById<EditText>(R.id.dialog_rename_widget_panel_edit_text)
?.text?.toString()
if (newLabel == null || newLabel.isEmpty()) {
newLabel =
(context.getString(R.string.widget_panel_default_name, widgetPanel.id))
}
widgetPanel.label = newLabel
updateWidgetPanel(widgetPanel)
}
setView(R.layout.dialog_rename_widget_panel)
}.create().also { it.show() }.apply {
findViewById<EditText>(R.id.dialog_rename_widget_panel_edit_text)?.let {
it.setText(widgetPanel.label)
it.hint = context.getString(R.string.widget_panel_default_name, widgetPanel.id)
}
}
true
}
popup.show()
return true
}
override fun getItemCount(): Int {
return widgetPanels.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view: View =
LayoutInflater.from(context).inflate(R.layout.list_widget_panels_row, parent, false)
val viewHolder = ViewHolder(view)
return viewHolder
}
}

View file

@ -0,0 +1,130 @@
package de.jrpie.android.launcher.widgets
import android.app.Activity
import android.appwidget.AppWidgetHostView
import android.appwidget.AppWidgetProviderInfo
import android.content.Context
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.util.DisplayMetrics
import android.util.SizeF
import android.view.View
import de.jrpie.android.launcher.Application
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
@SerialName("widget:app")
class AppWidget(
override val id: Int,
override var position: WidgetPosition = WidgetPosition(0,0,1,1),
override var panelId: Int = WidgetPanel.HOME.id,
override var allowInteraction: Boolean = false,
// We keep track of packageName, className and user to make it possible to restore the widget
// on a new device when restoring settings (currently not implemented)
// In normal operation only id and position are used.
val packageName: String? = null,
val className: String? = null,
val user: Int? = null
): Widget() {
constructor(
id: Int,
position: WidgetPosition,
panelId: Int,
widgetProviderInfo: AppWidgetProviderInfo
) :
this(
id,
position,
panelId,
panelId != WidgetPanel.HOME.id,
widgetProviderInfo.provider.packageName,
widgetProviderInfo.provider.className,
widgetProviderInfo.profile.hashCode()
)
/**
* Get the [AppWidgetProviderInfo] by [id].
* If the widget is not installed, use [restoreAppWidgetProviderInfo] instead.
*/
fun getAppWidgetProviderInfo(context: Context): AppWidgetProviderInfo? {
if (id < 0) {
return null
}
return (context.applicationContext as Application).appWidgetManager
.getAppWidgetInfo(id)
}
/**
* Restore the AppWidgetProviderInfo from [user], [packageName] and [className].
* Only use this when the widget is not installed,
* in normal operation use [getAppWidgetProviderInfo] instead.
*/
/*fun restoreAppWidgetProviderInfo(context: Context): AppWidgetProviderInfo? {
return getAppWidgetProviders(context).firstOrNull {
it.profile.hashCode() == user
&& it.provider.packageName == packageName
&& it.provider.className == className
}
}*/
override fun toString(): String {
return "WidgetInfo(id=$id, position=$position, packageName=$packageName, className=$className, user=$user)"
}
override fun createView(activity: Activity): AppWidgetHostView? {
val providerInfo = activity.getAppWidgetManager().getAppWidgetInfo(id) ?: return null
/* TODO: if providerInfo is null, the corresponding app was probably uninstalled.
There does not seem to be a way to recover the widget when the app is installed again,
hence it should be deleted. */
val view = activity.getAppWidgetHost()
.createView(activity, this.id, providerInfo)
val dp = activity.resources.displayMetrics.density
val screenWidth = activity.resources.displayMetrics.widthPixels
val screenHeight = activity.resources.displayMetrics.heightPixels
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val absolutePosition = position.getAbsoluteRect(screenWidth, screenHeight)
view.updateAppWidgetSize(Bundle.EMPTY,
listOf(SizeF(
absolutePosition.width() / dp,
absolutePosition.height() / dp
)))
}
view.setPadding(0,0,0,0)
return view
}
override fun findView(views: Sequence<View>): AppWidgetHostView? {
return views.mapNotNull { it as? AppWidgetHostView }.firstOrNull { it.appWidgetId == id }
}
override fun getIcon(context: Context): Drawable? {
return context.getAppWidgetManager().getAppWidgetInfo(id)?.loadIcon(context, DisplayMetrics.DENSITY_HIGH)
}
override fun getPreview(context: Context): Drawable? {
return context.getAppWidgetManager().getAppWidgetInfo(id)?.loadPreviewImage(context, DisplayMetrics.DENSITY_HIGH)
}
override fun isConfigurable(context: Context): Boolean {
return context.getAppWidgetManager().getAppWidgetInfo(id)?.configure != null
}
override fun configure(activity: Activity, requestCode: Int) {
if (!isConfigurable(activity)) {
return
}
activity.getAppWidgetHost().startAppWidgetConfigureActivityForResult(
activity,
id,
0,
requestCode,
null
)
}
}

View file

@ -0,0 +1,42 @@
package de.jrpie.android.launcher.widgets
import android.app.Activity
import android.content.Context
import android.graphics.drawable.Drawable
import android.view.View
import de.jrpie.android.launcher.ui.widgets.ClockView
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
@SerialName("widget:clock")
class ClockWidget(
override var id: Int,
override var position: WidgetPosition,
override val panelId: Int,
override var allowInteraction: Boolean = true
) : Widget() {
override fun createView(activity: Activity): View {
return ClockView(activity, null, id, panelId)
}
override fun findView(views: Sequence<View>): ClockView? {
return views.mapNotNull { it as? ClockView }.firstOrNull { it.appWidgetId == id }
}
override fun getPreview(context: Context): Drawable? {
return null
}
override fun getIcon(context: Context): Drawable? {
return null
}
override fun isConfigurable(context: Context): Boolean {
return false
}
override fun configure(activity: Activity, requestCode: Int) { }
}

View file

@ -0,0 +1,42 @@
package de.jrpie.android.launcher.widgets
import android.app.Activity
import android.content.Context
import android.graphics.drawable.Drawable
import android.view.View
import de.jrpie.android.launcher.ui.widgets.DebugInfoView
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
@SerialName("widget:debuginfo")
class DebugInfoWidget(
override var id: Int,
override var position: WidgetPosition,
override val panelId: Int,
override var allowInteraction: Boolean = true
) : Widget() {
override fun createView(activity: Activity): View {
return DebugInfoView(activity, null, id)
}
override fun findView(views: Sequence<View>): DebugInfoView? {
return views.mapNotNull { it as? DebugInfoView }.firstOrNull { it.appWidgetId == id }
}
override fun getPreview(context: Context): Drawable? {
return null
}
override fun getIcon(context: Context): Drawable? {
return null
}
override fun isConfigurable(context: Context): Boolean {
return false
}
override fun configure(activity: Activity, requestCode: Int) { }
}

View file

@ -0,0 +1,58 @@
package de.jrpie.android.launcher.widgets
import android.appwidget.AppWidgetProviderInfo
import android.content.Context
import android.graphics.drawable.Drawable
import android.os.Build
import android.util.DisplayMetrics
import androidx.appcompat.content.res.AppCompatResources
import de.jrpie.android.launcher.R
sealed class LauncherWidgetProvider {
abstract fun loadLabel(context: Context): CharSequence?
abstract fun loadPreviewImage(context: Context): Drawable?
abstract fun loadIcon(context: Context): Drawable?
abstract fun loadDescription(context: Context): CharSequence?
}
class LauncherAppWidgetProvider(val info: AppWidgetProviderInfo) : LauncherWidgetProvider() {
override fun loadLabel(context: Context): CharSequence? {
return info.loadLabel(context.packageManager)
}
override fun loadPreviewImage(context: Context): Drawable? {
return info.loadPreviewImage(context, DisplayMetrics.DENSITY_DEFAULT)
}
override fun loadIcon(context: Context): Drawable? {
return info.loadIcon(context, DisplayMetrics.DENSITY_DEFAULT)
}
override fun loadDescription(context: Context): CharSequence? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
info.loadDescription(context)
} else {
null
}
}
}
data object LauncherClockWidgetProvider : LauncherWidgetProvider() {
override fun loadLabel(context: Context): CharSequence {
return context.getString(R.string.widget_clock_label)
}
override fun loadDescription(context: Context): CharSequence {
return context.getString(R.string.widget_clock_description)
}
override fun loadPreviewImage(context: Context): Drawable? {
return null
}
override fun loadIcon(context: Context): Drawable? {
return AppCompatResources.getDrawable(context, R.drawable.baseline_clock_24)
}
}

View file

@ -0,0 +1,63 @@
package de.jrpie.android.launcher.widgets
import android.app.Activity
import android.content.Context
import android.graphics.drawable.Drawable
import android.view.View
import de.jrpie.android.launcher.preferences.LauncherPreferences
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
@Serializable
sealed class Widget {
abstract val id: Int
abstract var position: WidgetPosition
abstract val panelId: Int
abstract var allowInteraction: Boolean
/**
* @param activity The activity where the view will be used. Must not be an AppCompatActivity.
*/
abstract fun createView(activity: Activity): View?
abstract fun findView(views: Sequence<View>): View?
abstract fun getPreview(context: Context): Drawable?
abstract fun getIcon(context: Context): Drawable?
abstract fun isConfigurable(context: Context): Boolean
abstract fun configure(activity: Activity, requestCode: Int)
fun delete(context: Context) {
if (id >= 0) {
context.getAppWidgetHost().deleteAppWidgetId(id)
}
LauncherPreferences.widgets().widgets(
LauncherPreferences.widgets().widgets()?.also {
it.remove(this)
}
)
}
override fun hashCode(): Int {
return id
}
override fun equals(other: Any?): Boolean {
return (other as? Widget)?.id == id
}
fun serialize(): String {
return Json.encodeToString(serializer(), this)
}
companion object {
fun deserialize(serialized: String): Widget {
return Json.decodeFromString(serialized)
}
fun byId(id: Int): Widget? {
// TODO: do some caching
return LauncherPreferences.widgets().widgets().firstOrNull {
it.id == id
}
}
}
}

View file

@ -0,0 +1,64 @@
package de.jrpie.android.launcher.widgets
import android.content.Context
import de.jrpie.android.launcher.preferences.LauncherPreferences
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
@Serializable
@SerialName("panel")
class WidgetPanel(val id: Int, var label: String) {
override fun equals(other: Any?): Boolean {
return (other as? WidgetPanel)?.id == id
}
override fun hashCode(): Int {
return id
}
fun serialize(): String {
return Json.encodeToString(this)
}
fun delete(context: Context) {
LauncherPreferences.widgets().customPanels(
(LauncherPreferences.widgets().customPanels() ?: setOf()).minus(this)
)
(LauncherPreferences.widgets().widgets() ?: return)
.filter { it.panelId == this.id }.forEach { it.delete(context) }
}
fun getWidgets(): List<Widget> {
return LauncherPreferences.widgets().widgets().filter {
it.panelId == this.id
}
}
companion object {
val HOME = WidgetPanel(0, "home")
fun byId(id: Int): WidgetPanel? {
if (id == 0) {
return HOME
}
return LauncherPreferences.widgets().customPanels()?.firstOrNull { it.id == id }
}
fun allocateId(): Int {
return (
(LauncherPreferences.widgets().customPanels() ?: setOf())
.plus(HOME)
.maxOfOrNull { it.id } ?: 0
) + 1
}
fun deserialize(serialized: String): WidgetPanel {
return Json.decodeFromString(serialized)
}
}
}

View file

@ -0,0 +1,102 @@
package de.jrpie.android.launcher.widgets
import android.graphics.Rect
import kotlinx.serialization.Serializable
import kotlin.math.ceil
import kotlin.math.roundToInt
import kotlin.math.max
const val GRID_SIZE: Short = 12
@Serializable
data class WidgetPosition(var x: Short, var y: Short, var width: Short, var height: Short) {
constructor(rect: Rect) : this(
rect.left.toShort(),
rect.top.toShort(),
(rect.right - rect.left).toShort(),
(rect.bottom - rect.top).toShort()
)
fun toRect(): Rect {
return Rect(x.toInt(), y.toInt(), x + width, y + height)
}
fun getAbsoluteRect(screenWidth: Int, screenHeight: Int): Rect {
val gridWidth = screenWidth / GRID_SIZE.toFloat()
val gridHeight = screenHeight / GRID_SIZE.toFloat()
return Rect(
(x * gridWidth).toInt(),
(y * gridHeight).toInt(),
((x + width) * gridWidth).toInt(),
((y + height) * gridHeight).toInt()
)
}
companion object {
fun fromAbsoluteRect(absolute: Rect, screenWidth: Int, screenHeight: Int): WidgetPosition {
val gridWidth = screenWidth / GRID_SIZE.toFloat()
val gridHeight = screenHeight / GRID_SIZE.toFloat()
val x = (absolute.left / gridWidth).roundToInt().toShort()
.coerceIn(0, (GRID_SIZE - 1).toShort())
val y = (absolute.top / gridHeight).roundToInt().toShort()
.coerceIn(0, (GRID_SIZE - 1).toShort())
val w = max(2, ((absolute.right - absolute.left) / gridWidth).roundToInt()).toShort()
val h = max(2, ((absolute.bottom - absolute.top) / gridHeight).roundToInt()).toShort()
return WidgetPosition(x, y, w, h)
}
fun center(
minWidth: Int,
minHeight: Int,
screenWidth: Int,
screenHeight: Int
): WidgetPosition {
val gridWidth = screenWidth / GRID_SIZE.toFloat()
val gridHeight = screenHeight / GRID_SIZE.toFloat()
val cellsWidth = ceil(minWidth / gridWidth).toInt().toShort()
val cellsHeight = ceil(minHeight / gridHeight).toInt().toShort()
return WidgetPosition(
((GRID_SIZE - cellsWidth) / 2).toShort(),
((GRID_SIZE - cellsHeight) / 2).toShort(),
cellsWidth,
cellsHeight
)
}
fun findFreeSpace(
widgetPanel: WidgetPanel?,
minWidth: Int,
minHeight: Int
): WidgetPosition {
val rect = Rect(0, 0, minWidth, minHeight)
if (widgetPanel == null) {
return WidgetPosition(rect)
}
val widgets = widgetPanel.getWidgets().map { it.position.toRect() }
for (x in 0..<GRID_SIZE - minWidth) {
rect.left = x
rect.right = x + minWidth
for (y in 0..<GRID_SIZE - minHeight) {
rect.top = y
rect.bottom = y + minHeight
if (!widgets.any { Rect(it).intersect(rect) }) {
return WidgetPosition(rect)
}
}
}
return WidgetPosition(0, 0, minWidth.toShort(), minHeight.toShort())
}
}
}

View file

@ -0,0 +1,95 @@
package de.jrpie.android.launcher.widgets
import android.app.Activity
import android.app.Service
import android.appwidget.AppWidgetHost
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProviderInfo
import android.content.Context
import android.content.Intent
import android.content.pm.LauncherApps
import android.os.Build
import android.os.UserManager
import android.util.Log
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.preferences.LauncherPreferences
import kotlin.math.min
/**
* Tries to bind [providerInfo] to the id [id].
* @param providerInfo The widget to be bound.
* @param id The id to bind the widget to. If -1 is provided, a new id is allocated.
* @param
* @param requestCode Used to start an activity to request permission to bind the widget.
*
* @return true iff the app widget was bound successfully.
*/
fun bindAppWidgetOrRequestPermission(activity: Activity, providerInfo: AppWidgetProviderInfo, appWidgetId: Int, requestCode: Int? = null): Boolean {
Log.i("Launcher", "Binding new widget $appWidgetId")
if (!activity.getAppWidgetManager().bindAppWidgetIdIfAllowed(
appWidgetId,
providerInfo.provider
)
) {
Log.i("Widgets", "requesting permission for widget")
val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply {
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId)
putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, providerInfo.provider)
}
activity.startActivityForResult(intent, requestCode ?: 0)
return false
}
return true
}
fun getAppWidgetProviders( context: Context ): List<LauncherWidgetProvider> {
val list = mutableListOf<LauncherWidgetProvider>(LauncherClockWidgetProvider)
val appWidgetManager = context.getAppWidgetManager()
val profiles =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
(context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps).profiles
} else {
(context.getSystemService(Service.USER_SERVICE) as UserManager).userProfiles
}
list.addAll(
profiles.map { profile ->
appWidgetManager.getInstalledProvidersForProfile(profile)
.map { LauncherAppWidgetProvider(it) }
}.flatten()
)
return list
}
fun updateWidget(widget: Widget) {
LauncherPreferences.widgets().widgets(
(LauncherPreferences.widgets().widgets() ?: setOf())
.minus(widget)
.plus(widget)
)
}
// TODO: this needs to be improved
fun generateInternalId(): Int {
val minId = min(-5,(LauncherPreferences.widgets().widgets() ?: setOf()).minOfOrNull { it.id } ?: 0)
return minId -1
}
fun updateWidgetPanel(widgetPanel: WidgetPanel) {
LauncherPreferences.widgets().customPanels(
(LauncherPreferences.widgets().customPanels() ?: setOf())
.minus(widgetPanel)
.plus(widgetPanel)
)
}
fun Context.getAppWidgetHost(): AppWidgetHost {
return (this.applicationContext as Application).appWidgetHost
}
fun Context.getAppWidgetManager(): AppWidgetManager {
return (this.applicationContext as Application).appWidgetManager
}

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?android:textColor"
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" />
</vector>

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?android:textColor"
android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" />
</vector>

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?android:textColor"
android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z" />
</vector>

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?android:textColor"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" />
<path
android:fillColor="?android:textColor"
android:pathData="M12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z" />
</vector>

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?android:textColor"
android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" />
</vector>

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?android:textColor"
android:pathData="M13,13v8h8v-8h-8zM3,21h8v-8L3,13v8zM3,3v8h8L11,3L3,3zM16.66,1.69L11,7.34 16.66,13l5.66,-5.66 -5.66,-5.65z" />
</vector>

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:longClickable="false"
android:fitsSystemWindows="true"
tools:context=".ui.HomeActivity">
<de.jrpie.android.launcher.ui.widgets.WidgetContainerView
android:id="@+id/home_widget_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- only shown when µLauncher settings can't be reached by a gesture -->
<ImageView
android:id="@+id/button_fallback_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/settings"
android:visibility="gone"
tools:visibility="visible"
android:padding="20dp"
android:alpha="0.4"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/baseline_settings_24"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.widgets.manage.ManageWidgetPanelsActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/manage_widget_panels_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
app:elevation="0dp"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/manage_widget_panels_heading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:minHeight="?actionBarSize"
android:padding="@dimen/appbar_padding"
android:text="@string/widget_panels_title"
android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/manage_widget_panels_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
android:paddingRight="16sp"
android:src="@drawable/baseline_close_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/manage_widget_panels_recycler"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/manage_widget_panels_appbar" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/manage_widget_panels_add_panel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:contentDescription="@string/content_description_add_widget_panel"
android:src="@drawable/baseline_add_24"
app:layout_anchor="@+id/manage_widget_panels_recycler"
app:layout_anchorGravity="end|bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.widgets.manage.ManageWidgetsActivity">
<de.jrpie.android.launcher.ui.widgets.manage.WidgetManagerView
android:id="@+id/manage_widgets_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/manage_widgets_button_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:clickable="true"
android:contentDescription="@string/content_description_add_widget"
android:focusable="true"
android:src="@drawable/baseline_add_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -44,6 +44,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"

View file

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.ReportCrashActivity">
<com.google.android.material.appbar.AppBarLayout
android:background="@null"
app:elevation="0dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/report_crash_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.appbar.AppBarLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<de.jrpie.android.launcher.ui.util.HtmlTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crash_info" />
<Button
android:id="@+id/report_crash_button_copy"
android:text="@string/report_crash_button_copy"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Space
android:layout_width="match_parent"
android:layout_height="20dp" />
<Button
android:id="@+id/report_crash_button_mail"
android:text="@string/report_crash_button_mail"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/report_crash_button_report"
android:text="@string/report_crash_button_report"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/select_widget_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.widgets.manage.SelectWidgetActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/select_widget_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:background="@null"
app:elevation="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/select_widget_heading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:minHeight="?actionBarSize"
android:padding="@dimen/appbar_padding"
android:text="@string/select_widget_title"
android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"
android:textSize="30sp"
app:layout_constraintEnd_toStartOf="@id/select_widget_close"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/select_widget_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
android:paddingRight="16sp"
android:src="@drawable/baseline_close_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/select_widget_recycler"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:scrollbars="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/select_widget_appbar" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:longClickable="false"
tools:context=".ui.widgets.WidgetPanelActivity">
<de.jrpie.android.launcher.ui.widgets.WidgetContainerView
android:id="@+id/widget_panel_widget_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -24,6 +24,21 @@
android:layout_width="match_parent"
android:layout_height="10dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/dialog_select_color_alpha" />
<SeekBar
android:id="@+id/dialog_select_color_seekbar_alpha"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="255" />
<Space
android:layout_width="match_parent"
android:layout_height="10dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -65,18 +80,4 @@
android:layout_height="wrap_content"
android:max="255" />
<Space
android:layout_width="match_parent"
android:layout_height="10dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/dialog_select_color_alpha" />
<SeekBar
android:id="@+id/dialog_select_color_seekbar_alpha"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="255" />
</LinearLayout>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/AlertDialogCustom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/dialog_create_widget_panel_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:importantForAutofill="no"
android:inputType="text"
tools:ignore="LabelFor" />
</LinearLayout>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/AlertDialogCustom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/dialog_rename_widget_panel_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:importantForAutofill="no"
android:inputType="text"
tools:ignore="LabelFor" />
</LinearLayout>

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/dialog_select_widget_panel_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dialog_select_widget_panel_info_no_panels"
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/dialog_select_widget_panel_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1" />
</LinearLayout>

View file

@ -62,6 +62,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
@ -72,6 +73,7 @@
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/list_lock"
android:contentDescription="@string/content_description_lock"
android:visibility="gone"
tools:visibility="visible"
android:layout_width="wrap_content"
@ -91,7 +93,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="?attr/colorAccent"
custom:tabTextColor="?attr/android:textColor" />
custom:tabTextColor="?attr/android:textColor"
tools:ignore="SpeakableTextPresentCheck" />
</com.google.android.material.appbar.AppBarLayout>
@ -110,6 +113,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/list_appbar"
app:layout_constraintVertical_bias="0.0"
custom:layout_behavior="@string/appbar_scrolling_view_behavior" />
custom:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:ignore="SpeakableTextPresentCheck" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -27,6 +27,8 @@
android:text=""
android:textSize="11sp"
tools:text="@string/app_name"
android:ellipsize="end"
android:lines="1"
app:layout_constraintTop_toBottomOf="@id/list_apps_row_icon"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View file

@ -11,6 +11,7 @@
android:id="@+id/list_other_row_icon"
android:layout_width="35sp"
android:layout_height="35sp"
android:contentDescription="@null"
android:gravity="center"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_widget_panels_row_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15sp">
<TextView
android:id="@+id/list_widget_panels_label"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="60sp"
android:layout_marginEnd="5dp"
android:gravity="start"
android:text=""
tools:text="Panel #1"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/list_widget_panels_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="60sp"
android:layout_marginEnd="5dp"
android:gravity="start"
android:text=""
tools:text="Contains 5 widgets"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/list_widget_panels_label" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_apps_row_container"
android:background="@color/cardview_dark_background"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15sp">
<ImageView
android:id="@+id/list_widgets_header_icon"
android:layout_width="40dp"
android:layout_height="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:src="@mipmap/ic_launcher_round"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/list_widgets_header_app_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="20sp"
android:gravity="start"
android:text=""
android:textSize="20sp"
tools:text="some widget"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/list_widgets_header_icon"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_apps_row_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="30sp">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardBackgroundColor="?cardBackgroundColor"
app:cardElevation="8dp"
app:cardCornerRadius="12dp"
app:cardUseCompatPadding="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/icon_title_description_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/list_widgets_row_icon"
android:layout_width="40dp"
android:layout_height="40dp"
tools:src="@mipmap/ic_launcher_round"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/list_widgets_row_name"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginStart="10sp"
android:layout_marginEnd="10sp"
android:text=""
style="@style/TextAppearance.Material3.HeadlineSmall"
tools:text="Some Widget"
app:layout_constraintStart_toEndOf="@id/list_widgets_row_icon"
app:layout_constraintTop_toTopOf="@id/list_widgets_row_icon"
app:layout_constraintBottom_toBottomOf="@id/list_widgets_row_icon"/>
<TextView
android:id="@+id/list_widgets_row_description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text=""
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/list_widgets_row_name"
app:layout_constraintTop_toBottomOf="@+id/list_widgets_row_name"
tools:text="A longer description of the widget that may take up multiple lines." />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/icon_title_description_container">
<ImageView
android:id="@+id/list_widgets_row_preview"
android:layout_width="match_parent"
android:layout_height="100dp"
android:maxHeight="100dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/list_widgets_row_icon"
tools:src="@mipmap/ic_launcher_round"
tools:ignore="ContentDescription,NotSibling" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -20,6 +20,22 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/settings_system"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:contentDescription="@string/settings"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
android:paddingRight="16sp"
android:src="@drawable/baseline_settings_applications_24"
custom:layout_constraintBottom_toBottomOf="parent"
custom:layout_constraintStart_toStartOf="parent"
custom:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/settings_heading"
android:layout_width="wrap_content"
@ -40,6 +56,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
@ -48,28 +65,14 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/settings_system"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
android:paddingRight="16sp"
android:src="@drawable/baseline_settings_applications_24"
custom:layout_constraintBottom_toBottomOf="parent"
custom:layout_constraintStart_toStartOf="parent"
custom:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/settings_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabTextColor="?attr/android:textColor" />
app:tabTextColor="?attr/android:textColor"
tools:ignore="SpeakableTextPresentCheck" />
</com.google.android.material.appbar.AppBarLayout>

View file

@ -43,13 +43,15 @@
android:id="@+id/settings_actions_row_button_choose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:maxWidth="100dp"
android:text="@string/settings_apps_choose"
android:textAllCaps="false"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/settings_actions_row_icon_img"
@ -66,6 +68,7 @@
android:id="@+id/settings_actions_row_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/content_description_settings_actions_row_button_remove"
android:padding="8sp"
android:src="@drawable/baseline_close_24"
app:layout_constraintBottom_toBottomOf="parent"

View file

@ -41,6 +41,13 @@
android:text="@string/settings_meta_view_code"
android:textAllCaps="false" />
<Button
android:id="@+id/settings_meta_button_view_docs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/settings_meta_view_docs"
android:textAllCaps="false" />
<Button
android:id="@+id/settings_meta_button_report_bug"
android:layout_width="match_parent"

View file

@ -26,6 +26,7 @@
android:id="@+id/tutorial_button_back"
android:layout_width="50dp"
android:layout_height="50dp"
android:contentDescription="@string/content_description_navigate_back"
android:gravity="center"
android:alpha="0.5"
android:src="@drawable/baseline_navigate_before_24"
@ -43,12 +44,14 @@
app:layout_constraintStart_toEndOf="@+id/tutorial_button_back"
app:tabBackground="@drawable/tutorial_tab_selector"
app:tabGravity="center"
app:tabIndicatorHeight="0dp" />
app:tabIndicatorHeight="0dp"
tools:ignore="SpeakableTextPresentCheck" />
<ImageView
android:id="@+id/tutorial_button_next"
android:layout_width="50dp"
android:layout_height="50dp"
android:contentDescription="@string/content_description_navigate_next"
android:gravity="center"
android:src="@drawable/baseline_navigate_next_24"
app:layout_constraintBottom_toBottomOf="parent"

View file

@ -33,17 +33,27 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tutorial_setup_title" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/tutorial_setup_actions_rview_fragment"
android:name="de.jrpie.android.launcher.ui.settings.actions.SettingsFragmentActionsRecycler"
android:layout_width="0dp"
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:layout_marginBottom="16dp"
app:cardElevation="8dp"
app:cardBackgroundColor="?cardBackgroundColor"
app:cardCornerRadius="12dp"
app:cardUseCompatPadding="true"
app:layout_constraintTop_toBottomOf="@id/tutorial_setup_subtitle"
app:layout_constraintBottom_toTopOf="@id/tutorial_setup_text_bottom"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tutorial_setup_subtitle" />
app:layout_constraintEnd_toEndOf="parent">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/tutorial_setup_actions_rview_fragment"
android:name="de.jrpie.android.launcher.ui.settings.actions.SettingsFragmentActionsRecycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginVertical="4dp"
android:layout_marginStart="10dp"/>
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/tutorial_setup_text_bottom"

View file

@ -3,15 +3,14 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:longClickable="false"
android:fitsSystemWindows="true"
tools:context=".ui.HomeActivity">
tools:context=".ui.widgets.ClockView">
<TextClock
android:id="@+id/home_upper_view"
android:id="@+id/clock_upper_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
@ -20,32 +19,17 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.45"
tools:text="2024-12-24" />
<TextClock
android:id="@+id/home_lower_view"
android:id="@+id/clock_lower_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:textSize="18sp"
tools:text="18:00:00"
app:layout_constraintTop_toBottomOf="@+id/home_upper_view"
app:layout_constraintTop_toBottomOf="@+id/clock_upper_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<!-- only shown when µLauncher settings can't be reached by a gesture -->
<ImageView
android:id="@+id/button_fallback_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/settings"
android:visibility="gone"
tools:visibility="visible"
android:padding="20dp"
android:alpha="0.4"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/baseline_settings_24"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:longClickable="false"
android:fitsSystemWindows="true"
tools:context=".ui.widgets.DebugInfoView">
<TextView
android:id="@+id/debugInfoText"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,341 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="alert_cant_open_title">لا يمكن فتح التطبيق</string>
<string name="alert_cant_open_message">هل تريد تعديل اعداداته؟</string>
<string name="toast_cant_open_message">افتح الاعدادات لاختيار أمر لهذه الإيماءة</string>
<string name="settings_title">الاعدادات</string>
<string name="settings_tab_actions">الأوامر</string>
<string name="settings_tab_launcher">المشغل</string>
<string name="settings_tab_meta">بيانات</string>
<string name="settings_gesture_back">رجوع</string>
<string name="settings_gesture_up">أعلى</string>
<string name="settings_gesture_double_up">لأعلى بأصبعين</string>
<string name="settings_gesture_description_double_up">اسحب لأعلى بأصبعين</string>
<string name="settings_gesture_description_tap_up">أنقر ثم اسحب لأعلى</string>
<string name="settings_gesture_description_back">اضغط على زر الرجوع</string>
<string name="settings_gesture_description_up">اسحب لأعلى</string>
<string name="settings_gesture_tap_up">نقرة + أعلى</string>
<string name="settings_gesture_down">أسفل</string>
<string name="settings_gesture_description_down">اسحب لأسفل</string>
<string name="settings_gesture_tap_down">نقرة + لأسفل</string>
<string name="settings_gesture_double_down">لأسفل بأصبعين</string>
<string name="settings_gesture_left">يسار</string>
<string name="settings_gesture_description_left">اسحب من اليسار</string>
<string name="settings_gesture_tap_left">نقرة + يسار</string>
<string name="settings_gesture_description_tap_left">أنقر ثم اسحب إلى اليسار</string>
<string name="settings_gesture_double_left">يسار بأصبعين</string>
<string name="settings_gesture_right">يمين</string>
<string name="settings_gesture_description_right">اسحب إلى اليمين</string>
<string name="settings_gesture_tap_right">نقرة + يمين</string>
<string name="settings_gesture_description_tap_right">أنقر ثم اسحب إلى اليمين</string>
<string name="settings_gesture_double_right">يمين بأصبعين</string>
<string name="settings_gesture_description_double_right">اسحب إلى اليمين بأصبعين</string>
<string name="settings_gesture_right_top_edge">يمين (في الأعلى)</string>
<string name="settings_gesture_right_bottom_edge">يمين (في الأسفل)</string>
<string name="settings_gesture_description_right_bottom_edge">اسحب إلى اليمين من أسفل الشاشة</string>
<string name="settings_gesture_left_top_edge">يسار (في الأعلى)</string>
<string name="settings_gesture_description_left_top_edge">اسحب إلى اليسار من أعلى الشاشة</string>
<string name="settings_gesture_up_left_edge">أعلى (الحافة اليسرى)</string>
<string name="settings_gesture_description_up_left_edge">اسحب إلى الأعلى من حافة الشاشة اليسرى</string>
<string name="settings_gesture_up_right_edge">أعلى (الحافة اليمنى)</string>
<string name="settings_gesture_down_left_edge">أسفل (الحافة اليسرى)</string>
<string name="settings_gesture_description_down_left_edge">اسحب إلى الأسفل من حافة الشاشة اليسرى</string>
<string name="settings_gesture_down_right_edge">أسفل (الحافة اليمنى)</string>
<string name="settings_gesture_description_swipe_larger">أعلى اليسار -&gt; وسط اليمين -&gt; أسفل اليسار</string>
<string name="settings_gesture_description_swipe_larger_reverse">أسفل اليسار -&gt; وسط اليمين -&gt; أعلى اليسار</string>
<string name="settings_gesture_description_swipe_smaller">أعلى اليمين -&gt; وسط اليسار -&gt; أسفل اليمين</string>
<string name="settings_gesture_description_swipe_v">أعلى اليسار -&gt; الأسفل الوسط -&gt; أعلى اليمين</string>
<string name="settings_gesture_swipe_v_reverse">V (معكوس)</string>
<string name="settings_gesture_description_swipe_v_reverse">أعلى اليمين -&gt; الأسفل الوسط -&gt; أعلى اليسار</string>
<string name="settings_gesture_description_swipe_lambda">أسفل اليسار -&gt; أعلى الوسط -&gt; أسفل اليمين</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (معكوس)</string>
<string name="settings_gesture_vol_up">زر رفع الصوت</string>
<string name="settings_gesture_description_vol_up">اضغط على زر رفع الصوت</string>
<string name="settings_gesture_vol_down">زر خفض الصوت</string>
<string name="settings_gesture_description_vol_down">اضغط على زر خفض الصوت</string>
<string name="settings_gesture_double_click">نقرة مزدوجة</string>
<string name="settings_gesture_long_click">نقرة مطولة</string>
<string name="settings_gesture_description_long_click">أنقر مطولًا في مكان فارغ على الشاشة</string>
<string name="settings_gesture_date">التاريخ</string>
<string name="settings_gesture_description_date">أنقر على التاريخ</string>
<string name="settings_gesture_time">الوقت</string>
<string name="settings_gesture_description_time">أنقر على الوقت</string>
<string name="settings_apps_choose">اختر تطبيق</string>
<string name="settings_apps_install">ثبت تطبيقات</string>
<string name="settings_launcher_section_appearance">المظهر</string>
<string name="settings_theme_color_theme">السمة</string>
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (معكوس)]]></string>
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (Reverse)]]></string>
<string name="settings_gesture_swipe_v">V</string>
<string name="settings_gesture_swipe_lambda">Λ</string>
<string name="settings_theme_color_theme_item_dark">داكن</string>
<string name="settings_theme_color_theme_item_light">فاتح</string>
<string name="settings_theme_color_theme_item_dynamic">متغير</string>
<string name="settings_theme_text_shadow">ظل النص</string>
<string name="settings_theme_background_item_transparent">شفاف</string>
<string name="settings_theme_background_item_dim">مظلل</string>
<string name="settings_theme_background_item_blur">مُموه</string>
<string name="settings_theme_background_item_solid">لون ثابت</string>
<string name="settings_theme_font">الخط</string>
<string name="settings_theme_font_item_system_default">خط النظام</string>
<string name="settings_theme_font_item_sans_serif">بدون تذييل</string>
<string name="settings_theme_font_item_serif">مذيل</string>
<string name="settings_theme_font_item_monospace">أحادي المسافة</string>
<string name="settings_theme_monochrome_icons">أيقونات تطبيقات أحادية اللون</string>
<string name="settings_clock_color">اللون</string>
<string name="settings_clock_time_visible">أظهر الوقت</string>
<string name="settings_clock_date_visible">أظهر التاريخ</string>
<string name="settings_clock_localized">استخدم تنسيق التاريخ المحلي</string>
<string name="settings_clock_flip_date_time">إقلب مكان التاريخ مع الوقت</string>
<string name="settings_theme_wallpaper">اختر خلفية</string>
<string name="settings_launcher_section_display">العرض</string>
<string name="settings_display_screen_timeout_disabled">حافظ على بقاء الشاشة قيد التشغيل</string>
<string name="settings_display_hide_status_bar">إخفِ شريط الحالة</string>
<string name="settings_display_rotate_screen">تدوير الشاشة</string>
<string name="settings_launcher_section_functionality">الوظائف</string>
<string name="settings_enabled_gestures_double_swipe">إيماءات التمرير المزدوج</string>
<string name="settings_enabled_gestures_double_swipe_summary">اسحب باستخدام أصبعين</string>
<string name="settings_enabled_gestures_edge_swipe">إيماءات تمرير الحافة</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">عرض الحواف</string>
<string name="settings_functionality_auto_launch">إظهار نتائج البحث</string>
<string name="settings_functionality_auto_launch_summary">اضغط مسافة لتعطيل هذه الميزة مؤقتًا</string>
<string name="settings_functionality_search_web">ابحث في الويب</string>
<string name="settings_functionality_auto_keyboard">أظهر لوحة المفاتيح عند البحث</string>
<string name="settings_launcher_sensitivity">الحساسية</string>
<string name="settings_launcher_section_apps">التطبيقات</string>
<string name="settings_apps_hidden">التطبيقات المخفية</string>
<string name="settings_launcher_section_date_time"><![CDATA[Date & time]]></string>
<string name="settings_apps_hide_private_space_apps">إخفِ المساحة الخاصة من قائمة التطبيقات</string>
<string name="settings_list_layout">تخطيط قائمة التطبيقات</string>
<string name="settings_list_layout_item_default">الافتراضي</string>
<string name="settings_list_layout_item_text">نص</string>
<string name="settings_list_layout_item_grid">شبكة</string>
<string name="settings_general_choose_home_screen">تعيين μauncher كشاشة المنزل</string>
<string name="settings_meta_cant_select_launcher">معلومات التطبيق</string>
<string name="settings_meta_reset">إعادة تعيين الإعدادات</string>
<string name="settings_meta_reset_confirm">أنت على وشك تجاهل كل تفضيلاتك، هل تريد الإكمال؟</string>
<string name="settings_meta_view_code">عرض شيفرة المصدر</string>
<string name="settings_meta_report_bug">الإبلاغ عن خطأ</string>
<string name="dialog_report_bug_button_clipboard">النسخ إلى الحافظة</string>
<string name="dialog_report_bug_security_info">يرجى عدم الإبلاغ عن الثغرات الأمنية علنًا على Github ، استخدم ما يلي بدلاً من ذلك:</string>
<string name="dialog_report_bug_button_security">الإبلاغ عن ثغرة أمنية</string>
<string name="dialog_report_bug_create_report">إنشاء تقرير</string>
<string name="settings_meta_fork_contact">اتصل بمطور النسخة</string>
<string name="settings_meta_join_chat">انضم إلى دردشة μauncher</string>
<string name="settings_meta_donate">تبرع</string>
<string name="settings_meta_privacy">سياسة الخصوصية</string>
<string name="list_title_view">كل التطبيقات</string>
<string name="list_title_favorite">التطبيقات المفضلة</string>
<string name="list_title_hidden">التطبيقات المخفية</string>
<string name="list_title_private_space">المساحة الخاصة</string>
<string name="list_title_pick">اختر تطبيق</string>
<string name="list_tab_app">التطبيقات</string>
<string name="list_tab_other">أخرى</string>
<string name="list_app_delete">إلغاء التثبيت</string>
<string name="list_app_favorite_remove">إزالة من المفضلة</string>
<string name="list_app_hidden_add">إخفِ</string>
<string name="list_app_hidden_remove">أظهر</string>
<string name="list_app_rename">إعادة التسمية</string>
<string name="list_apps_search_hint">بحث</string>
<string name="list_apps_search_hint_no_auto_launch">بحث (بدون تشغيل تلقائي)</string>
<string name="list_other_settings">اعدادات التطبيق</string>
<string name="list_other_list">درج التطبيقات</string>
<string name="list_other_list_private_space">المساحة الخاصة</string>
<string name="list_other_toggle_private_space_lock">تبديل قفل المساحة الخاصة</string>
<string name="list_other_volume_up">ارفع الصوت</string>
<string name="settings_meta_discord">إنضم إلى مجموعة discord!</string>
<string name="list_other_volume_adjust">ضبط مستوى الصوت</string>
<string name="list_other_track_previous">الموسيقى: السابق</string>
<string name="list_other_track_play_pause">الموسيقى: تشغيل / ايقاف مؤقت</string>
<string name="list_other_recent_apps">التطبيقات الحديثة</string>
<string name="list_other_nop">لا تفعل شيئًا</string>
<string name="list_other_lock_screen">قفل الشاشة</string>
<string name="list_other_torch">تبديل الفلاش</string>
<string name="list_other_launch_other_launcher">تشغيل شاشة رئيسية أخرى</string>
<string name="pin_shortcut_title">أضف اختصارًا</string>
<string name="pin_shortcut_button_bind">اربط بإيماءة</string>
<string name="tutorial_title">درس تعليمي</string>
<string name="tutorial_start_text">👋\n\nخذ بضع ثوان لمعرفة كيفية استخدام هذا المشغل!</string>
<string name="tutorial_concept_title">المفهوم</string>
<string name="tutorial_concept_text_2">إنه برنامج مجاني (ترخيص MIT)!\nتأكد من مراجعة المستودع!</string>
<string name="tutorial_concept_label_version">النسخة</string>
<string name="tutorial_usage_title">الاستخدام</string>
<string name="tutorial_usage_text">تحتوي شاشة المنزل الخاصة بك على التاريخ والوقت المحليين. بدون أي مشتتات.</string>
<string name="tutorial_app_list_title">كل التطبيقات</string>
<string name="tutorial_app_list_text_2">بمجرد تطابق تطبيق واحد فقط، يتم تشغيله تلقائيًا.\nيمكن تعطيل ذلك عن طريق اضافة مساحة في بداية استعلام.</string>
<string name="tutorial_setup_title">الإعداد</string>
<string name="tutorial_setup_text">اخترنا لك بعض التطبيقات الافتراضية. يمكنك تغييرها الآن إذا كنت ترغب في ذلك:</string>
<string name="tutorial_setup_text_2">يمكنك أيضًا تغيير اختيارك لاحقًا.</string>
<string name="tutorial_finish_title">لنبدأ!</string>
<string name="tutorial_finish_button">ابدأ</string>
<string name="settings">الإعدادات</string>
<string name="ic_menu_alt">المزيد من الخيارات</string>
<string name="alert_requires_android_m">هذه الوظيفة تتطلب أندرويد 6 أو أحدث.</string>
<string name="alert_requires_android_v">هذه الوظيفة تتطلب أندرويد 15 أو أحدث.</string>
<string name="undo">تراجع</string>
<string name="snackbar_app_hidden">تم إخفاء التطبيق. يمكنك جعله مرئيًا مرة أخرى في الإعدادات.</string>
<string name="list_other_expand_settings_panel">الاعدادات السريعة</string>
<string name="toast_device_admin_not_enabled">يجب أن يكون μlauncher مسؤولًا من أجل قفل الشاشة.</string>
<string name="device_admin_explanation">هذا مطلوب لإجراء شاشة القفل.</string>
<string name="device_admin_description">تمكين إجراء شاشة القفل</string>
<string name="alert_no_torch_found">لم يتم اكتشاف كاميرا مع فلاش.</string>
<string name="alert_torch_access_exception">خطأ: لا يمكن الوصول إلى الفلاش.</string>
<string name="alert_recent_apps_failed">خطأ: فشل في إظهار التطبيقات الحديثة. (إذا قمت للتو بترقية التطبيق ، فحاول تعطيل خدمة الوصول وإعادة تمكينها في إعدادات الهاتف)</string>
<string name="alert_enable_accessibility_failed">خطأ: فشل في تمكين خدمة الوصول.</string>
<string name="toast_accessibility_service_not_enabled">لم يتم تمكين خدمة الوصول إلى μlauncher. يرجى تمكينه في الإعدادات</string>
<string name="toast_private_space_locked">المساحة الخاصة مقفلة</string>
<string name="toast_private_space_unlocked">المساحة الخاصة مفتوحة</string>
<string name="toast_private_space_not_available">المساحة الخاصة غير متوافرة</string>
<string name="tooltip_lock_private_space">قفل المساحة الخاصة</string>
<string name="tooltip_unlock_private_space">فتح المساحة الخاصة</string>
<string name="accessibility_service_name">μLauncher</string>
<string name="screen_lock_method_dialog_title">اختر طريقة القفل</string>
<string name="screen_lock_method_use_accessibility">استخدام خدمة إمكانية الوصول</string>
<string name="screen_lock_method_use_device_admin">استخدم مسؤول الجهاز</string>
<string name="settings_actions_lock_method">اختر طريقة لقفل الشاشة</string>
<string name="dialog_rename_title">اعادة تسمية %1$s</string>
<string name="dialog_select_color_red">أحمر</string>
<string name="dialog_select_color_alpha">شفافية</string>
<string name="dialog_select_color_blue">أزرق</string>
<string name="dialog_select_color_green">أخضر</string>
<string name="dialog_select_color_color_hex">اللون</string>
<string name="dialog_choose_color_title">اختر لونًا</string>
<string name="dialog_consent_accessibility_privileges">أدرك أن هذا سيمنح أذونات كثيرة لـμauncher.</string>
<string name="dialog_consent_accessibility_other_options">أدرك وجود خيارات أخرى (باستخدام أذونات مسؤول الجهاز أو زر الطاقة).</string>
<string name="dialog_consent_accessibility_consent">أوافق لـμlauncher باستخدام خدمة إمكانية الوصول لتوفير الوظائف ليس لها صلة بإمكانية الوصول.</string>
<string name="dialog_consent_accessibility_data_collection">أوافق على أن μlauncher لا يجمع أي بيانات.</string>
<string name="dialog_consent_accessibility_title">يتم تفعيل خدمة إمكانية الوصول</string>
<string name="dialog_consent_accessibility_ok">تفعيل خدمة إمكانية الوصول</string>
<string name="dialog_cancel">إلغاء</string>
<string name="settings_meta_licenses">تراخيص المصادر المفتوحة</string>
<string name="legal_info_title">تراخيص المصادر المفتوحة</string>
<string name="toast_activity_not_found_search_web">لم يتم العثور على تطبيق للتعامل مع البحث.</string>
<string name="toast_activity_not_found_browser">لا يمكن فتح عنوان URL: لم يتم العثور على متصفح.</string>
<string name="dialog_consent_accessibility_text"><![CDATA[أنت على وشك تنشيط خدمة إمكانية الوصول. سيمنح هذا <strong> أذونات كثيرة </strong> إلى التطبيق:
<ul>
<li>قفل الشاشة</li>
<li>التطبيقات الحديثة</li>
</ul>
<strong> لن يقومμlauncher أبدًا بجمع أي بيانات </strong>. على وجه الخصوص ، لا يستخدم μlauncher خدمة إمكانية الوصول لجمع أي بيانات.]]></string>
<string name="settings_gesture_description_tap_down">أنقر ثم اسحب لأسفل</string>
<string name="settings_theme_color_theme_item_default">الافتراضي</string>
<string name="pin_shortcut_switch_visible">أظهر في قائمة التطبيقات</string>
<string name="settings_gesture_description_double_down">اسحب لأسفل بأصبعين</string>
<string name="settings_clock_show_seconds">أظهر الثواني</string>
<string name="dialog_report_bug_title">الإبلاغ عن خطأ</string>
<string name="settings_gesture_description_double_left">اسحب إلى اليسار بأصبعين</string>
<string name="settings_gesture_description_double_click">أنقر مرتين في مكان فارغ على الشاشة</string>
<string name="settings_functionality_search_web_summary">اضغط على زر الرجوع أثناء البحث في قائمة التطبيقات لإظهار البحث على الويب</string>
<string name="settings_gesture_description_right_top_edge">اسحب إلى اليمين من أعلى الشاشة</string>
<string name="settings_gesture_left_bottom_edge">يسار (في الأسفل)</string>
<string name="settings_gesture_description_up_right_edge">اسحب إلى الأعلى من حافة الشاشة اليمنى</string>
<string name="settings_gesture_description_swipe_lambda_reverse">أسفل اليمين -&gt; أعلى الوسط -&gt; أسفل اليسار</string>
<string name="settings_apps_hide_bound_apps">لا تظهر التطبيقات المرتبطة بإيماءة في قائمة التطبيقات</string>
<string name="list_other_list_favorites">درج التطبيقات المفضلة</string>
<string name="list_other_track_next">الموسيقى: التالي</string>
<string name="tutorial_concept_text">تم تصميم μLauncher ليكون فعالًا وخاليًا من مشتتات الانتباه.\n\nلا يحتوي على أي إعلانات ولا يجمع أي بيانات.</string>
<string name="tutorial_finish_text">أنت مستعد للبدء!\n\nآمل أن يكون هذا ذا قيمة كبيرة بالنسبة لك!\n\n- المطورين</string>
<string name="toast_private_space_default_home_screen">يجب أن يكون μlauncher الشاشة الرئيسية الافتراضية للوصول إلى مساحة خاصة.</string>
<string name="settings_gesture_description_left_bottom_edge">اسحب إلى اليسار من أسفل الشاشة</string>
<string name="settings_gesture_description_swipe_smaller_reverse">أسفل اليمين -&gt; وسط اليسار -&gt; أعلى اليمين</string>
<string name="settings_apps_toast_store_not_found">لم يتم العثور على تطبيق المتجر</string>
<string name="settings_display_hide_navigation_bar">إخفِ شريط التنقل</string>
<string name="list_app_info">معلومات التطبيق</string>
<string name="list_app_favorite_add">أضف إلى المفضلة</string>
<string name="list_other_expand_notifications_panel">توسيع لوحة الاشعارات</string>
<string name="tutorial_app_list_text">يمكنك البحث بسرعة في جميع التطبيقات في قائمة التطبيقات.\n\nاسحب لأعلى لفتحها، أو اربطها بإيماءة مختلفة.</string>
<string name="alert_lock_screen_failed">خطأ: فشل في قفل الشاشة. (إذا قمت للتو بترقية التطبيق ، فحاول تعطيل خدمة الوصول وإعادة تمكينها في إعدادات الهاتف)</string>
<string name="settings_gesture_description_down_right_edge">اسحب إلى الأسفل من حافة الشاشة اليمنى</string>
<string name="settings_theme_font_item_serif_monospace">أحادي المسافة مذيل</string>
<string name="settings_list_reverse_layout">عكس قائمة التطبيقات</string>
<string name="alert_cant_expand_status_bar_panel">خطأ: لا يمكن توسيع شريط الحالة. يستخدم هذا الإجراء وظيفة ليست جزءًا من نظام أندرويد. لسوء الحظ ، لا يبدو أنه يعمل على جهازك.</string>
<string name="settings_theme_background">خلفية القوائم</string>
<string name="settings_apps_hide_paused_apps">إخفِ التطبيقات المتوقفة</string>
<string name="settings_meta_show_tutorial">أظهر العرض التعليمي للتطبيق</string>
<string name="dialog_report_bug_info">شكرا لك على المساعدة في تحسين μLauncher!\nيرجى إضافة المعلومات التالية إلى تقرير الأخطاء الخاص بك:</string>
<string name="settings_meta_contact">اتصل بالمطور الأصلي</string>
<string name="list_other_volume_down">اخفض الصوت</string>
<string name="tutorial_usage_text_2">يمكنك تشغيل أهم تطبيقاتك بإيماءات اللمس أو الضغط على الأزرار.</string>
<string name="settings_enabled_gestures_edge_swipe_summary">اسحب من حواف الشاشة</string>
<string name="toast_lock_screen_not_supported">خطأ: قفل الشاشة باستخدام إمكانية الوصول غير مدعوم على هذا الجهاز. الرجاء استخدام طريقة مسؤول الجهاز بدلاً من ذلك.</string>
<string name="accessibility_service_description">يتيح تعيين μlauncher كخدمة إمكانية الوصول قفل الشاشة وفتح قائمة التطبيقات الحديثة. يرجى ملاحظة أنه يتطلب كمية كبيرة من الأذونات. يجب ألا تمنح مثل هذه الأذونات باستخفاف لأي تطبيق. سوف يستخدم μlauncher خدمة إمكانية الوصول فقط لأداء الإجراءات التالية عند طلب المستخدم: * قفل شاشة * فتح التطبيقات الحديثة μlauncher لن يستخدم أبدًا خدمة إمكانية الوصول لجمع البيانات. يمكنك التحقق من شيفرة المصدر للتأكد. يرجى ملاحظة أنه يمكنك قفل الشاشة من خلال منح أذونات مسؤول الجهاز، لكنها لا تعمل مع بصمات الأصابع وفتح الوجه.</string>
<string name="dialog_create_widget_panel_title">إنشاء لوحة أداة جديدة</string>
<string name="settings_widgets_widgets">إدارة الأدوات المصغّرة</string>
<string name="settings_widgets_custom_panels">إدارة لوحات الأدوات المصغّرة</string>
<string name="screen_lock_method_dialog_text"><![CDATA[
<h1>اختر طريقة القفل</h1>
هناك طريقتان لقفل الشاشة.
للأسف، كلا الطريقتين لهما عيوب:<br/><br/>
<h3>إدارة الجهاز</h3>
لا تعمل مع فتح القفل باستخدام بصمة الإصبع أو التعرف على الوجه.
<br/>
<br/>
<h3>خدمة الوصول</h3>
تتطلب صلاحيات واسعة.
سيستخدم تطبيق μLauncher هذه الصلاحيات فقط لقفل الشاشة.
<br/>
(يجب ألا تثق بتطبيق عشوائي قمت بتحميله للتو بهذا الادعاء، ولكن يمكنك التحقق من <a href=\"https://github.com/jrpie/Launcher\">الكود المصدري</a>.)
<br/>
في بعض الأجهزة، لن يُستخدم رمز PIN الخاص بالتشغيل لتشفير البيانات بعد تفعيل خدمة الوصول.
يمكن <a href="https://issuetracker.google.com/issues/37010136#comment36">إعادة تفعيل</a> هذا لاحقًا.
<br/><br/><br/><br/>
يمكنك تغيير اختيارك لاحقًا في الإعدادات.
]]></string>
<string name="widget_clock_description">الساعة الافتراضية لـ μLauncher</string>
<string name="dialog_select_widget_panel_info_no_panels"><![CDATA[
لم يتم العثور على أي لوحات أدوات. يمكنك إنشاء لوحات أدوات في الإعدادات > المشغل > إدارة لوحات الأدوات.
]]></string>
<string name="select_widget_title">اختر الأداة</string>
<string name="widget_menu_remove">إزالة</string>
<string name="widget_menu_configure">تهيئة</string>
<string name="widget_menu_enable_interaction">تمكين التفاعل</string>
<string name="widget_menu_disable_interaction">تعطيل التفاعل</string>
<string name="widget_clock_label">ساعة</string>
<string name="manage_widget_panels_delete">حذف</string>
<string name="manage_widget_panels_rename">إعادة التسمية</string>
<string name="widget_panel_default_name">لوحة الأداة المصغّرة #%1$d</string>
<string name="dialog_ok">حسنا</string>
<string name="widget_panels_title">لوحات الأداة</string>
<string name="dialog_select_widget_panel_title">تحديد لوحة الأداة</string>
<string name="list_other_open_widget_panel">افتح لوحة الأدوات</string>
<string name="alert_widget_panel_not_found">لم تعد لوحة الأدوات هذه موجودة.</string>
<string name="settings_launcher_section_widgets">الأدوات</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="zero">يحتوي على %1$dأداة.</item>
<item quantity="one">يحتوي على %1$d أداة.</item>
<item quantity="two">يحتوي على %1$d أدوات.</item>
<item quantity="few">يحتوي على%1$d أدوات.</item>
<item quantity="many">يحتوي على %1$d أداة.</item>
<item quantity="other">يحتوي على%1$d أداة.</item>
</plurals>
<string name="settings_functionality_auto_close_keyboard">إغلاق لوحة المفاتيح عند التمرير</string>
<string name="crash_info"><![CDATA[
يبدو أن هناك خطأ ما، نعتذر عن ذلك!<br><br>
لأسباب تتعلق بالخصوصية، لا يتم جمع سجلات الأعطال تلقائيًا.<br>
ومع ذلك، فإن السجلات مفيدة جدًا لتصحيح الأخطاء، لذا سأكون ممتنًا جدًا إذا كان بإمكانك إرسال السجل المرفق عبر البريد
أو إنشاء تقرير عن الخطأ على GitHub.<br><br>
يرجى ملاحظة أن سجلات الأعطال قد تحتوي على <strong>معلومات حساسة</strong>، مثل اسم التطبيق الذي حاولت تشغيله.
يرجى <strong>حذف</strong> مثل هذه المعلومات قبل إرسال التقرير.
<h2>ماذا يمكنني أن أفعل الآن؟</h2>
إذا ظهر هذا الخطأ مرة أخرى، يمكنك تجربة عدة أشياء:
<ul>
<li>إيقاف μLauncher بالقوة</li>
<li>مسح بيانات μLauncher&#39;s (<strong>ستفقد إعداداتك!</strong>)</li>
<li>تثبيت إصدار أقدم (<a href="https://github.com/jrpie/Launcher/releases">GitHub</a>, <a href="https://f-droid.org/en/packages/de.jrpie.android.launcher">F-Droid</a>)</li>
</ul>
]]></string>
<string name="notification_crash_title">تعطل μLauncher</string>
<string name="notification_crash_explanation">آسف! انقر للحصول على مزيد من المعلومات.</string>
<string name="report_crash_button_copy">نسخ تقرير التعطل إلى الحافظة</string>
<string name="report_crash_button_mail">إرسال التقرير بالبريد</string>
<string name="report_crash_button_report">إنشاء تقرير خطأ على GitHub</string>
<string name="report_crash_title">تعطل μLauncher</string>
<string name="send_email">إرسال بريد إلكتروني</string>
<string name="notification_channel_crash">الأعطال ومعلومات التصحيح</string>
</resources>

View file

@ -14,7 +14,7 @@
-
-->
<string name="settings_title">Einstellungen</string>
<string name="settings_tab_app">Apps</string>
<string name="settings_tab_actions">Aktionen</string>
<string name="settings_tab_launcher">Launcher</string>
<string name="settings_tab_meta">Meta</string>
<!--
@ -54,9 +54,9 @@
<string name="settings_gesture_description_down_left_edge">An der linken Kante nach unten wischen</string>
<string name="settings_gesture_down_right_edge">Abwärts (rechts)</string>
<string name="settings_gesture_description_down_right_edge">An der rechten Kanten nach unten wischen</string>
<string name="settings_gesture_vol_up">Lautstärke +</string>
<string name="settings_gesture_vol_up">Lauter-Taste</string>
<string name="settings_gesture_description_vol_up">Die Taste \"Lauter\" drücken</string>
<string name="settings_gesture_vol_down">Lautstärke -</string>
<string name="settings_gesture_vol_down">Leiser-Taste</string>
<string name="settings_gesture_description_vol_down">Die Taste \"Leiser\" drücken</string>
<string name="settings_gesture_double_click">Doppelklick</string>
<string name="settings_gesture_description_double_click">In einem leeren Bereich doppelt klicken</string>
@ -97,9 +97,9 @@
<string name="settings_display_screen_timeout_disabled">Bildschirm nicht ausschalten</string>
<string name="settings_display_rotate_screen">Bildschirm drehen</string>
<string name="settings_launcher_section_functionality">Funktionalität</string>
<string name="settings_enabled_gestures_double_swipe">Doppelte Wischaktionen</string>
<string name="settings_enabled_gestures_double_swipe">Doppelte Wischgesten</string>
<string name="settings_enabled_gestures_double_swipe_summary">Mit zwei Fingern wischen</string>
<string name="settings_enabled_gestures_edge_swipe">Kantenaktionen</string>
<string name="settings_enabled_gestures_edge_swipe">Kantengesten</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">Kantenbreite</string>
<string name="settings_functionality_auto_launch">Suchergebnis starten</string>
<string name="settings_functionality_search_web_summary">Beim Durchsuchen der Apps Enter drücken, um stattdessen im Internet zu suchen.</string>

View file

@ -16,14 +16,13 @@
-->
<string name="alert_cant_open_title">No se pudo abrir la aplicación</string>
<string name="alert_cant_open_message">¿Desea cambiar la configuración?</string>
<string name="toast_cant_open_message">Abra la configuración para elegir una aplicación para esta acción</string>
<string name="toast_cant_open_message">Abra la configuración para elegir una acción para este gesto</string>
<!--
-
- Settings
-
-->
<string name="settings_title">Configuración</string>
<string name="settings_tab_app">Aplicaciones</string>
<string name="settings_tab_launcher">Launcher</string>
<string name="settings_tab_meta">Meta</string>
<!--
@ -31,20 +30,20 @@
- Settings : Apps
-
-->
<string name="settings_gesture_up">Deslizar Arriba</string>
<string name="settings_gesture_up">Arriba</string>
<string name="settings_gesture_double_up">Doble Arriba</string>
<string name="settings_gesture_down">Deslizar Abajo</string>
<string name="settings_gesture_down">Abajo</string>
<string name="settings_gesture_double_down">Doble Abajo</string>
<string name="settings_gesture_left">Deslizar Izquierda</string>
<string name="settings_gesture_left">Izquierda</string>
<string name="settings_gesture_double_left">Doble Izquierda</string>
<string name="settings_gesture_right">Deslizar Derecha</string>
<string name="settings_gesture_right">Derecha</string>
<string name="settings_gesture_double_right">Doble Derecha</string>
<string name="settings_gesture_vol_up">Subir Volumen</string>
<string name="settings_gesture_vol_down">Bajar Volumen</string>
<string name="settings_gesture_vol_up">Tecla para subir el volumen</string>
<string name="settings_gesture_vol_down">Tecla para bajar el volumen</string>
<string name="settings_gesture_double_click">Doble Click</string>
<string name="settings_gesture_long_click">Click Largo</string>
<string name="settings_gesture_date">Toca la fecha</string>
<string name="settings_gesture_time">Toca el reloj</string>
<string name="settings_gesture_date">Fecha</string>
<string name="settings_gesture_time">reloj</string>
<string name="settings_apps_choose">Elegir Aplicación</string>
<string name="settings_apps_install">Instalar aplicaciones</string>
<string name="settings_apps_toast_store_not_found">No se encontró la Store</string>
@ -73,7 +72,7 @@
-->
<string name="settings_general_choose_home_screen">Seleccionar Launcher</string>
<string name="settings_meta_cant_select_launcher">Información de la aplicación</string>
<string name="settings_meta_show_tutorial">Ver tutorial de Launcher</string>
<string name="settings_meta_show_tutorial">Ver el tutorial de µLauncher</string>
<string name="settings_meta_reset">Configuración por defecto</string>
<string name="settings_meta_reset_confirm">Todas sus preferencias se eliminarán. Desea continuar?</string>
<string name="settings_meta_report_bug">Reportar un error</string>
@ -92,11 +91,11 @@
<string name="list_tab_other">Otros</string>
<string name="list_app_delete">Desinstalar</string>
<string name="list_app_info">Información</string>
<string name="list_apps_search_hint">Buscar Aplicaciones</string>
<string name="list_other_settings">Configuración de Launcher</string>
<string name="list_apps_search_hint">Buscar</string>
<string name="list_other_settings">Configuración de μLauncher</string>
<string name="list_other_list">Aplicaciones</string>
<string name="list_other_volume_up">Música: Subir</string>
<string name="list_other_volume_down">Música: Bajar</string>
<string name="list_other_volume_up">Subir el volumen</string>
<string name="list_other_volume_down">Bajar volumen</string>
<string name="list_other_track_next">Música: Siguiente</string>
<string name="list_other_track_previous">Música: Anterior</string>
<string name="list_other_nop">Nada</string>
@ -106,19 +105,256 @@
-
-->
<string name="tutorial_title">Tutorial</string>
<string name="tutorial_start_text">Tómate unos segundos para aprender a usar este launcher</string>
<string name="tutorial_start_text">👋\n\n¡Tómate unos segundos para aprender a utilizar este Launcher!</string>
<string name="tutorial_concept_title">Concepto</string>
<string name="tutorial_concept_text">Launcher está diseñado para ser minimalista, eficiente y libre de distracciones.\n\nEs gratis y libre de anuncios y servicios de rastreo.</string>
<string name="tutorial_concept_text_2">La aplicación es de código abierto (licencia MIT) y está disponible en GitHub!\n\nNo olvides echarle un vistazo al repositorio!</string>
<string name="tutorial_concept_text">μLauncher está diseñado para ser mínimo, eficiente y libre de distracciones.\n\nNo contiene anuncios ni recopila datos.</string>
<string name="tutorial_concept_text_2">¡Es software libre (licencia MIT)!\n¡No olvides visitar el repositorio!</string>
<string name="tutorial_usage_title">Uso</string>
<string name="tutorial_usage_text">Tu pantalla de inicio contiene la fecha y hora local. Sin distracciones.</string>
<string name="tutorial_usage_text_2">Puedes iniciar tus aplicaciones con solo presionar o deslizar una vez. Elige algunas en la siguiente pantalla.</string>
<string name="tutorial_usage_text_2">Puede iniciar sus aplicaciones más importantes con gestos táctiles o presionando botones.</string>
<string name="tutorial_setup_title">Puesta a punto</string>
<string name="tutorial_setup_text">Elegimos algunas aplicaciones por defecto para ti, si lo deseas puedes cambiarlas ahora.</string>
<string name="tutorial_setup_text">Elegimos algunas aplicaciones predeterminadas para ti. Puedes cambiarlos ahora si lo deseas:</string>
<string name="tutorial_setup_text_2">También puedes cambiar tu selección más tarde.</string>
<string name="tutorial_finish_title">Vamos!</string>
<string name="tutorial_finish_text">Estás listo para iniciar!\n\n Esperamos que esto te sea de gran ayuda!\n\n- Finn M Glas\n(el desarrollador)</string>
<string name="tutorial_finish_text">¡Estás listo para comenzar!\n\n¡Espero que esto sea de gran valor para ti!\n\n- Finn (quien creó Launcher) y Josia (quien hizo algunas mejoras y mantiene la bifurcación μLauncher)</string>
<string name="tutorial_finish_button">Iniciar</string>
<string name="settings">Configuración</string>
<string name="ic_menu_alt">Más opciones</string>
<string name="settings_gesture_back">atrás</string>
<string name="settings_gesture_description_tap_right">Toca + Derecha Toca y desliza hacia la derecha</string>
<string name="settings_gesture_description_left_bottom_edge">Desliza el dedo hacia la izquierda en la parte inferior de la pantalla</string>
<string name="settings_gesture_description_down_right_edge">Desliza hacia abajo en el borde derecho de la pantalla</string>
<string name="settings_gesture_description_back">Botón de retroceso / gesto de retroceso</string>
<string name="settings_gesture_description_up_left_edge">Desliza el dedo hacia arriba en el borde izquierdo de la pantalla</string>
<string name="settings_gesture_description_up_right_edge">Desliza el dedo hacia arriba en el borde derecho de la pantalla</string>
<string name="settings_gesture_description_down_left_edge">Desliza el dedo hacia abajo en el borde izquierdo de la pantalla</string>
<string name="settings_theme_color_theme_item_dynamic">Dinámico</string>
<string name="settings_clock_color">Color</string>
<string name="settings_gesture_description_tap_up">Toca y desliza hacia arriba</string>
<string name="settings_gesture_tap_left">Toque + Izquierda</string>
<string name="settings_gesture_description_right_bottom_edge">Desliza el dedo hacia la derecha en la parte inferior de la pantalla</string>
<string name="settings_gesture_description_left_top_edge">Desliza el dedo hacia la izquierda en la parte superior de la pantalla</string>
<string name="settings_gesture_down_left_edge">Abajo (borde izquierdo)</string>
<string name="settings_gesture_description_vol_up">Presione el botón para subir el volumen</string>
<string name="settings_functionality_auto_launch_summary">Presione la barra espaciadora para desactivar esta función temporalmente.</string>
<string name="settings_launcher_section_apps">Aplicaciones</string>
<string name="settings_gesture_description_swipe_v">Arriba a la izquierda -&gt; Abajo en el medio -&gt; Arriba a la derecha</string>
<string name="settings_functionality_search_web_summary">Presione regresar mientras busca en la lista de aplicaciones para iniciar una búsqueda web.</string>
<string name="alert_torch_access_exception">Error: No se puede acceder a la antorcha.</string>
<string name="settings_theme_background">Fondo (lista de aplicaciones y configuración)</string>
<string name="settings_theme_color_theme">Tema de color</string>
<string name="settings_theme_font">Fuente</string>
<string name="settings_theme_monochrome_icons">Iconos de aplicaciones monocromáticos</string>
<string name="settings_gesture_right_top_edge">Derecha (arriba)</string>
<string name="settings_gesture_right_bottom_edge">Derecha (Abajo)</string>
<string name="settings_gesture_left_top_edge">Izquierda (arriba)</string>
<string name="dialog_consent_accessibility_text"><![CDATA[Está a punto de activar el servicio de accesibilidad. Esto otorgará privilegios de amplio alcance a μLauncher. μLauncher utilizará estos privilegios solo para bloquear la pantalla. μLauncher <strong>nunca recopilará ningún dato</strong>. En particular, μLauncher no utiliza el servicio de accesibilidad para recopilar ningún dato.]]></string>
<string name="accessibility_service_description">Configurar μLauncher como un servicio de accesibilidad le permite bloquear la pantalla. Tenga en cuenta que se requieren permisos excesivos. Nunca debe otorgar dichos permisos a la ligera a ninguna aplicación. μLauncher utilizará el servicio de accesibilidad solo para bloquear la pantalla. Puedes consultar el código fuente para asegurarte. Tenga en cuenta que también se puede bloquear la pantalla otorgando permisos de administrador del dispositivo μLauncher. Sin embargo, ese método no funciona con el desbloqueo mediante huellas dactilares y rostro.</string>
<string name="settings_apps_hide_private_space_apps">Ocultar el espacio privado de la lista de aplicaciones</string>
<string name="settings_list_layout">Diseño de la lista de aplicaciones</string>
<string name="list_title_private_space">Espacio privado</string>
<string name="alert_no_torch_found">No se detectó ninguna cámara con linterna.</string>
<string name="list_other_toggle_private_space_lock">Activar o desactivar el bloqueo del espacio privado</string>
<string name="list_other_torch">Activar o desactivar la antorcha</string>
<string name="settings_apps_hide_paused_apps">Ocultar aplicaciones pausadas</string>
<string name="settings_apps_hidden">Aplicaciones ocultas</string>
<string name="dialog_rename_title">Cambiar el nombre de %1$s</string>
<string name="dialog_cancel">Cancelar</string>
<string name="settings_gesture_swipe_v">V</string>
<string name="dialog_report_bug_title">Informar un error</string>
<string name="list_app_hidden_remove">mostrar</string>
<string name="toast_private_space_default_home_screen">μLauncher debe ser la pantalla de inicio predeterminada para acceder al espacio privado.</string>
<string name="dialog_report_bug_security_info">No informe vulnerabilidades de seguridad públicamente en GitHub, sino utilice lo siguiente:</string>
<string name="dialog_report_bug_button_security">Informar sobre una vulnerabilidad de seguridad</string>
<string name="dialog_report_bug_create_report">Crear informe</string>
<string name="settings_meta_join_chat">Únete al chat de μLauncher</string>
<string name="settings_meta_donate">Donar</string>
<string name="list_other_volume_adjust">Ajustar el volumen</string>
<string name="list_other_expand_notifications_panel">Expandir el panel de notificaciones</string>
<string name="toast_private_space_not_available">El espacio privado no está disponible</string>
<string name="settings_gesture_description_up">Desliza hacia arriba</string>
<string name="settings_gesture_description_double_click">Haga doble clic en un área vacía</string>
<string name="settings_gesture_description_vol_down">Presione el botón para bajar el volumen</string>
<string name="settings_gesture_description_long_click">Haga clic largo en un área vacía</string>
<string name="settings_gesture_description_date">Haga clic en la fecha</string>
<string name="settings_gesture_description_time">Haga clic en el reloj</string>
<string name="settings_clock_time_visible">Mostrar la hora</string>
<string name="settings_theme_text_shadow">Sombra de texto</string>
<string name="settings_display_hide_status_bar">Ocultar la barra de estado</string>
<string name="settings_display_hide_navigation_bar">Ocultar la barra de navegación</string>
<string name="settings_enabled_gestures_double_swipe_summary">Deslizar con dos dedos</string>
<string name="settings_list_layout_item_default">predeterminado</string>
<string name="list_title_favorite">Aplicaciones favoritas</string>
<string name="list_title_hidden">Aplicaciones ocultas</string>
<string name="undo">Deshacer</string>
<string name="dialog_consent_accessibility_consent">Doy mi consentimiento para que μLauncher utilice el servicio de accesibilidad para proporcionar una funcionalidad no relacionada con la accesibilidad.</string>
<string name="list_apps_search_hint_no_auto_launch">Buscar (sin inicio automático)</string>
<string name="dialog_consent_accessibility_privileges">Soy consciente de que esto otorgará privilegios de gran alcance a μLauncher.</string>
<string name="dialog_consent_accessibility_other_options">Soy consciente de que existen otras opciones (utilizando privilegios de administrador del dispositivo o el botón de encendido).</string>
<string name="settings_meta_licenses">Licencias de código abierto</string>
<string name="legal_info_title">Licencias de código abierto</string>
<string name="tutorial_concept_label_version">versión</string>
<string name="tutorial_app_list_title">Todas las aplicaciones</string>
<string name="screen_lock_method_dialog_title">Elija el método para bloquear</string>
<string name="screen_lock_method_dialog_text"><![CDATA[
Elegir método de bloqueo
Hay dos métodos para bloquear la pantalla.
Desafortunadamente, ambos tienen desventajas:<br/><br/>
Administrador del dispositivo
No funciona con desbloqueo por huella dactilar ni reconocimiento facial.
<br/>
<br/>
Servicio de Accesibilidad
Requiere privilegios excesivos.
μLauncher utilizará esos privilegios solo para bloquear la pantalla.
<br/>
(Realmente no deberías confiar en una aplicación aleatoria que acabas de descargar con tal afirmación, pero puedes consultar el <a href=\"https://github.com/jrpie/Launcher\">código fuente</a>).
<br/>
En algunos dispositivos, el PIN de inicio ya no se utilizará para cifrar datos después de activar un servicio de accesibilidad.
Esto se puede <a href="https://issuetracker.google.com/issues/37010136#comment36">reactivar</a> posteriormente.
<br/><br/><br/><br/>
Puede cambiar su selección más tarde en la configuración.
]]></string>
<string name="screen_lock_method_use_accessibility">Utilice el servicio de accesibilidad</string>
<string name="screen_lock_method_use_device_admin">Usar el administrador del dispositivo</string>
<string name="settings_actions_lock_method">Elija el método para bloquear la pantalla</string>
<string name="dialog_select_color_red">Rojo</string>
<string name="dialog_select_color_alpha">alfa</string>
<string name="dialog_select_color_blue">Azul</string>
<string name="dialog_select_color_green">Verde</string>
<string name="settings_theme_font_item_sans_serif">Sans serif</string>
<string name="settings_theme_font_item_serif">Serif</string>
<string name="settings_theme_font_item_monospace">Monoespaciado</string>
<string name="settings_theme_font_item_serif_monospace">Serif monoespaciado</string>
<string name="settings_clock_date_visible">Mostrar la fecha</string>
<string name="settings_clock_localized">Utilice el formato de fecha localizado</string>
<string name="settings_clock_show_seconds">Mostrar segundos</string>
<string name="settings_clock_flip_date_time">Cambiar fecha y hora</string>
<string name="settings_display_rotate_screen">Girar la pantalla</string>
<string name="settings_enabled_gestures_edge_swipe">Acciones de deslizamiento de borde</string>
<string name="settings_enabled_gestures_edge_swipe_summary">Desliza el dedo por el borde de la pantalla</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">Ancho del borde</string>
<string name="settings_apps_hide_bound_apps">No mostrar aplicaciones que estén vinculadas a un gesto en la lista de aplicaciones</string>
<string name="settings_meta_view_code">Ver el código fuente</string>
<string name="dialog_report_bug_info">¡Gracias por ayudarnos a mejorar μLauncher!\nConsidere agregar la siguiente información a su informe de error:</string>
<string name="dialog_report_bug_button_clipboard">Copiar al portapapeles</string>
<string name="list_app_favorite_add">Añadir a favoritos</string>
<string name="list_app_favorite_remove">Eliminar de favoritos</string>
<string name="list_app_hidden_add">Esconder</string>
<string name="list_app_rename">Renombrar</string>
<string name="list_other_list_favorites">Aplicaciones favoritas</string>
<string name="list_other_list_private_space">Espacio privado</string>
<string name="tutorial_app_list_text">Puede buscar rápidamente entre todas las aplicaciones en la lista de aplicaciones.\n\nDesliza hacia arriba para abrirlo o asigne un gesto diferente.</string>
<string name="tutorial_app_list_text_2">Una vez que sólo coincide una aplicación, se inicia automáticamente.\nEsto se puede desactivar anteponiendo un espacio a la consulta.</string>
<string name="alert_cant_expand_status_bar_panel">Error: No se puede expandir la barra de estado. Esta acción utiliza una funcionalidad que no forma parte de la API de Android publicada. Lamentablemente, no parece funcionar en su dispositivo.</string>
<string name="alert_requires_android_m">Esta funcionalidad requiere Android 6 o posterior.</string>
<string name="alert_requires_android_v">Esta funcionalidad requiere Android 15 o posterior.</string>
<string name="snackbar_app_hidden">Aplicación oculta. Puedes hacerlo visible nuevamente en la configuración.</string>
<string name="list_other_expand_settings_panel">Configuración rápida</string>
<string name="toast_device_admin_not_enabled">μLauncher debe ser administrador del dispositivo para poder bloquear la pantalla.</string>
<string name="device_admin_explanation">Esto es necesario para la acción de la pantalla de bloqueo.</string>
<string name="device_admin_description">Habilitar la acción de bloqueo de pantalla</string>
<string name="alert_lock_screen_failed">Error: Error al bloquear la pantalla. (Si acaba de actualizar la aplicación, intente deshabilitar y volver a habilitar el servicio de accesibilidad en la configuración del teléfono)</string>
<string name="toast_accessibility_service_not_enabled">El servicio de accesibilidad de μLauncher no está habilitado. Por favor, habilítelo en la configuración</string>
<string name="toast_private_space_locked">Espacio privado bloqueado</string>
<string name="toast_private_space_unlocked">Espacio privado desbloqueado</string>
<string name="tooltip_lock_private_space">Bloquear el espacio privado</string>
<string name="tooltip_unlock_private_space">Desbloquear espacio privado</string>
<string name="toast_lock_screen_not_supported">Error: El bloqueo de la pantalla mediante accesibilidad no es compatible con este dispositivo. En su lugar, utilice el administrador del dispositivo.</string>
<string name="accessibility_service_name">μLauncher - pantalla de bloqueo</string>
<string name="dialog_select_color_color_hex">Color</string>
<string name="dialog_choose_color_title">Elige el color</string>
<string name="dialog_consent_accessibility_data_collection">Doy mi consentimiento para que μLauncher no recopile ningún dato.</string>
<string name="dialog_consent_accessibility_title">Activación del servicio de accesibilidad</string>
<string name="dialog_consent_accessibility_ok">Activar el servicio de accesibilidad</string>
<string name="toast_activity_not_found_search_web">No se encontró ninguna aplicación para gestionar la búsqueda.</string>
<string name="toast_activity_not_found_browser">No se puede abrir la URL: no se encontró ningún navegador.</string>
<string name="settings_tab_actions">Acciones</string>
<string name="settings_gesture_tap_up">Toca + Arriba</string>
<string name="settings_gesture_description_double_up">Desliza hacia arriba con dos dedos</string>
<string name="settings_gesture_description_down">Desliza hacia abajo</string>
<string name="settings_gesture_tap_down">Toque + Abajo</string>
<string name="settings_gesture_description_tap_down">Toca y desliza hacia abajo</string>
<string name="settings_gesture_description_double_down">Desliza hacia abajo con dos dedos</string>
<string name="settings_gesture_description_left">Desliza hacia la izquierda</string>
<string name="settings_gesture_description_tap_left">Toca y desliza hacia la izquierda</string>
<string name="settings_gesture_description_double_left">Desliza dos dedos hacia la izquierda</string>
<string name="settings_gesture_description_right">Desliza hacia la derecha</string>
<string name="settings_gesture_tap_right">Toque + Derecha</string>
<string name="settings_gesture_description_double_right">Desliza con dos dedos hacia la derecha</string>
<string name="settings_gesture_description_right_top_edge">Desliza el dedo hacia la derecha en la parte superior de la pantalla</string>
<string name="settings_gesture_left_bottom_edge">Izquierda (Abajo)</string>
<string name="settings_gesture_up_left_edge">Arriba (borde izquierdo)</string>
<string name="settings_gesture_up_right_edge">Arriba (borde derecho)</string>
<string name="settings_gesture_down_right_edge">Abajo (borde derecho)</string>
<string name="settings_gesture_description_swipe_larger">Arriba a la izquierda -&gt; centro a la derecha -&gt; abajo a la izquierda</string>
<string name="settings_gesture_description_swipe_larger_reverse">Abajo a la izquierda -&gt; centro a la derecha -&gt; arriba a la izquierda</string>
<string name="settings_gesture_description_swipe_smaller">Arriba a la derecha -&gt; centro a la izquierda -&gt; abajo a la derecha</string>
<string name="settings_gesture_description_swipe_smaller_reverse">Abajo a la derecha -&gt; centro a la izquierda -&gt; arriba a la derecha</string>
<string name="settings_gesture_swipe_v_reverse">V (Reversa)</string>
<string name="settings_gesture_description_swipe_v_reverse">Arriba a la derecha -&gt; Abajo en el medio -&gt; Arriba a la izquierda</string>
<string name="settings_gesture_swipe_lambda">Λ</string>
<string name="settings_gesture_description_swipe_lambda">Abajo a la izquierda -&gt; arriba en el medio -&gt; abajo a la derecha</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (Inverso)</string>
<string name="settings_gesture_description_swipe_lambda_reverse">Abajo a la derecha -&gt; arriba en el medio -&gt; abajo a la izquierda</string>
<string name="settings_theme_background_item_dim">Atenuación</string>
<string name="settings_theme_background_item_solid">Sólido</string>
<string name="settings_theme_font_item_system_default">Valor predeterminado del sistema</string>
<string name="settings_theme_background_item_transparent">Transparente</string>
<string name="settings_theme_background_item_blur">Difuminar</string>
<string name="settings_functionality_search_web">Buscar en la web</string>
<string name="settings_list_layout_item_text">texto</string>
<string name="settings_list_layout_item_grid">Red</string>
<string name="list_other_track_play_pause">Música: Reproducir / Pausa</string>
<string name="list_other_lock_screen">Pantalla de bloqueo</string>
<string name="pin_shortcut_title">Agregar acceso directo</string>
<string name="pin_shortcut_button_bind">Vincular al gesto</string>
<string name="pin_shortcut_switch_visible">Mostrar en la lista de aplicaciones</string>
<string name="settings_list_reverse_layout">Invertir la lista de aplicaciones</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="one">Contiene %1$d widget.</item>
<item quantity="many">Contiene %1$d widgets.</item>
<item quantity="other">Contiene %1$d widgets.</item>
</plurals>
<string name="report_crash_button_report">Crear reporte de bug en GitHub</string>
<string name="report_crash_title">μLauncher dejó de funcionar</string>
<string name="send_email">Enviar correo</string>
<string name="settings_meta_view_docs">Documentación</string>
<string name="select_widget_title">Elegir widget</string>
<string name="widget_menu_remove">Quitar</string>
<string name="widget_menu_configure">Configurar</string>
<string name="widget_menu_enable_interaction">Habilitar interacción</string>
<string name="widget_clock_label">Reloj</string>
<string name="widget_clock_description">El reloj predeterminado de μLauncher</string>
<string name="manage_widget_panels_delete">Eliminar</string>
<string name="manage_widget_panels_rename">Cambiar nombre</string>
<string name="widget_panel_default_name">Panel de widgets #%1$d</string>
<string name="widget_panels_title">Paneles de widgets</string>
<string name="dialog_select_widget_panel_title">Seleccionar un panel de widgets</string>
<string name="list_other_open_widget_panel">Abrir panel de widgets</string>
<string name="alert_widget_panel_not_found">Este panel de widgets ya no existe.</string>
<string name="settings_launcher_section_widgets">Widgets</string>
<string name="report_crash_button_mail">Enviar reporte por correo</string>
<string name="dialog_ok">Ok</string>
<string name="content_description_add_widget">Añadir widget</string>
<string name="content_description_add_widget_panel">Añadir panel de widgets</string>
<string name="content_description_close">Cerrar</string>
<string name="content_description_navigate_back">Navegar atrás</string>
<string name="content_description_navigate_next">Navegar siguiente</string>
<string name="content_description_lock">Bloquear</string>
<string name="content_description_settings_actions_row_button_remove">Quitar enlace</string>
<string name="list_other_launch_other_launcher">Iniciar otra aplicación de inicio</string>
<string name="alert_recent_apps_failed">Error: Error al mostrar las aplicaciones recientes. (Si acaba de actualizar la aplicación, intente deshabilitar y volver a habilitar el servicio de accesibilidad en la configuración del teléfono)</string>
<string name="alert_enable_accessibility_failed">Error: Error al habilitar el servicio de accesibilidad.</string>
<string name="widget_menu_disable_interaction">Deshabilitar interacción</string>
<string name="dialog_create_widget_panel_title">Crear nuevo panel de widgets</string>
<string name="report_crash_button_copy">Copiar reporte de crash al portapapeles</string>
<string name="settings_widgets_custom_panels">Administrar paneles de widgets</string>
<string name="list_other_recent_apps">Aplicaciones recientes</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (Inverso)]]></string>
<string name="settings_widgets_widgets">Administrar widgets</string>
</resources>

View file

@ -14,7 +14,6 @@
-
-->
<string name="settings_title">Réglages</string>
<string name="settings_tab_app">Applications</string>
<string name="settings_tab_launcher">Launcher</string>
<string name="settings_tab_meta">Meta</string>
<!--

View file

@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_gesture_description_right_bottom_edge">Scorri verso destra sul bordo inferiore dello schermo</string>
<string name="settings_gesture_description_right_bottom_edge">Scorri a destra sul bordo inferiore dello schermo</string>
<string name="settings_launcher_section_appearance">Aspetto</string>
<string name="settings_apps_choose">Scegliere l\'applicazione</string>
<string name="settings_apps_choose">Associa app</string>
<string name="settings_theme_color_theme">Tema</string>
<string name="tutorial_concept_text">Questo launcher è progettato per essere minimale, efficiente e privo di distrazioni. Non contiene pagamenti, pubblicità o servizi di tracciamento.</string>
<string name="tutorial_concept_text">μLauncher è progettato per essere minimale, efficiente e privo di distrazione.\n\nNon contiene annunci e non raccoglie dati.</string>
<string name="settings_theme_color_theme_item_default">Predefinito</string>
<string name="settings_apps_hide_bound_apps">Non mostrare applicazioni collegate a gesti nella lista delle app</string>
<string name="settings_apps_hide_bound_apps">Non mostrare nella lista le applicazioni associate a gesti</string>
<string name="settings_list_layout_item_text">Testo</string>
<string name="accessibility_service_description">Impostare µLauncher come servizio accessibilità permette l\'azione di blocco dello schermo. Si precisa che sono richiesti permessi eccessivi. Non si dovrebbe mai concedere con leggerezza permessi ad alcuna app. µLauncher utilizza i servizi di accessibilità esclusivamente per il blocco dello schermo. Puoi verificare il codice sorgente. Si segnala che il blocco schermo si può attivare anche concedendo a µLauncher i permessi di amministratore, tuttavia tale metodo non funziona con lo sblocco tramite impronta o riconoscimento facciale.</string>
<string name="settings_theme_font_item_sans_serif">Sans serif (senza grazie)</string>
<string name="settings_gesture_description_double_up">Trascina due dita dal basso verso l\'alto</string>
<string name="settings_apps_toast_store_not_found">Negozio non trovato</string>
<string name="accessibility_service_description">Impostare µLauncher come servizio accessibilità permette l\'azione di blocco dello schermo. Nota che sono richiesti permessi eccessivi. Non si dovrebbero mai concedere con leggerezza permessi ad alcuna app. µLauncher utilizza i servizi di accessibilità esclusivamente per il blocco dello schermo. Puoi verificare il codice sorgente. Nota che il blocco schermo si può attivare anche concedendo a µLauncher i permessi di amministratore, tuttavia tale metodo non funziona con lo sblocco tramite impronta o riconoscimento facciale.</string>
<string name="settings_theme_font_item_sans_serif">Sans serif</string>
<string name="settings_gesture_description_double_up">Scorri verso l\'alto con due dita</string>
<string name="settings_apps_toast_store_not_found">Store non trovato</string>
<string name="settings_list_layout_item_grid">Griglia</string>
<string name="screen_lock_method_dialog_text"><![CDATA[
<h1>Scegli un sistema di blocco</h1>
@ -30,115 +30,118 @@
<br/>
(Non ci si dovrebbe mai fidare di un\'applicazione qualsiasi appena scaricata su queste cose, ma puoi verificare il <a href=\"https://github.com/jrpie/Launcher\">codice sorgente</a>.)
In alcuni dispositivi, il PIN iniziale non verrà più utilizzato per la crittografia dei dati dopo aver attivato un servizio di accessibilità.
Può essere <a href="https://issuetracker.google.com/issues/37010136#comment36">riattivato</a> dopo.
<br/><br/><br/><br/>
Puoi cambiare le tue scelte in seguito nelle impostazioni.
]]></string>
<string name="alert_cant_open_title">Impossibile aprire l\'applicazione</string>
<string name="alert_cant_open_message">Desideri modificare le impostazioni?</string>
<string name="toast_cant_open_message">Apri le impostazioni per abbinare un\'azione a questo gesto</string>
<string name="alert_cant_open_title">Impossibile avviare l\'app</string>
<string name="alert_cant_open_message">Modificare le impostazioni?</string>
<string name="toast_cant_open_message">Apri impostazioni per associare un\'azione a questo gesto</string>
<string name="settings_title">Impostazioni</string>
<string name="settings_tab_app">Applicazioni</string>
<string name="settings_tab_launcher">Launcher</string>
<string name="settings_tab_meta">Meta</string>
<string name="settings_gesture_description_double_down">Scorri verso il basso con due dita</string>
<string name="settings_gesture_left">Sinistra</string>
<string name="settings_gesture_description_left">Scorrere verso sinistra</string>
<string name="settings_gesture_double_left">Due dita verso sinistra</string>
<string name="settings_gesture_description_double_left">Scorrere verso sinistra con due dita</string>
<string name="settings_gesture_description_left">Scorri verso sinistra</string>
<string name="settings_gesture_double_left">Due dita a sinistra</string>
<string name="settings_gesture_description_double_left">Scorri verso sinistra con due dita</string>
<string name="settings_gesture_right">Destra</string>
<string name="settings_gesture_description_right">Scorri verso destra</string>
<string name="settings_gesture_double_right">Due dita verso destra</string>
<string name="settings_gesture_description_double_right">Scorri a destra con due dita</string>
<string name="settings_gesture_double_right">Due dita a destra</string>
<string name="settings_gesture_description_double_right">Scorri verso destra con due dita</string>
<string name="settings_gesture_right_top_edge">Destra (in alto)</string>
<string name="settings_gesture_description_right_top_edge">Scorri verso destra sul bordo superiore dello schermo</string>
<string name="settings_gesture_description_left_bottom_edge">Scorri verso sinistra sul bordo inferiore dello schermo</string>
<string name="settings_gesture_description_left_top_edge">Scorri verso sinistra sul bordo superiore dello schermo</string>
<string name="settings_gesture_up_left_edge">Verso l\'alto (lato sinistro)</string>
<string name="settings_gesture_up">Verso l\'alto</string>
<string name="settings_gesture_description_up">Striscia il dito dal basso verso l\'alto</string>
<string name="settings_gesture_down">Verso il basso</string>
<string name="settings_gesture_double_down">Trascina due dita dall\'alto verso il basso</string>
<string name="settings_gesture_description_down">Trascina un dito dall\'alto verso il basso</string>
<string name="settings_gesture_right_bottom_edge">Destra (bordo inferiore)</string>
<string name="settings_gesture_left_bottom_edge">Sinistra (bordo inferiore)</string>
<string name="settings_gesture_left_top_edge">Sinistra (bordo superiore)</string>
<string name="settings_gesture_description_up_left_edge">Scorri verso l\'alto sul bordo sinistro dello schermo</string>
<string name="settings_gesture_up_right_edge">Alto (lato destro)</string>
<string name="settings_gesture_description_up_right_edge">Scorri verso l\'alto sul bordo destro dello schermo</string>
<string name="settings_gesture_down_left_edge">Basso (bordo sinistro)</string>
<string name="settings_gesture_description_down_left_edge">Scorri verso il basso sul bordo sinistro dello schermo</string>
<string name="settings_gesture_down_right_edge">Basso (Lato destro)</string>
<string name="settings_gesture_description_down_right_edge">Scorri verso il basso sul lato destro dello schermo</string>
<string name="settings_gesture_vol_up">Aumenta il volume</string>
<string name="settings_gesture_double_click">Doppio click</string>
<string name="settings_gesture_description_double_click">Doppio click in un\'area vuota</string>
<string name="settings_gesture_long_click">Tocco prolungato</string>
<string name="settings_gesture_description_long_click">Tocco prolungato su un\'area vuota</string>
<string name="settings_gesture_description_right_top_edge">Scorri a destra sul bordo superiore dello schermo</string>
<string name="settings_gesture_description_left_bottom_edge">Scorri a sinistra sul bordo inferiore dello schermo</string>
<string name="settings_gesture_description_left_top_edge">Scorri a sinistra sul bordo superiore dello schermo</string>
<string name="settings_gesture_up_left_edge">Su (bordo sinistro)</string>
<string name="settings_gesture_up">Su</string>
<string name="settings_gesture_description_up">Scorri verso l\'alto</string>
<string name="settings_gesture_down">Giù</string>
<string name="settings_gesture_double_down">Scorri giù con due dita</string>
<string name="settings_gesture_description_down">Scorri verso il basso</string>
<string name="settings_gesture_right_bottom_edge">Destra (in basso)</string>
<string name="settings_gesture_left_bottom_edge">Sinistra (in basso)</string>
<string name="settings_gesture_left_top_edge">Sinistra (in alto)</string>
<string name="settings_gesture_description_up_left_edge">Scorri in alto sul bordo sinistro dello schermo</string>
<string name="settings_gesture_up_right_edge">Su (bordo destro)</string>
<string name="settings_gesture_description_up_right_edge">Scorri in alto sul bordo destro dello schermo</string>
<string name="settings_gesture_down_left_edge">Giù (bordo sinistro)</string>
<string name="settings_gesture_description_down_left_edge">Scorri in basso sul bordo sinistro dello schermo</string>
<string name="settings_gesture_down_right_edge">Giù (bordo destro)</string>
<string name="settings_gesture_description_down_right_edge">Scorri in basso sul bordo destro dello schermo</string>
<string name="settings_gesture_vol_up">Volume +</string>
<string name="settings_gesture_double_click">Doppio tap</string>
<string name="settings_gesture_description_double_click">Doppio tap in spazio vuoto</string>
<string name="settings_gesture_long_click">Tap lungo</string>
<string name="settings_gesture_description_long_click">Tap lungo in spazio vuoto</string>
<string name="settings_gesture_date">Data</string>
<string name="settings_gesture_description_date">Premi sulla data</string>
<string name="settings_gesture_description_date">Tap sulla data</string>
<string name="settings_gesture_time">Ora</string>
<string name="settings_gesture_description_time">Premi sull\'ora</string>
<string name="settings_gesture_description_vol_up">Premi il pulsante di aumento del volume</string>
<string name="settings_gesture_vol_down">Riduci il volume</string>
<string name="settings_gesture_description_vol_down">Premi il pulsante per ridurre il volume</string>
<string name="settings_apps_install">Installa le applicazioni</string>
<string name="settings_gesture_description_time">Tap sull\'ora</string>
<string name="settings_gesture_description_vol_up">Premi il pulsante Volume +</string>
<string name="settings_gesture_vol_down">Volume -</string>
<string name="settings_gesture_description_vol_down">Premi il pulsante Volume -</string>
<string name="settings_apps_install">Installa apps</string>
<string name="settings_theme_monochrome_icons">Icone monocromatiche</string>
<string name="settings_clock_time_visible">Mostra l\'ora</string>
<string name="settings_clock_date_visible">Mostra la data</string>
<string name="settings_clock_localized">Usa il formato ora locale</string>
<string name="settings_clock_show_seconds">Mostra i secondi</string>
<string name="settings_clock_time_visible">Mostra orario</string>
<string name="settings_clock_date_visible">Mostra data</string>
<string name="settings_clock_localized">Usa formato data locale</string>
<string name="settings_clock_show_seconds">Mostra secondi</string>
<string name="settings_launcher_section_date_time"><![CDATA[Data e ora]]></string>
<string name="settings_enabled_gestures_double_swipe_summary">Scorri con due dita</string>
<string name="settings_enabled_gestures_double_swipe">Azioni a scorrimento con due dita</string>
<string name="settings_enabled_gestures_double_swipe">Scorrimento a due dita</string>
<string name="settings_functionality_auto_launch">Apri il risultato della ricerca</string>
<string name="settings_enabled_gestures_edge_swipe">Azioni a scorrimento ai lati dello schermo</string>
<string name="settings_enabled_gestures_edge_swipe_summary">Scorri sul lato dello schermo</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">Larghezza margine laterale</string>
<string name="settings_meta_view_code">Vedi il codice sorgente</string>
<string name="settings_enabled_gestures_edge_swipe">Scorrimento sui bordi dello schermo</string>
<string name="settings_enabled_gestures_edge_swipe_summary">Scorri sui bordi dello schermo</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">Larghezza bordo</string>
<string name="settings_meta_view_code">Codice sorgente</string>
<string name="list_other_list">Tutte le applicazioni</string>
<string name="list_other_list_favorites">Applicazioni preferite</string>
<string name="list_other_track_next">Musica: passa alla traccia successiva</string>
<string name="list_other_volume_down">Musica: riduci il volume</string>
<string name="list_other_track_previous">Musica: torna alla traccia precedente</string>
<string name="list_other_volume_up">Musica: Aumenta il volume</string>
<string name="list_other_track_next">Musica: traccia successiva</string>
<string name="list_other_volume_down">Abbassa volume</string>
<string name="list_other_track_previous">Musica: traccia precedente</string>
<string name="list_other_volume_up">Alza volume</string>
<string name="undo">Annulla</string>
<string name="list_other_expand_settings_panel">Impostazioni rapide</string>
<string name="device_admin_explanation">Azione necessaria per abilitare il blocco dello schermo.</string>
<string name="settings_theme_text_shadow">Ombreggiatura del testo</string>
<string name="settings_theme_background">Sfondo (lista applicazioni e impostazioni)</string>
<string name="device_admin_explanation">Azione necessaria per abilitare il blocco schermo.</string>
<string name="settings_theme_text_shadow">Ombreggiatura testo</string>
<string name="settings_theme_background">Sfondo (lista apps e impostazioni)</string>
<string name="settings_theme_font">Font</string>
<string name="settings_clock_flip_date_time">Inverti data e ora</string>
<string name="settings_theme_wallpaper">Scegli uno sfondo</string>
<string name="settings_theme_wallpaper">Imposta sfondo</string>
<string name="settings_launcher_section_display">Schermo</string>
<string name="settings_display_screen_timeout_disabled">Mantieni lo schermo acceso</string>
<string name="settings_display_rotate_screen">Ruota lo schermo</string>
<string name="settings_launcher_section_functionality">Funzionalità</string>
<string name="settings_functionality_auto_keyboard">Apri automaticamente la tastiera per cercare</string>
<string name="settings_display_rotate_screen">Ruota schermo</string>
<string name="settings_launcher_section_functionality">Funzioni</string>
<string name="settings_functionality_auto_keyboard">Apri automaticamente la tastiera</string>
<string name="settings_launcher_sensitivity">Sensibilità</string>
<string name="list_title_pick">Scegli un\'applicazione</string>
<string name="list_title_pick">Scegli applicazione</string>
<string name="tutorial_setup_title">Configurazione</string>
<string name="tutorial_setup_text">Abbiamo impostato alcune app predefinite per te. Puoi modificarle ora se lo desideri:</string>
<string name="tutorial_setup_text_2">Puoi anche cambiare la tua selezione in seguito.</string>
<string name="tutorial_setup_text">Abbiamo impostato alcune app predefinite. Puoi modificarle ora se vuoi:</string>
<string name="tutorial_setup_text_2">Puoi anche modificare la selezione in seguito.</string>
<string name="tutorial_finish_title">Iniziamo!</string>
<string name="tutorial_finish_text">Sei pronto per iniziare! Spero questa applicazione ti risulti preziosa! - Finn (che ha ideato il launcher)\n \te Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher)</string>
<string name="tutorial_finish_text">Sei pronto per iniziare!\n\nSpero che lo apprezzi!\n\n- Finn (che ha fatto Launcher) e Josia (che ha apportato alcuni miglioramenti e mantiene il fork μLauncher)</string>
<string name="tutorial_finish_button">Inizia</string>
<string name="settings">Impostazioni</string>
<string name="ic_menu_alt">Altre opzioni</string>
<string name="tutorial_usage_text_2">Puoi aprire le tue app facendo scorrere il dito sullo schermo o premendo un pulsante. Configura i gesti nella prossima slide.</string>
<string name="alert_cant_expand_status_bar_panel">Errore: impossibile espandere la barra di stato. Questa azione utilizza funzionalità non incluse nelle API Android pubbliche. Sfortunatamente, non sembra funzionare sul tuo dispositivo.</string>
<string name="snackbar_app_hidden">Applicazione nascosta. Puoi renderla nuovamente visibile nelle impostazioni.</string>
<string name="toast_device_admin_not_enabled">µLauncher deve essere autorizzato come amministratore del dispositivo per bloccare lo schermo.</string>
<string name="device_admin_description">Abilita il blocco dello schermo</string>
<string name="tutorial_usage_text_2">Puoi avviare le tue app principali scorrendo il dito sullo schermo o premendo un pulsante.</string>
<string name="alert_cant_expand_status_bar_panel">Errore: impossibile espandere la barra di stato. Questa azione utilizza funzionalità non incluse nelle API Android. Sfortunatamente, non sembra funzionare sul tuo dispositivo.</string>
<string name="snackbar_app_hidden">Applicazione nascosta. Puoi renderla nuovamente visibile dalle impostazioni.</string>
<string name="toast_device_admin_not_enabled">µLauncher deve amministrare il dispositivo per poter bloccare lo schermo.</string>
<string name="device_admin_description">Abilita il blocco schermo</string>
<string name="alert_no_torch_found">Nessuna camera con torcia rilevata.</string>
<string name="alert_torch_access_exception">Errore: impossibile accedere alla torcia.</string>
<string name="toast_accessibility_service_not_enabled">Il servizio accessibilità per µLauncher non è attivo. Per favore attivalo nelle impostazioni</string>
<string name="toast_accessibility_service_not_enabled">Il servizio accessibilità per µLauncher non è attivo. Attivalo nelle impostazioni</string>
<string name="alert_lock_screen_failed">Errore: impossibile bloccare lo schermo. (Se hai appena aggiornato l\'app, prova a disabilitare e riattivare il servizio accessibilità nelle impostazioni del telefono)</string>
<string name="toast_lock_screen_not_supported">Errore: Il blocco schermo tramite accessibilità non è supportato su questo dispositivo. Per favore usa invece il servizio amministratore dispositivo.</string>
<string name="accessibility_service_name">µLauncher - blocco schermo</string>
<string name="toast_lock_screen_not_supported">Errore: Il blocco schermo tramite accessibilità non è supportato su questo dispositivo. In alternativa usa il servizio amministratore dispositivo.</string>
<string name="accessibility_service_name">μLauncher</string>
<string name="screen_lock_method_dialog_title">Scegli come bloccare lo schermo</string>
<string name="screen_lock_method_use_accessibility">Usa il servizio accessibilità</string>
<string name="screen_lock_method_use_device_admin">Usa l\'amministratore dispositivo</string>
<string name="screen_lock_method_use_device_admin">Usa Amministratore dispositivo</string>
<string name="settings_actions_lock_method">Scegli un sistema di blocco dello schermo</string>
<string name="settings_theme_color_theme_item_dark">Scuro</string>
<string name="settings_theme_color_theme_item_light">Chiaro</string>
@ -146,22 +149,22 @@
<string name="settings_theme_background_item_blur">Sfocato</string>
<string name="settings_theme_background_item_solid">Solido</string>
<string name="settings_theme_font_item_system_default">Predefinito di sistema</string>
<string name="settings_theme_font_item_serif">Serif (con grazie)</string>
<string name="settings_theme_font_item_monospace">Monospace (a larghezza fissa)</string>
<string name="settings_theme_font_item_serif_monospace">Serif monospace (a larghezza fissa con grazie)</string>
<string name="settings_theme_font_item_serif">Serif</string>
<string name="settings_theme_font_item_monospace">Monospace</string>
<string name="settings_theme_font_item_serif_monospace">Serif monospace</string>
<string name="settings_launcher_section_apps">Applicazioni</string>
<string name="settings_apps_hidden">Applicazioni nascoste</string>
<string name="settings_list_layout">Configurazione della lista applicazioni</string>
<string name="settings_list_layout">Configura la lista applicazioni</string>
<string name="settings_list_layout_item_default">Predefinito</string>
<string name="settings_theme_background_item_dim">Offuscato</string>
<string name="settings_general_choose_home_screen">Imposta μLauncher come predefinito per la schermata principale</string>
<string name="settings_meta_cant_select_launcher">Informazioni sulle applicazioni</string>
<string name="settings_meta_show_tutorial">Apri il tutorial del launcher</string>
<string name="settings_meta_reset">Ripristina le impostazioni predefinite</string>
<string name="settings_meta_reset_confirm">Stai per eliminare tutte le preferenze impostate. Vuoi continuare?</string>
<string name="settings_theme_background_item_dim">Soffuso</string>
<string name="settings_general_choose_home_screen">Imposta μLauncher come predefinito</string>
<string name="settings_meta_cant_select_launcher">Informazioni app</string>
<string name="settings_meta_show_tutorial">Tutorial di µLauncher</string>
<string name="settings_meta_reset">Ripristina le impostazioni</string>
<string name="settings_meta_reset_confirm">Stai per ripristinare tutte le impostazioni. Continuare?</string>
<string name="settings_meta_report_bug">Segnala un bug</string>
<string name="settings_meta_fork_contact">Contatta lo sviluppatore del fork</string>
<string name="settings_meta_join_chat">Partecipa alla chat di μLauncher</string>
<string name="settings_meta_join_chat">Unisciti alla chat di μLauncher</string>
<string name="settings_meta_privacy">Informativa sulla privacy</string>
<string name="settings_meta_contact">Contatta lo sviluppatore originale</string>
<string name="settings_meta_discord">Unisciti a noi su Discord!</string>
@ -169,9 +172,9 @@
<string name="list_title_favorite">Applicazioni preferite</string>
<string name="list_title_hidden">Applicazioni nascoste</string>
<string name="list_tab_app">Applicazioni</string>
<string name="list_tab_other">Altri</string>
<string name="list_tab_other">Altro</string>
<string name="list_app_delete">Disinstalla</string>
<string name="list_app_info">Informazioni sull\'app</string>
<string name="list_app_info">Informazioni app</string>
<string name="list_app_favorite_add">Aggiungi ai preferiti</string>
<string name="list_app_favorite_remove">Rimuovi dai preferiti</string>
<string name="list_app_hidden_add">Nascondi</string>
@ -179,29 +182,29 @@
<string name="list_app_rename">Rinomina</string>
<string name="list_apps_search_hint">Cerca</string>
<string name="list_other_settings">Impostazioni μLauncher</string>
<string name="list_other_expand_notifications_panel">Espandi il pannello notifiche</string>
<string name="list_other_expand_notifications_panel">Espandi pannello notifiche</string>
<string name="list_other_nop">Non fare niente</string>
<string name="list_other_lock_screen">Blocca lo schermo</string>
<string name="list_other_torch">Accendi/spegni la torcia</string>
<string name="list_other_lock_screen">Blocca schermo</string>
<string name="list_other_torch">Torcia ON/OFF</string>
<string name="tutorial_title">Tutorial</string>
<string name="tutorial_start_text">Prenditi qualche secondo per imparare ad usare questo launcher!</string>
<string name="tutorial_start_text">👋\n\nPrenditi qualche secondo per imparare ad usare questo launcher!</string>
<string name="tutorial_concept_title">Concetto</string>
<string name="tutorial_concept_text_2">L\'app è open source (sotto licenza MIT) e disponibile su GitHub! Visita il nostro archivio!</string>
<string name="tutorial_concept_text_2">E\' software libero (licenza MIT)!\nAssicurati di controllare il repository!</string>
<string name="tutorial_usage_title">Utilizzo</string>
<string name="tutorial_usage_text">La schermata principale contiene solo data e ora. Nessuna distrazione.</string>
<string name="alert_requires_android_m">Questa funzione richiede Android 6 o successivi.</string>
<string name="dialog_rename_title">Rinomina %1$s</string>
<string name="settings_theme_color_theme_item_dynamic">Dinamico</string>
<string name="settings_clock_color">Colore</string>
<string name="settings_gesture_double_up">Due dita verso l\'alto</string>
<string name="settings_gesture_double_up">Scorri su con due dita</string>
<string name="dialog_consent_accessibility_privileges">Sono consapevole che questo concederà privilegi estesi a µLauncher.</string>
<string name="dialog_consent_accessibility_consent">Accetto che µLauncher utilizzi il servizio di accessibilità per fornire funzionalità non correlate all\'accessibilità.</string>
<string name="dialog_consent_accessibility_data_collection">Accetto che µLauncher non raccolga alcun dato.</string>
<string name="settings_apps_hide_paused_apps">Nascondi le app in pausa</string>
<string name="list_other_toggle_private_space_lock">Attiva/Disattiva Blocco Spazio Privato</string>
<string name="alert_requires_android_v">Questa funzionalità richiede Android 15 o successivi.</string>
<string name="list_other_toggle_private_space_lock">Blocca/Sblocca Spazio Privato</string>
<string name="alert_requires_android_v">Questa funzione richiede Android 15 o successivi.</string>
<string name="dialog_select_color_red">Rosso</string>
<string name="dialog_select_color_alpha">Trasparente</string>
<string name="dialog_select_color_alpha">Alpha</string>
<string name="dialog_select_color_blue">Blu</string>
<string name="dialog_select_color_green">Verde</string>
<string name="dialog_select_color_color_hex">Colore</string>
@ -209,24 +212,135 @@
<string name="dialog_consent_accessibility_ok">Attiva Servizi di Accessibilità</string>
<string name="dialog_consent_accessibility_other_options">Sono consapevole che esistono altre opzioni (utilizzando i privilegi di amministratore del dispositivo o il pulsante di accensione).</string>
<string name="dialog_consent_accessibility_title">Attivazione dei Servizi di Accessibilità</string>
<string name="settings_functionality_search_web">Cerca su internet</string>
<string name="settings_functionality_search_web_summary">Premi invio durante la ricerca nell\'elenco delle app per avviare una ricerca su internet.</string>
<string name="settings_functionality_search_web">Cerca sul web</string>
<string name="settings_functionality_search_web_summary">Invio in ricerca app per avviare una ricerca web.</string>
<string name="list_apps_search_hint_no_auto_launch">Cerca (senza avvio automatico)</string>
<string name="settings_meta_licenses">Licenze Open Source</string>
<string name="legal_info_title">Licenze Open Source</string>
<string name="dialog_report_bug_title">Segnala un bug</string>
<string name="dialog_report_bug_info">Grazie per aver contribuito a migliorare µLauncher!\nSi prega di aggiungere le seguenti informazioni alla segnalazione del bug:</string>
<string name="dialog_report_bug_info">Grazie per il tuo contributo al miglioramento di µLauncher!\nAggiungi le seguenti informazioni alla segnalazione del bug:</string>
<string name="dialog_report_bug_button_clipboard">Copia negli appunti</string>
<string name="dialog_report_bug_security_info">Non segnalare pubblicamente le vulnerabilità di sicurezza su GitHub, ma utilizza invece:</string>
<string name="dialog_report_bug_security_info">Non segnalare le vulnerabilità di sicurezza pubblicamente su GitHub, ma usa invece:</string>
<string name="dialog_cancel">Annulla</string>
<string name="settings_functionality_auto_launch_summary">Premi spazio per disabilitare temporaneamente questa funzionalità.</string>
<string name="settings_functionality_auto_launch_summary">Spazio per disabilitare temporaneamente.</string>
<string name="dialog_report_bug_button_security">Segnala una vulnerabilità di sicurezza</string>
<string name="dialog_report_bug_create_report">Crea una segnalazione</string>
<string name="toast_private_space_locked">Spazio privato bloccato</string>
<string name="toast_private_space_unlocked">Spazio privato sbloccato</string>
<string name="toast_private_space_not_available">Spazio privato non disponibile</string>
<string name="toast_private_space_default_home_screen">µLauncher deve essere la schermata iniziale predefinita per accedere allo spazio privato.</string>
<string name="toast_private_space_default_home_screen">µLauncher deve essere il launcher predefinito per poter accedere allo spazio privato.</string>
<string name="toast_activity_not_found_browser">Impossibile aprire l\'URL: nessun browser trovato.</string>
<string name="toast_activity_not_found_search_web">Non è stata trovata un\'applicazione per gestire la ricerca.</string>
<string name="dialog_consent_accessibility_text"><![CDATA[Stai per arrivare il servizio di accessibilità. Questo garantirà <strong>privilegi più ampi</strong> a µLauncher.<br/>µLauncher utilizzerà questi privilegi <strong>solo per bloccare lo schermo</strong>. µLauncher <strong>non raccoglierà mai alcun dato</strong>. In particolare, µLauncher non usa il servizio di accessibilità per raccogliere nessun dato.]]></string>
<string name="toast_activity_not_found_search_web">Nessuna applicazione trovata per gestire la ricerca.</string>
<string name="dialog_consent_accessibility_text"><![CDATA[Stai per attivare il servizio di accessibilità. Questo concederà <strong>privilegi estesi</strong> a μLauncher.<br/>μLauncher userà questi privilegi <strong>solo</strong> per eseguire le seguenti azioni:
<ul>
<li>Blocco shermo</li>
<li>App recenti</li>
</ul>
μLauncher <strong>non raccoglierà mai alcun dato</strong>. In particolare, μLauncher non utilizza il servizio di accessibilità per raccogliere dati.]]></string>
<string name="list_title_private_space">Spazio privato</string>
<string name="list_other_list_private_space">Spazio privato</string>
<string name="list_other_volume_adjust">Regola volume</string>
<string name="pin_shortcut_button_bind">Associa al gesto</string>
<string name="settings_display_hide_status_bar">Nascondi barra di stato</string>
<string name="settings_display_hide_navigation_bar">Nascondi barra di navigazione</string>
<string name="settings_meta_donate">Dona</string>
<string name="list_other_recent_apps">App recenti</string>
<string name="settings_gesture_tap_up">Tap + Su</string>
<string name="settings_gesture_description_tap_up">Tap e scorri su</string>
<string name="settings_gesture_tap_down">Tap + Giù</string>
<string name="settings_gesture_description_tap_down">Tap e scorri verso il basso</string>
<string name="settings_gesture_tap_left">Tap + Sinistra</string>
<string name="settings_gesture_tap_right">Tap + Destra</string>
<string name="settings_gesture_description_swipe_larger">Alto sx -&gt; centro dx -&gt; basso sx</string>
<string name="settings_gesture_description_tap_left">Tap e scorri vesro sinistra</string>
<string name="settings_gesture_description_tap_right">Tap e scorri verso destra</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (Inverso)]]></string>
<string name="settings_gesture_description_swipe_larger_reverse">Basso sx -&gt; centro dx -&gt; alto sx</string>
<string name="settings_gesture_description_swipe_smaller">Alto dx -&gt; centro sx -&gt; basso dx</string>
<string name="settings_gesture_swipe_v">V</string>
<string name="settings_gesture_description_swipe_v">Alto sx -&gt; centro basso -&gt; alto dx</string>
<string name="settings_gesture_swipe_v_reverse">V (Inverso)</string>
<string name="settings_gesture_description_swipe_v_reverse">Alto dx -&gt; centro basso -&gt; alto sx</string>
<string name="settings_gesture_swipe_lambda">Λ</string>
<string name="settings_gesture_description_swipe_lambda">Basso sx -&gt; centro alto -&gt; basso dx</string>
<string name="settings_gesture_description_swipe_lambda_reverse">Basso dx -&gt; centro alto -&gt; basso sx</string>
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (Inverso)]]></string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (Inverso)</string>
<string name="list_other_track_play_pause">Musica: Riproduci / Pausa</string>
<string name="settings_list_reverse_layout">Inverti la lista applicazioni</string>
<string name="settings_tab_actions">Azioni</string>
<string name="settings_gesture_description_back">Pulsante / gesto indietro</string>
<string name="settings_gesture_back">Indietro</string>
<string name="settings_gesture_description_swipe_smaller_reverse">Basso dx -&gt; centro sx -&gt; alto dx</string>
<string name="settings_apps_hide_private_space_apps">Nascondi lo spazio privato dalla lista app</string>
<string name="list_other_launch_other_launcher">Avvia un altro launcher</string>
<string name="pin_shortcut_title">Aggiungi scorciatoia</string>
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
<string name="pin_shortcut_switch_visible">Mostra in lista app</string>
<string name="tooltip_lock_private_space">Blocca spazio privato</string>
<string name="tooltip_unlock_private_space">Sblocca spazio privato</string>
<string name="tutorial_concept_label_version">Versione</string>
<string name="alert_enable_accessibility_failed">Errore: impossibile abilitare il servizio di accessibilità.</string>
<string name="tutorial_app_list_text_2">Quando corrisponde una sola app, viene avviata automaticamente.\nPuoi disabilitare l\'avvio con uno spazio prima della query.</string>
<string name="tutorial_app_list_title">Tutte le app</string>
<string name="tutorial_app_list_text">Puoi cercare rapidamente tra tutte le app nella lista app.\n\nScorri su per la lista o associa ad un gesto diverso.</string>
<string name="alert_recent_apps_failed">Errore: impossibile mostrare le app recenti. (Se hai appena aggiornato l\'app, prova a disabilitare e riabilitare il servizio di accessibilità dalle impostazioni del telefono)</string>
<string name="settings_functionality_auto_close_keyboard">Chiudi la tastiera durante lo scorrimento</string>
<string name="settings_widgets_widgets">Gestione widget</string>
<string name="widget_menu_remove">Rimuovi</string>
<string name="settings_widgets_custom_panels">Gestione pannelli widget</string>
<string name="select_widget_title">Scegli widget</string>
<string name="widget_menu_configure">Configura</string>
<string name="widget_menu_enable_interaction">Abilita interazione</string>
<string name="widget_menu_disable_interaction">Disabilita interazione</string>
<string name="widget_clock_label">Orologio</string>
<string name="widget_clock_description">Orologio predefinito di μLauncher</string>
<string name="manage_widget_panels_delete">Elimina</string>
<string name="manage_widget_panels_rename">Rinomina</string>
<string name="widget_panel_default_name">Pannello widget #%1$d</string>
<string name="dialog_ok">Ok</string>
<string name="widget_panels_title">Pannelli widget</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="one">Contiene %1$d widget.</item>
<item quantity="many">Contiene %1$d widget.</item>
<item quantity="other">Contiene %1$d widget.</item>
</plurals>
<string name="dialog_create_widget_panel_title">Crea nuovo pannello widget</string>
<string name="list_other_open_widget_panel">Apri pannello widget</string>
<string name="alert_widget_panel_not_found">Questo pannello widget non esiste più.</string>
<string name="settings_launcher_section_widgets">Widget</string>
<string name="dialog_select_widget_panel_title">Seleziona pannello widget</string>
<string name="dialog_select_widget_panel_info_no_panels"><![CDATA[Nessun pannello widget trovato. Puoi creare pannelli widget da Impostazioni > Launcher > Gestione Pannelli Widget.]]></string>
<string name="settings_meta_view_docs">Documentazione</string>
<string name="notification_crash_explanation">Scusa! Clicca per altre info.</string>
<string name="notification_crash_title">µLauncher è crashato</string>
<string name="report_crash_button_copy">Copia il rapporto del crash negli appunti</string>
<string name="report_crash_button_mail">Invia il rapporto per email</string>
<string name="report_crash_button_report">Crea un bug report in GitHub</string>
<string name="report_crash_title">µLauncher è crashato</string>
<string name="send_email">Invia email</string>
<string name="notification_channel_crash">Info su crash e debug</string>
<string name="crash_info"><![CDATA[
Sembra che qualcosa sia andato storto, mi scuso per questo!<br><br>
Per motivi di privacy, i log dei crash non sono raccolti automaticamente.<br>
Comunque i log sono molto utili per il debug, quindi ti sarei molto grato se potessi inviarmi i log per email
oppure aprire un bug report su github.<br><br>
Nota che i crash log potrebbero contenere <strong>informazioni sensibili</strong>, come il nome dell\'app che hai provato ad avviare.
Please <strong>redact</strong> such information before sending the report.
<h2>What can I do now?</h2>
If this bug appears again and again, you can try several things:
<ul>
<li>Force stop μLauncher</li>
<li>Clear μLauncher\'s storage (<strong>Your settings will be lost!</strong>)</li>
<li>Install an older version (<a href=\"https://github.com/jrpie/Launcher/releases\">GitHub</a>, <a href=\"https://f-droid.org/en/packages/de.jrpie.android.launcher\">F-Droid</a>)</li>
</ul>
]]></string>
<string name="content_description_add_widget_panel">Aggiungi pannello widget</string>
<string name="content_description_close">Chiudi</string>
<string name="content_description_navigate_back">Naviga indietro</string>
<string name="content_description_navigate_next">Naviga avanti</string>
<string name="content_description_lock">Blocca</string>
<string name="content_description_add_widget">Aggiungi widget</string>
<string name="content_description_settings_actions_row_button_remove">Rimuovi associazione</string>
</resources>

View file

@ -3,7 +3,6 @@
<string name="alert_cant_open_title">アプリを開けません</string>
<string name="alert_cant_open_message">設定を変更しますか?</string>
<string name="settings_title">設定</string>
<string name="settings_tab_app">アプリ</string>
<string name="settings_tab_launcher">ランチャー</string>
<string name="settings_tab_meta">その他</string>
<string name="toast_cant_open_message">このジェスチャのアクションを選択するには設定を開きます</string>

View file

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--
-
- Home - Pradžia
-
-->
<string name="alert_cant_open_title">Nepavyksta paleisti programėlės</string>
<string name="alert_cant_open_message">Norite pakeisti nustatymus?</string>
<string name="toast_cant_open_message">Atidarykite nustatymus norėdami pasirinkti šio gesto veiksmą</string>
<!--
-
- Settings
-
-->
<string name="settings_title">Nustatymai</string>
<string name="settings_tab_actions">Veiksmai</string>
<string name="settings_tab_launcher">Paleidimo programėlė</string>
<string name="settings_tab_meta">Apie</string>
<!--
-
- Settings : Apps
-
-->
<string name="settings_gesture_back">Atgal</string>
<string name="settings_gesture_description_back">Grįžimo mygtukas / grįžimo gestas</string>
<string name="settings_gesture_up">Aukštyn</string>
<string name="settings_gesture_description_up">Perbraukimas aukštyn</string>
<string name="settings_gesture_tap_up">Bakstelėkite + aukštyn</string>
<string name="settings_gesture_description_tap_up">Bakstelėjimas ir perbraukimas aukštyn</string>
<string name="settings_gesture_double_up">Dvigubai aukštyn</string>
<string name="settings_gesture_description_double_up">Perbraukite aukštyn dviem pirštais</string>
<string name="settings_gesture_down">Žemyn</string>
<string name="settings_gesture_description_down">Perbraukite žemyn</string>
<string name="settings_gesture_tap_down">Bakstelėkite + žemyn</string>
<string name="settings_gesture_description_tap_down">Bakstelėkite ir perbraukite žemyn</string>
<string name="settings_gesture_double_down">Dvigubai žemyn</string>
<string name="settings_gesture_description_double_down">Perbraukite dviem pirštais</string>
<string name="settings_gesture_left">Kairėje</string>
<string name="settings_gesture_description_left">Perbraukite į kairę</string>
<string name="settings_gesture_tap_left">Bakstelėkite + kairę</string>
<string name="settings_gesture_description_tap_left">Bakstelėkite ir perbraukite į kairę</string>
<string name="settings_gesture_double_left">Dvigubai kairėje</string>
<string name="settings_gesture_description_double_left">Du pirštais perbraukite kairėn</string>
<string name="settings_gesture_right">Dešinė</string>
<string name="settings_gesture_description_right">Perbraukite į dešinę</string>
<string name="settings_gesture_tap_right">Bakstelėkite + dešinė</string>
<string name="settings_gesture_description_tap_right">Bakstelėkite ir perbraukite į dešinę</string>
<string name="settings_gesture_double_right">Dviguba dešinė</string>
<string name="settings_gesture_description_double_right">Perbraukite į dešinę dviem pirštais</string>
<string name="settings_gesture_right_top_edge">Dešinė (viršuje)</string>
<string name="settings_gesture_description_right_top_edge">Perbraukite tiesiai ekrano viršuje</string>
<string name="settings_gesture_right_bottom_edge">Dešinė (apačia)</string>
<string name="settings_gesture_description_right_bottom_edge">Perbraukite tiesiai ekrano apačioje</string>
<string name="settings_gesture_left_bottom_edge">Kairė (apačia)</string>
<string name="settings_gesture_description_left_bottom_edge">Perbraukite į kairę ekrano apačioje</string>
<string name="settings_gesture_left_top_edge">Kairė (viršuje)</string>
<string name="settings_gesture_description_left_top_edge">Perbraukite kairėn ekrano viršuje</string>
<string name="settings_gesture_up_left_edge">Aukštyn (kairysis kraštas)</string>
<string name="settings_gesture_description_up_left_edge">Perbraukite aukštyn kairiajame ekrano krašte</string>
<string name="settings_gesture_up_right_edge">Aukštyn (dešinysis kraštas)</string>
<string name="settings_gesture_description_up_right_edge">Perbraukite aukštyn dešiniajame ekrano krašte</string>
<string name="settings_gesture_down_left_edge">Žemyn (kairysis kraštas)</string>
<string name="settings_gesture_description_down_left_edge">Perbraukite žemyn kairiajame ekrano krašte</string>
<string name="settings_gesture_down_right_edge">Žemyn (dešinysis kraštas)</string>
<string name="settings_gesture_description_down_right_edge">Žemyn (dešinysis kraštas)</string>
<string name="settings_gesture_vol_up">Garsumo didinimo klavišas</string>
<string name="settings_gesture_description_vol_up">Paspauskite mygtuką „Volume Up“</string>
<string name="settings_gesture_vol_down">Volume žemyn klavišas</string>
<string name="settings_gesture_description_vol_down">Paspauskite mygtuką „Volume Down“</string>
<string name="settings_gesture_double_click">Dukart spustelėkite</string>
<string name="settings_gesture_description_double_click">Dukart spustelėkite tuščią sritį</string>
<string name="settings_gesture_long_click">Ilgas spustelėjimas</string>
<string name="settings_gesture_description_long_click">Ilgai spustelėkite tuščią sritį</string>
<string name="settings_gesture_date">Data</string>
<string name="settings_gesture_description_date">Spustelėkite datą</string>
<string name="settings_gesture_time">Laikas</string>
<string name="settings_gesture_description_time">Spustelėkite laiką</string>
<string name="settings_widgets_widgets">Tvarkykite valdiklius</string>
<string name="settings_widgets_custom_panels">Tvarkykite valdiklio skydelius</string>
<string name="settings_apps_choose">Pasirinkite programą</string>
<string name="settings_apps_install">Įdiekite programas</string>
<string name="settings_apps_toast_store_not_found">Parduotuvėje nerasta</string>
<!--
-
- Settings : Launcher
-
-->
<string name="settings_launcher_section_appearance">Išvaizda</string>
<string name="settings_theme_color_theme">Spalvos tema</string>
<string name="settings_theme_color_theme_item_default">Numatytasis</string>
<string name="settings_theme_color_theme_item_dark">Tamsu</string>
<string name="settings_theme_color_theme_item_light">Šviesa</string>
<string name="settings_theme_color_theme_item_dynamic">Dinaminis</string>
<string name="settings_theme_text_shadow">Teksto šešėlis</string>
<string name="settings_theme_background">Fonas (programų sąrašas ir nustatymas)</string>
<string name="settings_theme_background_item_transparent">Skaidrus</string>
<string name="settings_theme_background_item_dim">Dim</string>
<string name="settings_theme_background_item_blur">Blur</string>
<string name="settings_theme_background_item_solid">Solidus</string>
<string name="settings_theme_font">Šriftas</string>
<!-- names for @array/settings_theme_font_values -->
<string name="settings_theme_font_item_system_default">Sistemos numatytasis</string>
<string name="settings_theme_font_item_sans_serif">Be serifo</string>
<string name="settings_theme_font_item_serif">Serifas</string>
<string name="settings_theme_font_item_monospace">Monoerdvė</string>
<string name="settings_theme_font_item_serif_monospace">Serifo monospace</string>
<string name="settings_theme_monochrome_icons">Vienspalvių programų piktogramos</string>
<string name="settings_launcher_section_date_time"><![CDATA[Date & time]]></string>
<string name="settings_clock_color">Spalva</string>
<string name="settings_clock_time_visible">Rodyti laiką</string>
<string name="settings_clock_date_visible">Rodyti datą</string>
<string name="settings_clock_localized">Naudoti lokalizuotą datos formatą</string>
<string name="settings_clock_show_seconds">Rodyti sekundes</string>
<string name="settings_clock_flip_date_time">Apversti datą ir laiką</string>
<string name="settings_theme_wallpaper">Pasirinkite ekrano foną</string>
<string name="settings_launcher_section_display">Ekranas</string>
</resources>

View file

@ -0,0 +1,312 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_gesture_description_double_up">Met twee vingers naar boven vegen</string>
<string name="settings_widgets_widgets">Bewerk widgets</string>
<string name="settings_clock_color">Kleur</string>
<string name="settings_apps_toast_store_not_found">App-winkel niet gevonden</string>
<string name="settings_launcher_section_appearance">Uiterlijk</string>
<string name="settings_theme_color_theme">Kleurenschema</string>
<string name="settings_theme_color_theme_item_default">Standaard</string>
<string name="settings_theme_color_theme_item_dark">Donker</string>
<string name="settings_apps_choose">Kies app</string>
<string name="settings_general_choose_home_screen">µLauncher als standaard instellen</string>
<string name="settings_meta_cant_select_launcher">App info</string>
<string name="settings_meta_show_tutorial">Bekijk de µLauncher handleiding</string>
<string name="settings_meta_view_code">Broncode bekijken</string>
<string name="settings_meta_report_bug">Een probleem melden</string>
<string name="dialog_report_bug_title">Een probleem melden</string>
<string name="dialog_report_bug_button_clipboard">Naar klembord kopiëren</string>
<string name="dialog_report_bug_security_info">Meld veiligheidsproblemen niet publiek op GitHub, gebruik daarvoor het volgende:</string>
<string name="dialog_report_bug_create_report">Rapport maken</string>
<string name="settings_meta_fork_contact">Neem contact met de ontwikkelaar van de fork op</string>
<string name="settings_meta_join_chat">Word lid van de µLauncher chat</string>
<string name="settings_meta_reset">Instellingen terugzetten</string>
<string name="pin_shortcut_button_bind">Aan gebaar binden</string>
<string name="pin_shortcut_switch_visible">In aaps-lijst tonen</string>
<string name="tutorial_start_text">👋\n\nEen korte uitleg over hoe µLauncher functioneert.</string>
<string name="alert_enable_accessibility_failed">Foutmelding: De toegankelijkheidsdienst kon niet ingeschakeld worden.</string>
<string name="settings_gesture_description_tap_right">Tikken en dan naar rechts vegen</string>
<string name="settings_functionality_search_web_summary">Druk tijdens het zoeken naar apps enter, om op het internet te zoeken.</string>
<string name="toast_cant_open_message">Instellingen openen om voor dit gebaar een actie te kiezen</string>
<string name="settings_clock_localized">Gebruik gelokalizeerde datumformaat</string>
<string name="dialog_cancel">Annuleren</string>
<string name="settings_gesture_description_back">Terug-knop of gebaar</string>
<string name="settings_gesture_description_left_bottom_edge">Onderin naar links vegen</string>
<string name="settings_gesture_description_down_right_edge">Rechts naar beneden vegen</string>
<string name="settings_enabled_gestures_edge_swipe_summary">In de hoek vegen</string>
<string name="tutorial_title">Handleiding</string>
<string name="settings_gesture_description_double_down">Met twee vingers naar beneder vegen</string>
<string name="settings_apps_install">Apps installeren</string>
<string name="settings_list_layout_item_grid">Rooster</string>
<string name="settings_meta_reset_confirm">Hierdoor verwijdert u alle instellingen. Doorgaan?</string>
<string name="dialog_report_bug_info">Bedankt voor het helpen verbeteren van μLauncher!\nHet zou behulpzaam zijn om volgende informatie aan het rapport toe te voegen:</string>
<string name="pin_shortcut_title">Shortcut toevoegen</string>
<string name="alert_no_torch_found">Foutmelding: Er werd geen zaklamp gevonden.</string>
<string name="alert_torch_access_exception">Foutmelding: Geen toegang tot de zaklamp.</string>
<string name="accessibility_service_description">Door μLauncher in te stellen als toegankelijkheidsdienst kan het scherm worden vergrendeld en het menu met recente apps worden geopend. Merk op dat veel toestemingen vereist zijn. Wees hierdoor erg vorzichtig bij het geven van zulke machten aan een app. μLauncher zal de toegankelijkheidsdienst alleen gebruiken om de volgende acties uit te voeren wanneer de gebruiker daarom vraagt: * vergrendelscherm * recente apps openen μLauncher zal de toegankelijkheidsdienst nooit gebruiken om gegevens te verzamelen. U kunt de broncode controleren om er zeker van te zijn. Merk op dat het vergrendelen van het scherm ook kan worden bereikt door μLauncher apparaatbeheerdersrechten te geven, maar dat werkt echter niet met vingerafdruk- en gezichtsontgrendeling.</string>
<string name="screen_lock_method_dialog_text"><![CDATA[
<h1>Methode voor vergrendeling kiezen</h1>
Er zijn twee methodes om het scherm te vergrendelen.
Helaas hebben beide nadelen:<br/><br/>
<h3>Apparaatbeheerder</h3>
Werkt niet met ontgrendeling via vingerafdruk of gezichtsherkenning.
<br/>
<br/>
<h3>Toegankelijkheidsdienst</h3>
Vereist veel rechten.
μLauncher gebruikt deze rechten alleen om het scherm te vergrendelen.
<br/>
(Echter moet u niet zomaar een willekeurige app zulke rechten geven, maar u kunt de <a href=\"https://github.com/jrpie/Launcher\">Broncode</a>bekijken.)
<br/>
Op sommige apparaten wordt de pin niet meer gebruikt om data te vergrendelen na het aanzetten van een toegankelijkheidsdienst.
Dit kan nadehand <a href="https://issuetracker.google.com/issues/37010136#comment36">heraktiveerd</a> worden .
<br/><br/><br/><br/>
U kunt uw keuze altijd in de instellingen veranderen.
]]></string>
<string name="dialog_consent_accessibility_text"><![CDATA[U gaat hiermee de toegankelijkheidsdienst activeren. Dit geeft <strong>uitgebreide privileges</strong> aan μLauncher.<br/>μLauncher gebruikt deze privileges <strong>alleenmaar</strong> voor volgende doeleinde:
<ul>
<li>Vergrendelscherm</li>
<li>Recente apps</li>
</ul>
μLauncher <strong>verzamelt nooit gegevens</strong>. Onder anderen, μLauncher gebruikt de toegankelijkheidsdienst om gegevens verzamelen.]]></string>
<string name="settings_widgets_custom_panels">Bewerk widget paneel</string>
<string name="settings_theme_color_theme_item_light">Licht</string>
<string name="settings_theme_color_theme_item_dynamic">Dynamisch</string>
<string name="settings_theme_text_shadow">Tekstschaduw</string>
<string name="settings_theme_background">Achtergrond (zichtbaar in de instelligen en de app-lijst)</string>
<string name="settings_theme_background_item_transparent">Doorzichtig</string>
<string name="settings_theme_background_item_dim">Dimmen</string>
<string name="settings_theme_background_item_blur">Vervagen</string>
<string name="settings_theme_background_item_solid">Eenkleurig</string>
<string name="settings_theme_font">Lettertype</string>
<string name="settings_theme_font_item_system_default">Systeemstandaard</string>
<string name="settings_theme_font_item_sans_serif">Sans sarif</string>
<string name="settings_theme_font_item_serif">Serif</string>
<string name="settings_theme_font_item_monospace">Monospace</string>
<string name="settings_theme_font_item_serif_monospace">Serif monospace</string>
<string name="settings_theme_monochrome_icons">Eenkleurige aap-icoontjes</string>
<string name="settings_launcher_section_date_time"><![CDATA[Datum & Tijd]]></string>
<string name="settings_functionality_auto_keyboard">Toetenbord in de apps-lijst automatisch openen</string>
<string name="settings_launcher_section_apps">Apps</string>
<string name="settings_list_layout_item_text">Tekst</string>
<string name="settings_meta_donate">Doneer</string>
<string name="settings_meta_privacy">Privacybeleid</string>
<string name="settings_meta_contact">Contact opnemen met de oorspronkelijke ontwikkelaar</string>
<string name="settings_meta_discord">Wordt lid van onze Discord</string>
<string name="list_title_view">Alle apps</string>
<string name="list_title_favorite">Favorieten</string>
<string name="list_title_hidden">Verstopte apps</string>
<string name="list_title_private_space">Privébereik</string>
<string name="list_title_pick">App kiezen</string>
<string name="list_tab_app">Apps</string>
<string name="list_tab_other">Andere</string>
<string name="list_app_delete">Deïnstalleren</string>
<string name="list_app_info">App info</string>
<string name="list_app_favorite_add">Aan favorieten toevoegen</string>
<string name="list_app_favorite_remove">Uit favorieten verwijderen</string>
<string name="list_app_hidden_add">Verstoppen</string>
<string name="list_app_hidden_remove">Zichtbaar maken</string>
<string name="list_app_rename">Hernoemen</string>
<string name="list_apps_search_hint">Zoeken</string>
<string name="list_apps_search_hint_no_auto_launch">Zoeken (geen snelstart)</string>
<string name="list_other_settings">µLauncher instellingen</string>
<string name="list_other_list">Alle apps</string>
<string name="list_other_list_favorites">Favoriete apps</string>
<string name="list_other_list_private_space">Privéruimte</string>
<string name="list_other_toggle_private_space_lock">Privéruimte (ont)sluiten</string>
<string name="list_other_volume_up">Volume omhoog</string>
<string name="list_other_volume_down">Volume omlaag</string>
<string name="list_other_volume_adjust">Volume veranderen</string>
<string name="list_other_track_next">Muziek: Volgende</string>
<string name="list_other_track_previous">Muziek: Vorige</string>
<string name="list_other_track_play_pause">Muziek: Afspelen / Pauzeren</string>
<string name="list_other_expand_notifications_panel">Medling-scherm uitvouwen</string>
<string name="list_other_recent_apps">Recente apps</string>
<string name="list_other_lock_screen">Scherm vergrendelen</string>
<string name="list_other_torch">Zaklamp aan / uit</string>
<string name="list_other_launch_other_launcher">Andere launcher gebruiken</string>
<string name="tutorial_concept_title">Concept</string>
<string name="tutorial_concept_text">µLauncher biedt een minimalistische, efficiënte en afleidingsvrije omgeving.\n\nDe app is vrije software, het heeft geen advertenties en verzamelt geen data.</string>
<string name="tutorial_concept_label_version">Versie</string>
<string name="tutorial_usage_title">Gebruik</string>
<string name="tutorial_usage_text">Het startscherm toont allen de datum en tijd. Geen afleiding.</string>
<string name="tutorial_usage_text_2">Vaak gebruikte apps kunnen via gebaren of de volumeknoppen geopend worden.</string>
<string name="tutorial_app_list_title">Alle apps</string>
<string name="tutorial_app_list_text">In de applijst kan snel en eenvoudig naar apps gezocht worden.\n\nVeeg omhoog om de lijst te openen, of verander het gebaar in de settings.</string>
<string name="tutorial_app_list_text_2">Als maar één app bij het zoekbegrip past, wordt deze automatisch geopend.\nDoor een spatie voor het zoekbegrip intevoegen wordt dit onderdrukt.</string>
<string name="tutorial_setup_title">Instellen</string>
<string name="tutorial_setup_text">Wij hebben een paar standaard-apps voor u gekozen, u mag deze gerust veranderen:</string>
<string name="tutorial_setup_text_2">De selectie kan op elk moment in de instellingen aangepast worden.</string>
<string name="tutorial_finish_title">Starten!</string>
<string name="tutorial_finish_text">Het kan beginnen!\n\nWij hopen dat deze app u helpt!\n\n- Finn (de ontwikelaar) en Josia (de ontwikkelaar van de fork µLauncher)</string>
<string name="tutorial_finish_button">Starten</string>
<string name="settings">Instellingen</string>
<string name="ic_menu_alt">Meer opties</string>
<string name="alert_cant_expand_status_bar_panel">Foutmelding: Deze actie gebruikt een functie dat niet onderdeel is van de Android API, uw apparaat ondersteunt deze functie niet.</string>
<string name="alert_requires_android_m">Deze functie is pas vanaf Android 6 beschikbaar.</string>
<string name="alert_requires_android_v">Deze functie is pas vanaf Android 15 beschikbaar.</string>
<string name="snackbar_app_hidden">De app werd verstopt, het kan in de settings weer zichtbaar gemaakt worden.</string>
<string name="undo">Ongedaan maken</string>
<string name="list_other_expand_settings_panel">Snelle instellingen</string>
<string name="alert_recent_apps_failed">Foutmelding: Kon geen recente apps tonen (probeer de toegankelijkheidsdienst in de apparaatinstellingen uit en weer aan te zetten)</string>
<string name="toast_device_admin_not_enabled">µLauncher moet apparaatbeheerder zijn om het scherm te mogen vergrendelen.</string>
<string name="device_admin_explanation">Dit is nodig om het scherm te kunnen vergrendelen.</string>
<string name="device_admin_description">De actie \"scherm vergrendelen\" activeren</string>
<string name="toast_accessibility_service_not_enabled">De toegankelijkheidsdienst voor µLauncher staat niet aan. Schakel het aan in de instellingen</string>
<string name="alert_lock_screen_failed">Foutmelding: Kon het scherm niet vergrendelen (probeer de toegankelijkheidsdienst in de apparaatinstellingen uit en weer aan te zetten)</string>
<string name="toast_private_space_locked">Privégedeelte vergrendelt</string>
<string name="toast_private_space_unlocked">Privégedeelte ontgrendelt</string>
<string name="toast_private_space_not_available">Privégedeelte is niet bereikbaar</string>
<string name="toast_private_space_default_home_screen">µLauncher moet als standaard-launcher ingesteld zijn om tot de privégegedeelte toegeang te krijgen.</string>
<string name="tooltip_lock_private_space">Privégedeelte vergrendelen</string>
<string name="tooltip_unlock_private_space">Privégedeelte ontgrendelen</string>
<string name="toast_lock_screen_not_supported">Foutmelding: Op dit apparaat kan het scherm via de toegankelijkheidsdienst niet vergrendelt worden. Maak µLauncher apparaatbeheerder hiervoor.</string>
<string name="accessibility_service_name">µLauncher</string>
<string name="screen_lock_method_dialog_title">Methode voor vergrendeling kiezen</string>
<string name="screen_lock_method_use_accessibility">Gebruik toegankelijkheidsdienst</string>
<string name="screen_lock_method_use_device_admin">Gebruik apparaatadministratie</string>
<string name="settings_actions_lock_method">Kies een methode om het scherm te vergrendelen</string>
<string name="dialog_rename_title">%1$s hernoemen</string>
<string name="dialog_select_color_red">Rood</string>
<string name="dialog_select_color_alpha">Doorzichtigheid</string>
<string name="dialog_select_color_blue">Blauw</string>
<string name="dialog_select_color_green">Groen</string>
<string name="dialog_select_color_color_hex">Kleur</string>
<string name="dialog_choose_color_title">Kleur kiezen</string>
<string name="dialog_consent_accessibility_other_options">Ik ben me ervan bewust dat er andere opties bestaan (met beheerdersrechten of de aan/uit-knop).</string>
<string name="dialog_consent_accessibility_consent">Ik geef μLauncher toestemming om de toegankelijkheidservice te gebruiken om functionaliteit te bieden die niet gerelateerd is aan toegankelijkheid.</string>
<string name="dialog_consent_accessibility_privileges">Ik ben me ervan bewust ik hierdoor uitgebreide privileges verleen aan μLauncher.</string>
<string name="dialog_consent_accessibility_data_collection">Ik geef μLauncher toestemming om geen gegevens te verzamelen.</string>
<string name="dialog_consent_accessibility_title">Toegankelijkheidsservice activeren</string>
<string name="dialog_consent_accessibility_ok">Toegankelijkheidsservice activeren</string>
<string name="settings_meta_licenses">Open Source licenties</string>
<string name="legal_info_title">Open Source licenties</string>
<string name="toast_activity_not_found_search_web">Geen app gevonden om de zoekopdracht uit te voeren.</string>
<string name="select_widget_title">Kies widget</string>
<string name="widget_menu_remove">Verwijder</string>
<string name="widget_menu_configure">Configureren</string>
<string name="widget_menu_enable_interaction">Interactie inschakelen</string>
<string name="widget_menu_disable_interaction">Interactie uitschakelen</string>
<string name="widget_clock_label">Klok</string>
<string name="widget_clock_description">De standaard klok van µLauncher</string>
<string name="manage_widget_panels_delete">Verwijder</string>
<string name="manage_widget_panels_rename">Hernoem</string>
<string name="widget_panel_default_name">Widget Paneel #%1$d</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="one">Beinhoudt %d widget.</item>
<item quantity="other">Beinhoudt %d widgets.</item>
</plurals>
<string name="dialog_ok">Oké</string>
<string name="widget_panels_title">Widget paneel</string>
<string name="dialog_select_widget_panel_title">Selecteer een widget paneel</string>
<string name="dialog_create_widget_panel_title">Maak een nieuwe widget paneel</string>
<string name="dialog_select_widget_panel_info_no_panels"><![CDATA[Geen widget paneel gevonden. U kan een widget paneel maken in > Launcher > Beheer widget paneelen.]]></string>
<string name="list_other_open_widget_panel">Open widget paneel</string>
<string name="alert_widget_panel_not_found">Deze widget paneel bestaat niet meer.</string>
<string name="settings_launcher_section_widgets">Widgets</string>
<string name="alert_cant_open_title">App kan niet geopend worden</string>
<string name="alert_cant_open_message">App-instellingen aanpassen?</string>
<string name="settings_title">Instellingen</string>
<string name="settings_tab_actions">Acties</string>
<string name="settings_tab_launcher">Launcher</string>
<string name="settings_tab_meta">Meta</string>
<string name="settings_gesture_back">Terug</string>
<string name="settings_gesture_up">Naar boven</string>
<string name="settings_gesture_description_up">Naar boven vegen</string>
<string name="settings_gesture_description_tap_up">Tikken en dan naar boven vegen</string>
<string name="settings_gesture_double_up">Dubbel tikken en naar boven vegen</string>
<string name="settings_gesture_description_down">Naar beneden vegen</string>
<string name="settings_gesture_down">Naar beneden</string>
<string name="settings_gesture_tap_down">Tikken en naar beneden</string>
<string name="settings_gesture_description_tap_down">Tikken en naar beneden vegen</string>
<string name="settings_gesture_tap_up">Tikken en boven</string>
<string name="settings_gesture_double_down">Dubbel naar beneden</string>
<string name="settings_gesture_left">Naar links</string>
<string name="settings_gesture_description_left">Naar links vegen</string>
<string name="settings_gesture_tap_left">Tikken en links</string>
<string name="settings_gesture_description_tap_left">Tikken en dan naar links vegen</string>
<string name="settings_gesture_double_left">Dubbel links</string>
<string name="settings_gesture_description_double_left">Met twee vingers naar links vegen</string>
<string name="settings_gesture_right">Naar rechts</string>
<string name="settings_gesture_description_right">Naar rechts vegen</string>
<string name="settings_gesture_tap_right">Tikken en rechts</string>
<string name="settings_gesture_double_right">Dubbel rechts</string>
<string name="settings_gesture_description_double_right">Met twee vingers naar beneden vegen</string>
<string name="settings_gesture_right_top_edge">Rechts (boven)</string>
<string name="settings_gesture_description_right_top_edge">Bovenin naar rechts vegen</string>
<string name="settings_gesture_right_bottom_edge">Rechts (beneden)</string>
<string name="settings_gesture_description_right_bottom_edge">Onderin naar rechts vegen</string>
<string name="settings_gesture_left_bottom_edge">Links (onder)</string>
<string name="settings_gesture_left_top_edge">Links (boven)</string>
<string name="settings_gesture_description_left_top_edge">Bovenin naar liniks vegen</string>
<string name="settings_gesture_up_left_edge">Omhoog (links)</string>
<string name="settings_gesture_description_up_left_edge">Links naar boven vegen</string>
<string name="settings_gesture_up_right_edge">Omhoog (rechts)</string>
<string name="settings_gesture_description_up_right_edge">Rechts naar boven vegen</string>
<string name="settings_gesture_down_left_edge">Omlaag (links)</string>
<string name="settings_gesture_description_down_left_edge">Links naar beneden vegen</string>
<string name="settings_gesture_down_right_edge">Omlaag (rechts)</string>
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
<string name="settings_gesture_description_swipe_larger">Boven links -&gt; midden rechts -&gt; onder links</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (Achteruit)]]></string>
<string name="settings_gesture_description_swipe_larger_reverse">Onder links -&gt; midden rechts -&gt; boven links</string>
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
<string name="settings_gesture_vol_up">Volume omhoog knop</string>
<string name="settings_gesture_description_vol_up">Druk de \"volume omhoog\" knop</string>
<string name="settings_gesture_vol_down">Volume omlaag knop</string>
<string name="settings_gesture_description_vol_down">Druk de \"volume omlaag\" knop</string>
<string name="settings_gesture_double_click">Dubbelklik</string>
<string name="settings_gesture_description_double_click">Dubbeltik op een lege plek</string>
<string name="settings_gesture_long_click">Lange tik</string>
<string name="settings_gesture_description_long_click">Op een lege plek lang tikken</string>
<string name="settings_gesture_date">Datum</string>
<string name="settings_gesture_description_date">Op de datum tikken</string>
<string name="settings_gesture_time">Klok</string>
<string name="settings_gesture_description_time">Op de tijd tikken</string>
<string name="settings_gesture_description_swipe_smaller">Boven rechts -&gt; midden links -&gt; onder rechts</string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (Achteruit)]]></string>
<string name="settings_gesture_description_swipe_smaller_reverse">Onder rechts -&gt; midden links -&gt; boven rechts</string>
<string name="settings_gesture_swipe_v">V</string>
<string name="settings_gesture_description_swipe_v">Boven links -&gt; onder midden -&gt; boven rechts</string>
<string name="settings_gesture_swipe_v_reverse">V (Achteruit)</string>
<string name="settings_gesture_description_swipe_v_reverse">Boven rechts -&gt; onder rechts -&gt; boven links</string>
<string name="settings_gesture_swipe_lambda">Λ</string>
<string name="settings_gesture_description_swipe_lambda">Onder links -&gt; boven midden -&gt; onder rechts</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (Achteruit)</string>
<string name="settings_gesture_description_swipe_lambda_reverse">Onder rechts -&gt; boven midden -&gt; boven links</string>
<string name="settings_clock_time_visible">Toon de tijd</string>
<string name="settings_clock_date_visible">Toon de datum</string>
<string name="settings_clock_show_seconds">Toon sekondes</string>
<string name="settings_clock_flip_date_time">Spiegel datum en tijd</string>
<string name="settings_theme_wallpaper">Achtergrond kiezen</string>
<string name="settings_launcher_section_display">Beeldscherm</string>
<string name="settings_display_screen_timeout_disabled">Beeldscherm aanhouden</string>
<string name="settings_display_hide_status_bar">Statusbalk verbergen</string>
<string name="settings_display_hide_navigation_bar">Navigatiebalk verbergen</string>
<string name="settings_display_rotate_screen">Scherm draaien</string>
<string name="settings_launcher_section_functionality">Functionaliteit</string>
<string name="settings_enabled_gestures_double_swipe">Dubbele veeg gebaaren</string>
<string name="settings_enabled_gestures_double_swipe_summary">Met twee vingers vegen</string>
<string name="settings_enabled_gestures_edge_swipe">Hoek-gebaren</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">Kantbreedte</string>
<string name="settings_functionality_auto_launch">Start zoekresultaten</string>
<string name="settings_functionality_auto_launch_summary">Spatie drukken om deze functie tijdelijk te onderdruken.</string>
<string name="settings_functionality_search_web">Op het internet zoeken</string>
<string name="dialog_report_bug_button_security">Beveiligingsprobleem melden</string>
<string name="tutorial_concept_text_2">MIT licentie\nDe broncode is op GitHub te vinden.</string>
<string name="settings_functionality_auto_close_keyboard">Toetsenbord sluiten bij scrollen</string>
<string name="settings_launcher_sensitivity">Gevoeligheid</string>
<string name="settings_apps_hidden">Verstopte apps</string>
<string name="settings_apps_hide_bound_apps">Toon apps die aan een gebaar gekoppeld zijn niet in de apps-lijst</string>
<string name="settings_apps_hide_paused_apps">Gepauzeerde apps verstoppen</string>
<string name="settings_apps_hide_private_space_apps">Toon de privéruimte niet in de apps-lijst</string>
<string name="settings_list_layout">Opmaat van de apps-lijst</string>
<string name="settings_list_reverse_layout">Apps-lijst omkeren</string>
<string name="settings_list_layout_item_default">Standaard</string>
<string name="list_other_nop">Niets doen</string>
<string name="toast_activity_not_found_browser">URL kan niet geopend worden: geen browser gevonden.</string>
</resources>

View file

@ -0,0 +1,281 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_gesture_right_bottom_edge">W prawo (Dół)</string>
<string name="settings_gesture_description_down_left_edge">Przeciągnij w dół, po lewej krawędzi ekranu</string>
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
<string name="toast_cant_open_message">Otwórz ustawienia by wybrać akcje dla tego gestu</string>
<string name="settings_title">Ustawienia</string>
<string name="settings_tab_actions">Akcja</string>
<string name="settings_gesture_description_back">Przycisk cofnięcia / akcja cofnięcia</string>
<string name="settings_gesture_up">W górę</string>
<string name="settings_gesture_description_up">Przeciągnij w górę</string>
<string name="settings_gesture_tap_up">Kliknij + W górę</string>
<string name="settings_gesture_description_tap_up">Kliknij i przeciągnij w górę</string>
<string name="settings_gesture_double_up">Dwoma w górę</string>
<string name="settings_gesture_description_double_up">Przeciągnij dwoma palcami w górę</string>
<string name="settings_gesture_down">W dół</string>
<string name="settings_gesture_description_down">Przeciągnij w dół</string>
<string name="settings_gesture_tap_down">Kliknij + W dół</string>
<string name="settings_gesture_double_down">Dwoma w dół</string>
<string name="settings_gesture_description_double_down">Przeciągnij dwoma palcami w dół</string>
<string name="settings_gesture_left">W lewo</string>
<string name="settings_gesture_description_left">Przeciągnij w lewo</string>
<string name="settings_gesture_tap_left">Kliknij + W lewo</string>
<string name="settings_gesture_description_tap_left">Kliknij i przeciągnij w lewo</string>
<string name="settings_gesture_double_left">Dwoma w lewo</string>
<string name="settings_gesture_description_double_left">Przeciągnij dwoma palcami w lewo</string>
<string name="settings_gesture_right">W prawo</string>
<string name="settings_gesture_tap_right">Kliknij + W prawo</string>
<string name="settings_gesture_description_tap_right">Kliknij i przeciągnij w prawo</string>
<string name="settings_gesture_double_right">Dwoma w prawo</string>
<string name="settings_gesture_description_double_right">Przeciągnij dwoma palcami w prawo</string>
<string name="settings_gesture_right_top_edge">W prawo (Góra)</string>
<string name="settings_gesture_description_right_bottom_edge">Przeciągnij w prawo, w dolnej części ekranu</string>
<string name="settings_gesture_left_bottom_edge">W lewo (Dół)</string>
<string name="settings_gesture_description_left_bottom_edge">Przeciągnij w lewo, w dolnej części ekranu</string>
<string name="settings_gesture_left_top_edge">W lewo (Góra)</string>
<string name="settings_gesture_up_left_edge">W górę (Lewa krawędź)</string>
<string name="settings_gesture_description_up_left_edge">Przeciągnij w górę, po lewej krawędzi ekranu</string>
<string name="settings_gesture_up_right_edge">W górę (Prawa krawędź)</string>
<string name="settings_gesture_description_up_right_edge">Przeciągnij w górę, po prawej krawędzi ekranu</string>
<string name="settings_gesture_down_left_edge">W dół (Lewa krawędź)</string>
<string name="settings_gesture_down_right_edge">W dół (Prawa krawędź)</string>
<string name="settings_gesture_description_down_right_edge">Przeciągnij w dół, po prawej krawędzi ekranu</string>
<string name="settings_gesture_description_swipe_larger">Górny lewy -&gt; środek prawo -&gt; dolny lewy</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (Odwrotnie)]]></string>
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
<string name="settings_gesture_swipe_v">V</string>
<string name="settings_gesture_swipe_lambda">Λ</string>
<string name="alert_cant_open_title">Nie można otworzyć aplikacji</string>
<string name="settings_gesture_back">Cofnij</string>
<string name="alert_cant_open_message">Chcesz zmienić to ustawienie?</string>
<string name="settings_gesture_description_right">Przeciągnij w prawo</string>
<string name="settings_gesture_description_swipe_larger_reverse">Dolny lewy -&gt; środek prawo -&gt; górny lewy</string>
<string name="settings_gesture_description_tap_down">Kliknij i przeciągnij w dół</string>
<string name="settings_gesture_description_right_top_edge">Przeciągnij w prawo, w górnej części ekranu</string>
<string name="settings_gesture_description_left_top_edge">Przeciągnij w lewo, w górnej części ekranu</string>
<string name="dialog_report_bug_button_security">Zgłoś lukę w zabezpieczeniach</string>
<string name="list_other_list">Wszystkie aplikacje</string>
<string name="tutorial_usage_title">Użytek</string>
<string name="toast_private_space_not_available">Przestrzeń prywatna jest niedostępna</string>
<string name="settings_clock_flip_date_time">Zamień date i zegar</string>
<string name="settings_apps_hide_bound_apps">Nie pokazuje aplikacji przypisanych do gestów w liście aplikacji</string>
<string name="dialog_report_bug_info">Dziękujemy za pomoc w udoskonaleniu μLauncher!\nProszę przemyśl dodanie podanych informacji do twojego zgłoszenia błędu:</string>
<string name="settings_meta_discord">Dołącz do nas na Discordzie!</string>
<string name="list_other_track_previous">Muzyka: Poprzednie</string>
<string name="settings_launcher_section_appearance">Wygląd</string>
<string name="settings_theme_font_item_system_default">Domyślna systemowa</string>
<string name="settings_theme_font_item_serif">Serif</string>
<string name="settings_enabled_gestures_double_swipe">Akcje podwójnego przeciągnięcia</string>
<string name="settings_tab_launcher">Launcher</string>
<string name="settings_tab_meta">Meta</string>
<string name="settings_gesture_description_swipe_smaller">Prawy górny -&gt; środek lewo -&gt; prawy dolnym</string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (Odwrotnie)]]></string>
<string name="settings_gesture_description_swipe_smaller_reverse">Prawy dolnym -&gt; środek lewo -&gt; prawy górny</string>
<string name="settings_gesture_swipe_v_reverse">V (Odwrotnie)</string>
<string name="settings_gesture_description_swipe_lambda">Lewy dolny -&gt; środkowy górny -&gt; prawy dolny</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (Odwrotnie)</string>
<string name="settings_gesture_vol_up">Przycisk podgłośnienia</string>
<string name="settings_gesture_description_vol_up">Naciśnij przycisk podgłośnienia</string>
<string name="settings_gesture_vol_down">Przycisk przyciszenia</string>
<string name="settings_gesture_description_vol_down">Naciśnij przycisk przyciszenia</string>
<string name="settings_gesture_description_swipe_lambda_reverse">Prawy górny -&gt; środkowy górny -&gt; lewy górny</string>
<string name="settings_gesture_double_click">Dwuklik</string>
<string name="settings_gesture_description_double_click">Naciśnij dwukrotnie w pustym miejscu</string>
<string name="settings_gesture_long_click">Wydłużone kliknięcie</string>
<string name="settings_gesture_date">Data</string>
<string name="settings_gesture_description_date">Kliknij na date</string>
<string name="settings_gesture_time">Zegar</string>
<string name="settings_widgets_widgets">Zarządzaj widżetami</string>
<string name="settings_widgets_custom_panels">Zarządzaj panelem widżetów</string>
<string name="settings_apps_choose">Wybierz aplikacje</string>
<string name="settings_apps_install">Zainstaluj aplikacje</string>
<string name="settings_gesture_description_time">Kliknij na zegar</string>
<string name="settings_apps_toast_store_not_found">Sklep nie został znaleziony</string>
<string name="settings_theme_color_theme">Kolor motywu</string>
<string name="settings_theme_color_theme_item_default">Domyślne</string>
<string name="settings_theme_color_theme_item_dark">Ciemny</string>
<string name="settings_theme_color_theme_item_light">Jasny</string>
<string name="settings_theme_color_theme_item_dynamic">Dynamiczny</string>
<string name="settings_theme_text_shadow">Cień tekstu</string>
<string name="settings_theme_background">Tło (lista aplikacji i ustawienia)</string>
<string name="settings_theme_background_item_transparent">Przeźroczysty</string>
<string name="settings_theme_background_item_dim">Przygaszony</string>
<string name="settings_theme_background_item_blur">Rozmazanie</string>
<string name="settings_theme_background_item_solid">Jednolity</string>
<string name="settings_theme_font">Czcionką</string>
<string name="settings_theme_font_item_monospace">Monospace</string>
<string name="settings_theme_font_item_sans_serif">Sans serif</string>
<string name="settings_theme_font_item_serif_monospace">Serif monospace</string>
<string name="settings_theme_monochrome_icons">Monochromatyczne ikony aplikacji</string>
<string name="settings_launcher_section_date_time"><![CDATA[Date & time]]></string>
<string name="settings_clock_color">Kolor</string>
<string name="settings_clock_date_visible">Pokazuj date</string>
<string name="settings_clock_show_seconds">Pokazuj sekundy</string>
<string name="settings_theme_wallpaper">Wybierz tapetę</string>
<string name="settings_launcher_section_display">Wyświetlanie</string>
<string name="settings_display_screen_timeout_disabled">Zatrzymaj na ekranie</string>
<string name="settings_display_hide_status_bar">Schowaj pasek statusów</string>
<string name="settings_display_hide_navigation_bar">Schowaj pasek nawigacji</string>
<string name="settings_display_rotate_screen">Obracają ekran</string>
<string name="settings_launcher_section_functionality">Funkcjonalność</string>
<string name="settings_enabled_gestures_double_swipe_summary">Przeciągnij dwoma palcami</string>
<string name="settings_enabled_gestures_edge_swipe">Przeciąganie na krawędziach</string>
<string name="settings_enabled_gestures_edge_swipe_summary">Przeciągnij koło krawędź ekranu</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">Rozmiary krawędź</string>
<string name="settings_functionality_auto_launch">Automatycznie uruchamiaj wyszukiwanie</string>
<string name="settings_functionality_search_web">Wyszukuje w sieci</string>
<string name="settings_functionality_search_web_summary">Kliknij enter, wyszukując w liście aplikacji, by wyszukać w internecie.</string>
<string name="settings_functionality_auto_keyboard">Pokazuje klawiaturę do wyszukiwania</string>
<string name="settings_functionality_auto_close_keyboard">Zamknij klawiaturę podczas przewijania</string>
<string name="settings_launcher_sensitivity">Czułość</string>
<string name="settings_launcher_section_apps">Aplikacje</string>
<string name="settings_apps_hidden">Ukryte aplikacje</string>
<string name="settings_apps_hide_paused_apps">Ukryj zatrzymane aplikacje</string>
<string name="settings_apps_hide_private_space_apps">Ukryj przestrzeń prywatną z listy aplikacji</string>
<string name="settings_list_layout">Układ listy aplikacji</string>
<string name="settings_list_reverse_layout">Odwróć listę aplikacji</string>
<string name="settings_list_layout_item_default">Domyślny</string>
<string name="settings_list_layout_item_text">Tekst</string>
<string name="settings_list_layout_item_grid">Siatka</string>
<string name="settings_meta_cant_select_launcher">Informacje aplikacji</string>
<string name="settings_meta_show_tutorial">Zobacz samouczek µLauncher</string>
<string name="settings_meta_reset">Zresetuj ustawienia</string>
<string name="settings_meta_reset_confirm">Odrzucisz wszystkie swoje preferencje. Czy chcesz kontynuować?</string>
<string name="settings_meta_view_code">Zobacz kod źródłowy</string>
<string name="settings_meta_report_bug">Zgłoś błąd</string>
<string name="dialog_report_bug_title">Zgłoś błąd</string>
<string name="dialog_report_bug_button_clipboard">Skopiuj do schowka</string>
<string name="dialog_report_bug_security_info">Proszę nie zgłaszaj luk w zabezpieczeniach publicznie na GitHubie, użyj natomiast podanego linku:</string>
<string name="dialog_report_bug_create_report">Utwórz zgłoszenie</string>
<string name="settings_meta_fork_contact">Skontaktuj się z deweloperem forku</string>
<string name="settings_meta_join_chat">Dołącz do czatu μLauncher</string>
<string name="settings_meta_donate">Wesprzyj</string>
<string name="settings_meta_privacy">Polityka prywatność</string>
<string name="settings_meta_contact">Skontaktuj się z deweloperem orginału</string>
<string name="list_title_view">Lista aplikacji</string>
<string name="list_title_favorite">Ulubione aplikacje</string>
<string name="list_title_hidden">Ukryte aplikacje</string>
<string name="list_title_private_space">Przestrzeń prywatna</string>
<string name="list_title_pick">Wybierz aplikacje</string>
<string name="list_tab_app">Aplikacje</string>
<string name="list_tab_other">Inne</string>
<string name="list_app_delete">Odinstaluj</string>
<string name="list_app_info">Informacje aplikacji</string>
<string name="list_app_favorite_remove">Usuń z ulubionych</string>
<string name="list_app_hidden_add">Ukryj</string>
<string name="list_app_hidden_remove">Pokaż</string>
<string name="list_app_rename">Zmień nazwę</string>
<string name="list_apps_search_hint">Wyszukaj</string>
<string name="list_apps_search_hint_no_auto_launch">Wyszukaj (brak automatycznego uruchomienia)</string>
<string name="list_other_settings">Ustawienia μLauncher</string>
<string name="list_other_list_favorites">Ulubione aplikacje</string>
<string name="list_other_list_private_space">Przestrzeń prywatna</string>
<string name="list_other_toggle_private_space_lock">Przełącz zamek prywatnej przestrzeni</string>
<string name="list_other_volume_up">Podgłośnij</string>
<string name="list_other_volume_down">Przycisz</string>
<string name="list_other_volume_adjust">Dostosuj głośność</string>
<string name="list_other_track_next">Muzyka: Następne</string>
<string name="list_other_track_play_pause">Muzyka: Wznów / Wstrzymaj</string>
<string name="list_other_expand_notifications_panel">Rozwiń panel powiadomień</string>
<string name="list_other_recent_apps">Ostatnio używane aplikacje</string>
<string name="list_other_nop">Nie rób nic</string>
<string name="list_other_lock_screen">Ekran blokady</string>
<string name="list_other_torch">Przełącz latarkę</string>
<string name="list_other_launch_other_launcher">Uruchomiono inny ekran główny</string>
<string name="pin_shortcut_title">Dodaj skrót</string>
<string name="pin_shortcut_button_bind">Przypisz do gestu</string>
<string name="pin_shortcut_switch_visible">Pokaż w liście aplikacji</string>
<string name="tutorial_title">Samouczek</string>
<string name="tutorial_start_text">👋\n\nPoświeć kilka chwil, aby nauczyć się jak używać togo launchera!</string>
<string name="tutorial_concept_title">Koncept</string>
<string name="tutorial_concept_label_version">Wersja</string>
<string name="tutorial_app_list_title">Wszystkie aplikacje</string>
<string name="tutorial_setup_title">Konfiguracja</string>
<string name="tutorial_finish_title">Gratulacje!</string>
<string name="tutorial_finish_button">Start</string>
<string name="settings">Ustawienia</string>
<string name="ic_menu_alt">Więcej opcji</string>
<string name="undo">Cofnij</string>
<string name="toast_private_space_unlocked">Przestrzeń prywatna odblokowana</string>
<string name="tooltip_lock_private_space">Zablokuj przestrzeń prywatną</string>
<string name="tooltip_unlock_private_space">Odblokuj przestrzeń prywatną</string>
<string name="accessibility_service_name">μLauncher</string>
<string name="screen_lock_method_dialog_title">Wybierz metodę zablokowania</string>
<string name="settings_actions_lock_method">Wybierz metodę blokowania ekranu</string>
<string name="dialog_rename_title">Zmień nazwę %1$s</string>
<string name="dialog_select_color_red">Czerwony</string>
<string name="dialog_select_color_alpha">Przezroczystości</string>
<string name="dialog_select_color_blue">Niebieski</string>
<string name="dialog_select_color_green">Zielony</string>
<string name="dialog_choose_color_title">Wybierz kolor</string>
<string name="dialog_cancel">Anuluj</string>
<string name="toast_activity_not_found_search_web">Nie znaleziono aplikacji do obsługi wyszukiwania.</string>
<string name="settings_clock_time_visible">Pokazuj zegar</string>
<string name="settings_clock_localized">Użyj lokalnego formatu daty</string>
<string name="settings_gesture_description_long_click">Kliknij dłużej w pustym miejscu</string>
<string name="settings_gesture_description_swipe_v">Lewy górny -&gt; środkowy dolny -&gt; prawy górny</string>
<string name="settings_gesture_description_swipe_v_reverse">Prawy górny -&gt; środkowy dolny -&gt; lewy górny</string>
<string name="settings_functionality_auto_launch_summary">Kliknij spacje, by tymczasowo wyłączyć tą funkcje.</string>
<string name="list_other_expand_settings_panel">Szybkie ustawienia</string>
<string name="toast_private_space_locked">Przestrzeń prywatna zablokowana</string>
<string name="settings_general_choose_home_screen">Ustaw μLauncher jako ekran główny</string>
<string name="dialog_select_color_color_hex">Kolor</string>
<string name="list_app_favorite_add">Dodaj do ulubionych</string>
<string name="tutorial_concept_text_2">Jest to darmowe oprogramowanie (na licencji MIT)!\nZachęcamy do odwiedzenia naszego repozytorium!</string>
<string name="tutorial_concept_text">μLauncher jest projektowany z uwagą na minimalizm, efektywności i brak rozproszeń. \n\nNie zawiera reklam i nie zbiera twoich danych.</string>
<string name="tutorial_usage_text">Twój ekran główny zawiera lokalną datę i czas. Żadnych rozproszeń.</string>
<string name="tutorial_usage_text_2">Możesz uruchomić swoje najważniejsze aplikacje za pomocą gestów i użyciem przycisków.</string>
<string name="tutorial_app_list_text">Możesz szybko wyszukiwać aplikacje poprzez listę aplikacji.\n\nPrzeciągnij do góry aby ją otworzyć, lub przypisz ją do innego gestu.</string>
<string name="tutorial_app_list_text_2">Gdy tylko jedna aplikacja pasuje do twojego wyszukiwania, uruchomi się automatycznie.\nTa opcja może być wyłączona, przez wpisanie spacji przed wyszukaniem.</string>
<string name="tutorial_setup_text">Wybraliśmy pare domyślnych aplikacji dla ciebie. Możesz zmienić je teraz jeśli chcesz:</string>
<string name="tutorial_setup_text_2">Albo zmień je później.</string>
<string name="alert_requires_android_m">Ta funkcja wymaga wersji 6 lub wyższej Androida.</string>
<string name="alert_requires_android_v">Ta funkcja wymaga wersji 15 lub wyższej Androida.</string>
<string name="snackbar_app_hidden">Aplikacja schowana. Możesz przywrócić jej widoczność z powrotem w ustawieniach.</string>
<string name="alert_torch_access_exception">Error: Brak dostępu do latarki.</string>
<string name="device_admin_description">Aktywuj akcje zablokowania ekranu</string>
<string name="dialog_consent_accessibility_data_collection">Wyrażam zgodę by, μLauncher nie zbierał żadnych moich danych.</string>
<string name="toast_activity_not_found_browser">Nie można otworzyć adresu URL: nie znaleziono przeglądarki.</string>
<string name="select_widget_title">Wybierz widżet</string>
<string name="widget_menu_remove">Usuń</string>
<string name="widget_menu_configure">Skonfiguruj</string>
<string name="widget_clock_label">Zegar</string>
<string name="widget_menu_enable_interaction">Aktywuje interakcje</string>
<string name="widget_menu_disable_interaction">Dezaktywuj interakcje</string>
<string name="manage_widget_panels_delete">Usuń</string>
<string name="widget_clock_description">Domyślny zegar μLauncher</string>
<string name="manage_widget_panels_rename">Zmień nazwę</string>
<string name="widget_panel_default_name">Panel widżetów #%1$d</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="one">Zawiera %1$d widżet.</item>
<item quantity="few">Zawiera %1$d widżety.</item>
<item quantity="many">Zawiera %1$d widżetów.</item>
<item quantity="other">Zawiera %1$d widżetów.</item>
</plurals>
<string name="legal_info_title">Licencje Open Source</string>
<string name="settings_meta_licenses">Licencje Open Source</string>
<string name="dialog_ok">Okej</string>
<string name="widget_panels_title">Panel widżetów</string>
<string name="dialog_select_widget_panel_title">Wybierz panel widżetów</string>
<string name="dialog_create_widget_panel_title">Stwórz nowy panel widżetów</string>
<string name="list_other_open_widget_panel">Otwórz panel widżetów</string>
<string name="settings_launcher_section_widgets">Widżety</string>
<string name="alert_widget_panel_not_found">Ten panel widżetów już nie istnieje.</string>
<string name="alert_no_torch_found">Nie wykryto aparatu z latarką.</string>
<string name="toast_device_admin_not_enabled">μLauncher musi być administratorem urządzenia, aby zablokować ekran.</string>
<string name="alert_cant_expand_status_bar_panel">Błąd: Nie można rozszerzyć paska stanu. Ta akcja wykorzystuje funkcjonalność, która nie jest częścią opublikowanego interfejsu API Androida. Niestety, wydaje się, że nie działa na Twoim urządzeniu.</string>
<string name="device_admin_explanation">Jest to wymagane do działania blokady ekranu.</string>
<string name="alert_recent_apps_failed">Błąd: Nie udało się wyświetlić ostatnich aplikacji. (Jeśli właśnie zaktualizowałeś aplikację, spróbuj wyłączyć i ponownie włączyć usługę dostępności w ustawieniach telefonu)</string>
<string name="alert_enable_accessibility_failed">Błąd: Nie udało się włączyć usługi ułatwień dostępu.</string>
<string name="toast_private_space_default_home_screen">μLauncher musi być domyślnym ekranem głównym, aby uzyskać dostęp do przestrzeni prywatnej.</string>
<string name="toast_lock_screen_not_supported">Błąd: Blokowanie ekranu za pomocą funkcji ułatwień dostępu nie jest obsługiwane na tym urządzeniu. Zamiast tego użyj opcji administratora urządzenia.</string>
<string name="screen_lock_method_use_accessibility">Skorzystaj z usługi dostępności</string>
<string name="screen_lock_method_use_device_admin">Użyj opcji administratora urządzenia</string>
<string name="dialog_consent_accessibility_privileges">Zdaję sobie sprawę, że nada to μLauncherowi rozległe uprawnienia.</string>
<string name="dialog_consent_accessibility_other_options">Wiem, że istnieją inne opcje (użycie uprawnień administratora urządzenia lub przycisku zasilania).</string>
<string name="alert_lock_screen_failed">Błąd: Nie udało się zablokować ekranu. (Jeśli właśnie zaktualizowałeś aplikację, spróbuj wyłączyć i ponownie włączyć usługę dostępności w ustawieniach telefonu)</string>
<string name="toast_accessibility_service_not_enabled">Usługa dostępności μLauncher nie jest włączona. Proszę włączyć ją w ustawieniach</string>
<string name="tutorial_finish_text">Wszystko gotowe!\n\nMam nadzieję, że będzie to dla ciebie bardzo wartościowe!\n\n- Finn (twórca Launchera) i Josia (wprowadziła pewne ulepszenia i utrzymuje fork μLauncher)</string>
<string name="accessibility_service_description">Ustawienie μLauncher jako usługi ułatwień dostępu umożliwia zablokowanie ekranu i otwarcie menu ostatnich aplikacji. Należy pamiętać, że wymagane są nadmierne uprawnienia. Nigdy nie należy udzielać takich uprawnień bez powodu żadnej aplikacji. μLauncher będzie korzystał z usługi ułatwień dostępu wyłącznie w celu wykonania następujących czynności na żądanie użytkownika: * zablokuj ekran * otwórz ostatnio używane aplikacje μLauncher nigdy nie będzie korzystał z usługi ułatwień dostępu w celu zbierania danych. Możesz sprawdzić kod źródłowy, aby się upewnić. Należy pamiętać, że zablokowanie ekranu można również osiągnąć poprzez przyznanie aplikacji uprawnień administratora urządzenia. Jednak ta metoda nie działa w przypadku odblokowywania przy użyciu odcisku palca i skanu twarzy.</string>
</resources>

View file

@ -14,7 +14,6 @@
-
-->
<string name="settings_title">Configurações</string>
<string name="settings_tab_app">Apps</string>
<string name="settings_tab_launcher">Launcher</string>
<string name="settings_tab_meta">Meta</string>
<!--
@ -38,8 +37,8 @@
<string name="settings_gesture_up_right_edge">Para cima (borda direita)</string>
<string name="settings_gesture_down_left_edge">Para baixo (borda esquerda)</string>
<string name="settings_gesture_down_right_edge">Para baixo (borda direita)</string>
<string name="settings_gesture_vol_up">Aumento de volume</string>
<string name="settings_gesture_vol_down">Diminuição de volume</string>
<string name="settings_gesture_vol_up">Botão de aumentar volume</string>
<string name="settings_gesture_vol_down">Botão de diminuir volume</string>
<string name="settings_gesture_double_click">Toque duplo</string>
<string name="settings_gesture_long_click">Toque longo</string>
<string name="settings_gesture_date">Data</string>
@ -77,7 +76,7 @@
-->
<string name="settings_general_choose_home_screen">Definir o μLauncher como tela inicial</string>
<string name="settings_meta_cant_select_launcher">Informações do aplicativo</string>
<string name="settings_meta_show_tutorial">Ver tutorial do launcher</string>
<string name="settings_meta_show_tutorial">Ver tutorial do µLauncher</string>
<string name="settings_meta_reset">Redefinir configuraçãos</string>
<string name="settings_meta_reset_confirm">Você vai descartar todas as suas preferências. Continuar?</string>
<string name="settings_meta_report_bug">Reportar um bug</string>
@ -97,31 +96,31 @@
<string name="list_app_delete">Desinstalar</string>
<string name="list_app_info">Informações do aplicativo</string>
<string name="list_apps_search_hint">Busque</string>
<string name="list_other_settings">Configurações do µLauncher</string>
<string name="list_other_settings">Configurações do μLauncher</string>
<string name="list_other_list">Todos os apps</string>
<string name="list_other_volume_up">Música: Mais alto</string>
<string name="list_other_volume_down">Música: Mais silencioso</string>
<string name="list_other_volume_up">Aumentar volume</string>
<string name="list_other_volume_down">Diminuir volume</string>
<string name="list_other_track_next">Música: Próximo</string>
<string name="list_other_track_previous">Música: Anterior</string>
<string name="list_other_nop">Não faça nada</string>
<string name="list_other_nop">Não fazer nada</string>
<!--
-
- Tutorial
-
-->
<string name="tutorial_title">Tutorial</string>
<string name="tutorial_start_text">Tire alguns segundos para aprender a usar este Launcher!</string>
<string name="tutorial_start_text">👋\n\nTire alguns segundos para aprender a usar este Launcher!</string>
<string name="tutorial_concept_title">Conceito</string>
<string name="tutorial_concept_text">O Launcher foi criado para ser minimalista, eficiente e livre de distrações. Ele é livre de pagamentos, anúncios e serviços de rastreamento.</string>
<string name="tutorial_concept_text_2">O app é de código aberto (licença MIT) e está disponível no GitHub! Não deixe de conferir o repositório!</string>
<string name="tutorial_concept_text">O μLauncher foi criado para ser minimalista, eficiente e livre de distrações. \n\n\nNão contém anúncios e não coleta dados.</string>
<string name="tutorial_concept_text_2">É um software livre (sob licença MIT)!\nNão deixe de conferir o repositório!</string>
<string name="tutorial_usage_title">Uso</string>
<string name="tutorial_usage_text">Sua tela inicial contém a data e hora local. Sem distrações.</string>
<string name="tutorial_usage_text_2">Você pode iniciar seus aplicativos com um gesto único ou apertando um botão. Escolha algumas ações no próximo slide.</string>
<string name="tutorial_usage_text_2">Você pode iniciar seus aplicativos com gestos de toque ou apertando um botão.</string>
<string name="tutorial_setup_title">Configurar</string>
<string name="tutorial_setup_text">Selecionamos alguns aplicativos padrão para você. Se quiser, você pode alterá-los agora:</string>
<string name="tutorial_setup_text_2">Você pode alterar suas escolhas mais tarde.</string>
<string name="tutorial_finish_title">Vamos lá!</string>
<string name="tutorial_finish_text">Tá todo pronto para começar! Espero que isso seja de grande valor para você! - Finn (que criou o Launcher) \te Josia (que fez algumas melhorias e tb mantém o fork do μLauncher)</string>
<string name="tutorial_finish_text">Tá todo pronto para começar!\n\nEspero que isso seja de grande valor para você!\n\n- Finn (que criou o Launcher) e Josia (que fez algumas melhorias e tb mantém o fork do μLauncher)</string>
<string name="tutorial_finish_button">Começar</string>
<string name="settings">Configurações</string>
<string name="ic_menu_alt">Mais opções</string>
@ -148,11 +147,11 @@
<string name="alert_lock_screen_failed">Erro: Falha ao bloquear a tela. (Se você acabou de atualizar o app, tente desativar e reativar o Serviço de acessibilidade em configurações do aparelho)</string>
<string name="toast_accessibility_service_not_enabled">O Serviço de acessibilidade do μLauncher não está ativado. Entre em configurações para ativar</string>
<string name="settings_apps_hide_bound_apps">Não mostrar apps com um gesto atribuído na lista de aplicativos</string>
<string name="toast_device_admin_not_enabled">O µLauncher precisa tornar-se o Administrador do dispositivo para poder bloquear a tela.</string>
<string name="toast_device_admin_not_enabled">O μLauncher precisa virar um Administrador do dispositivo para poder bloquear a tela.</string>
<string name="device_admin_explanation">Isto é necessário para realizar a ação de bloqueio da tela.</string>
<string name="device_admin_description">Permitir a ação de bloqueio da tela</string>
<string name="alert_torch_access_exception">Erro: Não é possível acessar a lanterna.</string>
<string name="accessibility_service_name">µLauncher - bloqueio da tela</string>
<string name="accessibility_service_name">μLauncher</string>
<string name="screen_lock_method_use_accessibility">Usar o Serviço de acessibilidade</string>
<string name="screen_lock_method_use_device_admin">Usar o Administrador do dispositivo</string>
<string name="screen_lock_method_dialog_title">Escolha um método de bloqueio</string>
@ -161,7 +160,7 @@
<string name="alert_requires_android_m">Essa funcionalidade requer o Android 6 ou mais recente.</string>
<string name="alert_no_torch_found">Nenhuma câmera com lanterna detectada.</string>
<string name="toast_lock_screen_not_supported">Erro: O bloqueio da tela via Serviço de acessibilidade não é compatível com este aparelho. Tente usar Administrador do dispositivo como método alternativo.</string>
<string name="accessibility_service_description">Definindo µLauncher como Serviço de acessibilidade permite a ele bloquear a tela. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O µLauncher usará o Serviço de acessibilidade somente para bloquear a tela. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao µLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial.</string>
<string name="accessibility_service_description">Definindo o μLauncher como Serviço de acessibilidade permite bloquear a tela e abrir o menu de apps recentes. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O μLauncher usará o Serviço de acessibilidade somente para executar as seguintes ações quando solicitado pelo usuário: * bloquear a tela * abrir aplicativos recentes μLauncher nunca usará o Serviço de acessibilidade para coletar os dados. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao μLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial.</string>
<string name="screen_lock_method_dialog_text"><![CDATA[
<h1>Escolha um método de bloqueio</h1>
Há dois métodos para bloquear a tela.
@ -175,9 +174,9 @@
<h3>Serviço de acessibilidade</h3>
Exige permissões elevadas.
O µLauncher usará essas permissões apenas para bloquear a tela.
O μLauncher usará essas permissões apenas para bloquear a tela.
<br/>
(Você realmente não deveria confiar num app aleatório que você baixou que tá pedindo estas permissões, mas pode verificar o <a href=\"https://github.com/jrpie/Launcher\">código-fonte</a>.)
(Você realmente não deveria confiar num app aleatório que você baixou e tá pedindo estas permissões, mas pode verificar o <a href=\"https://github.com/jrpie/Launcher\">código-fonte</a>.)
<br/>
Em alguns aparelhos após ativação do Serviço de acessibilidade não será mais exigido o PIN para acessar dados criptografados, na inicialização do celular.
Isto pode ser <a href="https://issuetracker.google.com/issues/37010136#comment36">reativado</a> depois.
@ -211,7 +210,7 @@
<string name="settings_enabled_gestures_edge_swipe_summary">Deslize na borda da tela</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">Largura da borda</string>
<string name="settings_meta_view_code">Ver código-fonte</string>
<string name="settings_meta_join_chat">Entre no chat do µLauncher</string>
<string name="settings_meta_join_chat">Entre no chat do μLauncher</string>
<string name="list_other_lock_screen">Bloquear a tela</string>
<string name="settings_theme_text_shadow">Sombra no texto</string>
<string name="settings_theme_background_item_transparent">Transparente</string>
@ -237,13 +236,18 @@
<string name="dialog_select_color_green">Verde</string>
<string name="dialog_select_color_color_hex">Cor</string>
<string name="dialog_choose_color_title">Escola a cor</string>
<string name="dialog_consent_accessibility_consent">Autorizo a utilização do Serviço de acessibilidade para disponibilizar funcionalidades não relacionadas com a acessibilidade.</string>
<string name="dialog_consent_accessibility_data_collection">Não autorizo ao µLauncher a coleta de quaisquer dados.</string>
<string name="dialog_consent_accessibility_consent">Autorizo o μLauncher a usar Serviço de acessibilidade para acessar funcionalidades não relacionadas com a acessibilidade.</string>
<string name="dialog_consent_accessibility_data_collection">Não autorizo ao μLauncher coletar quaisquer dados.</string>
<string name="dialog_consent_accessibility_title">Ativação do Serviço de acessibilidade</string>
<string name="dialog_consent_accessibility_ok">Ativar o Serviço de acessibilidade</string>
<string name="dialog_cancel">Cancelar</string>
<string name="dialog_consent_accessibility_text"><![CDATA[Você está prestes a ativar o Serviço de acessibilidade. Isto concederá <strong>permissões elevadas</strong> ao µLauncher.<br/>µLauncher usará estas permissões <strong>apenas para bloquear a tela</strong>. µLauncher <strong>nunca coletará nenhum dado</strong>. Sobretudo, o µLauncher não implementa o Serviço de acessibilidade para coletar dados.]]></string>
<string name="dialog_consent_accessibility_privileges">Estou ciente de que isto concederá permissões elevadas ao µLauncher.</string>
<string name="dialog_consent_accessibility_text"><![CDATA[Você está prestes a ativar o Serviço de acessibilidade. Isto concederá <strong>permissões elevadas</strong> ao μLauncher.<br/>μLauncher usará estas permissões <strong>apenas</strong> para executar as seguintes ações:
<ul>
<li>Bloquear a tela</li>
<li>Apps recentes</li>
</ul>
μLauncher<strong>nunca coletará nenhum dado</strong>. Sobretudo, o μLauncher não implementa o Serviço de acessibilidade para coletar os dados.]]></string>
<string name="dialog_consent_accessibility_privileges">Estou ciente de que isto concederá permissões elevadas ao μLauncher.</string>
<string name="dialog_consent_accessibility_other_options">Estou ciente de que existem outras opções (permissões de Administrador do aparelho ou o botão de ligar).</string>
<string name="settings_functionality_search_web">Pesquise na internet</string>
<string name="settings_functionality_search_web_summary">Ao buscar na lista de apps toque no Enter para iniciar uma pesquisa na internet.</string>
@ -256,13 +260,13 @@
<string name="toast_private_space_locked">Espaço privado trancado</string>
<string name="toast_private_space_unlocked">Espaço privado liberado</string>
<string name="toast_private_space_not_available">Espaço privado indisponível</string>
<string name="toast_private_space_default_home_screen">O µLauncher precisa ser definido como a tela inicial padrão para poder usar Espaço privado.</string>
<string name="toast_private_space_default_home_screen">O μLauncher precisa ser definido como a tela inicial padrão para poder usar Espaço privado.</string>
<string name="dialog_report_bug_button_clipboard">Copiar para memória</string>
<string name="dialog_report_bug_security_info">Não relate vulnerabilidades de segurança publicamente no GitHub, use o seguinte:</string>
<string name="dialog_report_bug_button_security">Relatar vulnerabilidade de segurança</string>
<string name="dialog_report_bug_create_report">Criar relatório</string>
<string name="dialog_report_bug_title">Relatar um bug</string>
<string name="dialog_report_bug_info">Obrigado por ajudar a melhorar o µLauncher!\nConsidere adicionar as seguintes informações ao relatório de bug:</string>
<string name="dialog_report_bug_info">Obrigado por ajudar a melhorar o μLauncher!\nConsidere adicionar as seguintes informações ao relatório dos bugs:</string>
<string name="settings_functionality_auto_launch_summary">Toque no espaço para temporariamente desativar esta funcionalidade.</string>
<string name="toast_activity_not_found_browser">Não foi possível abrir a URL: nenhum navegador encontrado.</string>
<string name="toast_activity_not_found_search_web">Nenhum app encontrado para efetuar a pesquisa.</string>
@ -301,5 +305,44 @@
<string name="list_other_track_play_pause">Música: Reproduzir / Pausar</string>
<string name="settings_gesture_description_swipe_smaller_reverse">Canto inferior direito -&gt; centro esquerdo -&gt; canto superior direito</string>
<string name="settings_gesture_description_swipe_lambda_reverse">Inferior direito -&gt; superior médio -&gt; inferior esquerdo</string>
<string name="settings_list_reverse_layout">Lista de apps inversa</string>
<string name="settings_list_reverse_layout">Inverter a lista de apps</string>
<string name="settings_meta_donate">Doar</string>
<string name="list_other_volume_adjust">Ajustar volume</string>
<string name="settings_display_hide_status_bar">Ocultar barra de status</string>
<string name="settings_display_hide_navigation_bar">Ocultar barra de navegação</string>
<string name="tutorial_concept_label_version">Versão</string>
<string name="tutorial_app_list_title">Todos apps</string>
<string name="tutorial_app_list_text">Você pode encontrar rápido todos os apps na lista de aplicativos.\n\nDeslize para cima para abrir ou definir um gesto específico.</string>
<string name="tutorial_app_list_text_2">Quando apenas um aplicativo corresponde, vai ser iniciado automaticamente.\nIsso pode ser desativado acrescentando um espaço durante a busca.</string>
<string name="settings_tab_actions">Ações</string>
<string name="list_other_recent_apps">Apps recentes</string>
<string name="alert_enable_accessibility_failed">Erro: Falha ao ativar o Serviço de acessibilidade.</string>
<string name="list_other_launch_other_launcher">Usar outro iniciador</string>
<string name="alert_recent_apps_failed">Erro: Falha ao mostrar apps recentes. (Se você acabou de atualizar o app, tente desativar e reativar o Serviço de acessibilidade em configurações do Android)</string>
<string name="settings_widgets_widgets">Gerenciar widgets</string>
<string name="select_widget_title">Escolha widget</string>
<string name="settings_widgets_custom_panels">Gerenciar painéis de widgets</string>
<string name="widget_menu_configure">Configurar</string>
<string name="widget_menu_enable_interaction">Ativar interação</string>
<string name="widget_clock_label">Relógio</string>
<string name="widget_clock_description">O relógio padrão do μLauncher</string>
<string name="manage_widget_panels_delete">Apagar</string>
<string name="manage_widget_panels_rename">Renomear</string>
<string name="widget_panel_default_name">Painel do widget #%1$d</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="one">Contém %d widget.</item>
<item quantity="many">Contém %d widgets.</item>
<item quantity="other"/>
</plurals>
<string name="dialog_ok">Ok</string>
<string name="widget_panels_title">Painéis de widget</string>
<string name="dialog_create_widget_panel_title">Criar novo painel de widget</string>
<string name="list_other_open_widget_panel">Abrir painel de widget</string>
<string name="alert_widget_panel_not_found">Esse painel de widget não existe mais.</string>
<string name="settings_launcher_section_widgets">Widgets</string>
<string name="widget_menu_remove">Remover</string>
<string name="widget_menu_disable_interaction">Desativar interação</string>
<string name="dialog_select_widget_panel_title">Selecione um painel de widget</string>
<string name="dialog_select_widget_panel_info_no_panels"><![CDATA[Nenhum painel de widget encontrado. Você pode criar painéis de widgets em Configurações > Launcher > Gerenciar painéis de widget.]]></string>
<string name="settings_functionality_auto_close_keyboard">Esconder o teclado durante a rolagem</string>
</resources>

View file

@ -52,7 +52,6 @@
<string name="alert_cant_open_message">Ayarlarını değiştirmek ister misiniz?</string>
<string name="toast_cant_open_message">Bu harekete bir eylem atamak için ayarlarıın</string>
<string name="settings_title">Ayarlar</string>
<string name="settings_tab_app">Uygulamalar</string>
<string name="settings_tab_launcher">Başlatıcı</string>
<string name="settings_tab_meta">Daha Fazlası</string>
<string name="settings_gesture_up">Yukarı</string>

View file

@ -5,37 +5,36 @@
<string name="ic_menu_alt">更多选项</string>
<string name="settings_title">设置</string>
<string name="settings_launcher_section_appearance">外观</string>
<string name="settings_theme_color_theme">主题风格</string>
<string name="settings_theme_color_theme">色调风格</string>
<string name="settings_launcher_section_display">显示</string>
<string name="list_tab_other">其他</string>
<string name="settings_gesture_up"></string>
<string name="settings_gesture_down"></string>
<string name="settings_gesture_up"></string>
<string name="settings_gesture_down"></string>
<string name="alert_cant_open_title">无法打开应用</string>
<string name="alert_cant_open_message">要更改其设置吗?</string>
<string name="toast_cant_open_message">打开设置,为该手势绑定一个应用程序</string>
<string name="settings_tab_app">应用程序</string>
<string name="settings_tab_launcher">启动器</string>
<string name="settings_tab_meta">杂项</string>
<string name="settings_gesture_left"></string>
<string name="settings_gesture_double_left">左滑两次</string>
<string name="settings_gesture_double_up">上滑两次</string>
<string name="settings_gesture_double_down">下滑两次</string>
<string name="settings_gesture_double_left">双指左滑</string>
<string name="settings_gesture_double_up">双指上滑</string>
<string name="settings_gesture_double_down">双指下滑</string>
<string name="settings_gesture_right"></string>
<string name="settings_gesture_double_right">右滑两次</string>
<string name="settings_gesture_right_top_edge">右(顶部)</string>
<string name="settings_gesture_right_bottom_edge">右(底部)</string>
<string name="settings_gesture_left_bottom_edge">左(底部)</string>
<string name="settings_gesture_left_top_edge">左(顶部)</string>
<string name="settings_gesture_up_left_edge">上(左边缘)</string>
<string name="settings_gesture_up_right_edge">上(右边缘)</string>
<string name="settings_gesture_down_left_edge">下(左边缘)</string>
<string name="settings_gesture_down_right_edge">下(右边缘)</string>
<string name="settings_gesture_vol_up">音量</string>
<string name="settings_gesture_vol_down">音量</string>
<string name="settings_gesture_double_right">双指右滑</string>
<string name="settings_gesture_right_top_edge">(顶部)</string>
<string name="settings_gesture_right_bottom_edge">(底部)</string>
<string name="settings_gesture_left_bottom_edge">(底部)</string>
<string name="settings_gesture_left_top_edge">(顶部)</string>
<string name="settings_gesture_up_left_edge">(左边缘)</string>
<string name="settings_gesture_up_right_edge">(右边缘)</string>
<string name="settings_gesture_down_left_edge">(左边缘)</string>
<string name="settings_gesture_down_right_edge">(右边缘)</string>
<string name="settings_gesture_vol_up">音量增加键</string>
<string name="settings_gesture_vol_down">音量降低键</string>
<string name="settings_gesture_double_click">双击</string>
<string name="settings_gesture_long_click">长按</string>
<string name="settings_gesture_date">日期</string>
<string name="settings_gesture_time">时间</string>
<string name="settings_gesture_date">桌面日期</string>
<string name="settings_gesture_time">桌面时钟</string>
<string name="settings_apps_choose">选择应用</string>
<string name="settings_apps_install">安装应用</string>
<string name="settings_apps_toast_store_not_found">没有找到应用市场</string>
@ -43,9 +42,9 @@
<string name="settings_theme_wallpaper">选择壁纸</string>
<string name="settings_display_screen_timeout_disabled">保持屏幕常亮</string>
<string name="settings_launcher_section_functionality">功能</string>
<string name="settings_enabled_gestures_edge_swipe">边缘滑动动作</string>
<string name="settings_functionality_auto_launch">启动搜索匹配项</string>
<string name="settings_functionality_auto_keyboard">搜索时呼出键盘</string>
<string name="settings_enabled_gestures_edge_swipe">边缘滑动手势</string>
<string name="settings_functionality_auto_launch">自动启动搜索匹配项</string>
<string name="settings_functionality_auto_keyboard">自动激活搜索</string>
<string name="settings_launcher_sensitivity">灵敏度</string>
<string name="settings_meta_cant_select_launcher">应用信息</string>
<string name="settings_meta_show_tutorial">查看 µLauncher 的使用教程</string>
@ -62,10 +61,10 @@
<string name="tutorial_concept_title">概念</string>
<string name="tutorial_concept_text_2">这是一款自由软件(遵循 MIT 许可)!\n欢迎查看项目仓库</string>
<string name="tutorial_usage_title">使用方法</string>
<string name="tutorial_usage_text">您的主屏幕仅包含本地日期和时间,没有多余项目。</string>
<string name="tutorial_usage_text">您的桌面仅包含本地日期和时间,没有多余的项目。</string>
<string name="tutorial_setup_title">设置</string>
<string name="tutorial_setup_text">我们为您选择了一些默认应用。如果您希望进行更改,现在就可以</string>
<string name="tutorial_setup_text_2">您也可以稍后对您的选择进行更改</string>
<string name="tutorial_setup_text">我们为您预设了一些快捷操作。如果您不满意,现在就试试点击右侧图标</string>
<string name="tutorial_setup_text_2">您也可以稍后更改您的选择</string>
<string name="tutorial_finish_title">开始!</string>
<string name="list_tab_app">应用</string>
<string name="list_app_delete">卸载</string>
@ -77,18 +76,18 @@
<string name="list_other_volume_down">降低音量</string>
<string name="list_other_track_previous">音乐:上一首</string>
<string name="list_other_track_next">音乐:下一首</string>
<string name="list_other_nop">啥也不干</string>
<string name="list_other_nop">不做任何设置</string>
<string name="tutorial_title">教程</string>
<string name="tutorial_concept_text">μLauncher 的设计理念是简约、高效,无干扰。\n\n不含广告、且不收集任何数据。</string>
<string name="tutorial_usage_text_2">您可以通过手势或按键来启动最重要的应用程序。</string>
<string name="settings_general_choose_home_screen">将 μLauncher 设为默认桌面</string>
<string name="tutorial_finish_text">您已经准备好开始使用本启动器了!\n\n希望这对你有帮助!\n\n- FinnLauncher 的作者)和 Josia对 μLauncher 进行了改进和维护)</string>
<string name="settings_enabled_gestures_double_swipe">滑动作</string>
<string name="tutorial_usage_text_2">您可以通过手势或按键来启动对您来说最重要的应用程序。</string>
<string name="settings_general_choose_home_screen">将 μLauncher 设为默认启动器</string>
<string name="tutorial_finish_text">您已经准备好开始使用本启动器了!\n\n希望本快捷教程能对您有所帮助!\n\n- FinnLauncher 的作者)和 Josia对 μLauncher 进行了改进和维护)</string>
<string name="settings_enabled_gestures_double_swipe">指滑动手势</string>
<string name="settings_clock_localized">使用本地日期格式</string>
<string name="settings_clock_time_visible">显示时间</string>
<string name="settings_clock_date_visible">显示日期</string>
<string name="settings_clock_flip_date_time">翻转日期和时间</string>
<string name="settings_theme_background">背景(应用列表和设置)</string>
<string name="settings_clock_flip_date_time">交换日期和时间位置</string>
<string name="settings_theme_background">背景(应用程序列表和设置页面</string>
<string name="settings_theme_font">字体</string>
<string name="settings_theme_monochrome_icons">黑白应用图标</string>
<string name="settings_clock_show_seconds">显示秒</string>
@ -101,12 +100,12 @@
<string name="alert_torch_access_exception">错误:无法访问闪光灯。</string>
<string name="screen_lock_method_dialog_title">选择锁屏方法</string>
<string name="settings_actions_lock_method">选择锁屏的方法</string>
<string name="settings_apps_hide_bound_apps">不要在应用抽屉中显示被绑定到手势的应用</string>
<string name="settings_apps_hide_bound_apps">不要在应用程序列表中显示已被绑定到手势操作的应用</string>
<string name="alert_requires_android_m">此功能需要 Android 6 或更高版本。</string>
<string name="snackbar_app_hidden">应用程序已隐藏。您可在设置中让它再次显示。</string>
<string name="toast_device_admin_not_enabled">µLauncher 需要获得设备管理员权限才能够锁定屏幕。</string>
<string name="toast_device_admin_not_enabled">µLauncher 需要激活“设备管理应用”权限才能够锁定屏幕。</string>
<string name="device_admin_explanation">这是执行锁屏操作所必需的。</string>
<string name="accessibility_service_name">µLauncher - 锁屏</string>
<string name="accessibility_service_name">µLauncher</string>
<string name="list_title_favorite">收藏的应用</string>
<string name="list_app_favorite_add">添加到收藏夹</string>
<string name="list_app_favorite_remove">从收藏夹中移除</string>
@ -115,34 +114,34 @@
<string name="undo">撤销</string>
<string name="settings_apps_hidden">隐藏的应用</string>
<string name="list_title_hidden">隐藏的应用</string>
<string name="settings_gesture_description_up">上滑</string>
<string name="settings_gesture_description_double_up">用双指向上滑动</string>
<string name="settings_gesture_description_down">下滑</string>
<string name="settings_gesture_description_double_down">双指向下滑动</string>
<string name="settings_gesture_description_left">左滑</string>
<string name="settings_gesture_description_double_left">双指向左滑动</string>
<string name="settings_gesture_description_right">右滑</string>
<string name="settings_gesture_description_double_right">双指向右滑动</string>
<string name="settings_gesture_description_right_top_edge">屏幕顶部向右滑动</string>
<string name="settings_gesture_description_right_bottom_edge">屏幕底部向右滑动</string>
<string name="settings_gesture_description_left_bottom_edge">屏幕底部向左滑动</string>
<string name="settings_gesture_description_left_top_edge">屏幕顶部向左滑动</string>
<string name="settings_gesture_description_up_left_edge">屏幕左边缘向上滑动</string>
<string name="settings_gesture_description_up_right_edge">屏幕右边缘向上滑动</string>
<string name="settings_gesture_description_down_left_edge">屏幕左边缘向下滑动</string>
<string name="settings_gesture_description_down_right_edge">屏幕右边缘向下滑动</string>
<string name="settings_gesture_description_vol_up">按下音量增大按钮</string>
<string name="settings_gesture_description_vol_down">按下音量降低按钮</string>
<string name="settings_gesture_description_up">上滑</string>
<string name="settings_gesture_description_double_up">使用双指向上滑动</string>
<string name="settings_gesture_description_down">下滑</string>
<string name="settings_gesture_description_double_down">使用双指向下滑动</string>
<string name="settings_gesture_description_left">左滑</string>
<string name="settings_gesture_description_double_left">使用双指向左滑动</string>
<string name="settings_gesture_description_right">右滑</string>
<string name="settings_gesture_description_double_right">使用双指向右滑动</string>
<string name="settings_gesture_description_right_top_edge">桌面顶部向右滑动</string>
<string name="settings_gesture_description_right_bottom_edge">桌面底部向右滑动</string>
<string name="settings_gesture_description_left_bottom_edge">桌面底部向左滑动</string>
<string name="settings_gesture_description_left_top_edge">桌面顶部向左滑动</string>
<string name="settings_gesture_description_up_left_edge">桌面左边缘向上滑动</string>
<string name="settings_gesture_description_up_right_edge">桌面右边缘向上滑动</string>
<string name="settings_gesture_description_down_left_edge">桌面左边缘向下滑动</string>
<string name="settings_gesture_description_down_right_edge">桌面右边缘向下滑动</string>
<string name="settings_gesture_description_vol_up">按下音量增加键</string>
<string name="settings_gesture_description_vol_down">按下音量降低</string>
<string name="settings_gesture_description_double_click">双击空白区域</string>
<string name="settings_gesture_description_long_click">长按空白区域</string>
<string name="settings_gesture_description_date">点击日期</string>
<string name="settings_gesture_description_time">点击时间</string>
<string name="settings_gesture_description_date">点击桌面日期</string>
<string name="settings_gesture_description_time">点击桌面时钟</string>
<string name="settings_meta_view_code">查看源代码</string>
<string name="settings_meta_join_chat">加入 μLauncher 的聊天群</string>
<string name="list_other_list_favorites">收藏的应用</string>
<string name="list_other_lock_screen">锁屏</string>
<string name="settings_theme_text_shadow">文本阴影</string>
<string name="settings_enabled_gestures_double_swipe_summary">双指滑动</string>
<string name="settings_enabled_gestures_double_swipe_summary">使用双指进行滑动手势操作</string>
<string name="dialog_rename_title">重命名 %1$s</string>
<string name="settings_theme_color_theme_item_default">默认</string>
<string name="settings_theme_color_theme_item_dark">暗色</string>
@ -158,17 +157,17 @@
<string name="settings_enabled_gestures_edge_swipe_edge_width">边缘宽度</string>
<string name="list_app_rename">重命名</string>
<string name="device_admin_description">启用锁屏动作</string>
<string name="toast_accessibility_service_not_enabled">μLauncher 的无障碍服务未启用,请在设置中启用它。</string>
<string name="toast_lock_screen_not_supported">错误:此设备不支持使用无障碍功能锁定屏幕。请改用设备管理员模式</string>
<string name="screen_lock_method_use_accessibility">使用无障碍服务</string>
<string name="screen_lock_method_use_device_admin">使用设备管理员模式</string>
<string name="toast_accessibility_service_not_enabled">μLauncher 的无障碍服务未启用,请在设置中启用它。</string>
<string name="toast_lock_screen_not_supported">错误:此设备不支持使用“无障碍”服务锁定屏幕。请改用激活“设备管理应用”权限</string>
<string name="screen_lock_method_use_accessibility">使用无障碍服务</string>
<string name="screen_lock_method_use_device_admin">激活“设备管理应用”权限</string>
<string name="dialog_cancel">取消</string>
<string name="settings_theme_color_theme_item_light">亮色</string>
<string name="list_other_expand_settings_panel">快速设置</string>
<string name="alert_lock_screen_failed">错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用并重新启用无障碍服务</string>
<string name="settings_enabled_gestures_edge_swipe_summary">屏幕边缘滑动</string>
<string name="accessibility_service_description">将 µLauncher 设为无障碍服务允许其锁定屏幕。请注意这需要过多的权限。你永远不应该轻易地授予任何应用程序这样的权限。µLauncher 将仅使用无障碍服务功能锁屏。您可以审核源代码。请注意,锁屏也可以通过授予 µLauncher 设备管理员权限来实现,然而,这种方法不适用于以指纹和面部解锁</string>
<string name="settings_gesture_back">返回</string>
<string name="list_other_expand_settings_panel">启动器设置</string>
<string name="alert_lock_screen_failed">错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用再重新启用“无障碍”服务。</string>
<string name="settings_enabled_gestures_edge_swipe_summary">桌面边缘进行滑动手势操作</string>
<string name="accessibility_service_description">将 µLauncher 设置为“无障碍”服务以允许其锁定屏幕和展示最近应用屏幕。请注意,这会使 µLauncher 获得额外的权限。你永远不应该轻易地授予任何应用程序这样的权限。μLauncher 仅在被用户要求时才会使用“无障碍”服务权限以实现: * 锁定屏幕 * 展示最近应用屏幕。μLauncher 不会使用“无障碍”服务来收集任何数据。您可以审核我们的源代码。请注意,锁定屏幕也可以通过激活 µLauncher 的“设备管理应用”权限来实现,然而,这种方法无法与于指纹解锁和面部解锁兼容</string>
<string name="settings_gesture_back">返回操作</string>
<string name="dialog_select_color_red">红色</string>
<string name="dialog_select_color_blue">蓝色</string>
<string name="dialog_select_color_alpha">透明度</string>
@ -176,51 +175,51 @@
<string name="settings_theme_color_theme_item_dynamic">动态</string>
<string name="list_title_private_space">私人空间</string>
<string name="list_other_list_private_space">私人空间</string>
<string name="dialog_choose_color_title">选择颜色</string>
<string name="dialog_choose_color_title">设置颜色</string>
<string name="dialog_select_color_color_hex">颜色</string>
<string name="dialog_report_bug_title">错误反馈</string>
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
<string name="tooltip_lock_private_space">锁定私人空间</string>
<string name="settings_gesture_swipe_v">V</string>
<string name="settings_gesture_swipe_lambda">Λ</string>
<string name="settings_list_layout_item_text">文本</string>
<string name="settings_list_layout_item_text">文本</string>
<string name="settings_list_layout_item_grid">网格</string>
<string name="dialog_report_bug_create_report">创建报告</string>
<string name="tooltip_unlock_private_space">解锁私人空间</string>
<string name="settings_list_layout_item_default">默认</string>
<string name="settings_clock_color">颜色</string>
<string name="settings_clock_color">文本颜色</string>
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
<string name="dialog_report_bug_button_clipboard">复制到剪贴板</string>
<string name="alert_requires_android_v">此功能需要 Android 15 或更高版本。</string>
<string name="list_other_toggle_private_space_lock">切换私人空间锁</string>
<string name="dialog_consent_accessibility_ok">激活无障碍服务</string>
<string name="dialog_consent_accessibility_title">正在激活无障碍服务</string>
<string name="dialog_consent_accessibility_ok">激活无障碍服务</string>
<string name="dialog_consent_accessibility_title">正在激活无障碍服务</string>
<string name="settings_meta_licenses">开源许可证</string>
<string name="legal_info_title">开源许可证</string>
<string name="pin_shortcut_switch_visible">在应用列表中显示</string>
<string name="pin_shortcut_switch_visible">在应用程序列表中显示</string>
<string name="pin_shortcut_title">添加快捷方式</string>
<string name="toast_private_space_locked">私人空间已锁定</string>
<string name="toast_private_space_unlocked">私人空间已解锁</string>
<string name="toast_private_space_not_available">私人空间不可用</string>
<string name="toast_private_space_default_home_screen">µLauncher 需要作为默认主屏幕才能访问私人空间。</string>
<string name="toast_private_space_default_home_screen">µLauncher 需要作为默认启动器才能访问私人空间。</string>
<string name="toast_activity_not_found_search_web">没有找到处理搜索的应用。</string>
<string name="toast_activity_not_found_browser">无法打开 URL找不到浏览器。</string>
<string name="dialog_consent_accessibility_privileges">我已知晓,这将赋予 μLauncher 广泛且重要的权限。</string>
<string name="settings_apps_hide_private_space_apps">在应用程序列表中隐藏私人空间</string>
<string name="settings_apps_hide_paused_apps">隐藏已被暂停的应用</string>
<string name="settings_gesture_description_back">返回按键 / 返回手势</string>
<string name="settings_gesture_description_tap_down">先单击然后再下滑</string>
<string name="settings_gesture_description_tap_down">先单击然后再下滑</string>
<string name="settings_functionality_search_web">在网络上搜索</string>
<string name="settings_gesture_description_swipe_smaller">(从)右上 (滑向)中左(滑向)右下</string>
<string name="settings_functionality_search_web_summary">通过按回车键在应用列表搜索界面激活网络搜索。</string>
<string name="settings_gesture_description_swipe_lambda">(从)左下 (滑向)中上(滑向)右下</string>
<string name="settings_gesture_description_swipe_smaller">(从)右上(滑向)中左(滑向)右下</string>
<string name="settings_functionality_search_web_summary">输入搜索内容后,按回车键直接在应用程序列表界面启动网络搜索。</string>
<string name="settings_gesture_description_swipe_lambda">(从)左下(滑向)中上(滑向)右下</string>
<string name="screen_lock_method_dialog_text"><![CDATA[
<h1>选择锁定设备的方式</h1>
有2种方式可以用来锁定屏幕。
遗憾的是,两者都有缺点:<br/><br/>
<h3>通过设置“设备管理应用”</h3>
无法和指纹解锁和脸部解锁共同使用。
<h3>通过激活“设备管理应用”权限</h3>
该方法无法和指纹解锁和脸部解锁共同使用。
<br/>
<br/>
@ -229,50 +228,109 @@
需要更多的权限。
μLauncher 将这些权限仅用于锁定屏幕。
<br/>
(对于任何一个从网上下载的应用所做的类似声明,你都不应该抱持“默认为可信”的态度,你可以并应该检查一下它的<a href=\"https://github.com/jrpie/Launcher\">源代码</a>.)
对于任何一个从网上下载的应用所做的类似声明,你都不应该抱持“默认为可信”的态度,你可以并应该检查一下它的<a href=\"https://github.com/jrpie/Launcher\">源代码</a>.
<br/>
在某些设备上,激活辅助功能服务后启动PIN码将不再用于加密数据。
如果遇到该问题,可以通过<a href="https://issuetracker.google.com/issues/37010136#comment36">该方法</a>重新激活启动PIN码用于数据加密。
在某些设备上,激活“无障碍”服务后,启动 PIN 码将不再用于加密数据。
如果遇到该问题,可以通过<a href="https://issuetracker.google.com/issues/37010136#comment36">该方法</a>重新激活启动 PIN 码用于数据加密。
<br/><br/><br/><br/>
你可以在设置中随时更改这个选项。
]]></string>
<string name="list_apps_search_hint_no_auto_launch">搜索(不触发自动启动匹配项)</string>
<string name="dialog_consent_accessibility_text"><![CDATA[您即将激活“无障碍”服务。这将授予 μLauncher <strong>广泛且重要的权限</strong>。<br/>μLauncher 将这些权限<strong>仅用于锁定屏幕</strong>。µLauncher <strong>绝不会收集任何数据</strong>。尤其是μLauncher 不会使用“无障碍”服务来收集任何数据。]]></string>
<string name="settings_gesture_description_swipe_larger">(从)左上 (滑向)中右(滑向)左下</string>
<string name="dialog_consent_accessibility_text"><![CDATA[您即将激活“无障碍”服务。这将授予 μLauncher <strong>广泛且重要的权限</strong><br/>但 μLauncher <strong></strong>将这些权限用于:
<ul>
<li>锁定屏幕</li>
<li>展示最近应用屏幕</li>
</ul>
µLauncher <strong>绝不会收集任何数据</strong>。尤其是μLauncher 不会使用“无障碍”服务来收集任何数据。]]></string>
<string name="settings_gesture_description_swipe_larger">(从)左上(滑向)中右(滑向)左下</string>
<string name="settings_gesture_tap_up">单击 + 上滑</string>
<string name="settings_gesture_tap_down">单击 + 下滑</string>
<string name="settings_gesture_tap_left">单击 + 左滑</string>
<string name="settings_gesture_description_tap_left">先单击然后再左滑</string>
<string name="settings_gesture_description_tap_up">先单击然后再上滑</string>
<string name="settings_gesture_description_tap_left">先单击然后再左滑</string>
<string name="settings_gesture_description_tap_up">先单击然后再上滑</string>
<string name="settings_gesture_tap_right">单击 + 右滑</string>
<string name="settings_gesture_description_tap_right">先单击然后再右滑</string>
<string name="settings_gesture_description_swipe_larger_reverse">(从)左下 (滑向)中右(滑向)左上</string>
<string name="settings_gesture_description_swipe_smaller_reverse">(从)右下 (滑向)中左(滑向)右上</string>
<string name="settings_gesture_description_swipe_v">(从)左上 (滑向)中下(滑向)右上</string>
<string name="settings_gesture_description_swipe_v_reverse">(从)右上 (滑向)中下(滑向)左上</string>
<string name="settings_gesture_description_swipe_lambda_reverse">(从)右下 (滑向)中上(滑向)左下</string>
<string name="settings_gesture_description_tap_right">先单击然后再右滑</string>
<string name="settings_gesture_description_swipe_larger_reverse">(从)左下(滑向)中右(滑向)左上</string>
<string name="settings_gesture_description_swipe_smaller_reverse">(从)右下(滑向)中左(滑向)右上</string>
<string name="settings_gesture_description_swipe_v">(从)左上(滑向)中下(滑向)右上</string>
<string name="settings_gesture_description_swipe_v_reverse">(从)右上(滑向)中下(滑向)左上</string>
<string name="settings_gesture_description_swipe_lambda_reverse">(从)右下(滑向)中上(滑向)左下</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (反向)</string>
<string name="settings_gesture_swipe_v_reverse">V反向</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[>(反向)]]></string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[<(反向)]]></string>
<string name="settings_functionality_auto_launch_summary">开启后将直接启动匹配搜索内容的应用,可以通过按空格键临时暂停该功能。</string>
<string name="settings_functionality_auto_launch_summary">启用后将直接启动搜索所匹配到的应用,可以通过在搜索内容前添加空格来临时停用该功能。</string>
<string name="settings_list_layout">应用程序列表样式</string>
<string name="pin_shortcut_button_bind">绑定到手势</string>
<string name="list_other_track_play_pause">音乐:播放 / 暂停</string>
<string name="dialog_report_bug_button_security">报告安全漏洞</string>
<string name="dialog_report_bug_security_info">请不要在 Github 上以公开的方式报告安全漏洞,请使用以下方式进行报告:</string>
<string name="dialog_report_bug_info">感谢您帮助改进 µLauncher\n请考虑在您的应用程序错误反馈中添加以下信息</string>
<string name="dialog_consent_accessibility_other_options">我已知晓,还有其他替代方法(使用设备管理员模式或电源按键)。</string>
<string name="dialog_consent_accessibility_other_options">我已知晓,还有其他替代方法(激活“设备管理应用”权限或通过电源按键)。</string>
<string name="dialog_consent_accessibility_data_collection">我同意 μLauncher 不收集任何数据。</string>
<string name="settings_meta_donate">捐赠</string>
<string name="list_other_volume_adjust">调整音量</string>
<string name="tutorial_concept_label_version">版本</string>
<string name="tutorial_app_list_title">所有应用</string>
<string name="tutorial_app_list_text">您可以在应用程序列表中快速所搜所有应用。\n\n您可以通过上滑打开应用程序列表也可以通过绑定其他手势操作来打开应用程序列表。</string>
<string name="tutorial_app_list_text_2">当匹配到唯一的应用程序后,该应用将自动启动。\n如果你不想触发自动启动在查询内容前加上空格即可禁用。</string>
<string name="tutorial_app_list_text">您可以在应用程序列表中快速找到已安装的应用程序。\n\n您可以通过上滑打开应用程序列表也可以通过绑定其他手势操作来打开应用程序列表。</string>
<string name="tutorial_app_list_text_2">您还可以搜索,当匹配到唯一的应用程序后,该应用将自动启动。\n如果你不想触发自动启动可以在搜索内容前加上空格以禁用。</string>
<string name="settings_display_hide_status_bar">隐藏状态栏</string>
<string name="settings_display_hide_navigation_bar">隐藏导航栏</string>
<string name="settings_list_reverse_layout">倒序排列应用程序</string>
<string name="dialog_consent_accessibility_consent">我同意 μLauncher 使用无障碍服务来提供与无障碍服务无关的其他功能。</string>
<string name="settings_tab_actions">快捷操作</string>
<string name="list_other_recent_apps">最近应用屏幕</string>
<string name="alert_enable_accessibility_failed">错误:启用“无障碍”服务失败。</string>
<string name="alert_recent_apps_failed">错误:无法展示最近应用屏幕。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用再重新启用“无障碍”服务。)</string>
<string name="list_other_launch_other_launcher">启动其他启动器</string>
<string name="settings_functionality_auto_close_keyboard">滚动应用程序列表时自动隐藏键盘</string>
<string name="settings_widgets_widgets">设置小部件</string>
<string name="widget_menu_remove">删除</string>
<string name="widget_menu_enable_interaction">启用交互功能</string>
<string name="widget_menu_disable_interaction">关闭交互功能</string>
<string name="widget_clock_label">时钟</string>
<string name="manage_widget_panels_delete">删除</string>
<string name="manage_widget_panels_rename">重命名</string>
<string name="widget_panel_default_name">小部件面板 #%1$d</string>
<string name="widget_panels_title">小部件面板</string>
<string name="dialog_select_widget_panel_title">选择小部件面板</string>
<string name="list_other_open_widget_panel">打开小部件面板</string>
<string name="dialog_create_widget_panel_title">创建新面板</string>
<string name="dialog_select_widget_panel_info_no_panels"><![CDATA[未发现小部件面板。您可以在“设置 > 启动器 > 设置小部件面板”中进行创建。]]></string>
<string name="settings_launcher_section_widgets">桌面小部件</string>
<string name="alert_widget_panel_not_found">该小部件面板不存在</string>
<string name="widget_clock_description">μLauncher 默认时钟小部件</string>
<string name="select_widget_title">选择小部件</string>
<string name="settings_widgets_custom_panels">设置小部件面板</string>
<string name="dialog_ok">确认</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="other">包含 %1$d 个小部件。</item>
</plurals>
<string name="notification_crash_title">μLauncher 崩溃了</string>
<string name="notification_crash_explanation">抱歉!点击查看更多信息。</string>
<string name="report_crash_button_copy">复制崩溃报告到剪贴板</string>
<string name="report_crash_button_mail">通过 Email 发送报告</string>
<string name="report_crash_title">μLauncher 崩溃了</string>
<string name="report_crash_button_report">在 GitHub 上创建错误反馈</string>
<string name="send_email">发送 Email</string>
<string name="notification_channel_crash">崩溃和调试信息</string>
<string name="crash_info"><![CDATA[
发生了一些错误,非常抱歉!<br><br>
出于保护隐私的考量,崩溃日志不会被自动采集。<br>
但是,日志对应用调试非常有帮助,若您原意,请将所附日志文件通过 Email 发送给我们,
或在 GitHub 上创建错误报告,非常感谢!<br><br>
请注意,崩溃日志可能包含<strong>敏感信息</strong>,如,您尝试启动的应用名称。
因此,请在发送报告前,先将此类信息<strong>去除</strong>
<h2>我现在应该怎么做?</h2>
如果这个错误重复发生,您可以做如下尝试:
<ul>
<li>强行停止 μLauncher</li>
<li>清空 μLauncher 的存储空间(<strong>您的设置将被重置!</strong></li>
<li>安装旧版本(<a href=\"https://github.com/jrpie/Launcher/releases\">GitHub</a>, <a href=\"https://f-droid.org/en/packages/de.jrpie.android.launcher\">F-Droid</a></li>
</ul>
]]></string>
<string name="content_description_add_widget">添加小部件</string>
<string name="content_description_add_widget_panel">添加小部件面板</string>
<string name="settings_meta_view_docs">文档</string>
</resources>

View file

@ -1,11 +1,5 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="appbar_padding">16dp</dimen>
<dimen name="fab_margin">16dp</dimen>
<dimen name="appbar_padding_top">8dp</dimen>
<dimen name="app_icon_side">40dip</dimen>
<dimen name="app_action_height">48dip</dimen>
</resources>

View file

@ -9,6 +9,8 @@
<string name="settings_internal_started_key" translatable="false">internal.started_before</string>
<string name="settings_internal_started_time_key" translatable="false">internal.first_startup</string>
<string name="settings_internal_version_code_key" translatable="false">internal.version_code</string>
<string name="settings_widgets_widgets_key" translatable="false">widgets.widgets</string>
<string name="settings_widgets_custom_panels_key" translatable="false">widgets.custom_panels</string>
<string name="settings_apps_favorites_key" translatable="false">apps.favorites</string>
<string name="settings_apps_hidden_key" translatable="false">apps.hidden</string>
<string name="settings_apps_pinned_shortcuts_key" translatable="false">apps.pinned_shortcuts</string>
@ -147,6 +149,7 @@
<string name="settings_functionality_search_auto_launch_key" translatable="false">functionality.search_auto_launch</string>
<string name="settings_functionality_search_web_key" translatable="false">functionality.search_web</string>
<string name="settings_functionality_search_auto_open_keyboard_key" translatable="false">functionality.search_auto_keyboard</string>
<string name="settings_functionality_search_auto_close_keyboard_key" translatable="false">functionality.search_auto_close_keyboard</string>
<string name="settings_actions_lock_method_key" translatable="false">settings_action_lock_method</string>
@ -158,7 +161,9 @@
-
-->
<string name="settings_meta_link_github" translatable="false">https://github.com/jrpie/Launcher</string>
<string name="settings_meta_link_docs" translatable="false">https://launcher.jrpie.de/</string>
<string name="settings_meta_report_bug_link" translatable="false">https://github.com/jrpie/Launcher/issues/new?template=bug_report.yaml</string>
<string name="settings_meta_report_bug_mail" translatable="false">android-launcher-crash@jrpie.de</string>
<string name="settings_meta_report_vulnerability_link" translatable="false">https://github.com/jrpie/Launcher/security/policy</string>
<string name="settings_meta_fork_contact_url" translatable="false">https://s.jrpie.de/contact</string>
<string name="settings_meta_privacy_url" translatable="false">https://s.jrpie.de/android-legal</string>

View file

@ -16,7 +16,7 @@
-->
<string name="settings_title">Settings</string>
<string name="settings_tab_app">Apps</string>
<string name="settings_tab_actions">Actions</string>
<string name="settings_tab_launcher">Launcher</string>
<string name="settings_tab_meta">Meta</string>
@ -85,9 +85,9 @@
<string name="settings_gesture_swipe_lambda_reverse">Λ (Reverse)</string>
<string name="settings_gesture_description_swipe_lambda_reverse">Bottom right -> top mid -> bottom left</string>
<string name="settings_gesture_vol_up">Volume Up</string>
<string name="settings_gesture_vol_up">Volume Up Key</string>
<string name="settings_gesture_description_vol_up">Press the volume up button</string>
<string name="settings_gesture_vol_down">Volume Down</string>
<string name="settings_gesture_vol_down">Volume Down Key</string>
<string name="settings_gesture_description_vol_down">Press the volume down button</string>
<string name="settings_gesture_double_click">Double Click</string>
<string name="settings_gesture_description_double_click">Double click an empty area</string>
@ -98,6 +98,9 @@
<string name="settings_gesture_time">Time</string>
<string name="settings_gesture_description_time">Click on time</string>
<string name="settings_widgets_widgets">Manage widgets</string>
<string name="settings_widgets_custom_panels">Manage widget panels</string>
<string name="settings_apps_choose">Choose App</string>
@ -156,9 +159,9 @@
<string name="settings_launcher_section_functionality">Functionality</string>
<string name="settings_enabled_gestures_double_swipe">Double swipe actions</string>
<string name="settings_enabled_gestures_double_swipe">Double swipe gestures</string>
<string name="settings_enabled_gestures_double_swipe_summary">Swipe with two fingers</string>
<string name="settings_enabled_gestures_edge_swipe">Edge swipe actions</string>
<string name="settings_enabled_gestures_edge_swipe">Edge swipe gestures</string>
<string name="settings_enabled_gestures_edge_swipe_summary">Swipe at the edge of the screen</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">Edge width</string>
<string name="settings_functionality_auto_launch">Launch search results</string>
@ -167,6 +170,7 @@
<string name="settings_functionality_search_web">Search the web</string>
<string name="settings_functionality_search_web_summary">Press return while searching the app list to launch a web search.</string>
<string name="settings_functionality_auto_keyboard">Start keyboard for search</string>
<string name="settings_functionality_auto_close_keyboard">Close keyboard when scrolling</string>
<string name="settings_launcher_sensitivity">Sensitivity</string>
@ -251,10 +255,12 @@
<string name="list_other_track_next">Music: Next</string>
<string name="list_other_track_previous">Music: Previous</string>
<string name="list_other_track_play_pause">Music: Play / Pause</string>
<string name="list_other_expand_notifications_panel">Expand notifications panel</string>
<string name="list_other_nop">Do nothing</string>
<string name="list_other_expand_notifications_panel">Expand Notifications Panel</string>
<string name="list_other_recent_apps">Recent Apps</string>
<string name="list_other_nop">Do Nothing</string>
<string name="list_other_lock_screen">Lock Screen</string>
<string name="list_other_torch">Toggle Torch</string>
<string name="list_other_launch_other_launcher">Launch Other Home Screen</string>
<!-- Pin shortcuts -->
<string name="pin_shortcut_title">Add Shortcut</string>
@ -307,6 +313,8 @@
<string name="alert_no_torch_found">No camera with torch detected.</string>
<string name="alert_torch_access_exception">Error: Can\'t access torch.</string>
<string name="alert_lock_screen_failed">Error: Failed to lock screen. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings)</string>
<string name="alert_recent_apps_failed">Error: Failed to show recent apps. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings)</string>
<string name="alert_enable_accessibility_failed">Error: Failed to enable the accessibility service.</string>
<string name="toast_accessibility_service_not_enabled">μLauncher\'s accessibility service is not enabled. Please enable it in settings</string>
<string name="toast_private_space_locked">Private space locked</string>
<string name="toast_private_space_unlocked">Private space unlocked</string>
@ -315,12 +323,17 @@
<string name="tooltip_lock_private_space">Lock private space</string>
<string name="tooltip_unlock_private_space">Unlock private space</string>
<string name="toast_lock_screen_not_supported">Error: Locking the screen using accessibility is not supported on this device. Please use device admin instead.</string>
<string name="accessibility_service_name">μLauncher - lock screen</string>
<string name="accessibility_service_name">μLauncher</string>
<string name="accessibility_service_description">
Setting μLauncher as an accessibility service allows it to lock the screen.
Setting μLauncher as an accessibility service allows it to lock the screen and open the recent apps menu.
Note that excessive permissions are required. You should never grant such permissions lightly to any app.
μLauncher will use the accessibility service only for locking the screen. You can check the source code to make sure.
μLauncher will use the accessibility service only for performing the following actions when requested by the user:
* lock screen
* open recent apps
μLauncher will never use the accessibility service to collect data. You can check the source code to make sure.
Note that locking the screen can also be accomplished by granting μLauncher device administrator permissions. However that method doesn\'t work with fingerprint and face unlock.
</string>
@ -365,7 +378,12 @@
<string name="dialog_consent_accessibility_other_options">I am aware that other options exist (using device administrator privileges or the power button).</string>
<string name="dialog_consent_accessibility_consent">I consent to μLauncher using the accessibility service to provide functionality unrelated to accessibility.</string>
<string name="dialog_consent_accessibility_data_collection">I consent to μLauncher not collecting any data.</string>
<string name="dialog_consent_accessibility_text"><![CDATA[You are about to activate the accessibility service. This will grant <strong>far-reaching privileges</strong> to μLauncher.<br/>μLauncher will use these privileges <strong>only to lock the screen</strong>. μLauncher <strong>will never collect any data</strong>. In particular, μLauncher does not use the accessibility service to collect any data.]]></string>
<string name="dialog_consent_accessibility_text"><![CDATA[You are about to activate the accessibility service. This will grant <strong>far-reaching privileges</strong> to μLauncher.<br/>μLauncher will use these privileges <strong>only</strong> to perform the following actions:
<ul>
<li>Lock Screen</li>
<li>Recent Apps</li>
</ul>
μLauncher <strong>will never collect any data</strong>. In particular, μLauncher does not use the accessibility service to collect any data.]]></string>
<string name="dialog_consent_accessibility_title">Activating the Accessibility Service</string>
<string name="dialog_consent_accessibility_ok">Activate Accessibility Service</string>
<string name="dialog_cancel">Cancel</string>
@ -373,5 +391,69 @@
<string name="legal_info_title">Open Source Licenses</string>
<string name="toast_activity_not_found_search_web">No app found to handle search.</string>
<string name="toast_activity_not_found_browser">Can\'t open URL: no browser found.</string>
<string name="select_widget_title">Choose Widget</string>
<string name="widget_menu_remove">Remove</string>
<string name="widget_menu_configure">Configure</string>
<string name="widget_menu_enable_interaction">Enable Interaction</string>
<string name="widget_menu_disable_interaction">Disable Interaction</string>
<string name="widget_clock_label">Clock</string>
<string name="widget_clock_description">The default clock of μLauncher</string>
<string name="manage_widget_panels_delete">Delete</string>
<string name="manage_widget_panels_rename">Rename</string>
<string name="widget_panel_default_name">Widget Panel #%1$d</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="one">Contains %1$d widget.</item>
<item quantity="other">Contains %1$d widgets.</item>
</plurals>
<string name="dialog_ok">Ok</string>
<string name="widget_panels_title">Widget Panels</string>
<string name="dialog_select_widget_panel_title">Select a Widget Panel</string>
<string name="dialog_create_widget_panel_title">Create new widget panel</string>
<string name="dialog_select_widget_panel_info_no_panels"><![CDATA[No widget panels found. You can create widget panels in Settings > Launcher > Manage Widget Panels.]]></string>
<string name="list_other_open_widget_panel">Open Widget Panel</string>
<string name="alert_widget_panel_not_found">This widget panel no longer exists.</string>
<string name="settings_launcher_section_widgets">Widgets</string>
<string name="notification_crash_title">μLauncher crashed</string>
<string name="notification_crash_explanation">Sorry! Click for more information.</string>
<string name="crash_info"><![CDATA[
Looks like something went wrong, sorry about that!<br><br>
For privacy reasons, crash logs are not collected automatically.<br>
However logs are very useful for debugging, so I would be very grateful if you could send me the attached log by mail
or create a bug report on github.<br><br>
Note that crash logs might contain <strong>sensitive information</strong>, e.g. the name of an app you tried to launch.
Please <strong>redact</strong> such information before sending the report.
<h2>What can I do now?</h2>
If this bug appears again and again, you can try several things:
<ul>
<li>Force stop μLauncher</li>
<li>Clear μLauncher\'s storage (<strong>Your settings will be lost!</strong>)</li>
<li>Install an older version (<a href=\"https://github.com/jrpie/Launcher/releases\">GitHub</a>, <a href=\"https://f-droid.org/en/packages/de.jrpie.android.launcher\">F-Droid</a>)</li>
</ul>
]]>
</string>
<string name="report_crash_button_copy">Copy crash report to clipboard</string>
<string name="report_crash_button_mail">Send report by mail</string>
<string name="report_crash_button_report">Create bug report on GitHub</string>
<string name="report_crash_title">μLauncher crashed</string>
<string name="send_email">Send Email</string>
<string name="notification_channel_crash">Crashes and Debug Information</string>
<string name="settings_meta_view_docs">Documentation</string>
<!--
-
- Content Descriptions
-
-->
<string name="content_description_add_widget">Add widget</string>
<string name="content_description_add_widget_panel">Add widget panel</string>
<string name="content_description_close">Close</string>
<string name="content_description_navigate_back">Navigate back</string>
<string name="content_description_navigate_next">Navigate next</string>
<string name="content_description_lock">Lock</string>
<string name="content_description_settings_actions_row_button_remove">Remove binding</string>
</resources>

View file

@ -14,6 +14,7 @@
<item name="android:buttonStyle">@style/Widget.AppCompat.Button.Colored</item>
<item name="colorButtonNormal">?colorAccent</item>
<item name="cardBackgroundColor">@color/cardview_dark_background</item>
<!--<item name="android:popupMenuStyle">@style/PopupMenuCustom</item>-->
@ -32,6 +33,7 @@
<item name="colorPrimaryDark">@color/darkTheme_background_color</item>
<item name="colorAccent">@color/darkTheme_accent_color</item>
<item name="android:colorBackground">@color/darkTheme_background_color</item>
<item name="cardBackgroundColor">@color/cardview_dark_background</item>
<item name="android:textColor">@color/darkTheme_text_color</item>
</style>
@ -40,6 +42,7 @@
<item name="colorPrimaryDark">@color/finnmglasTheme_background_color</item>
<item name="colorAccent">@color/finnmglasTheme_accent_color</item>
<item name="android:colorBackground">@color/finnmglasTheme_background_color</item>
<item name="cardBackgroundColor">@color/cardview_dark_background</item>
<item name="android:textColor">@color/finnmglasTheme_text_color</item>
</style>
@ -48,6 +51,7 @@
<item name="colorPrimaryDark">@color/lightTheme_background_color</item>
<item name="colorAccent">@color/lightTheme_accent_color</item>
<item name="android:colorBackground">@color/lightTheme_background_color</item>
<item name="cardBackgroundColor">@color/cardview_light_background</item>
<item name="android:textColor">@color/lightTheme_text_color</item>
</style>
@ -57,6 +61,7 @@
<item name="colorPrimaryDark">@color/material_dynamic_primary50</item>
<item name="colorAccent">@color/material_dynamic_tertiary50</item>
<item name="android:colorBackground">@color/material_dynamic_neutral10</item>
<item name="cardBackgroundColor">@color/cardview_dark_background</item>
<item name="android:textColor">@color/material_dynamic_neutral_variant90</item>
</style>
@ -66,12 +71,12 @@
<item name="android:shadowDy">0</item>
<item name="android:shadowRadius">2</item>
</style>
<style name="textShadowLight" parent="textShadow">
<item name="android:shadowColor">#aaa</item>
</style>
<style name="backgroundWallpaper">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
@ -81,26 +86,30 @@
<item name="android:colorBackgroundCacheHint">@null</item>
</style>
<style name="backgroundSolid">
</style>
<style name="backgroundSolid"></style>
<style name="fontSystemDefault">
<!--<item name="android:textSize">18sp</item>-->
</style>
<style name="fontHack">
<item name="android:fontFamily">@font/hack</item>
<!--<item name="android:textSize">18sp</item>-->
</style>
<style name="fontMonospace">
<item name="android:fontFamily">monospace</item>
</style>
<style name="fontSerifMonospace">
<item name="android:fontFamily">serif-monospace</item>
</style>
<style name="fontSansSerif">
<item name="android:fontFamily">sans-serif</item>
</style>
<style name="fontSerif" tools:keep="@style/fontSerif">
<item name="android:fontFamily">serif</item>
</style>

View file

@ -3,10 +3,10 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
app:allowDividerAbove="false" > <!-- general -->
<Preference
android:key="@string/settings_general_choose_home_screen_key"
android:title="@string/settings_general_choose_home_screen"/>
</PreferenceCategory>
<PreferenceCategory
app:allowDividerAbove="false"
@ -104,6 +104,10 @@
android:key="@string/settings_functionality_search_auto_open_keyboard_key"
android:defaultValue="true"
android:title="@string/settings_functionality_auto_keyboard" />
<SwitchPreference
android:key="@string/settings_functionality_search_auto_close_keyboard_key"
android:defaultValue="false"
android:title="@string/settings_functionality_auto_close_keyboard" />
<SwitchPreference
android:key="@string/settings_enabled_gestures_double_swipe_key"
android:summary="@string/settings_enabled_gestures_double_swipe_summary"
@ -170,6 +174,16 @@
android:defaultValue="false"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/settings_launcher_section_widgets"
app:allowDividerAbove="false">
<Preference
android:key="@string/settings_widgets_widgets_key"
android:title="@string/settings_widgets_widgets" />
<Preference
android:key="@string/settings_widgets_custom_panels_key"
android:title="@string/settings_widgets_custom_panels" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/settings_launcher_section_display"

Some files were not shown because too many files have changed in this diff Show more