Skip to content

feat(android): design improvement for settings, add dark mode and tool menu#15827

Open
Mengchou97 wants to merge 39 commits intokeymanapp:masterfrom
memaynor:feat/dark-mode-and-settings
Open

feat(android): design improvement for settings, add dark mode and tool menu#15827
Mengchou97 wants to merge 39 commits intokeymanapp:masterfrom
memaynor:feat/dark-mode-and-settings

Conversation

@Mengchou97
Copy link
Copy Markdown

@Mengchou97 Mengchou97 commented Apr 8, 2026

Team: @Mengchou97, @seyhachhorn-dev, @phyphy-svg, @kongchanlina, @seanvisal69-ux, and @minanlynna-code.

Test-bot: skip
Fixes: #12718

Updated:

  • Fix text layout and organize text structure, images, mention team members.

Side panel changes

  • change section title: the about section has been changed to help section
  • renamed keyman for android to user guide: resolved the confusing option name
  • added the update keyboards to help section
image
  • added current keyboard to Setup: Display the selected keyboard
image
  • added subtitles to side panel’s options
  • added the space bar caption back to side panel
  • remove the more setting option: everything from the setting had been moved out
  • changed haptic feedback to show “get started” on startup
  • renamed all side panel’s options to their original name
image
  • changed each option’s icon to be unique
image
  • adjusted the alignment of the right icons and added right arrows to some options
image

Dark mode changes

  • added an appearance mode option to side panel
  • Introduced an Appearance Mode Toggle in the side panel to allow users to switch between light, dark mode, or system default.
image
dm-2 dm-1
  • Splash Screen Update: Applied Light Keyman for improved visual consistency during app launch in dark mode.
  • Added support for dark mode styling across all components.
dm-3

Main page changes

  • added the floating toolbar button to the main interface
  • moved the share, text size, and trash to toolbar option
  • added animation to the floating button
image

Final looks

Light mode

image   image

Dark mode

image   image

@keymanapp-test-bot
Copy link
Copy Markdown

keymanapp-test-bot Bot commented Apr 8, 2026

User Test Results

Test specification and instructions

User tests are not required

@keymanapp-test-bot keymanapp-test-bot Bot added this to the A19S26 milestone Apr 8, 2026
@keyman-server
Copy link
Copy Markdown
Collaborator

This pull request is from an external repo and will not automatically be built. The build must still be passed before it can be merged. Ask one of the team members to make a manual build of this PR.

@keymanapp-test-bot keymanapp-test-bot Bot removed the user-test-missing User tests have not yet been defined for the PR label Apr 8, 2026
@Meng-Heng Meng-Heng changed the title Feat/dark mode and settings feat(android): design improvement for settings, add dark mode and tool menu Apr 8, 2026
@mcdurdin mcdurdin self-assigned this Apr 8, 2026
@mcdurdin
Copy link
Copy Markdown
Member

mcdurdin commented Apr 8, 2026

សូមអរគុណច្រើន! Thank you for your fantastic contribution! I look forward to reviewing this next week with our team and we will provide feedback and comments then.

@mcdurdin mcdurdin added the feat label Apr 8, 2026
Copy link
Copy Markdown
Member

@mcdurdin mcdurdin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for this very nice changeset.

I do have a lot of suggestions for the code, so please work through those suggestions -- some of them are applicable throughout, for example avoiding whitespace-only changes.

We have also completed a design review this morning, which is available in a Google Doc: https://docs.google.com/document/d/1ipuuyOGDDC62Wi4mhdkO1SO75vhQCkziybtvb7niAUg/edit?usp=sharing

🩷 Overall we are really happy with how this looks and the improvement to the Keyman user experience. Well done! 🩷

Please feel free to ask questions if anything is unclear!

Comment thread android/KMAPro/kMAPro/build.gradle Outdated
Comment on lines +187 to +188
implementation 'com.google.android.gms:play-services-maps3d:0.2.0'
//implementation 'com.google.android.gms:play-services-maps:19.0.0'
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this for? We shouldn't need this in Keyman

Suggested change
implementation 'com.google.android.gms:play-services-maps3d:0.2.0'
//implementation 'com.google.android.gms:play-services-maps:19.0.0'

Comment thread android/KMAPro/kMAPro/build.gradle Outdated
defaultConfig {
applicationId "com.tavultesoft.kmapro"
minSdkVersion 21
minSdkVersion 23
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We would prefer not to update the minSdkVersion. Is there a reason why it has changed?

https://support.google.com/googleplay/android-developer/answer/9214102#
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> -->
<application
android:name=".MyApp"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
android:name=".MyApp"

We're not sure why you've added this name? It's not the name of the app, so if you need it to link to "MyApp.java" we need to rename it to something appropriate.

Comment on lines +70 to +76
<!-- <activity-->
<!-- android:name=".SplashScreenActivity"-->
<!-- android:exported="true"-->
<!-- android:label="@string/app_name"-->
<!-- android:resizeableActivity="false"-->
<!-- android:theme="@style/AppTheme_BrandedLunch"-->
<!-- >-->
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<!-- <activity-->
<!-- android:name=".SplashScreenActivity"-->
<!-- android:exported="true"-->
<!-- android:label="@string/app_name"-->
<!-- android:resizeableActivity="false"-->
<!-- android:theme="@style/AppTheme_BrandedLunch"-->
<!-- >-->

android:label="@string/app_name"
android:resizeableActivity="false"
android:theme="@style/AppTheme.BrandedLaunch">
android:theme="@style/Theme.App.Starting">
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
android:theme="@style/Theme.App.Starting">
android:theme="@style/Theme.App.Starting">

keyboardToolbarContainer = findViewById(R.id.keyboardToolbarContainer);

if (keyboardToolbarToggleButton == null || keyboardToolbarContainer == null) {
return;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this ever happen? Do we need to report an error if this is happening?

An error guard like this is nice to have, but it can hide a more serious issue. So we need to decide if this needs to be reported as an error to Keyman team through Sentry.

keyboardToolbarToggleButton.setOnClickListener(v -> setKeyboardToolbarExpanded(!isKeyboardToolbarExpanded, true));

View shareButton = findViewById(R.id.keyboardToolbarShareButton);
if (shareButton != null) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to report an error if shareButton == null here (and same for other buttons)?

Comment on lines 949 to 952
private int dpToPx(int dp) {
float density = getResources().getDisplayMetrics().density;
return Math.round(dp * density);
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this really needed? Should we be working either exclusively in dp or exclusively in px? I see that it is used only in two places with integer constants in updateKeyboardToolbarPosition:

    int keyboardTopOffset = KMManager.getKeyboardHeight(this) + KMManager.getBannerHeight(this) + dpToPx(12);
    updateBottomMargin(keyboardToolbarToggleButton, keyboardTopOffset);
    updateBottomMargin(keyboardToolbarContainer, dpToPx(8));

});

dialogBuilder.show();
// dialogBuilder.show(); no dialog
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// dialogBuilder.show(); no dialog

Comment on lines +1477 to +1478
setDrawerItemSubtitle(navigationView, R.id.nav_help,
getString(R.string.drawer_subtitle_about));
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The subtitle id does not match the primary title id

mcdurdin

This comment was marked as duplicate.

@mcdurdin
Copy link
Copy Markdown
Member

Note: I committed a couple of minor changes to get the project to build and removed some unnecessary changes from other parts of Keyman. Please pull these changes locally before updating.

@keyman-server keyman-server modified the milestones: A19S26, A19S27 Apr 14, 2026
@keyman-server keyman-server modified the milestones: A19S27, A19S28 Apr 24, 2026
@Mengchou97
Copy link
Copy Markdown
Author

Mengchou97 commented Apr 27, 2026

Thank you so much for the feedback! I’ve updated the code based on your suggestions and made several improvements.

I’ll go through the rest of the comments and continue refining things as much as I can.

I’ve also added a Google Doc with a summary of the changes here: https://docs.google.com/document/d/1uJisJ9qhv7sipawU6dWb4HGHbQeoMnKriB50QkU1sxM/edit?usp=sharing .

Please let me know if you have any further suggestions!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

feat(android): dark mode support

8 participants