From bdc13cfd61a39f61d36c0f90a9f97cab3fe70818 Mon Sep 17 00:00:00 2001 From: y20k Date: Tue, 28 Jan 2020 17:39:45 +0100 Subject: [PATCH] New Theme setting (Dark Mode) --- app/build.gradle | 8 +- app/src/main/java/org/y20k/trackbook/Keys.kt | 7 +- .../java/org/y20k/trackbook/MainActivity.kt | 27 ++++ .../java/org/y20k/trackbook/MapFragment.kt | 5 +- .../org/y20k/trackbook/SettingsFragment.kt | 25 +++ .../main/java/org/y20k/trackbook/Trackbook.kt | 5 +- .../java/org/y20k/trackbook/TrackerService.kt | 4 +- .../trackbook/TrackingToggleTileService.kt | 2 +- .../y20k/trackbook/helpers/AppThemeHelper.kt | 104 ++++++++++++ .../y20k/trackbook/helpers/NightModeHelper.kt | 150 ------------------ .../trackbook/helpers/PreferencesHelper.kt | 18 +-- .../trackbook/ui/MapFragmentLayoutHolder.kt | 20 +-- .../trackbook/ui/TrackFragmentLayoutHolder.kt | 6 +- app/src/main/res/values-da/strings.xml | 3 - app/src/main/res/values-de/strings.xml | 3 - app/src/main/res/values-fr/strings.xml | 3 - app/src/main/res/values-it/strings.xml | 3 - app/src/main/res/values-ja/strings.xml | 3 - app/src/main/res/values-nb-rNO/strings.xml | 3 - app/src/main/res/values-nl/strings.xml | 3 - app/src/main/res/values-zh-rCN/strings.xml | 5 +- app/src/main/res/values/strings.xml | 8 +- build.gradle | 2 +- 23 files changed, 191 insertions(+), 226 deletions(-) create mode 100644 app/src/main/java/org/y20k/trackbook/helpers/AppThemeHelper.kt delete mode 100644 app/src/main/java/org/y20k/trackbook/helpers/NightModeHelper.kt diff --git a/app/build.gradle b/app/build.gradle index e6255b3..d9e0633 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,8 +64,8 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.2" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.2" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0" implementation 'androidx.appcompat:appcompat:1.1.0' implementation "androidx.core:core-ktx:1.1.0" @@ -74,8 +74,8 @@ dependencies { implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' implementation "androidx.preference:preference-ktx:1.1.0" - implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0' - implementation 'androidx.navigation:navigation-ui-ktx:2.1.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.2.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.2.0' implementation "com.google.android.material:material:1.1.0-beta01" diff --git a/app/src/main/java/org/y20k/trackbook/Keys.kt b/app/src/main/java/org/y20k/trackbook/Keys.kt index 99702f2..dc971dc 100644 --- a/app/src/main/java/org/y20k/trackbook/Keys.kt +++ b/app/src/main/java/org/y20k/trackbook/Keys.kt @@ -51,7 +51,7 @@ object Keys { // preferences const val PREF_ONE_TIME_HOUSEKEEPING_NECESSARY = "ONE_TIME_HOUSEKEEPING_NECESSARY_VERSIONCODE_37" // increment to current app version code to trigger housekeeping that runs only once - const val PREF_NIGHT_MODE_STATE: String= "prefNightModeState" + const val PREF_THEME_SELECTION: String= "prefThemeSelection" const val PREF_CURRENT_BEST_LOCATION_PROVIDER: String = "prefCurrentBestLocationProvider" const val PREF_CURRENT_BEST_LOCATION_LATITUDE: String = "prefCurrentBestLocationLatitude" const val PREF_CURRENT_BEST_LOCATION_LONGITUDE: String = "prefCurrentBestLocationLongitude" @@ -66,9 +66,12 @@ object Keys { const val PREF_LOCATION_AGE_THRESHOLD: String = "prefLocationAgeThreshold" // states - const val STATE_NOT_TRACKING: Int = 0 + const val STATE_TRACKING_NOT: Int = 0 const val STATE_TRACKING_ACTIVE: Int = 1 const val STATE_TRACKING_STOPPED: Int = 2 + const val STATE_THEME_FOLLOW_SYSTEM: String = "stateFollowSystem" + const val STATE_THEME_LIGHT_MODE: String = "stateLightMode" + const val STATE_THEME_DARK_MODE: String = "stateDarkMode" // dialog types const val DIALOG_EMPTY_RECORDING: Int = 0 diff --git a/app/src/main/java/org/y20k/trackbook/MainActivity.kt b/app/src/main/java/org/y20k/trackbook/MainActivity.kt index d341827..5f32941 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivity.kt +++ b/app/src/main/java/org/y20k/trackbook/MainActivity.kt @@ -17,12 +17,16 @@ package org.y20k.trackbook +import android.content.Context +import android.content.SharedPreferences import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController +import androidx.preference.PreferenceManager import com.google.android.material.bottomnavigation.BottomNavigationView import org.osmdroid.config.Configuration +import org.y20k.trackbook.helpers.AppThemeHelper import org.y20k.trackbook.helpers.ImportHelper import org.y20k.trackbook.helpers.LogHelper import org.y20k.trackbook.helpers.PreferencesHelper @@ -80,6 +84,29 @@ class MainActivity : AppCompatActivity() { PreferencesHelper.saveHouseKeepingNecessaryState(this) } + // register listener for changes in shared preferences + PreferenceManager.getDefaultSharedPreferences(this as Context).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) } + + override fun onDestroy() { + super.onDestroy() + // unregister listener for changes in shared preferences + PreferenceManager.getDefaultSharedPreferences(this as Context).unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) + } + + + /* + * Defines the listener for changes in shared preferences + */ + private val sharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> + when (key) { + Keys.PREF_THEME_SELECTION -> { + AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection(this@MainActivity)) + } + } + } + /* + * End of declaration + */ } diff --git a/app/src/main/java/org/y20k/trackbook/MapFragment.kt b/app/src/main/java/org/y20k/trackbook/MapFragment.kt index 54a7865..c15fa1e 100644 --- a/app/src/main/java/org/y20k/trackbook/MapFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/MapFragment.kt @@ -53,7 +53,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { /* Main class variables */ private var bound: Boolean = false private val handler: Handler = Handler() - private var trackingState: Int = Keys.STATE_NOT_TRACKING + private var trackingState: Int = Keys.STATE_TRACKING_NOT private var gpsProviderActive: Boolean = false private var networkProviderActive: Boolean = false private var track: Track = Track() @@ -191,7 +191,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { when (trackingState) { Keys.STATE_TRACKING_STOPPED -> layout.toggleRecordingButtonSubMenu() Keys.STATE_TRACKING_ACTIVE -> trackerService.stopTracking() - Keys.STATE_NOT_TRACKING -> { + Keys.STATE_TRACKING_NOT -> { // start service via intent so that it keeps running after unbind startTrackerService() trackerService.startTracking() @@ -291,7 +291,6 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { // update location and track layout.markCurrentPosition(currentBestLocation, trackingState) layout.overlayCurrentTrack(track, trackingState) - layout.updateRecordingButton(trackingState) // center map, if it had not been dragged/zoomed before if (!layout.userInteraction) { layout.centerMap(currentBestLocation, true)} // show error snackbar if necessary diff --git a/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt b/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt index b02a7bf..2e7e6ee 100644 --- a/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt @@ -22,6 +22,7 @@ import android.content.Context import android.os.Bundle import android.view.View import androidx.preference.* +import org.y20k.trackbook.helpers.AppThemeHelper import org.y20k.trackbook.helpers.LengthUnitHelper import org.y20k.trackbook.helpers.LogHelper @@ -68,6 +69,29 @@ class SettingsFragment : PreferenceFragmentCompat() { preferenceImperialMeasurementUnits.summaryOff = getString(R.string.pref_imperial_measurement_units_summary_metric) preferenceImperialMeasurementUnits.setDefaultValue(LengthUnitHelper.useImperialUnits()) + // set up "App Theme" preference + val preferenceThemeSelection: ListPreference = ListPreference(activity as Context) + preferenceThemeSelection.title = getString(R.string.pref_theme_selection_title) + preferenceThemeSelection.key = Keys.PREF_THEME_SELECTION + preferenceThemeSelection.summary = "${getString(R.string.pref_theme_selection_summary)} ${AppThemeHelper.getCurrentTheme(activity as Context)}" + preferenceThemeSelection.entries = arrayOf(getString(R.string.pref_theme_selection_mode_device_default), getString(R.string.pref_theme_selection_mode_light), getString(R.string.pref_theme_selection_mode_dark)) + preferenceThemeSelection.entryValues = arrayOf(Keys.STATE_THEME_FOLLOW_SYSTEM, Keys.STATE_THEME_LIGHT_MODE, Keys.STATE_THEME_DARK_MODE) + preferenceThemeSelection.setOnPreferenceChangeListener { preference, newValue -> + if (preference is ListPreference) { + val index: Int = preference.entryValues.indexOf(newValue) + preferenceThemeSelection.summary = "${getString(R.string.pref_theme_selection_summary)} ${preference.entries.get(index)}" + return@setOnPreferenceChangeListener true + } else { + return@setOnPreferenceChangeListener false + } + } +// preferenceThemeSelection.setOnPreferenceClickListener { +// preferenceThemeSelection.summary = "${getString(R.string.pref_theme_selection_theme_summary)} ${AppThemeHelper.getCurrentTheme(activity as Context)}" +// return@setOnPreferenceClickListener true +// } + + + // set up "Accuracy Threshold" preference val preferenceAccuracyThreshold: SeekBarPreference = SeekBarPreference(activity as Context) preferenceAccuracyThreshold.title = getString(R.string.pref_accuracy_threshold_title) @@ -100,6 +124,7 @@ class SettingsFragment : PreferenceFragmentCompat() { screen.addPreference(preferenceCategoryGeneral) screen.addPreference(preferenceGpsOnly) screen.addPreference(preferenceImperialMeasurementUnits) + screen.addPreference(preferenceThemeSelection) screen.addPreference(preferenceCategoryAdvanced) screen.addPreference(preferenceAccuracyThreshold) screen.addPreference(preferenceResetAdvanced) diff --git a/app/src/main/java/org/y20k/trackbook/Trackbook.kt b/app/src/main/java/org/y20k/trackbook/Trackbook.kt index ff04f7a..08dd3f3 100644 --- a/app/src/main/java/org/y20k/trackbook/Trackbook.kt +++ b/app/src/main/java/org/y20k/trackbook/Trackbook.kt @@ -19,8 +19,9 @@ package org.y20k.trackbook import android.app.Application +import org.y20k.trackbook.helpers.AppThemeHelper import org.y20k.trackbook.helpers.LogHelper -import org.y20k.trackbook.helpers.NightModeHelper +import org.y20k.trackbook.helpers.PreferencesHelper /* @@ -38,7 +39,7 @@ class Trackbook: Application() { super.onCreate() LogHelper.v(TAG, "Trackbook application started.") // set Day / Night theme state - NightModeHelper.restoreSavedState(this) + AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection(this)) } diff --git a/app/src/main/java/org/y20k/trackbook/TrackerService.kt b/app/src/main/java/org/y20k/trackbook/TrackerService.kt index 1667c65..0f1ee6e 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackerService.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackerService.kt @@ -55,7 +55,7 @@ class TrackerService(): Service(), CoroutineScope, SensorEventListener { /* Main class variables */ - var trackingState: Int = Keys.STATE_NOT_TRACKING + var trackingState: Int = Keys.STATE_TRACKING_NOT var gpsProviderActive: Boolean = false var networkProviderActive: Boolean = false var useImperial: Boolean = false @@ -215,7 +215,7 @@ class TrackerService(): Service(), CoroutineScope, SensorEventListener { fun clearTrack() { track = Track() FileHelper.deleteTempFile(this) - trackingState = Keys.STATE_NOT_TRACKING + trackingState = Keys.STATE_TRACKING_NOT PreferencesHelper.saveTrackingState(this, trackingState) stopForeground(true) } diff --git a/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt b/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt index d178f0f..55ef954 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt @@ -38,7 +38,7 @@ class TrackingToggleTileService(): TileService() { /* Main class variables */ private var bound: Boolean = false - private var trackingState: Int = Keys.STATE_NOT_TRACKING + private var trackingState: Int = Keys.STATE_TRACKING_NOT private lateinit var trackerService: TrackerService diff --git a/app/src/main/java/org/y20k/trackbook/helpers/AppThemeHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/AppThemeHelper.kt new file mode 100644 index 0000000..74a4787 --- /dev/null +++ b/app/src/main/java/org/y20k/trackbook/helpers/AppThemeHelper.kt @@ -0,0 +1,104 @@ +/* + * AppThemeHelper.kt + * Implements the AppThemeHelper object + * A AppThemeHelper can set the differnt app themes: Light Mode, Dark Mode, Follow System + * + * This file is part of + * TRACKBOOK - Movement Recorder for Android + * + * Copyright (c) 2016-20 - Y20K.org + * Licensed under the MIT-License + * http://opensource.org/licenses/MIT + * + * Trackbook uses osmdroid - OpenStreetMap-Tools for Android + * https://github.com/osmdroid/osmdroid + */ + + +package org.y20k.trackbook.helpers + +import android.app.Activity +import android.content.Context +import android.content.res.Configuration +import android.view.View +import androidx.appcompat.app.AppCompatDelegate +import org.y20k.trackbook.Keys +import org.y20k.trackbook.R + + +/* + * AppThemeHelper object + */ +object AppThemeHelper { + + /* Define log tag */ + private val TAG: String = LogHelper.makeLogTag(AppThemeHelper::class.java) + + + /* Sets app theme */ + fun setTheme(nightModeState: String) { + when (nightModeState) { + Keys.STATE_THEME_DARK_MODE -> { + if (AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_YES) { + // turn on dark mode + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + LogHelper.i(TAG, "Dark Mode activated.") + } + } + Keys.STATE_THEME_LIGHT_MODE -> { + if (AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_NO) { + // turn on light mode + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + LogHelper.i(TAG, "Theme: Light Mode activated.") + } + } + Keys.STATE_THEME_FOLLOW_SYSTEM -> { + if (AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) { + // turn on mode "follow system" + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + LogHelper.i(TAG, "Theme: Follow System Mode activated.") + } + } + else -> { + // turn on mode "follow system" + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + LogHelper.i(TAG, "Theme: Follow System Mode activated.") + } + } + } + + + /* Return weather Night Mode is on, or not */ + fun isDarkModeOn(context: Context): Boolean { + val nightMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + return nightMode == Configuration.UI_MODE_NIGHT_YES + } + + + /* Returns a readable String for currently selected App Theme */ + fun getCurrentTheme(context: Context): String { + return when (PreferencesHelper.loadThemeSelection(context)) { + Keys.STATE_THEME_LIGHT_MODE -> context.getString(R.string.pref_theme_selection_mode_light) + Keys.STATE_THEME_DARK_MODE -> context.getString(R.string.pref_theme_selection_mode_dark) + else -> context.getString(R.string.pref_theme_selection_mode_device_default) + } + } + + + /* Displays the default status bar */ + private fun displayDefaultStatusBar(activity: Activity) { + val decorView = activity.window.decorView + decorView.systemUiVisibility = 0 + } + + + /* Displays the light (inverted) status bar */ + private fun displayLightStatusBar(activity: Activity) { + val decorView = activity.window.decorView + decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/helpers/NightModeHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/NightModeHelper.kt deleted file mode 100644 index 594d131..0000000 --- a/app/src/main/java/org/y20k/trackbook/helpers/NightModeHelper.kt +++ /dev/null @@ -1,150 +0,0 @@ -/* - * NightModeHelper.kt - * Implements the NightModeHelper object - * A NightModeHelper can toggle and restore the state of the theme's Night Mode - * - * This file is part of - * TRACKBOOK - Movement Recorder for Android - * - * Copyright (c) 2016-20 - Y20K.org - * Licensed under the MIT-License - * http://opensource.org/licenses/MIT - * - * Trackbook uses osmdroid - OpenStreetMap-Tools for Android - * https://github.com/osmdroid/osmdroid - */ - - -package org.y20k.trackbook.helpers - -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Context -import android.content.res.Configuration -import android.view.View -import android.widget.Toast -import androidx.appcompat.app.AppCompatDelegate -import org.y20k.trackbook.R - - -/* - * NightModeHelper object - */ -object NightModeHelper { - - /* Define log tag */ - private val TAG: String = LogHelper.makeLogTag(NightModeHelper::class.java) - - - /* Switches between modes: day, night, undefined */ - @SuppressLint("SwitchIntDef") - fun switchMode(activity: Activity) { - // SWITCH: undefined -> night / night -> day / day - undefined - when (AppCompatDelegate.getDefaultNightMode()) { - AppCompatDelegate.MODE_NIGHT_NO -> { - // currently: day mode -> switch to: follow system - // displayDefaultStatusBar(activity) // necessary hack :-/ - activateFollowSystemMode(activity, true) - } - AppCompatDelegate.MODE_NIGHT_YES -> { - // currently: night mode -> switch to: day mode - // displayLightStatusBar(activity) // necessary hack :-/ - activateDayMode(activity, true) - } - else -> { - // currently: follow system / undefined -> switch to: day mode - // displayLightStatusBar(activity) // necessary hack :-/ - activateNightMode(activity, true) - } - } - } - - - /* Sets night mode / dark theme */ - fun restoreSavedState(context: Context) { - val savedNightModeState = PreferencesHelper.loadNightModeState(context) - val currentNightModeState = AppCompatDelegate.getDefaultNightMode() - if (savedNightModeState != currentNightModeState) { - when (savedNightModeState) { - AppCompatDelegate.MODE_NIGHT_NO -> - // turn on day mode - activateDayMode(context, false) - AppCompatDelegate.MODE_NIGHT_YES -> - // turn on night mode - activateNightMode(context, false) - else -> - // turn on mode "follow system" - activateFollowSystemMode(context, false) - } - } - } - - - /* Return weather Night Mode is on, or not */ - fun isNightModeOn(context: Context): Boolean { - val nightMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK - return nightMode == Configuration.UI_MODE_NIGHT_YES - } - - - /* Activates Night Mode */ - private fun activateNightMode(context: Context, notifyUser: Boolean) { - PreferencesHelper.saveNightModeState(context, AppCompatDelegate.MODE_NIGHT_YES) - - // switch to Night Mode - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - - // notify user - if (notifyUser) { - Toast.makeText(context, context.getText(R.string.toast_message_theme_night), Toast.LENGTH_LONG).show() - } - } - - - /* Activates Day Mode */ - private fun activateDayMode(context: Context, notifyUser: Boolean) { - // save the new state - PreferencesHelper.saveNightModeState(context, AppCompatDelegate.MODE_NIGHT_NO) - - // switch to Day Mode - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - - // notify user - if (notifyUser) { - Toast.makeText(context, context.getText(R.string.toast_message_theme_day), Toast.LENGTH_LONG).show() - } - } - - - /* Activate Mode "Follow System" */ - private fun activateFollowSystemMode(context: Context, notifyUser: Boolean) { - // save the new state - PreferencesHelper.saveNightModeState(context, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - - // switch to Undefined Mode / Follow System - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - - // notify user - if (notifyUser) { - Toast.makeText(context, context.getText(R.string.toast_message_theme_follow_system), Toast.LENGTH_LONG).show() - } - } - - - /* Displays the default status bar */ - private fun displayDefaultStatusBar(activity: Activity) { - val decorView = activity.window.decorView - decorView.systemUiVisibility = 0 - } - - - /* Displays the light (inverted) status bar */ - private fun displayLightStatusBar(activity: Activity) { - val decorView = activity.window.decorView - decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - } - - - - -} \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/helpers/PreferencesHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/PreferencesHelper.kt index 5ab9774..40bba24 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/PreferencesHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/PreferencesHelper.kt @@ -20,7 +20,6 @@ package org.y20k.trackbook.helpers import android.content.Context import android.location.Location import android.location.LocationManager -import androidx.appcompat.app.AppCompatDelegate import androidx.preference.PreferenceManager import org.y20k.trackbook.Keys import org.y20k.trackbook.extensions.getDouble @@ -61,7 +60,7 @@ object PreferencesHelper { // get preferences val settings = PreferenceManager.getDefaultSharedPreferences(context) // load tracking state - return settings.getInt(Keys.PREF_TRACKING_STATE, Keys.STATE_NOT_TRACKING) + return settings.getInt(Keys.PREF_TRACKING_STATE, Keys.STATE_TRACKING_NOT) } @@ -134,18 +133,9 @@ object PreferencesHelper { } - /* Load state of Night Mode */ - fun loadNightModeState(context: Context): Int { - return PreferenceManager.getDefaultSharedPreferences(context).getInt(Keys.PREF_NIGHT_MODE_STATE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - } - - - /* Save state of night mode */ - fun saveNightModeState(context: Context, currentState: Int) { - val settings = PreferenceManager.getDefaultSharedPreferences(context) - val editor = settings.edit() - editor.putInt(Keys.PREF_NIGHT_MODE_STATE, currentState) - editor.apply() + /* Load currently selected app theme */ + fun loadThemeSelection(context: Context): String { + return PreferenceManager.getDefaultSharedPreferences(context).getString(Keys.PREF_THEME_SELECTION, Keys.STATE_THEME_FOLLOW_SYSTEM) ?: Keys.STATE_THEME_FOLLOW_SYSTEM } diff --git a/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt b/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt index bb65884..b17a17b 100644 --- a/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt +++ b/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt @@ -42,9 +42,9 @@ import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider import org.y20k.trackbook.Keys import org.y20k.trackbook.R import org.y20k.trackbook.core.Track +import org.y20k.trackbook.helpers.AppThemeHelper import org.y20k.trackbook.helpers.LogHelper import org.y20k.trackbook.helpers.MapHelper -import org.y20k.trackbook.helpers.NightModeHelper import org.y20k.trackbook.helpers.PreferencesHelper @@ -97,7 +97,7 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf controller.setZoom(zoomLevel) // set dark map tiles, if necessary - if (NightModeHelper.isNightModeOn(context as Activity)) { + if (AppThemeHelper.isDarkModeOn(context as Activity)) { mapView.overlayManager.tilesOverlay.setColorFilter(TilesOverlay.INVERT_COLORS) } @@ -119,9 +119,6 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf // initialize recording button state updateRecordingButton(trackingState) - // add touch listeners - addTouchListeners() - // listen for user interaction addInteractionListener() } @@ -158,7 +155,7 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf /* Mark current position on map */ - fun markCurrentPosition(location: Location, trackingState: Int = Keys.STATE_NOT_TRACKING) { + fun markCurrentPosition(location: Location, trackingState: Int = Keys.STATE_TRACKING_NOT) { mapView.overlays.remove(currentPositionOverlay) currentPositionOverlay = MapHelper.createMyLocationOverlay(context, location, trackingState) mapView.overlays.add(currentPositionOverlay) @@ -180,7 +177,7 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf /* Toggles state of recording button and sub menu_bottom_navigation */ fun updateRecordingButton(trackingState: Int) { when (trackingState) { - Keys.STATE_NOT_TRACKING -> { + Keys.STATE_TRACKING_NOT -> { recordingButton.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp) recordingButtonSubMenu.visibility = View.GONE } @@ -221,13 +218,4 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf } } - - /* Sets up views - adds touch listeners */ - private fun addTouchListeners() { - currentLocationButton.setOnLongClickListener { - NightModeHelper.switchMode(context as Activity) - return@setOnLongClickListener true - } - } - } \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt b/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt index 1c6fef5..c171a3a 100644 --- a/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt +++ b/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt @@ -126,8 +126,8 @@ data class TrackFragmentLayoutHolder(var context: Context, var inflater: LayoutI useImperialUnits = PreferencesHelper.loadUseImperialUnits(context) // set dark map tiles, if necessary - if (NightModeHelper.isNightModeOn(context as Activity)) { - mapView.getOverlayManager().getTilesOverlay().setColorFilter(TilesOverlay.INVERT_COLORS) + if (AppThemeHelper.isDarkModeOn(context as Activity)) { + mapView.overlayManager.tilesOverlay.setColorFilter(TilesOverlay.INVERT_COLORS) } // add compass to map @@ -143,7 +143,7 @@ data class TrackFragmentLayoutHolder(var context: Context, var inflater: LayoutI } else { track = Track() } - trackOverlay = MapHelper.createTrackOverlay(context, track, Keys.STATE_NOT_TRACKING) + trackOverlay = MapHelper.createTrackOverlay(context, track, Keys.STATE_TRACKING_NOT) if (track.wayPoints.isNotEmpty()) { mapView.overlays.add(trackOverlay) } diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 256b663..804be6d 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -26,9 +26,6 @@ Tip: nøjagtigheden af højde målingerne afhænger af din enhed. Op ad og nedadgående højder på hele ruten måles. Installer filhåndtering eller GPX læser først. - Skifter til nat tilstand (langt tryk genkendt) - Skifter til dag tilstand (langt tryk genkendt) - Skifter til at følge telefonens indstillinger (langt tryk genkendt) Tid Nøjagtighed diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 13aec95..229f740 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -27,9 +27,6 @@ Hinweis: Die Genauogkeit der Höhenmeter-Werte ist geräteabhängig. Gemessen werden die Steigungen und Gefälle der Gesamtstrecke. Bitte zunächst einen Dateimanager oder GPX-Betrachter installieren. - Nachtmodus aktiviert (Längeres Drücken erkannt) - Tagmodus aktiviert (Längeres Drücken erkannt) - Modus Systemeinstellung Beachten aktiviert (Längeres Drücken erkannt) Uhrzeit Genauigkeit diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f88ac7e..900bf9b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -27,9 +27,6 @@ Astuce : La précision des données d\'altitude dépend de votre appareil. La dénivellation globale du parcours est mesurée. Veuillez installer un gestionnaire de fichiers ou un visualiseur de fichier GPX. - Passage au mode Jour (appui long détecté) - Passage au mode Système (appui long détecté) - Passage au mode Nuit (appui long détecté) Précision Heure diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index bd3b6ce..d727f16 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -27,9 +27,6 @@ Suggerimento: L\'accuratezza dei dati dell\'altitudine dipende dal tuo dispositivo. Sono misurate la salita e la discesa di tutto il percorso. Per favore installa prima un gestore di file o un visualizzatore di tracce GPX. - Passaggio alla modalità notturna (pressione prolungata rilevata) - Passaggio alla modalità diurna (pressione prolungata rilevata) - Passaggio alla modalità Segui Impostazione di Sistema (pressione prolungata rilevata) Ora Precisione diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 67764b0..340ffd1 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -56,7 +56,4 @@ 再開ボタン トレース削除ボタン GPX としてエクスポートする共有ボタン - 夜間モードに切り替えています (長押しを検出しました) - 日中モードに切り替えています (長押しを検出しました) - システム設定モードにしたがって切り替えています (長押しを検出しました) \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 619294a..70967b1 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -27,9 +27,6 @@ Hint: Høydedataens nøyaktighet avhenger av enheten din. Opp og ned-stigningen for hele ruten måles. Installer en filbehandler eller en GPX-sporviser først. - Bytter til nattmodus (oppdaget langt trykk) - Bytter til dagmodus (oppdaget langt trykk) - Bytter til å følge systeminnstilling (oppdaget langt trykk) Tid Nøyaktighet diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 981b99d..0476be8 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -27,9 +27,6 @@ Tip: de nauwkeurigheid van de hoogtegegevens hangt af van uw apparaat. Het gemiddelde van de gehele route wordt genomen. Installeer eerst een bestandsbeheerder of GPX-viewer. - Nachtmodus geactiveerd (lange druk gedetecteerd) - Dagmodus geactiveerd (lange druk gedetecteerd) - Systeeminstellingen worden toegepast (lange druk gedetecteerd) Tijd Nauwkeurigheid diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6bb6296..d89b48e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -39,10 +39,7 @@ 提示:海拔数据的准确性取决于您的设备.测量整个路线的上坡和下坡海拔. 请先安装一个文件管理器或GPX轨迹查看器. - 切换到夜间模式(检测到长按) - 切换到白日模式(检测到长按) - 切换到跟随系统设置模式(检测到长按) - + 时间 误差 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1908e1d..853a101 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -39,9 +39,6 @@ Hint: The accuracy of elevation data depends on your device. The uphill and downhill elevation of the whole route is measured. Please install a file manager or a GPX track viewer first. - Switching to Night mode (long press detected) - Switching to Day mode (long press detected) - Switching to Follow System Setting mode (long press detected) Time Accuracy @@ -79,6 +76,11 @@ Use Imperial Measurements Reset advanced settings to defaults. Reset + Dark mode + Same as device + Light mode + Current theme: + App Theme hrs min diff --git a/build.gradle b/build.gradle index c84ec78..b4cd4ca 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.5.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }