diff --git a/android/app/src/main/cpp/app/organicmaps/util/Config.cpp b/android/app/src/main/cpp/app/organicmaps/util/Config.cpp index e754985f77..3794f74349 100644 --- a/android/app/src/main/cpp/app/organicmaps/util/Config.cpp +++ b/android/app/src/main/cpp/app/organicmaps/util/Config.cpp @@ -4,6 +4,19 @@ extern "C" { + JNIEXPORT jboolean JNICALL + Java_app_organicmaps_util_Config_nativeHasConfigValue(JNIEnv * env, jclass thiz, jstring name) + { + std::string value; + return settings::Get(jni::ToNativeString(env, name), value); + } + + JNIEXPORT void JNICALL + Java_app_organicmaps_util_Config_nativeDeleteConfigValue(JNIEnv * env, jclass thiz, jstring name) + { + settings::Delete(jni::ToNativeString(env, name)); + } + JNIEXPORT jboolean JNICALL Java_app_organicmaps_util_Config_nativeGetBoolean(JNIEnv * env, jclass thiz, jstring name, jboolean defaultVal) { diff --git a/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java b/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java index d0e16add7b..52eeaf0b3c 100644 --- a/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java +++ b/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java @@ -30,6 +30,7 @@ import app.organicmaps.intent.IntentProcessor; import app.organicmaps.intent.MapTask; import app.organicmaps.location.LocationHelper; import app.organicmaps.location.LocationListener; +import app.organicmaps.util.Config; import app.organicmaps.util.ConnectionState; import app.organicmaps.util.StringUtils; import app.organicmaps.util.UiUtils; @@ -231,7 +232,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity super.onSafeDestroy(); mApiRequest.unregister(); mApiRequest = null; - Utils.keepScreenOn(false, getWindow()); + Utils.keepScreenOn(Config.isKeepScreenOnEnabled(), getWindow()); if (mCountryDownloadListenerSlot != 0) { MapManager.nativeUnsubscribe(mCountryDownloadListenerSlot); diff --git a/android/app/src/main/java/app/organicmaps/MwmActivity.java b/android/app/src/main/java/app/organicmaps/MwmActivity.java index 4ae15c8234..06f8608a6f 100644 --- a/android/app/src/main/java/app/organicmaps/MwmActivity.java +++ b/android/app/src/main/java/app/organicmaps/MwmActivity.java @@ -117,7 +117,10 @@ import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission.POST_NOTIFICATIONS; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static app.organicmaps.location.LocationState.FOLLOW; +import static app.organicmaps.location.LocationState.FOLLOW_AND_ROTATE; import static app.organicmaps.location.LocationState.LOCATION_TAG; +import static app.organicmaps.location.LocationState.PENDING_POSITION; public class MwmActivity extends BaseMwmFragmentActivity implements PlacePageActivationListener, @@ -1089,8 +1092,6 @@ public class MwmActivity extends BaseMwmFragmentActivity LocationHelper.from(this).addListener(this); onMyPositionModeChanged(LocationState.nativeGetMode()); mSearchController.attach(this); - if (!Config.isScreenSleepEnabled()) - Utils.keepScreenOn(true, getWindow()); } @Override @@ -1523,6 +1524,7 @@ public class MwmActivity extends BaseMwmFragmentActivity mMapButtonsViewModel.setSearchOption(null); mMapButtonsViewModel.setLayoutMode(MapButtonsController.LayoutMode.regular); refreshLightStatusBar(); + Utils.keepScreenOn(Config.isKeepScreenOnEnabled(), getWindow()); } @Override @@ -1542,6 +1544,7 @@ public class MwmActivity extends BaseMwmFragmentActivity requestPostNotificationsPermission(); NavigationService.startForegroundService(this); + Utils.keepScreenOn(true, getWindow()); } @Override @@ -1693,6 +1696,10 @@ public class MwmActivity extends BaseMwmFragmentActivity if (controller.isPlanning()) showAddStartOrFinishFrame(controller, true); LocationHelper.from(this).restartWithNewMode(); + if (newMode == FOLLOW || newMode == FOLLOW_AND_ROTATE) + Utils.keepScreenOn(Config.isKeepScreenOnEnabled() || RoutingController.get().isNavigating(), getWindow()); + else + Utils.keepScreenOn(RoutingController.get().isNavigating(), getWindow()); } /** diff --git a/android/app/src/main/java/app/organicmaps/MwmApplication.java b/android/app/src/main/java/app/organicmaps/MwmApplication.java index f9f86bd051..3e20a87850 100644 --- a/android/app/src/main/java/app/organicmaps/MwmApplication.java +++ b/android/app/src/main/java/app/organicmaps/MwmApplication.java @@ -149,6 +149,8 @@ public class MwmApplication extends Application implements Application.ActivityL Logger.d(TAG, "Settings path = " + settingsPath); nativeSetSettingsDir(settingsPath); + Config.init(this); + mMainLoopHandler = new Handler(getMainLooper()); ConnectionState.INSTANCE.initialize(this); diff --git a/android/app/src/main/java/app/organicmaps/SplashActivity.java b/android/app/src/main/java/app/organicmaps/SplashActivity.java index 2ecec89d3d..a6fc6267f2 100644 --- a/android/app/src/main/java/app/organicmaps/SplashActivity.java +++ b/android/app/src/main/java/app/organicmaps/SplashActivity.java @@ -81,7 +81,6 @@ public class SplashActivity extends AppCompatActivity throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme); UiThread.cancelDelayedTasks(mInitCoreDelayedTask); - Config.updateCounters(this); setContentView(R.layout.activity_splash); mPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> Config.setLocationRequested()); diff --git a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java index f68a8af251..e40df225bb 100644 --- a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java +++ b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java @@ -731,18 +731,18 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment private void initScreenSleepEnabledPrefsCallbacks() { - final Preference pref = getPreference(getString(R.string.pref_screen_sleep)); + final Preference pref = getPreference(getString(R.string.pref_keep_screen_on)); - final boolean isScreenSleepEnabled = Config.isScreenSleepEnabled(); - ((TwoStatePreference) pref).setChecked(isScreenSleepEnabled); + final boolean isKeepScreenOnEnabled = Config.isKeepScreenOnEnabled(); + ((TwoStatePreference) pref).setChecked(isKeepScreenOnEnabled); pref.setOnPreferenceChangeListener( (preference, newValue) -> { boolean newVal = (Boolean) newValue; - if (isScreenSleepEnabled != newVal) + if (isKeepScreenOnEnabled != newVal) { - Config.setScreenSleepEnabled(newVal); - Utils.keepScreenOn(!newVal, requireActivity().getWindow()); + Config.setKeepScreenOnEnabled(newVal); + Utils.keepScreenOn(newVal, requireActivity().getWindow()); } return true; }); diff --git a/android/app/src/main/java/app/organicmaps/util/Config.java b/android/app/src/main/java/app/organicmaps/util/Config.java index 7870d7fbfc..bfa04a50c2 100644 --- a/android/app/src/main/java/app/organicmaps/util/Config.java +++ b/android/app/src/main/java/app/organicmaps/util/Config.java @@ -30,7 +30,8 @@ public final class Config private static final String KEY_MISC_USE_MOBILE_DATA = "UseMobileData"; private static final String KEY_MISC_USE_MOBILE_DATA_TIMESTAMP = "UseMobileDataTimestamp"; private static final String KEY_MISC_USE_MOBILE_DATA_ROAMING = "UseMobileDataRoaming"; - private static final String KEY_MISC_ENABLE_SCREEN_SLEEP = "EnableScreenSleep"; + private static final String KEY_MISC_KEEP_SCREEN_ON = "KeepScreenOn"; + private static final String KEY_MISC_SHOW_ON_LOCK_SCREEN = "ShowOnLockScreen"; private static final String KEY_MISC_AGPS_TIMESTAMP = "AGPSTimestamp"; private static final String KEY_DONATE_URL = "DonateUrl"; @@ -170,14 +171,14 @@ public final class Config setBool(KEY_PREF_STATISTICS, enabled); } - public static boolean isScreenSleepEnabled() + public static boolean isKeepScreenOnEnabled() { - return getBool(KEY_MISC_ENABLE_SCREEN_SLEEP, false); + return getBool(KEY_MISC_KEEP_SCREEN_ON, false); } - public static void setScreenSleepEnabled(boolean enabled) + public static void setKeepScreenOnEnabled(boolean enabled) { - setBool(KEY_MISC_ENABLE_SCREEN_SLEEP, enabled); + setBool(KEY_MISC_KEEP_SCREEN_ON, enabled); } public static boolean isShowOnLockScreenEnabled() @@ -333,13 +334,14 @@ public final class Config return getString(KEY_DONATE_URL); } - public static void updateCounters(@NonNull Context context) + public static void init(@NonNull Context context) { PreferenceManager.setDefaultValues(context, R.xml.prefs_main, false); final SharedPreferences prefs = MwmApplication.prefs(context); final SharedPreferences.Editor editor = prefs.edit(); + // Update counters. final int launchNumber = prefs.getInt(KEY_APP_LAUNCH_NUMBER, 0); editor.putInt(KEY_APP_LAUNCH_NUMBER, launchNumber + 1); editor.putLong(KEY_APP_LAST_SESSION_TIMESTAMP, System.currentTimeMillis()); @@ -354,6 +356,14 @@ public final class Config editor.remove("LastRatedSession"); editor.remove("RatedDialog"); + // Migrate ENABLE_SCREEN_SLEEP to KEEP_SCREEN_ON. + final String KEY_MISC_ENABLE_SCREEN_SLEEP = "EnableScreenSleep"; + if (nativeHasConfigValue(KEY_MISC_ENABLE_SCREEN_SLEEP)) + { + nativeSetBoolean(KEY_MISC_KEEP_SCREEN_ON, !getBool(KEY_MISC_ENABLE_SCREEN_SLEEP, false)); + nativeDeleteConfigValue(KEY_MISC_ENABLE_SCREEN_SLEEP); + } + editor.apply(); } @@ -370,6 +380,8 @@ public final class Config .apply(); } + private static native boolean nativeHasConfigValue(String name); + private static native boolean nativeDeleteConfigValue(String name); private static native boolean nativeGetBoolean(String name, boolean defaultValue); private static native void nativeSetBoolean(String name, boolean value); private static native int nativeGetInt(String name, int defaultValue); diff --git a/android/app/src/main/java/app/organicmaps/util/Utils.java b/android/app/src/main/java/app/organicmaps/util/Utils.java index 69b954f226..677eb2ad26 100644 --- a/android/app/src/main/java/app/organicmaps/util/Utils.java +++ b/android/app/src/main/java/app/organicmaps/util/Utils.java @@ -74,6 +74,7 @@ public class Utils */ public static void keepScreenOn(boolean enable, Window w) { + Logger.i(TAG, "enabled = " + enable + " window = " + w); if (enable) w.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); else @@ -90,6 +91,7 @@ public class Utils public static void showOnLockScreen(boolean enable, Activity activity) { + Logger.i(TAG, "enabled = " + enable + " window = " + activity.getWindow()); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O_MR1) showOnLockScreenOld(enable, activity); else diff --git a/android/app/src/main/res/values/donottranslate.xml b/android/app/src/main/res/values/donottranslate.xml index 527150dca9..f515beb367 100644 --- a/android/app/src/main/res/values/donottranslate.xml +++ b/android/app/src/main/res/values/donottranslate.xml @@ -37,7 +37,7 @@ Information Transliteration PowerManagment - ScreenSleep + KeepScreenOn ShowOnLockScreen %1$s: %2$s diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 5ca04fd5c1..9e0e0a7c18 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -753,9 +753,9 @@ Connection failure Disconnect USB cable - Allow the screen to sleep + Keep the screen on - When enabled, the screen will be allowed to sleep after a period of inactivity. + When enabled, the screen will always be on when displaying the map. Show on the lock screen diff --git a/android/app/src/main/res/xml/prefs_main.xml b/android/app/src/main/res/xml/prefs_main.xml index 7bb06f87d1..983f8c3f40 100644 --- a/android/app/src/main/res/xml/prefs_main.xml +++ b/android/app/src/main/res/xml/prefs_main.xml @@ -84,10 +84,10 @@ android:entryValues="@array/power_management_scheme_values" android:order="15"/>