Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
192 commits
Select commit Hold shift + click to select a range
be0c84f
chore(common): use new namespace km_vk for constants(2.)
SabineSIL Jul 15, 2025
b4d76dc
chore(common): use new namespace km_vk in charToKeyConversion and mac…
SabineSIL Jul 15, 2025
0a43883
chore(common): use new namespace km_vk in linux/mcompile/keymap/keymap.h
SabineSIL Jul 15, 2025
49d5270
chore(common): use new namespace km_vk in kmx_processevent.cpp, Compi…
SabineSIL Jul 16, 2025
a1465c0
chore(common): missing semicolon in savekeyboard.cpp
SabineSIL Jul 16, 2025
ed8e248
chore(common): remove VK_DECIMAL from keyman_vkey.h
SabineSIL Jul 16, 2025
9a8e052
chore(common): use new namespace km_vk in imsample.cpp
SabineSIL Jul 16, 2025
e2ed502
chore(common): use new namespace km_vk in kmdecomp
SabineSIL Jul 17, 2025
a0a3305
chore(common): include new file in kmdecomp/pch.h
SabineSIL Jul 17, 2025
c04ef63
chore(common): undo changes for kmdecomp
SabineSIL Jul 17, 2025
4c40421
Merge branch 'chore/developer/scatteredCode/cleanup_VKeys' of https:/…
SabineSIL Jul 17, 2025
eb2045b
chore(common): merge branch undo
SabineSIL Jul 17, 2025
50204ab
chore(common): disable VK_DECIMAL again in keyman_vkeys.h
SabineSIL Jul 17, 2025
b1575b4
testing message
memaynor Mar 16, 2026
b0399d3
90% of Dark Mode
kongchanlina Mar 16, 2026
6f31744
updated-right-panel-to-origin-without-merging
Mengchou97 Mar 16, 2026
776b565
change section title
Mengchou97 Mar 16, 2026
cdc4c0b
changed splash_screen logo
kongchanlina Mar 23, 2026
bb8b8f0
Merge branch 'side-panel-prod' of https://github.com/memaynor/keyman …
kongchanlina Mar 23, 2026
92c795c
dark-mode-on-side-panel
kongchanlina Mar 23, 2026
dc70f68
fixed the conflict sidebr button
Mengchou97 Mar 23, 2026
5f377c7
added subtitle
Mengchou97 Mar 25, 2026
7b0ec6e
updated sidebar with pr
Mengchou97 Mar 25, 2026
9f7d1b1
fixed sidebar layout and remove redundant code
Mengchou97 Mar 29, 2026
25617f8
added the floating button for toolbar and final touches on icon in th…
Mengchou97 Mar 30, 2026
52290ae
fixed the button close function
Mengchou97 Mar 30, 2026
244cec4
adjusted the width of the sidebar to always wrap-content at 80% of th…
Mengchou97 Mar 30, 2026
e373dbd
Splash Screen's Appearance Mode
kongchanlina Apr 1, 2026
25b90dd
Merge remote-tracking branch 'origin/side-panel-prod' into dark-mode-…
kongchanlina Apr 3, 2026
717889a
dark-mode-on-new-updated-ui
kongchanlina Apr 3, 2026
66a01ca
nothing
seanvisal69-ux Apr 6, 2026
d4af11d
nothing
seanvisal69-ux Apr 6, 2026
c67f319
fixing status bar color
kongchanlina Apr 6, 2026
409b9b0
fixing status bar
kongchanlina Apr 6, 2026
86caca9
fixing status bar
seanvisal69-ux Apr 6, 2026
5335625
minor adjustment to the string and the name of the side panel
Mengchou97 Apr 6, 2026
45590e5
updated the set keyman as default option function
Mengchou97 Apr 7, 2026
a447e18
finally finished the set keyman as default keyboard
Mengchou97 Apr 7, 2026
97fad55
updated the update keyboard function
Mengchou97 Apr 7, 2026
2834c12
Merge branch 'keymanapp:master' into main
memaynor Apr 8, 2026
bf5164d
Update README.md
memaynor Apr 8, 2026
d4b86bf
merge from main
Mengchou97 Apr 8, 2026
e281b9a
updated string for osk
Mengchou97 Apr 8, 2026
3c11eae
chore: restore files
mcdurdin Apr 13, 2026
1c175f0
chore(android): uncomment main_text_color
mcdurdin Apr 13, 2026
fe8861d
fixed the pull request problem
Mengchou97 Apr 20, 2026
d3a76b8
replace icon
Mengchou97 Apr 20, 2026
32b383f
updated icons for side panel and titlebar
Mengchou97 Apr 20, 2026
4d48850
completed adding separator to side-panel using group
Mengchou97 Apr 22, 2026
5f8c38e
updated the hamburger icon in the titlebar to switch between theme
Mengchou97 Apr 22, 2026
a3781a8
Update dark mode handling for Chrome WebView layout
minanlynna-code Apr 23, 2026
9489cf1
updated the font color once in dark mode
Mengchou97 Apr 24, 2026
a65fef6
updated the repeated keyboard option
Mengchou97 May 12, 2026
3a817e9
refactor MainActivity and clean up outdated review comments
Mengchou97 May 12, 2026
a2016ce
following PR suggestion on whitespace changes and revert
Mengchou97 Jun 6, 2026
5fc545b
Add navigation drawer with settings, theme switcher, keyboard toolbar…
Mengchou97 Jun 6, 2026
2c6f211
error, so change back
Mengchou97 Jun 6, 2026
00e0967
updated Keyman standard header and added comment to the onWindowFocus…
Mengchou97 Jun 10, 2026
ecccaa0
replace SystemKeyboard.java with the one from master
Mengchou97 Jun 10, 2026
8142776
replace SystemKeyboard.java with the one from master but updated the …
Mengchou97 Jun 10, 2026
2c7a61d
addressing the issues with keymansettingfragments
Mengchou97 Jun 10, 2026
ecd3f65
added the cmt back
Mengchou97 Jun 10, 2026
9b930ea
removed unused codes
Mengchou97 Jun 10, 2026
2b800fa
removed whitespaces problems
Mengchou97 Jun 10, 2026
536b5b5
fixed more whitespace problems
Mengchou97 Jun 10, 2026
2f1f62a
fixed whitespace problems fragment_select_language
Mengchou97 Jun 10, 2026
2b54302
reverted the ic_action_timelapse
Mengchou97 Jun 10, 2026
d1e7839
reverted the splashscreenactivity
Mengchou97 Jun 10, 2026
9dfc7b0
added the standard header
Mengchou97 Jun 11, 2026
0df8861
chore(deps-dev): bump esbuild from 0.25.0 to 0.28.1
dependabot[bot] Jun 14, 2026
a9933ab
feat(windows): add network connectivity tool
rc-swag Jun 16, 2026
cc8b4d2
Merge branch 'master' into feat/windows/13566/check-metered-connection
rc-swag Jun 16, 2026
94756fd
feat(windows): add intstall ready flag to pop up
rc-swag Jun 17, 2026
e92f01a
Merge branch 'master' into feat/windows/13566/check-metered-connection
rc-swag Jun 22, 2026
293f8ec
feat(windows): apply suggestions from code review
rc-swag Jun 23, 2026
5e26d5d
feat(windows): address review comments
rc-swag Jun 23, 2026
9813318
removed whitespaces problems
Mengchou97 Jun 24, 2026
8aa1d26
added one whitespace back to be exactly the same as master
Mengchou97 Jun 24, 2026
82d5580
fixed whitespace problems
Mengchou97 Jun 24, 2026
cc41925
Apply suggestions from code review
Meng-Heng Jun 24, 2026
89b8cde
Apply suggestions from code review
Meng-Heng Jun 24, 2026
9d42a5f
remove whitespace on line 8
Mengchou97 Jun 24, 2026
bd693b8
restored master file
Mengchou97 Jun 24, 2026
aa71ee0
Merge branch 'master' into feat/dark-mode-and-settings
Mengchou97 Jun 24, 2026
3974f03
feat(windows): use enum to drive installfrm layout
rc-swag Jun 25, 2026
85da9dc
feat(windows): apply suggestions
rc-swag Jun 25, 2026
448d63e
feat(windows): apply exception check
rc-swag Jun 25, 2026
0bd7bf1
feat(windows): apply suggestions from code review
rc-swag Jun 30, 2026
6009473
feat(windows): wrap network util in class
rc-swag Jun 30, 2026
0e5c94c
chore(common): add JPathOrMatcher for use of fast-xml-parser 5.8
SabineSIL Jul 2, 2026
9ca40fa
Merge branch 'master' into chore/developer/scatteredCode/cleanup_VKeys
SabineSIL Jul 2, 2026
5ab4b10
chore(common): dummy change
SabineSIL Jul 2, 2026
490eb93
chore(common): change path for #include /keymanversion.h
SabineSIL Jul 2, 2026
a19e452
chore(common): change use of #includes
SabineSIL Jul 2, 2026
62d7f79
chore(common): rename and use keyman_vkey.h-> km_vkey.h
SabineSIL Jul 2, 2026
68fa9b9
chore(common): rename namespace km_vk to vkey and use under km (km::v…
SabineSIL Jul 2, 2026
b780ecc
chore(common): edit value of VK_DECIMAL
SabineSIL Jul 2, 2026
a8f509d
chore(common): include kmx_processevent.h
SabineSIL Jul 2, 2026
1d61654
chore(common): include kmx_processevent.h from core
SabineSIL Jul 2, 2026
7d621a8
chore(common): include km_vkey.h from common
SabineSIL Jul 2, 2026
3be3aa2
Merge branch 'master' into feat/dark-mode-and-settings
mcdurdin Jul 2, 2026
c38fa4e
chore(common): include km_vkey.h from common
SabineSIL Jul 2, 2026
4d229d1
Merge branch 'chore/developer/scatteredCode/cleanup_VKeys' of https:/…
SabineSIL Jul 2, 2026
5bfff67
Merge branch 'master' into chore/developer/scatteredCode/cleanup_VKeys
SabineSIL Jul 2, 2026
106d3eb
chore(android): move v23 styles into v23 resource file
mcdurdin Jul 2, 2026
953f687
chore(common): comment for VK_DECIMAL, remove VK__MAX; use windows.h …
SabineSIL Jul 2, 2026
bec7203
ondrawerclosed sidebar scroll back to top
Mengchou97 Jul 4, 2026
176df82
removed the active keyboard helper in the bottom section as recommended
Mengchou97 Jul 4, 2026
8e55aec
change the keybaord_banner to dark in dark mode
Mengchou97 Jul 4, 2026
812fca0
resolve the update option from always appearing
Mengchou97 Jul 8, 2026
681fb12
resolved the logo overlayed in arabic language
Mengchou97 Jul 8, 2026
0f5b0e6
resolved the navigation bar layover keyboard problem
Mengchou97 Jul 8, 2026
c243cea
docs(android): update keyboardharness readme
mcdurdin Jul 10, 2026
65b9316
updated sidebar - removed checkboxes options
Mengchou97 Jul 12, 2026
62c85e3
fix(windows): add required download case
rc-swag Jul 13, 2026
c32f731
fix(windows): need restart only case manual update
rc-swag Jul 14, 2026
ffd45e1
fix(windows): fix caution image allignment metered
rc-swag Jul 14, 2026
c9b11c0
chore(android): patch enable_system_keyboard string
mcdurdin Jul 14, 2026
f75a913
chore: Merge branch 'master' into feat/dark-mode-and-settings
mcdurdin Jul 14, 2026
d9717d6
updated sidebar title and move button and add a get started action bu…
Mengchou97 Jul 15, 2026
f027c29
feat(windows): send errors to sentry
rc-swag Jul 16, 2026
fd3610b
Merge branch 'master' into feat/windows/13566/check-metered-connection
rc-swag Jul 27, 2026
363f71e
refactor(web): improve naming of `_SetTargetDir` function
ermshiperete Jul 31, 2026
7f1f344
Merge branch 'chore/developer/scatteredCode/cleanup_VKeys' of https:/…
SabineSIL Aug 7, 2026
9854206
chore(common): use shorter input paths for km_vkey.h and #include als…
SabineSIL Aug 7, 2026
540f8c5
Merge branch 'master' into chore/developer/scatteredCode/cleanup_VKeys
SabineSIL Aug 7, 2026
dde35c8
chore(common): undo last changes
SabineSIL Aug 7, 2026
22a04c1
Merge branch 'chore/developer/scatteredCode/cleanup_VKeys' of https:/…
SabineSIL Aug 7, 2026
dfb274a
chore(common): use shorter input paths
SabineSIL Aug 7, 2026
e69204c
chore(common): use shorter input paths
SabineSIL Aug 7, 2026
f4c8bca
Merge branch 'chore/developer/scatteredCode/cleanup_VKeys' of https:/…
SabineSIL Aug 7, 2026
279820b
chore(common): include km_vkey.h
SabineSIL Aug 7, 2026
0b7af5b
chore(common): include km_vkey.h
SabineSIL Aug 7, 2026
1e09783
Merge branch 'chore/developer/scatteredCode/cleanup_VKeys' of https:/…
SabineSIL Aug 7, 2026
97a2e81
chore(common): use km_vkey.h on mac
SabineSIL Aug 7, 2026
cbe5d40
chore(common): undo use km_vkey.h on mac
SabineSIL Aug 7, 2026
e772775
Merge pull request #16311 from keymanapp/refactor/web/setTargetDir
ermshiperete Aug 10, 2026
5891506
docs(web): add language identifier to the code blocks of event docs
ermshiperete Aug 10, 2026
1aaba2e
Merge pull request #16333 from keymanapp/docs/web/eventdocs
ermshiperete Aug 10, 2026
bbf0eae
auto: increment master version to 19.0.264
keyman-server Aug 10, 2026
ca269ce
Merge pull request #16338 from keymanapp/auto/version-master-19.0.264
keyman-server Aug 10, 2026
5e200ca
Merge pull request #16220 from keymanapp/docs/android/keyboardharness…
mcdurdin Aug 11, 2026
5be5eb4
fix(core): unit test action_que insert terminated
rc-swag Aug 11, 2026
16e6a56
fix(core): make coherence check a debug assert
rc-swag Aug 11, 2026
f8be03c
fix(core): fix typo plus temp remove null check
rc-swag Aug 11, 2026
8b0f6d3
fix(core): add null check
rc-swag Aug 11, 2026
f223307
chore(core): Merge branch 'fix/core/16341/unit-test-action-que-termin…
rc-swag Aug 11, 2026
a2bf976
chore(common): remove commented old #defines; in some files remove pa…
SabineSIL Aug 11, 2026
10aceea
Merge branch 'master' into chore/developer/scatteredCode/cleanup_VKeys
SabineSIL Aug 11, 2026
4e4e37e
chore(common): add VK_DELETE to km_vkey.h
SabineSIL Aug 11, 2026
b1f05b5
Merge branch 'chore/developer/scatteredCode/cleanup_VKeys' of https:/…
SabineSIL Aug 11, 2026
4522e08
fix(core): fix indenting in state_api_tests
rc-swag Aug 11, 2026
176d031
Merge pull request #15827 from memaynor/feat/dark-mode-and-settings
mcdurdin Aug 11, 2026
f1acc9b
auto: increment master version to 19.0.265
keyman-server Aug 11, 2026
873a460
Merge pull request #16348 from keymanapp/auto/version-master-19.0.265
keyman-server Aug 11, 2026
e5312b0
Merge pull request #16343 from keymanapp/fix/core/16340/action-clone-…
rc-swag Aug 11, 2026
7e885e0
Merge pull request #16342 from keymanapp/fix/core/16341/unit-test-act…
rc-swag Aug 11, 2026
159a46b
Merge pull request #16099 from keymanapp/feat/windows/13566/check-met…
rc-swag Aug 11, 2026
a621106
chore(common): remove namespace km::vkey
SabineSIL Aug 12, 2026
450e23a
Merge branch 'master' into chore/developer/scatteredCode/cleanup_VKeys
SabineSIL Aug 12, 2026
f1361a9
feat(web): add `keyman.versionInfo` API
mcdurdin Aug 12, 2026
b40c4b3
fix(web): cleanup `loaduserinterface` and `unloaduserinterface` events
mcdurdin Aug 12, 2026
1f82507
docs(web): deprecate unused and obsolete API endpoints and docs cleanup
mcdurdin Aug 12, 2026
e224973
chore(common): Update Crowdin strings for Spanish (Latin America)
darcywong00 Aug 12, 2026
d397feb
auto: increment master version to 19.0.266
keyman-server Aug 12, 2026
740ec33
Merge pull request #16357 from keymanapp/auto/version-master-19.0.266
keyman-server Aug 12, 2026
e285b5a
chore(android): Update crowdin strings for Spanish - Latin America
darcywong00 Aug 12, 2026
190cde8
chore(ios): Update crowdin for Spanish - Latin America
darcywong00 Aug 12, 2026
0624bc9
Merge pull request #16095 from keymanapp/dependabot/npm_and_yarn/esbu…
mcdurdin Aug 13, 2026
512481c
Merge pull request #16354 from keymanapp/docs/web/cleanup
mcdurdin Aug 13, 2026
6c3b68c
Merge pull request #16353 from keymanapp/fix/web/loaduserinterface-ap…
mcdurdin Aug 13, 2026
85d7b39
chore(web): add test for versionInfo.full
mcdurdin Aug 13, 2026
b75f0ee
Merge pull request #16351 from keymanapp/feat/web/versionInfo
mcdurdin Aug 13, 2026
2e7772b
fix(windows): release shift key on OSK when user releases physical ri…
mcdurdin Aug 13, 2026
7517531
chore(common): remove stray keylayout file
SabineSIL Aug 13, 2026
c34de18
Merge branch 'chore/developer/scatteredCode/cleanup_VKeys' of https:/…
SabineSIL Aug 13, 2026
1f29802
Merge branch 'master' into chore/developer/scatteredCode/cleanup_VKeys
SabineSIL Aug 13, 2026
5f10226
Merge pull request #14360 from keymanapp/chore/developer/scatteredCod…
SabineSIL Aug 13, 2026
2c5157b
chore(windows): remove junk files from kmshell
mcdurdin Aug 13, 2026
57ff337
auto: increment master version to 19.0.267
keyman-server Aug 13, 2026
2277196
Merge pull request #16366 from keymanapp/auto/version-master-19.0.267
keyman-server Aug 13, 2026
bc497a5
fix(web): adjust sourcemap linking pattern used for error reporting w…
jahorton Aug 13, 2026
fecb3b9
chore(common): add missing history
mcdurdin Aug 14, 2026
16559f9
docs(windows): update comment for TfrmOSKOnScreenKeyboard.OskModifier…
mcdurdin Aug 14, 2026
3742e0c
Merge pull request #16369 from keymanapp/chore/common/history
mcdurdin Aug 14, 2026
9526eb7
Merge pull request #16365 from keymanapp/chore/windows/remove-junk-files
mcdurdin Aug 14, 2026
9f8717e
Merge pull request #16361 from keymanapp/fix/windows/12611-release-sh…
mcdurdin Aug 14, 2026
15eeca0
Merge pull request #16368 from keymanapp/fix/web/mobile-app-sourcemap…
jahorton Aug 14, 2026
669afb2
Merge pull request #16358 from keymanapp/chore/crowdin-es
darcywong00 Aug 14, 2026
f55218f
chore: Merge remote-tracking branch 'origin/epic/web-core' into auto/…
mcdurdin Aug 14, 2026
a650ca4
Merge pull request #16382 from keymanapp/auto/A19S35-merge-base-into-…
mcdurdin Aug 18, 2026
e0928d0
Merge branch 'epic/kmc-test' into auto/A19S36-merge-base-into-kmc-test
keyman-server Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,30 @@
# Keyman Version History

## 19.0.266 alpha 2026-08-13

* chore(deps-dev): bump esbuild from 0.25.0 to 0.28.1 (#16095)
* feat(web): add `keyman.versionInfo` API (#16351)
* fix(web): cleanup `loaduserinterface` and `unloaduserinterface` events (#16353)
* docs(web): deprecate unused and obsolete API endpoints and docs cleanup (#16354)
* chore(common): cleanup and merge Preprocessor constants (#14360)

## 19.0.265 alpha 2026-08-12

* fix(core): make coherence check a debug assert (#16343)
* feat(windows): honour Windows "metered connection" flag for downloading updates (#16099)

## 19.0.264 alpha 2026-08-11

* docs(android): update keyboardharness readme (#16220)
* feat(android): design improvement for settings, add dark mode and tool menu (#15827)

## 19.0.263 alpha 2026-08-10

* chore(deps): bump tar from 7.5.11 to 7.5.22 in /developer/src/server/src/win32/trayicon/addon-src (#16282)
* chore(deps): bump brace-expansion from 5.0.6 to 5.0.9 in /developer/src/server/src/win32/trayicon/addon-src (#16295)
* refactor(web): improve naming of `_SetTargetDir` function (#16311)
* docs(web): add language identifier to the code blocks of event docs (#16333)

## 19.0.262 alpha 2026-08-04

* chore(web): fire `keyboardloaded` event only once per keyboard (#16297)
Expand Down
2 changes: 1 addition & 1 deletion VERSION.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
19.0.263
19.0.267
23 changes: 9 additions & 14 deletions android/KMAPro/kMAPro/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,22 @@
https://support.google.com/googleplay/android-developer/answer/9214102#
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> -->
<application
android:name=".KeymanApplication"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:theme="@style/AppTheme"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:resizeableActivity="false"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme"
android:supportsRtl="true">
android:supportsRtl="true"
>
<receiver android:name=".NetworkStateReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>

<!-- see the events from this app in sentry.keyman.com dashboard -->
<meta-data
android:name="io.sentry.dsn" android:value="https://2f067e5571a74974b9e210ca76ca9607@o1005580.ingest.sentry.io/5983520" />
Expand Down Expand Up @@ -65,7 +66,7 @@
android:exported="true"
android:label="@string/app_name"
android:resizeableActivity="false"
android:theme="@style/AppTheme.BrandedLaunch">
android:theme="@style/Theme.App.Starting">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down Expand Up @@ -241,23 +242,17 @@
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize"
android:label="@string/app_name"
android:launchMode="singleTask"
android:theme="@style/AppTheme.Light.Dialog"/>
<activity
android:name=".KeymanSettingsActivity"
android:label="@string/keyman_settings"
android:parentActivityName=".MainActivity"
android:launchMode="singleTask"
android:theme="@style/AppTheme.Base" />
android:theme="@style/AppTheme.Dialog"/>
<activity
android:name=".KeymanSettingsInstallActivity"
android:label="@string/app_name"
android:parentActivityName=".KeymanSettingsActivity"
android:parentActivityName=".MainActivity"
android:launchMode="singleTask"
android:theme="@style/AppTheme.Base" />
<activity
android:name=".KeymanSettingsLocalizeActivity"
android:label="@string/app_name"
android:parentActivityName=".KeymanSettingsActivity"
android:parentActivityName=".MainActivity"
android:launchMode="singleTask"
android:theme="@style/AppTheme.Base" />
<activity
Expand All @@ -275,7 +270,7 @@
android:name=".KeyboardSettingsActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize"
android:label="@string/app_name"
android:theme="@style/AppTheme.Light.Dialog" />
android:theme="@style/AppTheme.Dialog" />
<activity
android:name=".SelectPackageActivity"
android:label="@string/app_name"
Expand Down
14 changes: 12 additions & 2 deletions android/KMAPro/kMAPro/src/main/assets/banner.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
<!-- Custom banner theme -->
<div style="background: white; width: 100%; height: 100%; position: absolute; left: 0; top: 0; display: flex">
<style>
.keyman-banner { background: white; }
.keyman-banner.dark { background: #1e1e1e; }

.keyman-banner .logo-dark { display: none; }
.keyman-banner.dark .logo-light { display: none; }
.keyman-banner.dark .logo-dark { display: block; }
</style>

<div class="keyman-banner" style="width: 100%; height: 100%; position: absolute; left: 0; top: 0; display: flex">

<!-- svg path is relative to assets/ folder -->
<img src="banner/keyman_banner.svg" style="height:60%; background: white; display: block; margin: auto 2%;">
<img class="logo-light" src="banner/keyman_banner.svg" style="height:60%; margin: auto 2%;">
<img class="logo-dark" src="banner/keyman_banner_dark.png" style="height:60%; margin: auto 2%;">

<!-- Tri-color line -->
<div style='height: 7%; left: 0; position: absolute; bottom: 0; width: 56%; background: #F68924'></div>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class BannerController {
public static final String KM_BANNER_DIR = "banner";
public static final String KM_BANNER_THEME_KEYMAN = "banner.html";

public static void setHTMLBanner(Context context, KMManager.KeyboardType keyboardType) {
public static void setHTMLBanner(Context context, KMManager.KeyboardType keyboardType, boolean isDarkMode) {
if (keyboardType == KMManager.KeyboardType.KEYBOARD_TYPE_UNDEFINED) {
return;
}
Expand All @@ -22,6 +22,9 @@ public static void setHTMLBanner(Context context, KMManager.KeyboardType keyboar

// Always use Keyman banner theme
String contents = FileUtils.readContents(context, KM_BANNER_THEME_KEYMAN);
if (isDarkMode) {
contents = contents.replace("class=\"keyman-banner\"", "class=\"keyman-banner dark\"");
}
KMManager.setHTMLBanner(keyboardType, contents);
KMManager.setBanner(keyboardType, KMManager.BannerType.HTML);
KMManager.showBanner(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import com.keyman.engine.util.DownloadFileUtils;
import com.tavultesoft.kmapro.BuildConfig;
import com.tavultesoft.kmapro.DefaultLanguageResource;
import com.tavultesoft.kmapro.KeymanSettingsActivity;
import com.tavultesoft.kmapro.KeymanSettingsKeys;
import com.tavultesoft.kmapro.PreferencesManager;
import com.keyman.engine.KMManager;
import com.keyman.engine.KMManager.KeyboardType;
Expand Down Expand Up @@ -76,13 +76,13 @@ public void onCreate() {
KMManager.setInputMethodService(this); // for HW interface

SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE);
KMManager.SpacebarText spacebarText = KMManager.SpacebarText.fromString(prefs.getString(KeymanSettingsActivity.spacebarTextKey, KMManager.SpacebarText.LANGUAGE_KEYBOARD.toString()));
KMManager.SpacebarText spacebarText = KMManager.SpacebarText.fromString(prefs.getString(KeymanSettingsKeys.SPACEBAR_TEXT, KMManager.SpacebarText.LANGUAGE_KEYBOARD.toString()));
KMManager.setSpacebarText(spacebarText);

// Set the system keyboard HTML banner
BannerController.setHTMLBanner(this, KeyboardType.KEYBOARD_TYPE_SYSTEM);
BannerController.setHTMLBanner(this, KeyboardType.KEYBOARD_TYPE_SYSTEM, isDarkMode());

boolean mayHaveHapticFeedback = prefs.getBoolean(KeymanSettingsActivity.hapticFeedbackKey, false);
boolean mayHaveHapticFeedback = prefs.getBoolean(KeymanSettingsKeys.HAPTIC_FEEDBACK, false);
KMManager.setHapticFeedback(mayHaveHapticFeedback);

// Checking for updates should never be allowed to crash the keyboard.
Expand Down Expand Up @@ -176,7 +176,7 @@ public void onStartInput(EditorInfo attribute, boolean restarting) {
if (KMManager.getPredictionsSuspended(KeyboardType.KEYBOARD_TYPE_SYSTEM)) {
KMManager.setBannerOptions(false);
// Set the system keyboard HTML banner
BannerController.setHTMLBanner(this, KeyboardType.KEYBOARD_TYPE_SYSTEM);
BannerController.setHTMLBanner(this, KeyboardType.KEYBOARD_TYPE_SYSTEM, isDarkMode());
} else if (KMManager.isKeyboardLoaded(KeyboardType.KEYBOARD_TYPE_SYSTEM)){
// Check if predictions needs to be re-enabled per Settings preference
Keyboard kbInfo = KMManager.getCurrentKeyboardInfo(appContext);
Expand Down Expand Up @@ -282,15 +282,15 @@ public void onKeyboardLoaded(KeyboardType keyboardType) {
@Override
public void onKeyboardChanged(String newKeyboard) {
// Refresh banner theme
BannerController.setHTMLBanner(this, KeyboardType.KEYBOARD_TYPE_SYSTEM);
BannerController.setHTMLBanner(this, KeyboardType.KEYBOARD_TYPE_SYSTEM, isDarkMode());
KMManager.showSystemKeyboard();
sendCurrentFontName();
}

@Override
public void onKeyboardShown() {
// Refresh banner theme
BannerController.setHTMLBanner(this, KeyboardType.KEYBOARD_TYPE_SYSTEM);
BannerController.setHTMLBanner(this, KeyboardType.KEYBOARD_TYPE_SYSTEM, isDarkMode());
}

@Override
Expand All @@ -309,7 +309,7 @@ public boolean onEvaluateInputViewShown() {

Context context = getApplicationContext();
SharedPreferences prefs = context.getSharedPreferences(PreferencesManager.kma_prefs_name, Context.MODE_PRIVATE);
boolean showOSK = prefs.getBoolean(KeymanSettingsActivity.oskWithPhysicalKeyboardKey, false);
boolean showOSK = prefs.getBoolean(KeymanSettingsKeys.OSK_WITH_PHYSICAL_KEYBOARD, false);
return showOSK;
}

Expand Down Expand Up @@ -349,4 +349,8 @@ public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
return interpreter.onKeyLongPress(keyCode, event);
}
private boolean isDarkMode() {
return (getResources().getConfiguration().uiMode &
Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@
import android.provider.Settings;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.InputMethodInfo;

import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageButton;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
Expand All @@ -36,14 +36,25 @@ public class GetStartedActivity extends BaseActivity {
private static ArrayList<HashMap<String, String>> list = null;
private static KMListAdapter listAdapter = null;
protected static final String showGetStartedKey = "ShowGetStarted";
public static final String openDefaultKeyboardPickerOnlyKey = "OpenDefaultKeyboardPickerOnly";
private final String iconKey = "icon";
private final String textKey = "text";
private final String isEnabledKey = "isEnabled";
private boolean openDefaultKeyboardPickerOnly = false;
private boolean didAutoOpenDefaultKeyboardPicker = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
openDefaultKeyboardPickerOnly = getIntent().getBooleanExtra(openDefaultKeyboardPickerOnlyKey, false);

if (openDefaultKeyboardPickerOnly) {
// Picker-only mode: intentionally skip rendering Get Started UI.
KMManager.dontCloseParentAppOnShowKeyboardPicker();
return;
}

final Context context = this;
setContentView(R.layout.get_started_list_layout);

Expand Down Expand Up @@ -161,20 +172,40 @@ protected void onResume() {
super.onResume();
}

@Override
protected void onPause() {
super.onPause();
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
if (openDefaultKeyboardPickerOnly) {

// When the user taps 'Set Default Keyboard' from the drawer,
// GetStartedActivity is launched in picker-only mode. But you
// can't open the system keyboard picker directly from a menu
// tap — it requires a window with focus. So we use
// onWindowFocusChanged as the trigger point: first focus opens
// the picker, and when the user dismisses it and focus returns
// to this activity, we call finish() to close it. The activity
// is essentially just a invisible bridge to show the system
// picker.

if (!didAutoOpenDefaultKeyboardPicker) {
didAutoOpenDefaultKeyboardPicker = true;
InputMethodManager imManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imManager != null) {
imManager.showInputMethodPicker();
}
} else {
// Focus returned after the picker was dismissed, so close the host activity.
finish();
}
return;
}

// Enumerated steps are replaced with checkboxes when the user completes a step
String one = String.valueOf(R.drawable.ic_looks_one);
String two = String.valueOf(R.drawable.ic_looks_two);
String three = String.valueOf(R.drawable.ic_looks_three);
String checkbox_on = String.valueOf(android.R.drawable.checkbox_on_background);
String checkbox_on = String.valueOf(R.drawable.ic_checkbox);
String info = String.valueOf(R.drawable.ic_info_outline);

List<Keyboard> kbList = KMManager.getKeyboardsList(this);
Expand Down Expand Up @@ -208,4 +239,12 @@ public void onWindowFocusChanged(boolean hasFocus) {
uncheckGetStartedIfComplete();
}
}

@Override
protected void onPause() {
super.onPause();
if (openDefaultKeyboardPickerOnly && didAutoOpenDefaultKeyboardPicker) {
finish();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ protected void onCreate(Bundle savedInstanceState) {
}

setupEdgeToEdge(R.id.kmp_browser_layout);
setupStatusBarColors(R.color.complementary_5, android.R.color.white);
setupStatusBarColors(R.color.keyman_blue, android.R.color.white);

webView = (WebView) findViewById(R.id.kmpBrowserWebView);
webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public void onCreate(Bundle savedInstanceState) {
// Display notification to download update if available
if (kbd.hasUpdateAvailable()) {
hashMap.put(subtitleKey, context.getString(R.string.update_available, kbVersion));
icon = String.valueOf(R.drawable.ic_cloud_download);
icon = String.valueOf(R.drawable.ic_cloud_download_mode);
}
hashMap.put(iconKey, icon);
infoList.add(hashMap);
Expand All @@ -105,7 +105,7 @@ public void onCreate(Bundle savedInstanceState) {
hashMap = new HashMap<>();
final String customHelpLink = kbd.getHelpLink();
// Check if app declared FileProvider
icon = String.valueOf(R.drawable.ic_action_forward);
icon = String.valueOf(R.drawable.ic_action_forward_mode);
// Don't show help link arrow if File Provider unavailable, or custom help doesn't exist
if ( (customHelpLink != null && !FileProviderUtils.exists(context)) ||
(customHelpLink == null && !packageID.equals(KMManager.KMDefault_UndefinedPackageID)) ) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Keyman is copyright (C) SIL Global. MIT License.
*
* Created by MengchouChey on 2026-06-10
* Internship Program, 9th Feb - 27th Apr 2026
*
* This file is the Application class for Keyman, which is used to set the default night mode based on user preferences when the application starts.
*
*/
package com.tavultesoft.kmapro;

import android.app.Application;
import android.content.SharedPreferences;

import androidx.appcompat.app.AppCompatDelegate;

public class KeymanApplication extends Application {
@Override
public void onCreate() {
SharedPreferences prefs = getSharedPreferences("settings", MODE_PRIVATE);
int mode = prefs.getInt("theme_mode", AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
AppCompatDelegate.setDefaultNightMode(mode);
super.onCreate();
}
}
Loading