Compare commits

...

322 commits

Author SHA1 Message Date
Eran Leshem
1012386c8c
more reliable fix for bottom inset padding on edge-to-edge (#1486) 2025-04-20 18:58:58 +02:00
Helium314
7748ed75fe clarify when we use our own name for the language instead of using whatver is provided by the system 2025-04-19 08:35:46 +02:00
Benson Muite
c32b3bada4
Keyboard layouts for languages primarily used in Africa (#1483) 2025-04-19 08:27:58 +02:00
Helium314
e042adc5b8 Merge remote-tracking branch 'refs/remotes/origin/main' 2025-04-18 10:04:19 +02:00
Eran Leshem
901e745158
Fix bottom of keyboard being under navigation bar (#1461)
mostly for Android 15+, but issues may also occur on older Android versions
2025-04-18 10:02:27 +02:00
Helium314
91554b02eb fix unchanged layout list when deleting secondary layout 2025-04-14 18:46:41 +02:00
Helium314
fe7f1a1b38 fix crash when deleting subtype
fixes GH-1476
2025-04-14 17:06:34 +02:00
Helium314
8fddf94121 fix unable to change one-handed mode scale 2025-04-08 16:10:04 +02:00
Helium314
003ec854ab update version 2025-04-06 19:20:01 +02:00
Helium314
00ae92318d add missed changelog translations 2025-04-06 18:33:06 +02:00
Helium314
e4cd58a722 update translations 2025-04-06 18:32:23 +02:00
Eran Leshem
f4b4705e81
Add bottom inset padding on Android15+ (#1457) 2025-04-06 10:54:39 +02:00
Helium314
d4960c73dc fix tests after recent changes 2025-04-06 10:52:24 +02:00
Helium314
22eb48ff91 add comments about build variants 2025-04-06 10:50:10 +02:00
Helium314
6995266bd1 treat default button as value change for SliderPreference 2025-04-05 10:24:24 +02:00
Eran Leshem
087f87e95c
Optimize debug build (#1411) 2025-04-05 08:43:24 +02:00
Helium314
8edea4f7c5 allow renaming main layouts in subtypeScreen 2025-04-03 17:09:27 +02:00
Helium314
d79c84d7df fix issues when renaming or deleting layouts 2025-04-03 17:09:15 +02:00
Helium314
57deb82ca7 remove todo section from readme 2025-03-31 20:13:28 +02:00
Helium314
7a57f5a24f make searchText non-saveable and add a comment 2025-03-31 20:12:52 +02:00
Helium314
452770566c avoid creating additional subtypes that are the same as a resource subtype 2025-03-31 16:31:52 +02:00
Helium314
8247366bdd avoid issues with prefChanged not changing 2025-03-31 16:27:16 +02:00
Helium314
3dbd9c6ed9 slightly adjust behavior and layouts of subtype screen 2025-03-31 01:27:06 +02:00
Helium314
6bbce0b5ca change subtype dialog to screen
mostly just moved the content and adjusted necessary calls
still needs some minor tweaking
2025-03-30 12:40:06 +02:00
Helium314
ac805a9286 fix some issues with renaming color schemes
fixes GH-1449 and some more unreported bugs
2025-03-30 12:03:21 +02:00
Helium314
8932fc84e1 add timestamp keycode and setting for adjusting format, fixes GH-846 2025-03-29 12:36:07 +01:00
Helium314
525c4e59b6 confirm color in color picker dialog on done, fixes GH-1443 2025-03-29 11:47:06 +01:00
Helium314
a3fcce26a7 add all_colors color for popup key text, fixes #1297 2025-03-29 10:48:14 +01:00
Helium314
58778b1f23 add all_colors color for key preview text, fixes #1434 2025-03-29 10:38:43 +01:00
Helium314
fbfff03541 add all_colors color for key text in emoji keyboard, fixes #1058 2025-03-29 10:18:27 +01:00
Helium314
a1f991088d reduce font size for multilibgual typing in settings 2025-03-29 07:19:17 +01:00
Helium314
10af5def2b deal with some very bad behavior of firefox, fixes #1139 2025-03-27 21:04:42 +01:00
Helium314
a745c92e05 update ndk and translations 2025-03-26 21:26:05 +01:00
Helium314
b26ba76221 add test related to GH-1408 2025-03-26 20:57:54 +01:00
Helium314
1b1dbd4006 upgrade robolectric version to make tests work again 2025-03-26 20:38:06 +01:00
Helium314
f06521c8ec make text fields follow content language direction 2025-03-26 20:07:47 +01:00
Helium314
0847bac3d5 upgrade target SDK to 35
might cause issues with hebrew and indonesian on Android 15 devices due to changed language codes
2025-03-26 19:56:46 +01:00
Helium314
f5bc89b91d make reverting autocorrect on backspace optional
fixes GH-210
2025-03-26 19:18:13 +01:00
Helium314
c0b14635fd fix issue that could result in autospace being added before period 2025-03-26 18:29:57 +01:00
Helium314
b600431af9 reduce vertical padding for preference 2025-03-26 18:11:47 +01:00
Helium314
66a07eb8d2 Add more settings for autospace
fixes GH-1348
fixes GH-876
2025-03-26 18:05:00 +01:00
EduRGB
88a7f41038
Layout for shift + long press on number row (#1400)
Add full-featured number row layout and set it as default; set existing layout as basic.
2025-03-22 20:28:56 +01:00
Helium314
2fe0937ead apparently people want smaller icons 2025-03-22 20:05:51 +01:00
Helium314
efaddf6c51 store clipboard history as strings, fixes GH-1430 2025-03-22 19:34:27 +01:00
Helium314
9e91e7562b add another setting to disable always show suggestions just for web edit fields, which seem fo frequenty cause issues with this setting 2025-03-22 19:27:38 +01:00
Helium314
7228fa06d1 move "no limit" clipboard history retantion time to the right side
sort of fixes GH-1425 (at least the unclarity about finding the setting)
2025-03-22 19:05:24 +01:00
Helium314
a3bada8d25 upgrade version and translations 2025-03-16 15:01:39 +01:00
Helium314
9b7eaa4cf2 use default text button style for popup key order / hint source buttons 2025-03-16 14:49:04 +01:00
Helium314
7571890551 remove appcompat
was mainly used for settings
2025-03-16 14:33:53 +01:00
KuRa KuRd
cb70553484
Add Central Kurdish layout (#1417) 2025-03-16 14:00:23 +01:00
Helium314
8298542c39 add setting to switch to alphabet after typing on numpad and pressing space
fixes #1224
2025-03-15 15:59:49 +01:00
Helium314
a9e5f879d8 better way of determining whether a key should have action key background
mostly relevant for popups
fixes #1008
2025-03-15 15:35:55 +01:00
Quantom2
a6b6d1b659
Rework of UK and RU standard layout plus added extended layout (#1215)
Rework of UK and RU standard layout plus added extended layout (similar to PC keyboard) as optional;
- Added 'ї' as separate letter (it used much more often, just to be optional key in popups)
- Added [ { } } popups to fill empty hint space (similar to PC layout)
- Added ' (apostrofee) suggestion onto 'є' key (similar to oter keyboards and to PC layout)
RU)
Added siggestion to 'ъ' on 'х' key (similar to other keyboards, anyway there was no popups at all)
- Added [ { } } popups to fill empty hint space (similar to PC layout)
- Added 'э́' suggestion similar to other keyboards
Both)
- Improvements to multilanguage typing (now this is possible to sue UK-RU or RU-UK pair, I added letters from other language as popups)
Added)
- UK Extended with separate ' key (used less often than 'ї', but still used pretty often)
- RU Extended, with separate 'ъ' key (similar to full desk PC layout)
2025-03-15 14:05:05 +01:00
Helium314
ba88129641 make navigation transistion animation duration follow system transition animation scale 2025-03-15 09:06:10 +01:00
Helium314
55259b2915 fix disappearing all_colors for dark theme on upgrade from 2.3 2025-03-14 23:21:41 +01:00
Helium314
d3401e5c04 re-add background to app icon in about screen 2025-03-14 22:57:00 +01:00
Eran Leshem
18a328cd2b
Show TLD popup keys (#1399)
* Add option to replace period key's popup keys with the locale-specific top level domains for URL and email inputs. On by default.
Also change the wide keyboard's '.com' key to use the same TLD list.
Tweak TLD list order, putting default ones first, so that .com is the first TLD.

* Enable TLD hint
Avoid TLD popups on tablet
Revert to using set for TLDs, and insert default ones first
Move setting one slot up
Tweak setting description
Update docs

* Preserve case on period key

* Prevent non-TLD hints on period key
2025-03-13 16:31:03 +01:00
unlair
d05a59e4ed
Track overridden subtypes when auto-switching due to HintLocales (#1410)
* Track overridden subtypes when auto-switching due to HintLocales

* Move hint-locale switching logic to SubtypeState
2025-03-11 21:25:32 +01:00
Helium314
bf713d6967 copy user-supplied library to final file instead of renaming
apparently fixes #1251
2025-03-10 18:27:45 +01:00
Helium314
e9a2a7ebb1 remove unnecessary settings reloads during adjusting additional subtype 2025-03-08 17:55:02 +01:00
Helium314
2b8c39b125 make editing the "+" layouts work 2025-03-08 10:26:24 +01:00
Helium314
c47da4203f consistent way of for settingsSubtypes <-> string 2025-03-08 09:34:33 +01:00
Helium314
e1f02dab31 add some tests for subtype enablement 2025-03-08 09:23:41 +01:00
Helium314
a4d96a12a9 fix some issues with subtypes being disabled or not shown as enabled after editing 2025-03-08 09:05:33 +01:00
Helium314
15c1526895 toAdditional subtype not nullable any more
was causing too much trouble
and only was in there because "it always has been there"
2025-03-08 07:48:15 +01:00
Helium314
fa9ac20d39 fix edited subtypes not showing up when they weren't enabled 2025-03-08 07:35:49 +01:00
Helium314
912ba45d5e fix default additional subtypes 2025-03-08 07:35:08 +01:00
Helium314
631ab60eb9 upgrade version and translations 2025-03-06 18:13:32 +01:00
Md. Rifat Hasan Jihan
073318d7d0
Update existing incomplete bn-IN layout (#1374) 2025-03-06 18:10:44 +01:00
Helium314
43d96e3131 disable check breaking non-latin additional subtypes without custom main layout 2025-03-06 18:06:30 +01:00
Helium314
43f5dd555b remove the / at the end of layout folders
because apparently android 7 asset manager does not understand it
fixes #1393
2025-03-06 05:16:26 +01:00
Md. Rifat Hasan Jihan
ee33140106
add missing popup (#1396) 2025-03-04 22:49:14 +01:00
Md. Rifat Hasan Jihan
411bd79890
add label flag on manualOrLocked keys to hide popup hint (#1397) 2025-03-04 22:20:44 +01:00
Helium314
f60406d6ac upgrade dependencies 2025-03-04 22:19:17 +01:00
Helium314
4310025b2d fix light navbar symbols with light theme 2025-03-02 18:13:04 +01:00
Helium314
fad6c7b758 fix some bugs resulting in bad colors after entering ColorsScreen 2025-03-02 17:04:16 +01:00
Helium314
72ca12d52e pre-fill name for new color themes 2025-03-02 12:05:49 +01:00
Helium314
e342ff24b5 fix user-defined theme being added to list on first startup 2025-03-02 11:39:33 +01:00
Helium314
18693cdf20 fix welcome wizard title color in dark mode 2025-03-02 11:02:20 +01:00
Helium314
45c30b5c64 fix wrong name shown in launcher 2025-03-02 10:56:49 +01:00
Helium314
b4f3732cde better details for dictionaries 2025-03-02 10:36:05 +01:00
Helium314
2fb618888b use some resource strings again 2025-03-02 09:59:03 +01:00
Helium314
cffdbff23c remove some unused resource strings, and mark others for possible future removal 2025-03-02 09:36:13 +01:00
Helium314
5e63a7f29b add missing new metdatata file translations 2025-03-02 07:34:00 +01:00
Helium314
02e8a001cd update translations 2025-03-02 07:33:10 +01:00
Helium314
f929caa4d8
Remove old settings and clean up (#1392) 2025-03-02 07:28:37 +01:00
Helium314
8a8e8a70e3 re-add missing light theme 2025-03-02 00:47:31 +01:00
Helium314
8c557ec42c don't show welcome wizard in spell checker settings
and show crash reports only in normal settings
2025-03-01 23:39:55 +01:00
Helium314
122b51c0ed adjust welcome wizard colors 2025-03-01 23:36:05 +01:00
Md. Rifat Hasan Jihan
3d690ae371
Added Bengali (India)/Baishakhi layout (#1373) 2025-03-01 17:40:27 +01:00
Helium314
be3ccc631d minor improvements in appearance screen 2025-03-01 17:29:00 +01:00
Helium314
1fc5d60483 better instant-reload for some settings (while keyboard is showing) 2025-03-01 17:28:48 +01:00
Helium314
95b6333bf4 better way of force-reloading the keyboard theme
not duplicating an existing mechanism any more
and working while keyboard is shown (at least it looks like it)
2025-03-01 17:06:49 +01:00
Helium314
f0bb541b72 better "add dictionary" button in dictionaries screen 2025-03-01 10:31:38 +01:00
Helium314
b69ec39539 extend list of locales for which bigrams are used in contacts dictionary 2025-03-01 10:24:22 +01:00
Helium314
efa2faf474 more frequent selected subtype checks in welcome wizard 2025-03-01 10:02:56 +01:00
Helium314
5d1545687f fix broken list preferences 2025-03-01 10:01:16 +01:00
Helium314
7696beeb29 deal with empty subtype preference strings produced by old versions 2025-03-01 09:50:33 +01:00
Helium314
f016c20ca8 remove some values from old settings
preparation for removal
2025-03-01 09:23:34 +01:00
Helium314
7ec9e1a8cf sort extra value when creating SettingsSubtype 2025-03-01 08:40:50 +01:00
Helium314
c431f7043f move settings.kt and settings subtype 2025-03-01 07:32:09 +01:00
Helium314
e55b375f90 add more compose previews, and make them work better 2025-02-28 23:47:11 +01:00
Helium314
1b5a793690 more convenient access to settingsValues
Settings.getInstance().getCurrent() -> Settings.getValues()
2025-02-28 22:17:06 +01:00
Helium314
98640c6b0d add readable timestamp to logs and crash reports (similar to backup files) 2025-02-28 21:57:31 +01:00
Helium314
912be23900 avoid exception on startup
java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory"
see https://stackoverflow.com/a/65980047
2025-02-28 21:44:25 +01:00
Helium314
999c900f7f clearly show when a subtype is custom in languages & layouts 2025-02-28 21:42:09 +01:00
Helium314
27e2a6f584 determine whether to show shift key for scripts without uppercase 2025-02-28 21:29:38 +01:00
Helium314
48fbe86dcc fix accessing setting from system keyboard settings 2025-02-28 20:29:37 +01:00
Helium314
247ec2b7f3 compose welcome wizard (could look better, but good enough for now) 2025-02-28 20:26:38 +01:00
Helium314
b65d00e142 improve color picker: better landscape layout and survive orientation change 2025-02-27 19:35:07 +01:00
Helium314
1c955a34b2 convert popup multiTextKey codePoints into (KeySpec) label
fixes #1376
2025-02-26 21:16:23 +01:00
Md. Rifat Hasan Jihan
2e9ba954ad
Improved Probhat Layout (#1382)
Discussed in https://github.com/Helium314/HeliBoard/discussions/1368
2025-02-26 20:57:08 +01:00
ottosch
f65864a935
Add datestamp to backup filename (#1364)
resolve #1188
2025-02-26 20:00:25 +01:00
Helium314
aaa7fb2ad1 make unsaved changes in SubtypeDialog survive screen orientation change 2025-02-25 22:55:05 +01:00
Helium314
f0689b00f6 remove "use system locales"
now behavior is as it was disabled
if no subtypes are explicitly enabled, it behaves the same as if the setting was enabled (same as before, actually)
2025-02-25 22:41:54 +01:00
Helium314
cab9cc7de0 make subtypeDialog survive screen rotation (but currently loses changes to settings) 2025-02-25 22:32:05 +01:00
Helium314
93e6f88f6c update todo 2025-02-25 21:36:30 +01:00
Helium314
987f0560d9 add missing headers 2025-02-25 20:35:30 +01:00
Helium314
3c9d1c8795 add links to discussin sections to load dialogs for laoyuts and colors
and gather links in a single place
2025-02-25 20:24:24 +01:00
Helium314
6212f44283 fix theme not appearing after importing from file 2025-02-24 21:06:51 +01:00
Helium314
761b56fdc3 fix weird double window insets 2025-02-24 20:42:21 +01:00
Helium314
a8bd9058e7 move some icons and iconButtons to separate file 2025-02-24 19:17:21 +01:00
Helium314
875a98d3f4 rename "text" to "content" in alert dialog 2025-02-24 18:43:12 +01:00
Helium314
b7aadac07c add the "will not be translated" message to allColors 2025-02-24 18:30:12 +01:00
Helium314
f076d66f93 add contentDescription for some more icons 2025-02-24 18:16:38 +01:00
Helium314
d5d672ee33 fix links using annotatedString instead of html 2025-02-24 16:49:03 +01:00
Helium314
fa72e2bcbb work on some more todos 2025-02-23 20:57:16 +01:00
Helium314
adc5c8cf1c remove some outdated todos 2025-02-23 19:16:39 +01:00
Helium314
9ff5fda8ed fix issues with insets not being respected 2025-02-23 19:01:45 +01:00
Helium314
43cfbddf68 initialize RichIMM on app start (fixes tests) 2025-02-23 18:42:19 +01:00
Helium314
53a5cb0c92 upgrade compose dependencies 2025-02-23 18:38:07 +01:00
Helium314
4edaa485b6 some todos in SubtypeDialog 2025-02-23 17:58:04 +01:00
Helium314
e3fa210031 editing a theme does not automatically enabled it (outside edit screen) 2025-02-23 16:24:59 +01:00
Helium314
b41ad29e55 limit locales when adding dictionaries to matching scripts 2025-02-23 13:58:11 +01:00
Helium314
ff27d1f1c5 solve a bunch of recent todos 2025-02-23 13:41:30 +01:00
Helium314
86f15e11d8 compose PersonalDictionariesScreen 2025-02-23 11:38:06 +01:00
Helium314
52c887e941 add dictionary screen and dialogs 2025-02-22 22:42:36 +01:00
Helium314
7494d85aea allow editing main layouts in subtype dialog 2025-02-22 12:21:26 +01:00
Helium314
f15f65daa8 properly handle layout deletion 2025-02-21 05:07:13 +01:00
Helium314
05fc53c96f move file pickers to separate composable 2025-02-21 05:04:57 +01:00
Helium314
4efc33dba4 fix toast spam in layout editor 2025-02-20 18:24:59 +01:00
Helium314
31f7ef6182 also rename layout in preferences when renaming the file 2025-02-20 18:11:23 +01:00
Helium314
d03801f22e make the "+" layouts selectable with normal name 2025-02-20 16:18:19 +01:00
Helium314
f7cf1762b5 add better icon for using default setting 2025-02-20 00:31:13 +01:00
Helium314
e7acef5396 fix editing "+" layouts, update todos 2025-02-19 23:56:02 +01:00
Helium314
35083e6515 do some inits on app create instead of in the services 2025-02-19 23:33:51 +01:00
Helium314
0899245ae7 use existing constants for NO_LANGUAGE and QWERTY 2025-02-19 23:06:52 +01:00
Helium314
8d094e268a make the settings overrides in subtype work 2025-02-19 23:00:58 +01:00
Helium314
eec197c32c cache subtype display names for improved performance 2025-02-17 19:32:02 +01:00
Helium314
40de17c148 solve some todos in SubtypeDialog 2025-02-17 19:19:08 +01:00
Helium314
47070c1086 change ShowMorePopupKeys to string
and some minor adjustments / comments
2025-02-17 15:55:31 +01:00
Md. Rifat Hasan Jihan
23a067187c
Removed redundant number row for bn-BD (#1369)
And formatted the json for better readability
2025-02-17 14:09:20 +01:00
Helium314
85382de881 add language screen (not finished) 2025-02-16 22:58:19 +01:00
Helium314
12f1e20d9f make popup order prefs shorter 2025-02-16 22:45:48 +01:00
Helium314
56c7748dff fix issues with restoring old settings 2025-02-16 20:32:32 +01:00
Helium314
0fa8f58750 fix issue with creating subtype extra value 2025-02-16 13:09:18 +01:00
Helium314
6f1e79caa1 fix issues with settings upgrades when starting from 0 2025-02-16 13:01:31 +01:00
Helium314
2c1d6a5f4c change subtypeSettings to object, so it's clear which init is called 2025-02-16 12:49:19 +01:00
Helium314
6e77437ea9 copy the dictonary cleanup and crash report checker to new settings 2025-02-16 10:57:38 +01:00
Helium314
a25ed6d5e0 store layouts in the same way in selected, enabled and additional layouts 2025-02-16 10:44:11 +01:00
Helium314
d005ffac06 modify some separators we don't get into trouble when storing more data in extra values, and when storing extra values in prefs 2025-02-15 21:45:26 +01:00
Helium314
4c060689fa shorter name for some functions for custom layouts 2025-02-15 20:11:27 +01:00
Helium314
bccb10ea39 store custom latin layouts with scripts instead of language tag, so they can be used across languages 2025-02-15 18:31:25 +01:00
Helium314
5ccc117ae1 remove unused layout edit preference, read layout edit errors immediately 2025-02-15 17:44:24 +01:00
Helium314
682a4ae911 improve handling of IME padding
still not really good...
2025-02-15 14:35:59 +01:00
Helium314
d8e9a004e5 reduce padding for LayoutEditDialog 2025-02-15 13:30:48 +01:00
Helium314
42f4561422 convert additionalSubtypeUtils to kotlin 2025-02-15 12:22:53 +01:00
Helium314
aa3bf37852 put LayoutUtilsCustom into an object 2025-02-15 11:39:53 +01:00
Helium314
a3e85bc664 add layout screen for choosing and editing default (non-main) layouts 2025-02-15 10:52:56 +01:00
Helium314
6b86ea236b use isError and trainingIcon to indicate invalid name for color 2025-02-15 02:43:01 +01:00
Helium314
5ba40f7875 adjust arrangement for layouts
so we can have more than one layout per type (was possible only for main)
2025-02-14 13:37:21 +01:00
Helium314
846388de97 better checks for custom json layouts
and a todo
2025-02-13 19:47:01 +01:00
Helium314
fe59a598b7 fix potential issue with not set autocorrect threshold
and an unintentionally changed default
2025-02-13 18:08:34 +01:00
Helium314
201b430362 change what can be stored in KeyboardLayoutSet subtype extra value
and some more preparations for adjustments related to language/layout settings upgrade
2025-02-13 17:29:51 +01:00
Helium314
f2f7426ee5 merge pref for toolbar normal and longpress codes
and remove old toolbar customizer dialog
2025-02-12 16:47:31 +01:00
Helium314
b31b8f8fe2 string resources for load and error dialogs in color theme picker 2025-02-12 05:52:13 +01:00
Helium314
767be15006 fix issues with loading / adding / removing user theme 2025-02-12 05:46:42 +01:00
Helium314
589179e626 fix button text in info dialog 2025-02-12 05:39:54 +01:00
Helium314
e105f39752 add option to load colors 2025-02-11 23:21:34 +01:00
Helium314
6d9763d079 add save color options to new colors screen 2025-02-11 22:43:29 +01:00
Helium314
cb08d32d14 slightly improve weird behavior 2025-02-11 22:16:18 +01:00
Helium314
9bb087b422 make sure the right theme is shown in colors screen
proobably there is a way to do it more straightforward...
2025-02-11 21:42:31 +01:00
Helium314
f8bdd7dd1c add menu for switching moreColors 2025-02-11 19:47:05 +01:00
Helium314
1484d7021e allow renaming user themes 2025-02-11 19:20:15 +01:00
Helium314
bd7e92bcf8 fix issues with color screen navigation 2025-02-11 18:21:02 +01:00
Helium314
63bda02cc4 upgrade user theme selection, now multiple themes are possible
currently missing: old "show more/all colors", and import/export
2025-02-11 17:40:53 +01:00
Helium314
40433bd8d2 move radiobuttons to left side in listpickerdialog 2025-02-11 15:23:14 +01:00
Helium314
5300c4d930 change how colors are stored (color and appearance settings currently not working properly)
with settings upgrade from previous version
version code increase to make sure colors are upgraded
2025-02-10 18:39:16 +01:00
Helium314
6dad54b83d switch spell checker settings to compose 2025-02-09 21:14:27 +01:00
Helium314
57313a4b79 directly start SettingsActivity when keyboard is selected 2025-02-09 20:18:30 +01:00
Helium314
2a76b49f3a fix wrong text on setting 2025-02-09 19:30:13 +01:00
Helium314
e36a20719f remove todos (was already mostly solved) 2025-02-09 19:08:17 +01:00
Helium314
d807e08195 put setting defaults in one place
notable exceptions: color settings
they will be re-done anyway...
2025-02-09 19:01:57 +01:00
Helium314
ecf7aabdb1 stricter checks for json layouts (and fix an old bug in hebrew layout) 2025-02-09 15:17:06 +01:00
Helium314
2700c3428a fix unexpected dialog dismisses 2025-02-09 14:36:01 +01:00
Helium314
b31d6d0051 add a ktx shortcut for default shared preferences 2025-02-09 14:23:44 +01:00
Helium314
125a483591 use context.prefs() instead of the long DeviceProtected... 2025-02-09 13:52:59 +01:00
Helium314
deb9dda7e7 consistently check for landscape when looking for portrait/landscape orientation 2025-02-09 13:36:25 +01:00
Helium314
e845e38e42
Settings upgrade (#1325)
Re-implement most of the settings in compose, searchable
Languages & Layouts, Colors, and Personal Dictionary still missing, will be done later
2025-02-09 13:27:55 +01:00
PurplePickleMonster
679754bb2d
Add toolbar option to toggle Split Keyboard Setting - Enhancement #1218 (#1263)
---------

Co-authored-by: Josh <joshtidal24@gmail.com>
Co-authored-by: Helium314 <helium314@mailbox.org>
2025-02-09 11:32:16 +01:00
Helium314
c0b3e76741 use backspace key event instead of deleteSurroundingText when a browser claims it does not have text before the cursor
fixes #1337
2025-02-06 22:48:45 +01:00
Helium314
7c77f4d1c4 add tests related to #210 2025-02-03 20:44:30 +01:00
Helium314
f2a46cfa9a disable undo-like functionality for textInput, fixes #1019 2025-02-03 00:20:48 +01:00
Helium314
73988394a9 improve detection of emojis when deleting 2025-02-03 00:11:34 +01:00
QuantumSoul
ad3086183d
Arabic Hija'i Layout (#1329)
---------

Co-authored-by: Helium314 <helium314@mailbox.org>
2025-02-02 21:52:07 +01:00
Helium314
d57301918e clarify that some parts of the contribution guidelines are (strongly) recommended, but not necessary 2025-02-02 21:50:33 +01:00
Md. Rifat Hasan Jihan
274c6b0212
Improve behavior for language swipe cycling (#1319)
---------

Co-authored-by: Helium314 <helium314@mailbox.org>
2025-02-02 21:46:11 +01:00
Eran Leshem
82ec37f339
Optionally show popup hints on number row (#1303) 2025-01-31 22:53:08 +01:00
Md. Rifat Hasan Jihan
0d48a18264
adjust unijoy layout for bn-BD (#1321) 2025-01-28 19:10:25 +01:00
Helium314
92bc79b7e6
Add side padding scale setting (#1309) 2025-01-26 17:31:23 +01:00
Helium314
635cd5f8da toolbar key activated state now responds to settings changes 2025-01-26 13:16:13 +01:00
Helium314
79c9a85082 better choice of color for deactivated toolbar key 2025-01-26 11:36:17 +01:00
Helium314
833aa321b9 rename stateList to pressedStateList for clarification 2025-01-26 11:27:40 +01:00
Helium314
54f222c0ee fix weird issue with toolbar keys having wrong color for their state
and remove related semi-workaround
2025-01-26 11:25:50 +01:00
Helium314
419c0d847b switch from start / stop one-handed mode key codes to a toggle code
mainly so there is no awkward state-dependent key code on the toolbar key
2025-01-26 09:48:21 +01:00
Helium314
5afb1e3a0c use custom font also for hint labels, fixes #1323 2025-01-26 09:31:32 +01:00
Helium314
105a6a7791 add font scale setting (separat for emoji view, because here it feels different)
fixes #1149
2025-01-26 09:27:48 +01:00
Helium314
f45f69f8a2 add setting for adjusting bottom padding in landscape mode
fixes some issue I can't currently find
slight issue: will remove the bottom padding on large tables (sw768-land), users need to get it back by switching to 100%
2025-01-26 09:10:07 +01:00
Helium314
fc12877795 fix additional subtypes being removed when upgrading from 2.2 beta or older 2025-01-23 16:53:26 +01:00
Helium314
453683a925 fix typo, add short text to contributing about app size 2025-01-23 00:54:09 +01:00
zyachel
05816e4436
fix link to license file in about screen (#1315) 2025-01-22 17:35:32 +01:00
Helium314
35e0fe6be3 add TLD information to LocaleKeyboardInfos
preparation for #492
2025-01-20 21:28:12 +01:00
Helium314
df8c0c6c59 switch tests from junit to kotlin.test (mostly) 2025-01-19 18:27:31 +01:00
Helium314
da8827efc3 migrate build.gradle to kts 2025-01-19 18:15:58 +01:00
Helium314
5283c5878c consider custom font in floating preview 2025-01-18 14:07:36 +01:00
Helium314
cde1a70427 avoid repeated checks for custom typeface when there is none 2025-01-18 12:49:57 +01:00
Helium314
789b533358 set custom typeface also in clipboard suggestion view
and rename read method to get
2025-01-18 12:45:26 +01:00
Helium314
c1bbf51fa1 add custom font file to backup
and remove outdated unnecessary text
2025-01-18 07:59:05 +01:00
Helium314
9edbbcf0ea add button to clear all custom toolbar codes 2025-01-18 07:55:50 +01:00
Helium314
9a2009d182 allow using user-provided font
fixes #494
2025-01-17 21:47:13 +01:00
Helium314
c581e9601b allow setting background image for landscape and portrait separately
fixes #798
2025-01-17 20:10:16 +01:00
Helium314
71d17f6792 update readme / templates / guidelines 2025-01-17 18:15:25 +01:00
Helium314
092cac529f add setting to autocorrect shortcuts
fixes #1287
2025-01-14 22:19:44 +01:00
Helium314
83b48b474e use the first non-typed suggestion for determining autocorrect
otherwise the correction score is sometimes based on the typed word, and not on the word that will be corrected to
2025-01-14 21:25:24 +01:00
Eran Leshem
8931f79b62
Add a Hebrew 1452-2 layout (#1288) 2025-01-13 23:13:06 +01:00
Helium314
df37e3589e move keyboard coordinate transformation to KeyboardActionListener as per ancient TODO 2025-01-13 22:40:37 +01:00
Helium314
10c0b64e45 only show default button in reorder dialog if default actually exists 2025-01-13 20:40:20 +01:00
Arsen Abdusalamov
a4b07d6de2
Add Dargwa(Urakhi) layout (#1127) 2025-01-13 20:26:46 +01:00
tenextractor
0076f04639
Greek accent/dead key support (#1240)
Greek accent/dead key support: simplify by making every combining accent key a dead key

---------

Co-authored-by: Helium314 <helium314@mailbox.org>
2025-01-13 20:12:01 +01:00
Helium314
4638709db5 add missing default for navbar_color in prefs, and change in SettingsValues 2025-01-13 17:18:07 +01:00
Helium314
44015f6857 upgrade test dependencies 2025-01-13 17:16:34 +01:00
Helium314
13e2260aab tiny update to contributon guidelines 2025-01-13 17:14:34 +01:00
Helium314
1e7ea7d699 rename LICENSE-GPL-3 to LICENSE because GitHub is stupid and wrongly shows Apache-2.0 (can't choose, only determined automatically) 2025-01-12 21:12:14 +01:00
Helium314
c2fdce9d58 upgrade emojis to unicode 16.0
and set default emoji SDK level to 21, as we don't support 19 any more
2025-01-12 21:10:06 +01:00
Helium314
7339000df3 allow overriding sdk level for determining which emojis are shown
might show that dreaded [x] symbol, but allows newer emojis on older android versions with upgraded fonts
2025-01-12 21:08:20 +01:00
Helium314
465fc86e61 add new groupId -1 for suppressing default popups e.g. on action or comma keys
fixes #1243
2025-01-12 21:04:32 +01:00
Helium314
7e3657185f prevent selected text being the first suggestion when overwriting with glide typing
fixes #1284
2025-01-12 21:02:29 +01:00
npnpatidar
de5968d04a
Add Hindi Phonetic layout (#1278) 2025-01-12 21:00:47 +01:00
Mario Restuccia
bf37a7f947
Add schwa ə for Italian (#1275)
Added lowercase schwa `ə` to Italian keyboard layout, for inclusive language use
2025-01-12 21:00:08 +01:00
Helium314
0543ccdb2d update translations and version 2025-01-12 20:46:51 +01:00
Helium314
cd5ac492be revert fix for #994, fixes #1281 2025-01-12 20:31:22 +01:00
Helium314
548bf64c9d add option to also vibrate in dnd mode 2025-01-12 20:28:23 +01:00
Helium314
d4d3ba16e0 remove outdated comment 2025-01-11 12:20:43 +01:00
Helium314
9f09d28f4e update description of TextKeyData 2025-01-11 11:43:11 +01:00
Helium314
ce61fa9a21 fix broken width of emoji & clipboard bottom rows in one-handed mode 2025-01-11 11:33:24 +01:00
Helium314
fce02d4669 add missing emojis (to make-emoji-keys only) 2025-01-11 08:39:18 +01:00
Helium314
30180165cb update make-emoji-keys to unicode 16.0 2025-01-11 08:06:06 +01:00
Helium314
16b6196c54 make emoji task work again 2025-01-11 08:05:32 +01:00
Helium314
846ab1edef fix crap introduced with Android 15
using fixes from GrapheneOS
bdc88aaf46
3b7322437a

fixes #1186
2025-01-07 20:38:03 +01:00
Helium314
5251bcd989 re-add l·l for catalan
was wrongly removed in d7d47670a7
fixes #1176
2025-01-07 20:17:41 +01:00
Helium314
76990814e1 only trigger fix for #994 when we have an alphabet keyboard
fixes #1268
2025-01-07 17:20:49 +01:00
Helium314
5e64e94085 avoid known test failure when running via github workflow 2025-01-07 16:59:44 +01:00
Helium314
250a43e4e7 update version, translations, and dictionary list 2025-01-06 15:57:05 +01:00
Helium314
ab974a980e update changelog 2025-01-05 22:48:59 +01:00
Helium314
3cf9d4c87e don't set tablet extra keys for custom layouts
fixes #1180
2025-01-05 22:46:40 +01:00
Helium314
d25df2c4de remove popup label when the popup key is removed 2025-01-05 22:21:26 +01:00
Helium314
2ad45af856 disable remove redundant popup keys by default
looks like people don't like it (#1052 and more)
2025-01-05 22:06:31 +01:00
Helium314
3989c1348a make remove redundant popup keys work on base layout only
fixes #1052
2025-01-05 22:05:55 +01:00
Helium314
ca67fc71a6 add info about labelFlags 2025-01-05 20:53:10 +01:00
Helium314
eb8d204d00 add failing test as some sort of todo / reminder 2025-01-05 20:37:18 +01:00
Helium314
4b21e3e54e add preliminary changelog 2025-01-05 19:25:29 +01:00
Helium314
afd7bc2985 add button to reset all customized icons 2025-01-05 19:16:51 +01:00
Helium314
8c3ed1ac22 sort icons in icon customiz er alphabetically 2025-01-05 18:59:58 +01:00
Helium314
fe041293b6 add label for bin icon and rename drawable 2025-01-05 18:49:38 +01:00
Helium314
51a7508374 reload icons before opening icon customizer 2025-01-05 18:42:22 +01:00
Helium314
044f6dd81c allow entering minus and nothing (same as 0) 2025-01-05 18:36:47 +01:00
Helium314
f7c694bfe0 reload custom layouts on restoring backup
fixes #1235
2025-01-05 16:56:47 +01:00
Helium314
c9b8dfd4c2 properly reload on DPI changes 2025-01-05 14:47:03 +01:00
Helium314
cd1ed0e1e7 avoid doing unnecessary consistency checks during text reload / reset 2025-01-05 13:41:33 +01:00
Helium314
d3bd97a104 reload text on selection updates even if selection is as expected
if composing region was changed
e.g. KDE Connect removes composing region after entering a letter, and we should be able to deal with it
this is not really a good solution, as it will reload the suggestions, which flashes the underline and has noticeable performance impact

fixes #1141
2025-01-05 13:18:14 +01:00
Helium314
d08afcd279 improve situation when local state is out of sync with editor
related to / found during tests for 6100186f73
2025-01-05 12:08:48 +01:00
Helium314
6100186f73 deal with keyboard layout changing between pressing and quickly releasing a key
fixes #994
2025-01-05 09:40:17 +01:00
Helium314
32a37eaddf do not switch for hintLocales if we have a matching secondary locale
fixes #1181
2025-01-04 08:52:27 +01:00
Helium314
6e50d6e208 perform recapitalization on shift only in alphabet mode
fixes #1256
2025-01-03 18:50:04 +01:00
Helium314
a1c70a1181 truncate display of clipboard text for performance reasons
fixes #1236
2025-01-03 18:09:51 +01:00
Helium314
7652af888d upgrade dependencies 2025-01-03 17:24:43 +01:00
Helium314
d0157361f7 update translations 2025-01-03 17:17:09 +01:00
Helium314
71d98e1e4f require a minimum frequency value in history before adding a word to personal dictionary 2024-09-29 19:30:12 +02:00
Helium314
d754e7ca7f do not vibrate if do not disturb is enabled, fixes #1125 2024-09-28 22:28:37 +02:00
Helium314
27d257ce1d udpate templates 2024-09-28 22:28:25 +02:00
Helium314
640f26d0fc avoid adding potentially unwanted capitalized version of words to dictionary in capitalized manually at beginning of sentence 2024-09-28 19:33:50 +02:00
Helium314
b4eb63e9a9 mark string as not translatable 2024-09-25 05:30:19 +02:00
Helium314
05523ecd30
Allow changing toolbar icon and codes (#1110) 2024-09-23 20:45:23 +02:00
Md. Rifat Hasan Jihan
7d1cf0dd63
Update strings.xml (#1068) 2024-09-18 16:55:48 +02:00
Helium314
723812d913 add discussion templates for colors and layouts
and hope it works because apparently there is no preview
2024-09-15 12:18:11 +02:00
Helium314
b1798d5777 update translations 2024-09-15 11:07:49 +02:00
Helium314
056452775c update readme (some stuff is now in the wiki) 2024-09-15 10:57:27 +02:00
Helium314
404f6a5726 actually use downEvent detection, fixes #1075 2024-09-02 21:08:37 +02:00
Helium314
ab34815c7d
Replace bottom keys in emoji / clipboard view customizable keyboard (#966) 2024-09-01 21:33:49 +02:00
Helium314
be13ca40a1 fix setting the correct script in tests 2024-08-30 20:58:44 +02:00
Helium314
8ca65aebc9 allow customizing text on space bar
fixes #956
fixes #875 (set text to space)
2024-08-28 22:08:00 +02:00
Helium314
4ddfd2d5a9 allow numpad key in custom layout
fixes #1020
2024-08-28 20:53:44 +02:00
Helium314
374b840127 don't expect number row to have 10 keys 2024-08-28 19:01:23 +02:00
Helium314
c96326a256 be a bit more strict when determining a clearly preferred language in multilingual typing
should somewhat reduce addition of unwanted words to personal dictionary when auto-add is enabled
2024-08-27 19:52:10 +02:00
Helium314
6f71e577d3 don't show toolbar key names as popup hint labels 2024-08-26 23:27:48 +02:00
Helium314
3306ffb849 allow customizing number row
so users can do #558 themselves
2024-08-26 23:11:59 +02:00
Helium314
44eb296d38 don't use json/txt file endings for custom layouts
just determine json or simple when parsing

fixes #1034
2024-08-26 22:51:09 +02:00
Helium314
a1a7489856 fix bad backup
apparently settings keys can be null
2024-08-26 21:57:59 +02:00
Helium314
ee748023fd move number row into assets
make it customizable later
2024-08-26 21:11:23 +02:00
Helium314
be5c86ac31 add escape to processCode
fixes #1009
2024-08-25 20:19:55 +02:00
Helium314
b43e06c66f always add punctuation popups to non-priority popups
fixes #1062

(also remove unused function)
2024-08-25 20:12:34 +02:00
Helium314
c0e3811698 don't remove the layout when switching between text and json
app still needs to be restarted when switching types
workaround for #1034, but should be fixed properly at some point
2024-08-25 19:51:39 +02:00
Alex
7b4420cc6b
fix(uk): remove non-existing symbol (#1038)
Symbol `ъ` does not exist in Ukrainian language, therefore there's no need to have it on keyboard.
2024-08-25 19:23:16 +02:00
Helium314
2de5798504 small update to guidelines 2024-08-25 19:00:03 +02:00
Helium314
48b0bb1cbf allow independent selection of icon style and theme style 2024-08-25 18:46:29 +02:00
Helium314
aed5704582 set keyboard icon ids per style in keyboardIconsSet instead of using styleable
increases flexibility
preparation for planned changes
2024-08-24 23:46:13 +02:00
Helium314
8a457c1821 add empty hi-Latn.txt, fixes #305 (again) 2024-07-27 10:35:26 +02:00
Helium314
2b135481be update version and translations 2024-07-25 07:18:56 +02:00
Devy Ballard
83ae078cfa
More visual options for gesture typing (#944) 2024-07-25 07:08:50 +02:00
Helium314
28ba8a7a72 update logging 2024-07-25 07:04:45 +02:00
BlackyHawky
136b45880e
Update rounded icons for rounded style - Fix #694 (#977) 2024-07-23 22:51:15 +02:00
Helium314
446b0fb826 remove barely used semi-foreign diacritic character from sl.txt 2024-07-23 19:43:11 +02:00
740 changed files with 33681 additions and 15197 deletions

View file

@ -0,0 +1,18 @@
body:
- type: input
- type: textarea
id: description
attributes:
label: Description
placeholder: |
"You can add some description and screenshots here if you want."
validations:
required: false
- type: textarea
id: colors
attributes:
label: Colors
placeholder: |
"Please paste the colors (obtained via the _copy_ button) here, and surround the text with ``` to make sure it's displayed in a way that can be copied easily."
validations:
required: true

View file

@ -0,0 +1,18 @@
body:
- type: input
- type: textarea
id: description
attributes:
label: Description
placeholder: |
"You can add some description and screenshots here if you want."
validations:
required: false
- type: textarea
id: layout
attributes:
label: Layout
placeholder: |
"Please paste the layout here, and surround it with ``` to make sure it's displayed in a way that can be copied easily."
validations:
required: true

View file

@ -12,19 +12,20 @@ tl;dr:
<!-- <!--
issue template below, please remove above text before submitting (and the template too if you think it's a good idea) issue template below, please remove above text before submitting (and the template too if you think it's a good idea)
Please choose a meaningful title for your issue Please choose a meaningful title for your issue, and consider that if you want help you should provide enough information that people can actually help
--> -->
**Describe the bug** **Describe the bug**
**To Reproduce** **To Reproduce**
If possible, provide all the necessary steps to reproduce your problem, including the involved apps or settings if relevant. If possible, provide all the necessary steps to reproduce your problem, including the involved apps or settings if relevant.
In case you cannot reproduce the bug, say so and provide information about when the bug may occur for you. Settings and the app you're writing in are usually important, please don't omit them.
**Expected behavior** **Expected behavior**
If it's not obvious (e.g. not crash), describe how you think the app should behave. If it's not obvious (e.g. not crash), describe how you think the app should behave.
**Screenshots** **Screenshots**
ONLY add screenshots if applicable and helpful. ONLY add screenshots when they add real value.
If you add screenshots, reduce the size or use thumbnails to keep the issue nicely readable. If you add screenshots, reduce the size or use thumbnails to keep the issue nicely readable.
**App version** **App version**

View file

@ -8,7 +8,7 @@ Please see the appropriate readme section for issue reporting guidelines: https:
tl;dr: tl;dr:
* search for duplicates, also in closed issues * search for duplicates, also in closed issues
* a single issue per topic * a single issue per topic
* reduce screenshot size * ONLY add screenshots when necessary, and reduce their size
<!-- <!--
issue template below, please remove above text before submitting (and the template too if you think it's a good idea) issue template below, please remove above text before submitting (and the template too if you think it's a good idea)

View file

@ -7,6 +7,6 @@ Please see the appropriate readme section for issue reporting guidelines: https:
tl;dr: tl;dr:
* search for duplicates, also in closed issues * search for duplicates, also in closed issues
* a single issue per topic * a single issue per topic
* reduce screenshot size * ONLY add screenshots when necessary, and reduce their size
<!-- please remove above text before submitting, and choose a meaningful title for your issue --> <!-- please remove above text before submitting, and choose a meaningful title for your issue -->

View file

@ -1,16 +1,19 @@
See the contributing readme for more detailed guideline, please understand and accept them: https://github.com/Helium314/HeliBoard/blob/main/CONTRIBUTING.md See the contributing readme for more detailed guidelines: https://github.com/Helium314/HeliBoard/blob/main/CONTRIBUTING.md#guidelines
tl;dr (you should still read the full list though): tl;dr:
* make sure it's wanted necessary;
* a single thing only * a single thing only
* describe it properly * describe it properly
recommended:
* make changes optional
* re-use existing mechanisms / code * re-use existing mechanisms / code
* low performance impact * low performance impact
* make it a draft if you still want to work on it * make it a draft if you still want to work on it
* no translations or dictionaries
A good description and small scope ("single thing") massively help with reviewing. Don't be surprised when your PR gets closes if you clearly / repeatedly violate these parts of the guidelines.
Further Further
* When the PR contains "fixes" <issue number>, the related issue will be linked and automatically closed if the PR is merged (also works for other words like "fix", "resolve", "resolves", "closes", ...) * When the PR contains "fixes" <issue number>, the related issue will be linked and automatically closed if the PR is merged (also works for other words like "fix", "resolve", "resolves", "closes", ...)
* If you add a keyboard layout, make sure you have read https://github.com/Helium314/HeliBoard/blob/main/layouts.md#adding-new-layouts--languages * If you add a keyboard layout, best read https://github.com/Helium314/HeliBoard/blob/main/layouts.md#adding-new-layouts--languages
* Please avoid force-pushing when doing changes. This way it's not possible which parts have changed since the previous state. * Please avoid force-pushing when doing requested changes. This way it's not possible to see which parts have changed since the previous state.
<!-- (please remove the text above before submitting the PR) --> <!-- (please remove the text above before submitting the PR) -->

View file

@ -2,29 +2,69 @@
HeliBoard project is based on Gradle and Android Gradle Plugin. To get started, you can install [Android Studio](https://developer.android.com/studio), and import project 'from Version Control / Git / Github' by providing this git repository [URL](https://github.com/Helium314/HeliBoard) (or git SSH [URL](git@github.com:Helium314/heliboard.git)). HeliBoard project is based on Gradle and Android Gradle Plugin. To get started, you can install [Android Studio](https://developer.android.com/studio), and import project 'from Version Control / Git / Github' by providing this git repository [URL](https://github.com/Helium314/HeliBoard) (or git SSH [URL](git@github.com:Helium314/heliboard.git)).
Of course you can also use any other compatible IDE, or work with text editor and command line. Of course you can also use any other compatible IDE, or work with text editor and command line.
Once everything is up correctly, you're ready to go! Once everything is up correctly, you're ready to go!
If you have difficulties implementing some functionality, you're welcome to ask for help. No one will write the code for you, but often other contributors can give you very useful hints.
# About the Code
HeliBoard is based on AOSP keyboard, and in many places still contains mostly the original code. There are some extensions, and some parts have been replaced completely.
When working on this app, you will likely notice its rather large size, and quite different code styles and often ancient comments and _TODO_s, where the latter are typically untouched since AOSP times.
Unfortunately a lot of the old code is hard to read or to fully understand with all of its intended (and unintended) consequences.
Some hints for finding what you're looking for:
* Layouts: stored in `layouts` folder in assets, interpreted by `KeyboardParser` and `TextKeyData`
* Popups: either on layouts, or in `locale_key_texts` (mostly letter variations for specific languages that are not dependent on layout)
* Touch and swipe input handling: `PointerTracker`
* Handling of key inputs: `InputLogic`
* Suggestions: `DictionaryFacilitatorImpl`, `Suggest`, `InputLogic`, and `SuggestionStripView` (in order from creation to display)
* Forwarding entered text / keys to the app / text field: `RichInputConnection`
* Receiving events and information from the app / text field: `LatinIME`
* Settings are in `SettingsValues`, with some functionality in `Settings` and the default values in `Default`
# Guidelines # Guidelines
HeliBoard is a complex application, when contributing, you must take a step back and make sure your contribution: ## Recommended
- **Is actually wanted**. Best check related open issues before you start working on a PR. Issues with "PR" and "contributor needed" labels are accepted, but still it would be good if you announced that you are working on it, so we can discuss how changes are best implemented.
If there is no issue related to your intended contribution, it's a good idea to open a new one to avoid disappointment of the contribution not being accepted. For small changes or fixing obvious bugs this step is not necessary.
- **Is only about a single thing**. Mixing unrelated or semi-related contributions into a single PR is hard to review and can get messy.
- **Is finished or a draft**. When you keep changing the PR without reviewer's feedback, any attempt to review it is doomed and a waste of time. Better mark it as a draft in this case.
- **Has a proper description**. What your contribution does is usually less obvious to reviewers than for yourself. A good description helps _a lot_ for understanding what is going on, and for separating wanted from unintended changes in behavior. Therefore the changes should be as described, not more and not less.
- **Uses already in-place mechanism and take advantage of them**. In other terms, does not reinvent the wheel or uses shortcuts that could alter the consistency of the existing code. The contribution should only add as little complexity as necessary, the code is overly complicated already 😶.
- **Has a low footprint**. Some parts of the code are executed very frequently, and the keyboard should stay responsive even on older devices.
- **Does not bring any non-free code or proprietary binary blobs**. This also applies to code/binaries with unknown licenses. Make sure you do not introduce any closed-source library from Google.
If your contribution contains code that is not your own, provide a link to the source.
- **Complies with the user privacy principle HeliBoard follows**.
(and leave dependency upgrades to the maintainers, unless it's an actual security issue) If you want to contribute, it's a good idea to make sure your idea is actually wanted in HeliBoard.
In addition to previous elements, HeliBoard must stick to [F-Droid inclusion guidelines](https://f-droid.org/docs/Inclusion_Policy/). Best check related issues before you start working on a PR. If the issue has the [labels](https://github.com/Helium314/HeliBoard/labels) [_PR_](https://github.com/Helium314/HeliBoard/labels/PR) or [_contributor needed_](https://github.com/Helium314/HeliBoard/issues?q=label%3A%22contributor%20needed%22) (even closed ones), contributions are wanted. If you don't find a related issue, it's recommended to open one, but ultimately it's your choice.
Asking before starting a PR may help you for getting pointers to potentially relevant code, and deciding how to implement your desired changes.
# Adding Layouts HeliBoard is a complex application and used by users with a large variety of opinions on how things should be.
When contributing to the app, please:
* Be careful when modifying core components, as it's easy to trigger unintended consequences
* When introducing a feature or change that might not be wanted by everyone, make it optional
* Keep code simple where possible. Complex code is harder to review and to maintain, so the complexity should also add a clear benefit
* Avoid noticeable performance impact. Some parts of the code are executed very frequently, and the keyboard should stay responsive even on older devices.
* Try making use of in-place mechanisms instead of re-inventing the wheel. Your contribution should only add as much complexity as necessary, the code is overly complicated already 😶.
* Keep your changes to few places, as opposed to sprinkling them over many parts of the code. This helps with keeping down complexity during review, and with maintainability of the app.
* Make a draft PR when you intend to still work on it. Submitting an unfinished PR can be a good idea when you're not sure how to best continue and would like some comments.
See [layouts.md](layouts.md#adding-new-layouts--languages) for how to add new layouts to the app. Further things to consider (though irrelevant for most PRs):
* APK size:
* Large increases should be discussed first, and will only be added when it's considered worth the increase for a majority of users. It might be possible to avoid size increase by importing optional parts, like it's done for dictionaries.
* Small increases like when adding code or layouts are never an issue
* Do not add proprietary code or binary blobs. If it turns out to be necessary for a feature you want to add, it might be acceptable when the user opts in and imports those parts, like it's done for glide typing.
* Privacy: Only relevant when adding some form of communication with other apps. Internet permission will not be added.
* If your contribution contains code that is not your own, provide a link to the source
* This is especially relevant to be sure the code's license is compatible to HeliBoard's GPL3
## Necessary
Some parts of the guidelines are necessary to fulfill for facilitating code review. It doesn't need to be perfect from the start, but consider it for your future PRs when you're reminded of these guidelines. Note that the larger / more complex your PR is, the more relevant these guidelines are.
Your PR should:
- **Be only about a single thing**. Mixing unrelated or semi-related contributions into a single PR is hard to review and can get messy. As a general rule: if one part doesn't need the other one(s), it should be separate PRs. If one feature builds on top of another one, but the base is usable on its own, do a PR for the base and then a follow-up once it's merged.
- **Have a proper description**. A good description helps _a lot_ for understanding what you intend to achieve with the changes, and for understanding the code. This is relevant for separating wanted from unintended changes in behavior during review.
- **No translations**. Translations should be done using [Weblate](https://translate.codeberg.org/projects/heliboard/). Exception is when you add new resource strings, those can be added right away.
Please leave dependency upgrades to the maintainers, unless you state a good reason why they should be done now.
# Adding / Adjusting Layouts
See [layouts.md](layouts.md#adding-new-layouts--languages) for how to add new layouts to the app. Please stay in line with other layouts regarding the popup keys.
When editing existing layouts, please consider that people should should still get what they're used to. In case of doubt it might be better to add a new layout instead of overhauling existing layouts.
`locale_key_texts` files should only contain letters that are actually part of the language, with exception of the optional `more_popups_<...>.txt` files.
# Update Emojis # Update Emojis

View file

@ -9,14 +9,11 @@ Does not use internet permission, and thus is 100% offline.
## Table of Contents ## Table of Contents
- [Features](#features) - [Features](#features)
* [FAQ / Common Issues](#faq--common-issues)
* [Hidden Functionality](#hidden-functionality)
- [Contributing](#contributing-) - [Contributing](#contributing-)
* [Reporting Issues](#reporting-issues) * [Reporting Issues](#reporting-issues)
* [Translations](#translations) * [Translations](#translations)
* [To Community Creation](#to-community) * [To Community Creation](#to-community)
* [Code Contribution](CONTRIBUTING.md) * [Code Contribution](CONTRIBUTING.md)
- [To-do](#to-do)
- [License](#license) - [License](#license)
- [Credits](#credits) - [Credits](#credits)
@ -43,56 +40,12 @@ Does not use internet permission, and thus is 100% offline.
</ul> </ul>
<li>Clipboard history</li> <li>Clipboard history</li>
<li>One-handed mode</li> <li>One-handed mode</li>
<li>Split keyboard (only available if the screen is large enough)</li> <li>Split keyboard</li>
<li>Number pad</li> <li>Number pad</li>
<li>Backup and restore your settings and learned word / history data</li> <li>Backup and restore your settings and learned word / history data</li>
</ul> </ul>
## FAQ / Common Issues For [FAQ](https://github.com/Helium314/HeliBoard/wiki/FAQ) and more information about the app and features, please visit the [wiki](https://github.com/Helium314/HeliBoard/wiki)
* __Add a dictionary__: First download the dictionary file, e.g. from [here](https://codeberg.org/Helium314/aosp-dictionaries#dictionaries). Then go to language settings, click on the language, then on `+` next to _dictionary_ the _add_ and select the file. Alternatively you can open a `.dict` file in a file explorer with HeliBoard and then select the language. Note that the latter method does not work with all file explorers.
* __Emoji search__: You can get addon dictionaries for emoji suggestions in the [dictionaries repo](https://codeberg.org/Helium314/aosp-dictionaries). An actual search function does not exist yet.
* __Cannot switch choose layout__: This is only possible when _use system languages_ is disabled. You can select the layout when tapping on the language.
* __How to customize layout__: Go to layout selection and use the `+` button, then you can add a custom layout, either from a file or you can copy and edit an existing layout.
* __No suggestions for some language__: Check [dictionaries repo](https://codeberg.org/Helium314/aosp-dictionaries) whether a dictionary is available. If there is one, download it and add it in the language settings for this language.
* __No suggestions in some app / text field__: This app respects the [no suggestions flag](https://developer.android.com/reference/android/text/InputType#TYPE_TEXT_FLAG_NO_SUGGESTIONS) set by some input fields, i.e. the developer does not want you to see suggestions here. Best do in issue report for that app if you think this behavior is wrong. Alternatively you can enable the _always show suggestions_ setting that overrides the _no suggestions_ flag.
* __Multilingual typing__ (type in multiple languages without switching manually): Enable in _Languages & Layouts_, select the main language and tap the `+` button next to _multilingual typing_ to add a language. Note that the selection is limited to languages with the same script as the main language, and to languages that have a dictionary (see above for how to add).
* __How to enable glide typing__: There is no glide typing built into this app, but you can load compatible libraries: Go to advanced settings -> _load gesture typing library_ and point to a file (setting not available in _nouserlib_ version). You can extract the file from GApps packages ("_swypelibs_"), or download one [here](https://github.com/erkserkserks/openboard/tree/master/app/src/main/jniLibs). Make sure to use the correct version (app will tell you in the dialog to load the library).
* __Glide typing is not working after loading a library__: Possibly the download was corrupted, or you downloaded the wrong file. If you get a "_unknown file_" confirmation popup, it is likely you are not using the correct file (or you might be using a different version of the library). In rare cases, there might be crashes when the file is not in internal storage, or some [Samsung-specific problems](https://stackoverflow.com/a/75286899).
* __German layout with / without umlauts__: _German (Germany)_ layout has umlauts, _German_ layout doesn't
* __Spell checker is not checking all languages in multilingual typing__: Make sure you actually enabled HeliBoard spell checker. Usually it can be found in System Settings -> System -> Languages -> Advanced -> Spell Checker, but this may depend on Android version.
* __Words added to Gboard dictionary are not suggested__: Gboard uses its own dictionary instead of the system's personal dictionary. See [here](https://github.com/Helium314/HeliBoard/issues/500#issuecomment-2032292161) for how to export the words.
* __What is the _nouserlib_ version?__: The normal version (_release_) allows the user to provide a library for glide typing, while the _nouserlib_ version does not. Running code that isn't supplied with the app is _dynamic code loading_, which is a security risk. Android Studio warns about this:
> Dynamically loading code from locations other than the application's library directory or the Android platform's built-in library directories is dangerous, as there is an increased risk that the code could have been tampered with. Applications should use loadLibrary when possible, which provides increased assurance that libraries are loaded from one of these safer locations. Application developers should use the features of their development environment to place application native libraries into the lib directory of their compiled APKs.
The app checks the SHA256 checksum of the library and warns the user if it doesn't match with known library versions. A mismatch indicates the library was modified, but may also occur if the user intentionally provides a different library than expected (e.g. a self-built variant).
Note that if the the app is installed as a system app, both versions have access to the system glide typing library (if it is installed).
* __App crashing when using as system app__: This happens if you do not install the app, but just copy the APK. Then the app's own library is not extracted from the APK, and not accessible to the app. You will need tp either install the app over itself, or provide a library.
## Hidden Functionality
Features that may go unnoticed, and further potentially useful information
* Long-pressing toolbar keys results in additional functionality: clipboard -> paste, move left/right -> word left/right, move up/down -> page up/down, word left/right -> line start/end, page up/down -> page start/end, copy -> cut, select word <-> select all, undo <-> redo
* Long-press the Comma-key to access Clipboard View, Emoji View, One-handed Mode, Settings, or Switch Language:
* Emoji View and Language Switch will disappear if you have the corresponding key enabled;
* For some layouts it\'s not the Comma-key, but the key at the same position (e.g. it\'s `q` for Dvorak layout).
* When incognito mode is enabled, no words will be learned, and no emojis will be added to recents.
* Sliding key input: Swipe from shift or symbol key to another key. This will enter a single uppercase key or symbol and return to the previous keyboard.
* Hold shift or symbol key, press one or more keys, and then release shift or symbol key to return to the previous keyboard.
* Long-press a suggestion in the suggestion strip to show more suggestions, and a delete button to remove this suggestion.
* Swipe up from a suggestion to open more suggestions, and release on the suggestion to select it.
* Long-press an entry in the clipboard history to pin it (keep it in clipboard until you unpin).
* Swipe left in clipboard view to remove an entry (except when it's pinned)
* Select text and press shift to switch between uppercase, lowercase and capitalize words
* You can add dictionaries by opening the file
* This only works with _content-uris_ and not with _file-uris_, meaning that it may not work with some file explorers.
* Not really a feature, but you can restart the keyboard by going to the settings and swiping it away from recents
* _Debug mode / debug APK_
* Long-press a suggestion in the suggestion strip twice to show the source dictionary.
* When using debug APK, you can find _Debug Settings_ within the _Advanced Preferences_, though the usefulness is limited except for dumping dictionaries into the log.
* For a release APK, you need to tap the version in _About_ several times, then you can find debug settings in _Advanced Preferences_.
* When enabling _Show suggestion infos_, suggestions will have some tiny numbers on top showing some internal score and source dictionary.
* In the event of an application crash, you will be prompted whether you want the crash logs when you open the Settings.
* When using multilingual typing, space bar will show an confidence value used for determining the currently used language.
* For users doing manual backups with root access: Starting at Android 7, some files and the main shared preferences file are not in the default location, because the app is using [device protected storage](https://developer.android.com/reference/android/content/Context#createDeviceProtectedStorageContext()). This is necessary so the settings and layout files can be read before the device is unlocked, e.g. at boot. The files are usually located in `/data/user_de/0/<package_id>/`, though the location may depend on the device and Android version.
# Contributing ❤ # Contributing ❤
@ -105,7 +58,7 @@ Before opening a new issue, be sure to check the following:
- **Is the issue still relevant?** Make sure your issue is not already fixed in the latest version of HeliBoard. - **Is the issue still relevant?** Make sure your issue is not already fixed in the latest version of HeliBoard.
- **Is it a single topic?** If you want to suggest multiple things, open multiple issues. - **Is it a single topic?** If you want to suggest multiple things, open multiple issues.
- **Did you use the issue template?** It is important to make life of our kind contributors easier by avoiding issues that miss key information to their resolution. - **Did you use the issue template?** It is important to make life of our kind contributors easier by avoiding issues that miss key information to their resolution.
Note that issues that that ignore part of the issue template will likely get treated with very low priority, as often they are needlessly hard to read or understand (e.g. huge screenshots, not providing a proper description, or addressing multiple topics). Note that issues that that ignore part of the issue template will likely get treated with very low priority, as often they are needlessly hard to read or understand (e.g. huge screenshots, not providing a proper description, or addressing multiple topics). Blatant violation of the guidelines may result in the issue getting closed.
If you're interested, you can read the following useful text about effective bug reporting (a bit longer read): https://www.chiark.greenend.org.uk/~sgtatham/bugs.html If you're interested, you can read the following useful text about effective bug reporting (a bit longer read): https://www.chiark.greenend.org.uk/~sgtatham/bugs.html
@ -113,12 +66,18 @@ If you're interested, you can read the following useful text about effective bug
Translations can be added using [Weblate](https://translate.codeberg.org/projects/heliboard/). You will need an account to update translations and add languages. Add the language you want to translate to in Languages -> Manage translated languages in the top menu bar. Translations can be added using [Weblate](https://translate.codeberg.org/projects/heliboard/). You will need an account to update translations and add languages. Add the language you want to translate to in Languages -> Manage translated languages in the top menu bar.
Updating translations in a PR will not be accepted, as it may cause conflicts with Weblate translations. Updating translations in a PR will not be accepted, as it may cause conflicts with Weblate translations.
Some notes on translations
* when translating metadata, translating the changelogs is rather useless. It's available as it was requested by translators.
* the `hidden_features_message` is horrible to translate with Weblate, and serves little benefit as it's just a copy of what's already in the wiki: https://github.com/Helium314/HeliBoard/wiki/Hidden-functionality. It's been made available in the app on user request/contribution.
## To Community ## To Community
You can share your themes, layouts and dictionaries with other people: You can share your themes, layouts and dictionaries with other people:
* Themes can be saved and loaded using the menu on top-right in the _adjust colors_ screen * Themes can be saved and loaded using the menu on top-right in the _adjust colors_ screen
* You can share custom colors in a separate [discussion section](https://github.com/Helium314/HeliBoard/discussions/categories/custom-colors)
* Custom keyboard layouts are text files whose content you can edit, copy and share * Custom keyboard layouts are text files whose content you can edit, copy and share
* this applies to main keyboard layouts and to special layouts adjustable in advanced settings * this applies to main keyboard layouts and to special layouts adjustable in advanced settings
* see [layouts.md](layouts.md) for details * see [layouts.md](layouts.md) for details
* You can share custom layouts in a separate [discussion section](https://github.com/Helium314/HeliBoard/discussions/categories/custom-layout)
* Creating dictionaries is a little more work * Creating dictionaries is a little more work
* first you will need a wordlist, as described [here](https://codeberg.org/Helium314/aosp-dictionaries/src/branch/main/wordlists/sample.combined) and in the repository readme * first you will need a wordlist, as described [here](https://codeberg.org/Helium314/aosp-dictionaries/src/branch/main/wordlists/sample.combined) and in the repository readme
* the you need to compile the dictionary using [external tools](https://github.com/remi0s/aosp-dictionary-tools) * the you need to compile the dictionary using [external tools](https://github.com/remi0s/aosp-dictionary-tools)
@ -128,39 +87,15 @@ You can share your themes, layouts and dictionaries with other people:
## Code Contribution ## Code Contribution
See [Contribution Guidelines](CONTRIBUTING.md) See [Contribution Guidelines](CONTRIBUTING.md)
# To-do
__Planned features and improvements:__
* Improve support for modifier keys (_alt_, _ctrl_, _meta_ and _fn_), some ideas:
* keep modifier keys on with long press
* keep modifier keys on until the next key press
* use sliding input
* Less complicated addition of new keyboard languages (e.g. #519)
* Additional and customizable key swipe functionality
* Some functionality will not be possible when using glide typing
* Ability to enter all emojis independent of Android version (optional, #297)
* Add and enable emoji dictionaries by default (if available for language)
* Clearer / more intuitive arrangement of settings
* Maybe hide some less used settings by default (similar to color customization)
* Make use of the `.com` key in URL fields (currently only available for tablets)
* With language-dependent TLDs
* Internal cleanup (a lot of over-complicated and convoluted code)
* [Bug fixes](https://github.com/Helium314/HeliBoard/issues?q=is%3Aissue+is%3Aopen+label%3Abug)
__What will _not_ be added:__
* Material 3 (not worth adding 1.5 MB to app size)
* Dictionaries for more languages (you can still download them)
* Anything that requires additional permissions, unless there is a very good reason
# License # License
HeliBoard (as a fork of OpenBoard) is licensed under GNU General Public License v3.0. HeliBoard (as a fork of OpenBoard) is licensed under GNU General Public License v3.0.
> Permissions of this strong copyleft license are conditioned on making available complete source code of licensed works and modifications, which include larger works using a licensed work, under the same license. Copyright and license notices must be preserved. Contributors provide an express grant of patent rights. > Permissions of this strong copyleft license are conditioned on making available complete source code of licensed works and modifications, which include larger works using a licensed work, under the same license. Copyright and license notices must be preserved. Contributors provide an express grant of patent rights.
See repo's [LICENSE](/LICENSE-GPL-3) file. See repo's [LICENSE](/LICENSE) file.
Since the app is based on Apache 2.0 licensed AOSP Keyboard, an [Apache 2.0](LICENSE-Apache-2.0) license file is provided. Since the app is based on Apache 2.0 licensed AOSP Keyboard, an [Apache 2.0](LICENSE-Apache-2.0) license file is provided.
The icon is licensed under [Creative Commons BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). A [license file](LICENSE-CC-BY-SA-4.0) is also included. The icon is licensed under [Creative Commons BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). A [license file](LICENSE-CC-BY-SA-4.0) is also included.
# Credits # Credits

View file

@ -1,118 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlinx-serialization'
android {
compileSdk 34
buildToolsVersion = '34.0.0'
defaultConfig {
applicationId "helium314.keyboard"
minSdkVersion 21
targetSdkVersion 34
versionCode 2200
versionName '2.2-beta1'
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
buildTypes {
release {
minifyEnabled true
shrinkResources false
debuggable false
jniDebuggable false
renderscriptDebuggable false
}
nouserlib { // same as release, but does not allow the user to provide a library
minifyEnabled true
shrinkResources false
debuggable false
jniDebuggable false
renderscriptDebuggable false
}
debug {
minifyEnabled true
jniDebuggable false
applicationIdSuffix ".debug"
}
runTests { // build variant for running tests on CI that skips tests known to fail
minifyEnabled true
jniDebuggable false
}
archivesBaseName = "HeliBoard_" + defaultConfig.versionName
}
buildFeatures {
viewBinding true
buildConfig true
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
ndkVersion '26.2.11394342'
packagingOptions {
jniLibs {
// shrinks APK by 3 MB, zipped size unchanged
useLegacyPackaging true
}
}
testOptions {
unitTests {
includeAndroidResources = true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
// see https://github.com/Helium314/HeliBoard/issues/477
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
namespace "helium314.keyboard.latin"
lint {
abortOnError true
}
}
dependencies {
// androidx
implementation 'androidx.core:core-ktx:1.13.1'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.preference:preference:1.2.1'
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'androidx.autofill:autofill:1.1.0'
// kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3"
// color picker for user-defined colors
implementation 'com.github.martin-stone:hsv-alpha-color-picker-android:3.1.0'
// test
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:5.11.0'
testImplementation 'org.mockito:mockito-inline:5.2.0'
testImplementation 'org.robolectric:robolectric:4.12.1'
testImplementation 'androidx.test:runner:1.5.2'
testImplementation 'androidx.test:core:1.5.0'
}

132
app/build.gradle.kts Executable file
View file

@ -0,0 +1,132 @@
plugins {
id("com.android.application")
kotlin("android")
kotlin("plugin.serialization") version "2.0.21"
kotlin("plugin.compose") version "2.0.0"
}
android {
compileSdk = 35
buildToolsVersion = "34.0.0"
defaultConfig {
applicationId = "helium314.keyboard"
minSdk = 21
targetSdk = 35
versionCode = 3004
versionName = "3.0-beta1"
ndk {
abiFilters.clear()
abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64"))
}
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = false
isDebuggable = false
isJniDebuggable = false
}
create("nouserlib") { // same as release, but does not allow the user to provide a library
isMinifyEnabled = true
isShrinkResources = false
isDebuggable = false
isJniDebuggable = false
}
debug {
// "normal" debug has minify for smaller APK to fit the GitHub 25 MB limit when zipped
// and for better performance in case users want to install a debug APK
isMinifyEnabled = true
isJniDebuggable = false
applicationIdSuffix = ".debug"
}
create("runTests") { // build variant for running tests on CI that skips tests known to fail
isMinifyEnabled = true
isJniDebuggable = false
}
create("debugNoMinify") { // for faster builds in IDE
isDebuggable = true
isMinifyEnabled = false
isJniDebuggable = false
signingConfig = signingConfigs.getByName("debug")
applicationIdSuffix = ".debug"
}
base.archivesBaseName = "HeliBoard_" + defaultConfig.versionName
}
buildFeatures {
viewBinding = true
buildConfig = true
compose = true
}
externalNativeBuild {
ndkBuild {
path = File("src/main/jni/Android.mk")
}
}
ndkVersion = "28.0.13004108"
packagingOptions {
jniLibs {
// shrinks APK by 3 MB, zipped size unchanged
useLegacyPackaging = true
}
}
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
// see https://github.com/Helium314/HeliBoard/issues/477
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
namespace = "helium314.keyboard.latin"
lint {
abortOnError = true
}
}
dependencies {
// androidx
implementation("androidx.core:core-ktx:1.15.0")
implementation("androidx.recyclerview:recyclerview:1.4.0")
implementation("androidx.autofill:autofill:1.1.0")
// kotlin
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0")
// compose
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
implementation(platform("androidx.compose:compose-bom:2025.02.00"))
implementation("androidx.compose.material3:material3")
implementation("androidx.compose.ui:ui-tooling-preview")
debugImplementation("androidx.compose.ui:ui-tooling")
implementation("androidx.navigation:navigation-compose:2.8.8")
implementation("sh.calvin.reorderable:reorderable:2.4.3") // for easier re-ordering
implementation("com.github.skydoves:colorpicker-compose:1.1.2") // for user-defined colors
// test
testImplementation(kotlin("test"))
testImplementation("junit:junit:4.13.2")
testImplementation("org.mockito:mockito-core:5.15.2")
testImplementation("org.robolectric:robolectric:4.14.1")
testImplementation("androidx.test:runner:1.6.2")
testImplementation("androidx.test:core:1.6.1")
}

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
SPDX-License-Identifier: GPL-3.0-only
-->
<resources>
<string name="english_ime_name" translatable="false">HeliBoard debug</string>
<string name="spell_checker_service_name" translatable="false">HeliBoard debug Spell Checker</string>
<string name="ime_settings" translatable="false">HeliBoard debug Settings</string>
</resources>

View file

@ -5,7 +5,8 @@ modified
SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
--> -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.READ_USER_DICTIONARY" /> <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
@ -20,7 +21,9 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
android:supportsRtl="true" android:supportsRtl="true"
android:allowBackup="true" android:allowBackup="true"
android:defaultToDeviceProtectedStorage="true" android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true"> android:directBootAware="true"
tools:remove="android:appComponentFactory"
tools:targetApi="p">
<!-- Services --> <!-- Services -->
<service android:name="LatinIME" <service android:name="LatinIME"
@ -46,42 +49,15 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
</service> </service>
<!-- Activities --> <!-- Activities -->
<activity android:name=".setup.SetupActivity" <activity android:name="helium314.keyboard.settings.SettingsActivity"
android:theme="@style/platformActivityTheme" android:theme="@style/platformActivityTheme"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:launchMode="singleTask" android:windowSoftInputMode="adjustResize"
android:noHistory="true"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity>
<activity
android:name=".permissions.PermissionsActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="false"
android:taskAffinity="" >
</activity>
<activity android:name=".setup.SetupWizardActivity"
android:theme="@style/platformActivityTheme"
android:clearTaskOnLaunch="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<activity android:name=".settings.SettingsActivity"
android:theme="@style/platformActivityTheme"
android:label="@string/ime_settings"
android:excludeFromRecents="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
<!-- intent filter for opening .dict files --> <!-- intent filter for opening .dict files -->
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
@ -93,7 +69,7 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
<activity android:name=".spellcheck.SpellCheckerSettingsActivity" <activity android:name=".spellcheck.SpellCheckerSettingsActivity"
android:theme="@style/platformActivityTheme" android:theme="@style/platformActivityTheme"
android:label="@string/android_spell_checker_settings" android:label="@string/spell_checker_service_name"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View file

@ -32,6 +32,8 @@ main,hu,
main,it, main,it,
main,kn, main,kn,
main,ks, main,ks,
main,km,
main,la,
main,lv, main,lv,
main,lt, main,lt,
main,lb, main,lb,
@ -54,6 +56,8 @@ main,sr,
main,sd, main,sd,
main,sl, main,sl,
main,es, main,es,
main,zgh_ZZ,
main,zgh,
main,sv, main,sv,
main,ta, main,ta,
main,te, main,te,
@ -68,23 +72,44 @@ main,ar,exp
main,bn_BD,exp main,bn_BD,exp
main,bn,exp main,bn,exp
main,bg,exp main,bg,exp
main,ca,exp
main,hr,exp
main,cs,exp main,cs,exp
main,da,exp
main,nl,exp
main,en_CA,exp
main,en_GB,exp main,en_GB,exp
main,en_US,exp main,en_US,exp
symbols,en,exp symbols,en,exp
main,eo,exp
main,et,exp
main,fi,exp
symbols,fr,exp symbols,fr,exp
main,fr,exp main,fr,exp
main,gl,exp
main,de_AT,exp main,de_AT,exp
main,de,exp main,de,exp
main,he,exp main,he,exp
main,hu,exp
main,is,exp
main,id,exp main,id,exp
main,it,exp main,it,exp
main,kab,exp main,kab,exp
main,kk,exp main,kk,exp
main,lv,exp
main,lt,exp
addon,ml_ZZ,exp addon,ml_ZZ,exp
main,ne,exp
main,nb,exp
main,pms,exp main,pms,exp
main,pl,exp
main,pt_PT,exp
main,ro,exp
main,ru,exp main,ru,exp
main,sk,exp main,sk,exp
main,sl,exp
main,es,exp main,es,exp
main,sv,exp
main,tr,exp
main,uk,exp main,uk,exp
main,vi,exp main,vi,exp

1 main ar
32 main it
33 main kn
34 main ks
35 main km
36 main la
37 main lv
38 main lt
39 main lb
56 main sd
57 main sl
58 main es
59 main zgh_ZZ
60 main zgh
61 main sv
62 main ta
63 main te
72 main bn_BD exp
73 main bn exp
74 main bg exp
75 main ca exp
76 main hr exp
77 main cs exp
78 main da exp
79 main nl exp
80 main en_CA exp
81 main en_GB exp
82 main en_US exp
83 symbols en exp
84 main eo exp
85 main et exp
86 main fi exp
87 symbols fr exp
88 main fr exp
89 main gl exp
90 main de_AT exp
91 main de exp
92 main he exp
93 main hu exp
94 main is exp
95 main id exp
96 main it exp
97 main kab exp
98 main kk exp
99 main lv exp
100 main lt exp
101 addon ml_ZZ exp
102 main ne exp
103 main nb exp
104 main pms exp
105 main pl exp
106 main pt_PT exp
107 main ro exp
108 main ru exp
109 main sk exp
110 main sl exp
111 main es exp
112 main sv exp
113 main tr exp
114 main uk exp
115 main vi exp

View file

@ -1,34 +0,0 @@

View file

@ -1,136 +0,0 @@
[
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ধ" },
"default": { "label": "দ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঊ" },
"default": { "label": "ূ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঈ" },
"default": { "label": "ী" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ড়" },
"default": { "label": "র" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঠ", "popup": { "main": { "label": "৳" } } },
"default": { "label": "ট" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঐ", "popup": { "main": { "label": "ঞ" } } },
"default": { "label": "এ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "উ", "popup": { "main": { "label": "ৎ" } } },
"default": { "label": "ু" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ই" },
"default": { "label": "ি" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঔ" },
"default": { "label": "ও" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ফ" },
"default": { "label": "প" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৈ" },
"default": { "label": "ে" }
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "অ" },
"default": { "label": "া" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ষ" },
"default": { "label": "স" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ" },
"default": { "label": "ড" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "থ" },
"default": { "label": "ত" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঘ" },
"default": { "label": "গ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঃ" },
"default": { "label": "হ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঝ" },
"default": { "label": "জ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "খ" },
"default": { "label": "ক" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ং" },
"default": { "label": "ল" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৌ" },
"default": { "label": "ো" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "৳" },
"default": { "label": "॥" }
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "য" },
"default": { "label": "য়" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ়" },
"default": { "label": "শ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ছ" },
"default": { "label": "চ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঋ" },
"default": { "label": "আ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ভ" },
"default": { "label": "ব" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ণ" },
"default": { "label": "ন" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঙ" },
"default": { "label": "ম" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৃ" },
"default": { "label": "।" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঁ" },
"default": { "label": "্" }
}
],
[
{ "label": "," },
{ "label": "." }
]
]

View file

@ -1,112 +0,0 @@
[
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ং" },
"default": { "label": "ঙ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "য়" },
"default": { "label": "য" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ" },
"default": { "label": "ড" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ফ" },
"default": { "label": "প" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঠ" },
"default": { "label": "ট" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ছ" },
"default": { "label": "চ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঝ" },
"default": { "label": "জ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঞ" },
"default": { "label": "হ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঘ" },
"default": { "label": "গ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ়" },
"default": { "label": "ড়" }
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঃ" },
"default": { "label": "ৃ" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ূ" },
"default": { "label": "ু" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ী" },
"default": { "label": "ি" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "অ" },
"default": { "label": "া" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঁ" },
"default": { "label": "্" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ভ" },
"default": { "label": "ব" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "খ" },
"default": { "label": "ক" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "থ" },
"default": { "label": "ত" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ধ" },
"default": { "label": "দ" }
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "্য" },
"default": { "label": "্র" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৌ" },
"default": { "label": "ো" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৈ" },
"default": { "label": "ে" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ল" },
"default": { "label": "র" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ণ" },
"default": { "label": "ন" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ষ" },
"default": { "label": "স" }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "শ" },
"default": { "label": "ম" }
}
]
]

View file

@ -0,0 +1,7 @@
[
[
{ "label": "alpha", "width": 0.15 },
{ "label": "space", "width": -1 },
{ "label": "delete", "width": 0.15 }
]
]

View file

@ -0,0 +1,7 @@
[
[
{ "label": "alpha", "width": 0.15 },
{ "label": "space", "width": -1 },
{ "label": "delete", "width": 0.15 }
]
]

View file

@ -15,7 +15,7 @@
{ "$": "keyboard_state_selector", "emojiKeyEnabled": { "$": "keyboard_state_selector", "alphabet": { "label": "emoji" }}}, { "$": "keyboard_state_selector", "emojiKeyEnabled": { "$": "keyboard_state_selector", "alphabet": { "label": "emoji" }}},
{ "$": "keyboard_state_selector", "symbols": { "label": "numpad" }}, { "$": "keyboard_state_selector", "symbols": { "label": "numpad" }},
{ "label": "space" }, { "label": "space" },
{ "label": "period", "labelFlags": 1073741824 }, { "label": "period" },
{ "label": "action", "width": 0.15 } { "label": "action", "width": 0.15 }
] ]
] ]

View file

@ -0,0 +1,28 @@
ɛ q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
ɔ x
c ¢
v
b
n
m

View file

@ -0,0 +1,34 @@
ز
ر
ذ
د
خ
ح
ج
ث
ت
ب
ا
ك
ق
ف
غ
ع
ظ
ط
ض
ص
ش
س
ء
ى
ي
ؤ
و
ة
ن
م
ل

View file

@ -0,0 +1,29 @@
q
w
e
r
t
y
u
i
o
p
ŋ
a
s
d
f
g
h
j
k
l
z
x
c
v
b
n
m

View file

@ -0,0 +1,127 @@
[
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ", "labelFlags": 1073741824 },
"default": { "label": "ড", "popup": { "relevant": [{ "label": "ঢ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ূ", "labelFlags": 1073741824 },
"default": { "label": "ী", "popup": { "relevant": [{ "label": "ূ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "এ", "labelFlags": 1073741824 },
"default": { "label": "ে", "popup": { "relevant": [{ "label": "ঐ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৃ", "labelFlags": 1073741824 },
"default": { "label": "র", "popup": { "main": { "label": "ঋ" }, "relevant": [{ "label": "র‍্য" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঠ", "labelFlags": 1073741824 },
"default": { "label": "ট", "popup": { "relevant": [{ "label": "ঠ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "য়", "labelFlags": 1073741824 },
"default": { "label": "য", "popup": { "relevant": [{ "label": "য়" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "উ", "labelFlags": 1073741824 },
"default": { "label": "ু", "popup": { "relevant": [{ "label": "ঊ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ই", "labelFlags": 1073741824 },
"default": { "label": "ি", "popup": { "relevant": [{ "label": "ঈ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ও", "labelFlags": 1073741824 },
"default": { "label": "ো", "popup": { "relevant": [{ "label": "ঔ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ফ", "labelFlags": 1073741824 },
"default": { "label": "প", "popup": { "relevant": [{ "label": "ফ" }]}}
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "অ", "labelFlags": 1073741824 },
"default": { "label": "া", "popup": { "relevant": [{ "label": "আ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "শ", "labelFlags": 1073741824 },
"default": { "label": "স", "popup": { "relevant": [{ "label": "ষ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ধ", "labelFlags": 1073741824 },
"default": { "label": "দ", "popup": { "relevant": [{ "label": "ধ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "থ", "labelFlags": 1073741824 },
"default": { "label": "ত", "popup": { "main": { "label": "থ" }, "relevant": [{ "label": "ৎ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঘ", "labelFlags": 1073741824 },
"default": { "label": "গ", "popup": { "relevant": [{ "label": "ঘ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "হ", "labelFlags": 1073741824 },
"default": { "label": "্", "popup": { "relevant": [{ "label": "ঃ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঝ", "labelFlags": 1073741824 },
"default": { "label": "জ", "popup": { "relevant": [{ "label": "ঝ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "খ", "labelFlags": 1073741824 },
"default": { "label": "ক", "popup": { "relevant": [{ "label": "খ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ং", "labelFlags": 1073741824 },
"default": { "label": "ল", "popup": { "relevant": [{ "label": "ং" }]}}
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৌ", "labelFlags": 1073741824 },
"default": { "label": "ৈ", "popup": { "relevant": [{ "label": "ৌ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ়", "labelFlags": 1073741824 },
"default": { "label": "ড়", "popup": { "relevant": [{ "label": "ঢ়" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ছ", "labelFlags": 1073741824 },
"default": { "label": "চ", "popup": { "relevant": [{ "label": "ছ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঁ", "labelFlags": 1073741824, "popup": { "relevant": [
{ "label": "!autoColumnOrder!6" },
{ "label": "়" },
{ "label": "ৄ" },
{ "label": "ঽ" },
{ "label": "ৢ" },
{ "label": "ৱ" },
{ "label": "ৣ" },
{ "label": "ৗ" },
{ "label": "ৠ" },
{ "label": "৺" },
{ "label": "ঌ" },
{ "label": "ৰ" },
{ "label": "ৡ"}
]}},
"default": { "label": "ঞ", "popup": { "relevant": [{ "label": "ঁ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ভ", "labelFlags": 1073741824 },
"default": { "label": "ব", "popup": { "relevant": [{ "label": "ভ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ণ", "labelFlags": 1073741824 },
"default": { "label": "ন", "popup": { "relevant": [{ "label": "ণ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঙ", "labelFlags": 1073741824 },
"default": { "label": "ম", "popup": { "relevant": [{ "label": "ঁ" }]}}
}
]
]

View file

@ -0,0 +1,142 @@
[
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঔ", "labelFlags": 1073741824 },
"default": { "label": "ৌ", "popup": { "relevant": [{"label": "ঔ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঐ", "labelFlags": 1073741824 },
"default": { "label": "ৈ", "popup": { "relevant": [{"label": "ঐ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "আ", "labelFlags": 1073741824 },
"default": { "label": "া", "popup": { "relevant": [{"label": "আ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঈ", "labelFlags": 1073741824 },
"default": { "label": "ী", "popup": { "relevant": [{"label": "ঈ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঊ", "labelFlags": 1073741824 },
"default": { "label": "ূ", "popup": { "relevant": [{"label": "ঊ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ভ", "labelFlags": 1073741824 },
"default": { "label": "ব", "popup": { "relevant": [{"label": "ভ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঙ", "labelFlags": 1073741824 },
"default": { "label": "হ", "popup": { "relevant": [{"label": "ঙ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঘ", "labelFlags": 1073741824 },
"default": { "label": "গ", "popup": { "relevant": [{"label": "ঘ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ধ", "labelFlags": 1073741824 },
"default": { "label": "দ", "popup": { "relevant": [{"label": "ধ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঝ", "labelFlags": 1073741824 },
"default": { "label": "জ", "popup": { "relevant": [{"label": "ঝ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ", "labelFlags": 1073741824 },
"default": { "label": "ড", "popup": { "relevant": [{"label": "ঢ" }]}}
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ও", "labelFlags": 1073741824 },
"default": { "label": "ো", "popup": { "relevant": [{"label": "ও" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "এ", "labelFlags": 1073741824 },
"default": { "label": "ে", "popup": { "relevant": [{"label": "এ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "অ", "labelFlags": 1073741824 },
"default": { "label": "্", "popup": { "relevant": [{"label": "অ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ই", "labelFlags": 1073741824 },
"default": { "label": "ি", "popup": { "relevant": [{"label": "ই" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "উ", "labelFlags": 1073741824 },
"default": { "label": "ু", "popup": { "relevant": [{"label": "উ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ফ", "labelFlags": 1073741824 },
"default": { "label": "প", "popup": { "relevant": [{"label": "ফ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ড়", "labelFlags": 1073741824 },
"default": { "label": "র", "popup": { "main": { "label": "ড়" }, "relevant": [{ "label": "র‍্য" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "খ", "labelFlags": 1073741824 },
"default": { "label": "ক", "popup": { "relevant": [{"label": "খ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "থ", "labelFlags": 1073741824 },
"default": { "label": "ত", "popup": { "main": { "label": "থ" }, "relevant": [{ "label": "ৎ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ছ", "labelFlags": 1073741824 },
"default": { "label": "চ", "popup": { "relevant": [{"label": "ছ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঠ", "labelFlags": 1073741824 },
"default": { "label": "ট", "popup": { "relevant": [{"label": "ঠ" }]}}
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঋ", "labelFlags": 1073741824 },
"default": { "label": "ৃ", "popup": { "relevant": [{"label": "ঋ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঁ", "labelFlags": 1073741824, "popup": { "relevant": [
{"label": "!autoColumnOrder!6" },
{ "label": "়" },
{ "label": "ৄ" },
{ "label": "ঽ" },
{ "label": "ৢ" },
{ "label": "ৱ" },
{ "label": "ৣ" },
{ "label": "ৗ" },
{ "label": "ৠ" },
{ "label": "৺" },
{ "label": "ঌ" },
{ "label": "ৰ" },
{ "label": "ৡ" }
]}},
"default": { "label": "ং", "popup": { "main": { "label": "ঁ" }, "relevant": [{ "label": "ঃ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ণ", "labelFlags": 1073741824 },
"default": { "label": "ম", "popup": { "relevant": [{"label": "ণ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঞ", "labelFlags": 1073741824 },
"default": { "label": "ন", "popup": { "relevant": [{"label": "ঞ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ়", "labelFlags": 1073741824 },
"default": { "label": "ব", "popup": { "relevant": [{"label": "ঢ়" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ষ", "labelFlags": 1073741824 },
"default": { "label": "ল", "popup": { "relevant": [{"label": "ষ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "শ", "labelFlags": 1073741824 },
"default": { "label": "স", "popup": { "relevant": [{"label": "শ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "য", "labelFlags": 1073741824 },
"default": { "label": "য়", "popup": { "relevant": [{"label": "য" }]}}
}
]
]

View file

@ -0,0 +1,141 @@
[
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ধ", "labelFlags": 1073741824 },
"default": { "label": "দ", "popup": { "relevant": [{ "label": "ধ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঊ", "labelFlags": 1073741824 },
"default": { "label": "ূ", "popup": { "relevant": [{ "label": "ঊ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঈ", "labelFlags": 1073741824 },
"default": { "label": "ী", "popup": { "relevant": [{ "label": "ঈ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ড়", "labelFlags": 1073741824 },
"default": { "label": "র", "popup": { "main": { "label": "ড়" }, "relevant": [{ "label": "র‍্য" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঠ", "labelFlags": 1073741824 },
"default": { "label": "ট", "popup": { "relevant": [{ "label": "ঠ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঐ", "labelFlags": 1073741824 },
"default": { "label": "এ", "popup": { "relevant": [{ "label": "ঐ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "উ", "labelFlags": 1073741824 },
"default": { "label": "ু", "popup": { "relevant": [{ "label": "উ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ই", "labelFlags": 1073741824 },
"default": { "label": "ি", "popup": { "relevant": [{ "label": "ই" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঔ", "labelFlags": 1073741824 },
"default": { "label": "ও", "popup": { "relevant": [{ "label": "ঔ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ফ", "labelFlags": 1073741824 },
"default": { "label": "প", "popup": { "relevant": [{ "label": "ফ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৈ", "labelFlags": 1073741824 },
"default": { "label": "ে", "popup": { "relevant": [{ "label": "ৈ" }]}}
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "অ", "labelFlags": 1073741824 },
"default": { "label": "া", "popup": { "relevant": [{ "label": "অ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ষ", "labelFlags": 1073741824 },
"default": { "label": "স", "popup": { "relevant": [{ "label": "ষ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ", "labelFlags": 1073741824 },
"default": { "label": "ড", "popup": { "relevant": [{ "label": "ঢ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "থ", "labelFlags": 1073741824 },
"default": { "label": "ত", "popup": { "main": { "label": "থ" }, "relevant": [{ "label": "ৎ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঘ", "labelFlags": 1073741824 },
"default": { "label": "গ", "popup": { "relevant": [{ "label": "ঘ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঃ", "labelFlags": 1073741824 },
"default": { "label": "হ", "popup": { "relevant": [{ "label": "ঃ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঝ", "labelFlags": 1073741824 },
"default": { "label": "জ", "popup": { "relevant": [{ "label": "ঝ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "খ", "labelFlags": 1073741824 },
"default": { "label": "ক", "popup": { "relevant": [{ "label": "খ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ং", "labelFlags": 1073741824 },
"default": { "label": "ল", "popup": { "relevant": [{ "label": "ং" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৌ", "labelFlags": 1073741824 },
"default": { "label": "ো", "popup": { "relevant": [{ "label": "ৌ" }]}}
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "য", "labelFlags": 1073741824 },
"default": { "label": "য়", "popup": { "main": { "label": "য" }, "relevant": [{ "label": "্য" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ়", "labelFlags": 1073741824 },
"default": { "label": "শ", "popup": { "relevant": [{ "label": "ঢ়" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ছ", "labelFlags": 1073741824 },
"default": { "label": "চ", "popup": { "relevant": [{ "label": "ছ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঋ", "labelFlags": 1073741824 },
"default": { "label": "আ", "popup": { "relevant": [{ "label": "ঋ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ভ", "labelFlags": 1073741824 },
"default": { "label": "ব", "popup": { "relevant": [{ "label": "ভ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ণ", "labelFlags": 1073741824 },
"default": { "label": "ন", "popup": { "relevant": [{ "label": "ণ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঙ", "labelFlags": 1073741824 },
"default": { "label": "ম", "popup": { "relevant": [{ "label": "ঙ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৃ", "labelFlags": 1073741824 },
"default": { "label": "ঞ", "popup": { "relevant": [{ "label": "ৃ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঁ", "popup": { "relevant": [
{ "label": "!autoColumnOrder!6"},
{ "label": "়" },
{ "label": "ৄ"},
{ "label": "ঽ"},
{ "label": "ৢ"},
{ "label": "ৱ"},
{ "label": "ৣ"},
{ "label": "ৗ"},
{ "label": "ৠ"},
{ "label": "৺"},
{ "label": "ঌ"},
{ "label": "ৰ"},
{ "label": "ৡ" }]}},
"default": { "label": "্", "popup": { "relevant": [{ "label": "ঁ" }]}}
}
]
]

View file

@ -0,0 +1,126 @@
[
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ং", "labelFlags": 1073741824 },
"default": { "label": "ঙ", "popup": { "relevant": [{ "label": "ং" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "য়", "labelFlags": 1073741824 },
"default": { "label": "য", "popup": { "relevant": [{ "label": "য়" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ", "labelFlags": 1073741824 },
"default": { "label": "ড", "popup": { "relevant": [{ "label": "ঢ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ফ", "labelFlags": 1073741824 },
"default": { "label": "প", "popup": { "relevant": [{ "label": "ফ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঠ", "labelFlags": 1073741824 },
"default": { "label": "ট", "popup": { "relevant": [{ "label": "ঠ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ছ", "labelFlags": 1073741824 },
"default": { "label": "চ", "popup": { "relevant": [{ "label": "ছ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঝ", "labelFlags": 1073741824 },
"default": { "label": "জ", "popup": { "relevant": [{ "label": "ঝ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঞ", "labelFlags": 1073741824 },
"default": { "label": "হ", "popup": { "relevant": [{ "label": "ঞ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঘ", "labelFlags": 1073741824 },
"default": { "label": "গ", "popup": { "relevant": [{ "label": "ঘ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঢ়", "labelFlags": 1073741824 },
"default": { "label": "ড়", "popup": { "relevant": [{ "label": "ঢ়" }]}}
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঃ", "labelFlags": 1073741824 },
"default": { "label": "ৃ", "popup": { "relevant": [{ "label": "ঋ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ূ", "popup": { "relevant": [{ "label": "ঊ" }]}},
"default": { "label": "ু", "popup": { "relevant": [{ "label": "উ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ী", "popup": { "relevant": [{ "label": "ঈ"}]}},
"default": { "label": "ি", "popup": { "relevant": [{ "label": "ই" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "অ", "labelFlags": 1073741824 },
"default": { "label": "া", "popup": { "main": { "label": "আ" }, "relevant": [{ "label": "অ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ঁ", "labelFlags": 1073741824, "popup": { "relevant": [
{ "label": "!autoColumnOrder!6" },
{ "label": "়" },
{ "label": "ৄ" },
{ "label": "ঽ" },
{ "label": "ৢ" },
{ "label": "ৱ" },
{ "label": "ৣ" },
{ "label": "ৗ" },
{ "label": "ৠ" },
{ "label": "৺" },
{ "label": "ঌ" },
{ "label": "ৰ" },
{ "label": "ৡ"}
]}},
"default": { "label": "্", "popup": { "relevant": [{ "label": "ঁ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ভ", "labelFlags": 1073741824 },
"default": { "label": "ব", "popup": { "relevant": [{ "label": "ভ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "খ", "labelFlags": 1073741824 },
"default": { "label": "ক", "popup": { "relevant": [{ "label": "খ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "থ", "labelFlags": 1073741824 },
"default": { "label": "ত", "popup": { "main": { "label": "থ" }, "relevant": [{ "label": "ৎ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ধ", "labelFlags": 1073741824 },
"default": { "label": "দ", "popup": { "relevant": [{ "label": "ধ" }]}}
}
],
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "্য", "labelFlags": 1073741824 },
"default": { "label": "্র", "popup": { "relevant": [{ "label": "্য" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৌ", "popup": { "relevant": [{ "label": "ঔ" }]}},
"default": { "label": "ো", "popup": { "relevant": [{ "label": "ও" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ৈ", "popup": { "relevant": [{ "label": "ঐ" }]}},
"default": { "label": "ে", "popup": { "relevant": [{ "label": "এ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ল", "labelFlags": 1073741824 },
"default": { "label": "র", "popup": { "main": { "label": "ল" }, "relevant": [{ "label": "র‍্য" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ণ", "labelFlags": 1073741824 },
"default": { "label": "ন", "popup": { "relevant": [{ "label": "ণ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "ষ", "labelFlags": 1073741824 },
"default": { "label": "স", "popup": { "relevant": [{ "label": "ষ" }]}}
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "শ", "labelFlags": 1073741824 },
"default": { "label": "ম", "popup": { "relevant": [{ "label": "শ" }]}}
}
]
]

View file

@ -0,0 +1,31 @@
ق
و
ە
ر
ت
ی
ێ
ئ
ۆ
پ
ا
س
ش
د
ف
ھ|ه
ژ
ل
ک
گ
ز
ع
ح
ج
چ
خ
ب
ن
م

View file

@ -0,0 +1,28 @@
q
w
ɛ e
r ¢
t
y
u
i
ɔ o
p
a
s
d
f
ɣ g
h
j
k
l
ʒ z
x x
c
v
b
ŋ n
m

View file

@ -0,0 +1,35 @@
й
ц
у ӯ ӱ ý ӱ́
к ҟ ҝ ҡ
е ē ë е́ ë́
н
г ґ ғ ꚕ
ш
щ
з ҙ
х ҳ ẋ
ъ
ф
ы
в w
а ā ӓ á ӓ́
п ԥ
р ҏ
о о̄ ӧ ó ӧ́
л
д
ж җ
э э̄ э́
Ӏ
я я̄ я́ ǽ æ ǣ
ч ҹ
с
м
и ӣ и́
т ԏ
ь
б ҕ
ю ю́

View file

@ -0,0 +1,28 @@
ɛ q
w
e
r
t
ɣ y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
ɔ x
c ¢
v
b
n
m

View file

@ -0,0 +1,28 @@
ɛ q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
ɔ x
ŋ c ¢
v
b
n
m

View file

@ -23,7 +23,11 @@
{ "label": "η" }, { "label": "η" },
{ "label": "ξ" }, { "label": "ξ" },
{ "label": "κ" }, { "label": "κ" },
{ "label": "λ" } { "label": "λ" },
{ "$": "shift_state_selector",
"shiftedManual": { "code": 776, "label": "¨" },
"default": { "code": 769, "label": "´" }
}
], ],
[ [
{ "label": "ζ" }, { "label": "ζ" },

View file

@ -0,0 +1,28 @@
ẹ q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
ọ x
c
v
b
n ₦
m

View file

@ -2,12 +2,12 @@
[ [
{ "$": "variation_selector", { "$": "variation_selector",
"email": { "label": "-" }, "email": { "label": "-" },
"url": { "label": "-" }, "uri": { "label": "-" },
"default": { "label": "'", "popup": { "relevant": [{ "label": "׳" }, { "label": "״" }, { "label": "\"" }] } } "default": { "label": "'", "popup": { "relevant": [{ "label": "׳" }, { "label": "״" }, { "label": "\"" }] } }
}, },
{ "$": "variation_selector", { "$": "variation_selector",
"email": { "label": "_" }, "email": { "label": "_" },
"url": { "label": "_" }, "uri": { "label": "_" },
"default": { "label": "-", "popup": { "relevant": [{ "label": "־" }, { "label": "_" }] } } "default": { "label": "-", "popup": { "relevant": [{ "label": "־" }, { "label": "_" }] } }
}, },
{ "label": "ק", "popup": { { "label": "ק", "popup": {

View file

@ -0,0 +1,85 @@
[
[
{ "label": "ץ", "popup": {
"relevant": [
{ "label": "ש\u05c2" }
]
} },
{ "label": "ן", "popup": {
"relevant": [
{ "label": "ש\u05c1" }
]
} },
{ "label": "ק", "popup": {
"relevant": [
{ "label": "\u05b8" },
{ "label": "\u05bb" }
]
} },
{ "label": "ר", "popup": {
"relevant": [
{ "label": "\u05b3" }
]
} },
{ "label": "א" },
{ "label": "ט" },
{ "label": "ו", "popup": {
"relevant": [
{ "label": "\u05b9" }
]
} },
{ "label": "ת" },
{ "label": "ם" },
{ "label": "פ", "popup": {
"relevant": [
{ "label": "\u05b2" },
{ "label": "\u05b7" }
]
} }
],
[
{ "label": "ש", "popup": {
"relevant": [
{ "label": "\u05b0" }
]
} },
{ "label": "ד", "popup": {
"relevant": [
{ "label": "\u05bc" }
]
} },
{ "label": "ג" },
{ "label": "כ" },
{ "label": "ע" },
{ "label": "י" },
{ "label": "ח", "popup": {
"relevant": [
{ "label": "\u05b4" }
]
} },
{ "label": "ל" },
{ "label": "ך" },
{ "label": "ף" }
],
[
{ "label": "ז" },
{ "label": "ס", "popup": {
"relevant": [
{ "label": "\u05b6" }
]
} },
{ "label": "ב", "popup": {
"relevant": [
{ "label": "\u05b1" }
]
} },
{ "label": "ה" },
{ "label": "נ" },
{ "label": "מ" },
{ "label": "צ", "popup": {
"relevant": [
{ "label": "\u05b5" }
]
} }
]
]

View file

@ -0,0 +1,554 @@
[
[
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ठ"
},
"default": {
"label": "ट"
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ढ"
},
"default": {
"label": "ड",
"popup": {
"main": {
"label": "ड़"
},
"relevant": [
{
"label": "ढ़"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ै"
},
"default": {
"label": "े",
"popup": {
"main": {
"label": "ए"
},
"relevant": [
{
"label": "ऍ"
},
{
"label": "ऐ"
},
{
"code": 2374,
"label": " ॆ"
},
{
"code": 2389,
"label": " ॕ"
},
{
"code": 2382,
"label": " ॎ"
},
{
"label": "ऎ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ृ"
},
"default": {
"label": "र",
"popup": {
"main": {
"label": "ऋ"
},
"relevant": [
{
"label": "ॠ"
},
{
"label": "ॄ"
},
{
"label": "ऱ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "थ"
},
"default": {
"label": "त",
"popup": {
"main": {
"label": "त्र"
}
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "य़"
},
"default": {
"label": "य",
"popup": {
"main": {
"label": "ॺ"
}
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ू"
},
"default": {
"label": "ु",
"popup": {
"main": {
"label": "उ"
},
"relevant": [
{
"label": "ऊ"
},
{
"label": "ॷ"
},
{
"code": 2390,
"label": " ॖ"
},
{
"label": "ॶ"
},
{
"code": 2391,
"label": " ॗ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ी"
},
"default": {
"label": "ि",
"popup": {
"main": {
"label": "इ"
},
"relevant": [
{
"label": "ई"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ौ"
},
"default": {
"label": "ो",
"popup": {
"main": {
"label": "ओ"
},
"relevant": [
{
"label": "औ"
},
{
"label": "ऑ"
},
{
"code": 2383,
"label": " ॏ"
},
{
"label": "ॵ"
},
{
"label": "ॐ"
},
{
"label": "ॉ"
},
{
"label": "ॳ"
},
{
"label": "ॴ"
},
{
"code": 2362,
"label": " ऺ"
},
{
"code": 2363,
"label": " ऻ"
},
{
"label": "ऒ"
},
{
"code": 2378,
"label": " ॊ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "फ़"
},
"default": {
"label": "प"
}
}
],
[
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "अ"
},
"default": {
"label": "ा",
"popup": {
"main": {
"label": "आ"
},
"relevant": [
{
"label": "ॅ"
},
{
"label": "ॲ"
},
{
"label": "ऄ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "श"
},
"default": {
"label": "स",
"popup": {
"main": {
"label": "श्र"
},
"relevant": [
{
"label": "ष"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ध"
},
"default": {
"label": "द",
"popup": {
"main": {
"label": "ड़"
},
"relevant": [
{
"label": "ॾ"
},
{
"label": "ढ़"
},
{
"label": "ॸ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"code": 2364,
"label": " ़"
},
"default": {
"label": "फ",
"popup": {
"main": {
"label": "फ़"
}
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "घ"
},
"default": {
"label": "ग",
"popup": {
"main": {
"label": "ग़"
},
"relevant": [
{
"label": "ॻ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": ""
},
"default": {
"label": "ह"
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "झ"
},
"default": {
"label": "ज",
"popup": {
"main": {
"label": "ज़"
},
"relevant": [
{
"label": "ॼ"
},
{
"label": "ॹ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ख"
},
"default": {
"label": "क",
"popup": {
"main": {
"label": "क़"
},
"relevant": [
{
"label": "ख़"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ळ"
},
"default": {
"label": "ल",
"popup": {
"relevant": [
{
"label": "ऴ"
},
{
"label": "ॣ"
},
{
"label": "ऌ"
},
{
"label": "ॡ"
},
{
"label": "ॢ"
}
]
}
}
}
],
[
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ज़",
"labelFlags": 128
},
"default": {
"label": "ज्ञ",
"labelFlags": 128
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ष"
},
"default": {
"label": "क्ष",
"labelFlags": 128
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "छ"
},
"default": {
"label": "च",
"popup": {
"relevant": [
{
"$": "auto_text_key",
"code": 2385,
"label": " ॑"
},
{
"$": "auto_text_key",
"code": 2386,
"label": " ॒"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "्"
},
"default": {
"label": "व",
"popup": {
"relevant": [
{
"$": "auto_text_key",
"code": 2387,
"label": " ॓"
},
{
"$": "auto_text_key",
"code": 2388,
"label": " ॔"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "भ"
},
"default": {
"label": "ब",
"popup": {
"relevant": [
{
"label": "ॿ"
},
{
"label": "ऽ"
},
{
"label": "॰"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ण"
},
"default": {
"label": "न",
"popup": {
"main": {
"label": "ङ"
},
"relevant": [
{
"label": "ऩ"
},
{
"label": "ञ"
}
]
}
}
},
{
"$": "shift_state_selector",
"manualOrLocked": {
"label": "ं"
},
"default": {
"label": "म",
"popup": {
"main": {
"label": "ँ"
},
"relevant": [
{
"label": "ऀ"
}
]
}
}
}
]
]

View file

@ -0,0 +1,28 @@
ṅ q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
ọ x
c
ụ v
b
n ₦
m

View file

@ -0,0 +1,28 @@
ĩ q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
ũ x
c
v
b
n
m

View file

@ -0,0 +1,28 @@
q
w
ɛ e
r
t
y
u
i
ɔ o
p
a
s
d
f
g
h
j
k
l
z
x
c
̌ v
b
n
m

View file

@ -0,0 +1,29 @@
q
w
e
r
t
y
u
i
o
p
ŋ
a
s
d
f
g
h
j
k
l
z
x
c
v
b
n
m

View file

@ -8,7 +8,7 @@
ш ш
щ щ
з з
х х ъ [ {
ф ф
ы ы
@ -20,7 +20,7 @@
л л
д д
ж ж
э э э́ ] }
я я
ч ч

View file

@ -0,0 +1,34 @@
й
ц
у
к
е
н
г
ш
щ
з
х [ {
ъ ] }
ф
ы
в
а
п
р
о
л
д
ж
э э́
я
ч
с
м
и
т
ь
б <
ю >

View file

@ -0,0 +1,28 @@
q
w
e
r
t
y
u
i
o
p
a
š s
d
f
g
h
j
k
l
z
x
c
v
b
n
m

View file

@ -8,7 +8,8 @@
ш ш
щ щ
з з
х х [ {
ї ] }
ф ф
і і
@ -20,7 +21,7 @@
л л
д д
ж ж
є є ' "
я я
ч ч
@ -30,4 +31,4 @@
т т
ь ь
б < б <
ю > ю > ґ

View file

@ -0,0 +1,35 @@
й
ц
у
к
е
н
г
ш
щ
з
х [ {
ї ] }
ф
і
в
а
п
р
о
л
д
ж
є ' "
' "
я
ч
с
м
и
т
ь
б <
ю > ґ

View file

@ -0,0 +1,28 @@
ẹ q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
ọ x
c
ṣ v
b
n ₦
m

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