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 + --> + + + + + + + + - - - - - - +