diff --git a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml
index 446405033e..d27db14302 100644
--- a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml
+++ b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml
@@ -17,21 +17,22 @@
https://support.google.com/googleplay/android-developer/answer/9214102#
-->
+ android:supportsRtl="true"
+ >
-
@@ -42,19 +43,19 @@
-
-
-
-
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+ android:theme="@style/Theme.App.Starting">
+
+
+
+
+
+
+
diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java
index dc7dd49040..0d0931b0b6 100644
--- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java
+++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java
@@ -66,6 +66,7 @@ import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBarDrawerToggle;
+import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.appcompat.widget.SwitchCompat;
import androidx.appcompat.app.AlertDialog;
@@ -88,6 +89,8 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
+import androidx.core.view.WindowCompat;
+import androidx.core.view.WindowInsetsControllerCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.drawerlayout.widget.DrawerLayout;
@@ -153,11 +156,19 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
DownloadResultReceiver resultReceiver;
private static ProgressDialog progressDialog;
+ private static final String PREFS_NAME = "settings";
+ private static final String KEY_THEME_MODE = "theme_mode";
@Override
protected void onCreate(Bundle savedInstanceState) {
- setTheme(R.style.AppTheme);
+ // setTheme(R.style.AppTheme);
+
+ SharedPreferences theme_prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
+ int savedMode = theme_prefs.getInt(KEY_THEME_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
+ AppCompatDelegate.setDefaultNightMode(savedMode);
+ getDelegate().applyDayNight();
super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
context = this;
checkSendCrashReport();
@@ -245,6 +256,7 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
if (imManager != null) {
imManager.showInputMethodPicker();
}
+
} else if (id == R.id.nav_installed_languages) {
drawerLayout.closeDrawers();
Intent intent = new Intent(context, LanguagesSettingsActivity.class);
@@ -268,6 +280,9 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
} else if (id == R.id.nav_about) {
drawerLayout.closeDrawers();
startActivity(new Intent(context, InfoActivity.class));
+ }else if (id == R.id.nav_palette){
+ drawerLayout.closeDrawers();
+ openThemeDialog();
}
return true;
}
@@ -313,6 +328,40 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
checkGetStarted();
}
+ private void openThemeDialog() {
+ String[] options = {"Dark Mode", "Light Mode", "System Default"};
+
+ SharedPreferences themePrefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
+ int currentMode = themePrefs.getInt(KEY_THEME_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
+
+ int checkedItem;
+ if (currentMode == AppCompatDelegate.MODE_NIGHT_YES) checkedItem = 0;
+ else if (currentMode == AppCompatDelegate.MODE_NIGHT_NO) checkedItem = 1;
+ else checkedItem = 2;
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle("Choose Theme");
+
+ builder.setSingleChoiceItems(options, checkedItem, (dialog, which) -> {
+ int modeToApply;
+ switch (which) {
+ case 0: modeToApply = AppCompatDelegate.MODE_NIGHT_YES; break;
+ case 1: modeToApply = AppCompatDelegate.MODE_NIGHT_NO; break;
+ default: modeToApply = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM; break;
+ }
+ // Save the choice
+ themePrefs.edit().putInt(KEY_THEME_MODE, modeToApply).apply();
+
+ // Apply immediately
+ AppCompatDelegate.setDefaultNightMode(modeToApply);
+ getDelegate().applyDayNight(); // ensures current activity updates
+
+ dialog.dismiss();
+ });
+ builder.setNegativeButton("Cancel", (dialog, which) -> dialog.dismiss());
+ builder.show();
+ }
+
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent returnIntent) {
@@ -561,6 +610,7 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
return true;
}
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Android Gradle 8.0 no longer declares resources final, so can't use switch statement here
diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MyApp.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MyApp.java
new file mode 100644
index 0000000000..0ac1ec574b
--- /dev/null
+++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MyApp.java
@@ -0,0 +1,15 @@
+package com.tavultesoft.kmapro;
+
+import android.app.Application;
+import android.content.SharedPreferences;
+import androidx.appcompat.app.AppCompatDelegate;
+
+public class MyApp extends Application {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ SharedPreferences prefs = getSharedPreferences("settings", MODE_PRIVATE);
+ int mode = prefs.getInt("theme_mode", AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
+ AppCompatDelegate.setDefaultNightMode(mode);
+ }
+}
\ No newline at end of file
diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SplashScreenActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SplashScreenActivity.java
index 60d26d7508..fd913ece4e 100644
--- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SplashScreenActivity.java
+++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SplashScreenActivity.java
@@ -1,25 +1,37 @@
package com.tavultesoft.kmapro;
+import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.widget.TextView;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatDelegate;
+
import com.keyman.engine.util.KMLog;
import java.util.Calendar;
-public class SplashScreenActivity extends Activity {
+public class SplashScreenActivity extends AppCompatActivity {
private final static String TAG = "Splash";
-
// For now, disable this Activity so app is not delayed showing version/copyright text
- private static int SPLASH_TIME_OUT = 0; // msec
+ private static int SPLASH_TIME_OUT = 100; // msec
@Override
protected void onCreate(Bundle savedInstanceState) {
+ SharedPreferences prefs = getSharedPreferences("settings", MODE_PRIVATE);
+ int savedMode = prefs.getInt("theme_mode", AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
+
+ if (savedMode == AppCompatDelegate.MODE_NIGHT_YES) {
+ setTheme(R.style.AppTheme_BrandedLaunchDark);
+ } else {
+ setTheme(R.style.AppTheme_BrandedLaunchLight);
+ }
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
@@ -41,6 +53,8 @@ public class SplashScreenActivity extends Activity {
String date = String.format("%s%s", copyright.getText(), year);
//copyright.setText(date);
+ AppCompatDelegate.setDefaultNightMode(savedMode);
+
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
diff --git a/android/KMAPro/kMAPro/src/main/res/drawable/ic_palette.xml b/android/KMAPro/kMAPro/src/main/res/drawable/ic_palette.xml
new file mode 100644
index 0000000000..f701027ccf
--- /dev/null
+++ b/android/KMAPro/kMAPro/src/main/res/drawable/ic_palette.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/android/KMAPro/kMAPro/src/main/res/layout/activity_splash_screen.xml b/android/KMAPro/kMAPro/src/main/res/layout/activity_splash_screen.xml
index c6cde0e259..128cadc6e1 100644
--- a/android/KMAPro/kMAPro/src/main/res/layout/activity_splash_screen.xml
+++ b/android/KMAPro/kMAPro/src/main/res/layout/activity_splash_screen.xml
@@ -1,19 +1,18 @@
-
-
+
\ No newline at end of file
diff --git a/android/KMAPro/kMAPro/src/main/res/layout/nav_header.xml b/android/KMAPro/kMAPro/src/main/res/layout/nav_header.xml
index a59be8fd9d..093647f9ad 100644
--- a/android/KMAPro/kMAPro/src/main/res/layout/nav_header.xml
+++ b/android/KMAPro/kMAPro/src/main/res/layout/nav_header.xml
@@ -12,7 +12,7 @@
diff --git a/android/KMAPro/kMAPro/src/main/res/menu/main.xml b/android/KMAPro/kMAPro/src/main/res/menu/main.xml
index d98360a9a9..bf8da41f38 100644
--- a/android/KMAPro/kMAPro/src/main/res/menu/main.xml
+++ b/android/KMAPro/kMAPro/src/main/res/menu/main.xml
@@ -38,7 +38,7 @@
+ android:icon="@drawable/ic_action_share_mode" />
+
- @android:color/black
- @android:color/black
- - @android:color/black
+
- @android:color/white
- @android:color/white
- @style/PreferenceThemeOverlay
-
+
+ - #131313
- false
- true
+ - @android:color/black
+ - false
+ - true
+
- @style/AppTheme.PopupMenu
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/android/KMAPro/kMAPro/src/main/res/values/styles.xml b/android/KMAPro/kMAPro/src/main/res/values/styles.xml
index da85f8d32a..34f775595f 100644
--- a/android/KMAPro/kMAPro/src/main/res/values/styles.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values/styles.xml
@@ -12,8 +12,6 @@
- @color/complementary_5
- - @android:color/white
-
- @android:color/black
- @color/neutral_3
- @android:color/black
@@ -22,29 +20,48 @@
- @style/AppTheme.PopupMenu
- @style/PreferenceThemeOverlay
-
+
+ - @android:color/white
- false
- true
+ - @android:color/white
+ - true
+ - true
+
- -->
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+