diff --git a/app/src/main/java/org/y20k/trackbook/MainActivity.kt b/app/src/main/java/org/y20k/trackbook/MainActivity.kt index 91bf4ee..ccd99b0 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivity.kt +++ b/app/src/main/java/org/y20k/trackbook/MainActivity.kt @@ -53,7 +53,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) // todo: remove after testing finished - if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { StrictMode.setVmPolicy( VmPolicy.Builder() .detectNonSdkApiUsage() @@ -109,7 +109,7 @@ class MainActivity : AppCompatActivity() { private val sharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> when (key) { Keys.PREF_THEME_SELECTION -> { - AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection(this@MainActivity)) + AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection()) } } } diff --git a/app/src/main/java/org/y20k/trackbook/MapFragment.kt b/app/src/main/java/org/y20k/trackbook/MapFragment.kt index a41a05a..ca7d6a9 100644 --- a/app/src/main/java/org/y20k/trackbook/MapFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/MapFragment.kt @@ -71,7 +71,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlayHelpe // get current best location currentBestLocation = LocationHelper.getLastKnownLocation(activity as Context) // get saved tracking state - trackingState = PreferencesHelper.loadTrackingState(activity as Context) + trackingState = PreferencesHelper.loadTrackingState() } @@ -319,7 +319,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlayHelpe when (key) { Keys.PREF_TRACKING_STATE -> { if (activity != null) { - trackingState = PreferencesHelper.loadTrackingState(activity as Context) + trackingState = PreferencesHelper.loadTrackingState() layout.updateRecordingButton(trackingState) } } diff --git a/app/src/main/java/org/y20k/trackbook/Trackbook.kt b/app/src/main/java/org/y20k/trackbook/Trackbook.kt index cc9615d..ca70c6e 100644 --- a/app/src/main/java/org/y20k/trackbook/Trackbook.kt +++ b/app/src/main/java/org/y20k/trackbook/Trackbook.kt @@ -22,6 +22,7 @@ import android.app.Application import org.y20k.trackbook.helpers.AppThemeHelper import org.y20k.trackbook.helpers.LogHelper import org.y20k.trackbook.helpers.PreferencesHelper +import org.y20k.trackbook.helpers.PreferencesHelper.initPreferences /* @@ -38,8 +39,10 @@ class Trackbook: Application() { override fun onCreate() { super.onCreate() LogHelper.v(TAG, "Trackbook application started.") + // initialize single sharedPreferences object when app is launched + initPreferences() // set Dark / Light theme state - AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection(this)) + AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection()) } diff --git a/app/src/main/java/org/y20k/trackbook/TrackerService.kt b/app/src/main/java/org/y20k/trackbook/TrackerService.kt index 5ba3fbd..579f228 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackerService.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackerService.kt @@ -83,9 +83,9 @@ class TrackerService: Service(), SensorEventListener { /* Overrides onCreate from Service */ override fun onCreate() { super.onCreate() - gpsOnly = PreferencesHelper.loadGpsOnly(this) - useImperial = PreferencesHelper.loadUseImperialUnits(this) - accuracyMultiplier = PreferencesHelper.loadAccuracyMultiplier(this) + gpsOnly = PreferencesHelper.loadGpsOnly() + useImperial = PreferencesHelper.loadUseImperialUnits() + accuracyMultiplier = PreferencesHelper.loadAccuracyMultiplier() locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager sensorManager = this.getSystemService(Context.SENSOR_SERVICE) as SensorManager @@ -95,10 +95,10 @@ class TrackerService: Service(), SensorEventListener { networkProviderActive = LocationHelper.isNetworkEnabled(locationManager) gpsLocationListener = createLocationListener() networkLocationListener = createLocationListener() - trackingState = PreferencesHelper.loadTrackingState(this) + trackingState = PreferencesHelper.loadTrackingState() currentBestLocation = LocationHelper.getLastKnownLocation(this) track = FileHelper.readTrack(this, FileHelper.getTempFileUri(this)) - altitudeValues.capacity = PreferencesHelper.loadAltitudeSmoothingValue(this) + altitudeValues.capacity = PreferencesHelper.loadAltitudeSmoothingValue() PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener( sharedPreferenceChangeListener ) @@ -239,7 +239,7 @@ class TrackerService: Service(), SensorEventListener { } // set state trackingState = Keys.STATE_TRACKING_ACTIVE - PreferencesHelper.saveTrackingState(this, trackingState) + PreferencesHelper.saveTrackingState(trackingState) // start recording steps and location fixes startStepCounter() handler.postDelayed(periodicTrackUpdate, 0) @@ -255,7 +255,7 @@ class TrackerService: Service(), SensorEventListener { CoroutineScope(IO).launch { FileHelper.saveTempTrackSuspended(this@TrackerService, track) } // save state trackingState = Keys.STATE_TRACKING_STOPPED - PreferencesHelper.saveTrackingState(this, trackingState) + PreferencesHelper.saveTrackingState(trackingState) // reset altitude values queue altitudeValues.reset() // stop recording steps and location fixes @@ -272,7 +272,7 @@ class TrackerService: Service(), SensorEventListener { track = Track() FileHelper.deleteTempFile(this) trackingState = Keys.STATE_TRACKING_NOT - PreferencesHelper.saveTrackingState(this, trackingState) + PreferencesHelper.saveTrackingState(trackingState) stopForeground(true) } @@ -469,7 +469,7 @@ class TrackerService: Service(), SensorEventListener { when (key) { // preference "Restrict to GPS" Keys.PREF_GPS_ONLY -> { - gpsOnly = PreferencesHelper.loadGpsOnly(this@TrackerService) + gpsOnly = PreferencesHelper.loadGpsOnly() when (gpsOnly) { true -> removeNetworkLocationListener() false -> addNetworkLocationListener() @@ -477,11 +477,11 @@ class TrackerService: Service(), SensorEventListener { } // preference "Use Imperial Measurements" Keys.PREF_USE_IMPERIAL_UNITS -> { - useImperial = PreferencesHelper.loadUseImperialUnits(this@TrackerService) + useImperial = PreferencesHelper.loadUseImperialUnits() } // preference "Recording Accuracy" Keys.PREF_RECORDING_ACCURACY_HIGH -> { - accuracyMultiplier = PreferencesHelper.loadAccuracyMultiplier(this@TrackerService) + accuracyMultiplier = PreferencesHelper.loadAccuracyMultiplier() } } } diff --git a/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt b/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt index 2e37dcf..fa28931 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt @@ -47,7 +47,7 @@ class TrackingToggleTileService: TileService() { override fun onTileAdded() { super.onTileAdded() // get saved tracking state - trackingState = PreferencesHelper.loadTrackingState(this) + trackingState = PreferencesHelper.loadTrackingState() // set up tile updateTile() } @@ -62,7 +62,7 @@ class TrackingToggleTileService: TileService() { override fun onStartListening() { super.onStartListening() // get saved tracking state - trackingState = PreferencesHelper.loadTrackingState(this) + trackingState = PreferencesHelper.loadTrackingState() // set up tile updateTile() // register listener for changes in shared preferences @@ -141,7 +141,7 @@ class TrackingToggleTileService: TileService() { private val sharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> when (key) { Keys.PREF_TRACKING_STATE -> { - trackingState = PreferencesHelper.loadTrackingState(this) + trackingState = PreferencesHelper.loadTrackingState() updateTile() } } diff --git a/app/src/main/java/org/y20k/trackbook/helpers/AppThemeHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/AppThemeHelper.kt index 9500951..ed8dfed 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/AppThemeHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/AppThemeHelper.kt @@ -77,7 +77,7 @@ object AppThemeHelper { /* Returns a readable String for currently selected App Theme */ fun getCurrentTheme(context: Context): String { - return when (PreferencesHelper.loadThemeSelection(context)) { + return when (PreferencesHelper.loadThemeSelection()) { 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) diff --git a/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.kt index 7a8ee4c..2423d1e 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.kt @@ -62,7 +62,7 @@ object LocationHelper { /* Tries to return the last location that the system has stored */ fun getLastKnownLocation(context: Context): Location { // get last location that Trackbook has stored - var lastKnownLocation: Location = PreferencesHelper.loadCurrentBestLocation(context) + var lastKnownLocation: Location = PreferencesHelper.loadCurrentBestLocation() // try to get the last location the system has stored - it is probably more recent if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager 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 2c5b60b..6306f85 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/PreferencesHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/PreferencesHelper.kt @@ -18,6 +18,7 @@ package org.y20k.trackbook.helpers import android.content.Context +import android.content.SharedPreferences import android.location.Location import android.location.LocationManager import androidx.core.content.edit @@ -35,121 +36,104 @@ object PreferencesHelper { /* Define log tag */ private val TAG: String = LogHelper.makeLogTag(PreferencesHelper::class.java) + /* The sharedPreferences object to be initialized */ + private lateinit var sharedPreferences: SharedPreferences + + /* Initialize a single sharedPreferences object when the app is launched */ + fun Context.initPreferences() { + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) + } + + /* Loads zoom level of map */ - fun loadZoomLevel(context: Context): Double { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - // load zoom level - return settings.getDouble(Keys.PREF_MAP_ZOOM_LEVEL, Keys.DEFAULT_ZOOM_LEVEL) + fun loadZoomLevel(): Double { + return sharedPreferences.getDouble(Keys.PREF_MAP_ZOOM_LEVEL, Keys.DEFAULT_ZOOM_LEVEL) } /* Saves zoom level of map */ - fun saveZoomLevel(context: Context, zoomLevel: Double) { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - // save zoom level - settings.edit { putDouble(Keys.PREF_MAP_ZOOM_LEVEL, zoomLevel) } + fun saveZoomLevel(zoomLevel: Double) { + sharedPreferences.edit { + putDouble(Keys.PREF_MAP_ZOOM_LEVEL, zoomLevel) + } } /* Loads tracking state */ - fun loadTrackingState(context: Context): Int { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) + fun loadTrackingState(): Int { // load tracking state - return settings.getInt(Keys.PREF_TRACKING_STATE, Keys.STATE_TRACKING_NOT) + return sharedPreferences.getInt(Keys.PREF_TRACKING_STATE, Keys.STATE_TRACKING_NOT) } /* Saves tracking state */ - fun saveTrackingState(context: Context, trackingState: Int) { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - // save tracking state - settings.edit { putInt(Keys.PREF_TRACKING_STATE, trackingState) } + fun saveTrackingState(trackingState: Int) { + sharedPreferences.edit { + putInt(Keys.PREF_TRACKING_STATE, trackingState) + } } /* Loads length unit system - metric or imperial */ - fun loadUseImperialUnits(context: Context): Boolean { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - // load length unit system - return settings.getBoolean(Keys.PREF_USE_IMPERIAL_UNITS, LengthUnitHelper.useImperialUnits()) + fun loadUseImperialUnits(): Boolean { + return sharedPreferences.getBoolean(Keys.PREF_USE_IMPERIAL_UNITS, LengthUnitHelper.useImperialUnits()) } /* Loads length unit system - metric or imperial */ - fun loadGpsOnly(context: Context): Boolean { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - // load length unit system - return settings.getBoolean(Keys.PREF_GPS_ONLY, false) + fun loadGpsOnly(): Boolean { + return sharedPreferences.getBoolean(Keys.PREF_GPS_ONLY, false) } /* Loads accuracy threshold used to determine if location is good enough */ - fun loadAccuracyThreshold(context: Context): Int { + fun loadAccuracyThreshold(): Int { // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) + // load tracking state - return settings.getInt(Keys.PREF_LOCATION_ACCURACY_THRESHOLD, Keys.DEFAULT_THRESHOLD_LOCATION_ACCURACY) + return sharedPreferences.getInt(Keys.PREF_LOCATION_ACCURACY_THRESHOLD, Keys.DEFAULT_THRESHOLD_LOCATION_ACCURACY) } /* Loads state of recording accuracy */ - fun loadRecordingAccuracyHigh(context: Context): Boolean { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - // load current setting - return settings.getBoolean(Keys.PREF_RECORDING_ACCURACY_HIGH, false) + fun loadRecordingAccuracyHigh(): Boolean { + return sharedPreferences.getBoolean(Keys.PREF_RECORDING_ACCURACY_HIGH, false) } /* Loads current accuracy multiplier */ - fun loadAccuracyMultiplier(context: Context): Int { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - // load current setting - val recordingAccuracyHigh: Boolean = settings.getBoolean(Keys.PREF_RECORDING_ACCURACY_HIGH, false) + fun loadAccuracyMultiplier(): Int { + val recordingAccuracyHigh: Boolean = sharedPreferences.getBoolean(Keys.PREF_RECORDING_ACCURACY_HIGH, false) // return multiplier based on state return if (recordingAccuracyHigh) 2 else 1 } /* Load altitude smoothing value */ - fun loadAltitudeSmoothingValue(context: Context): Int { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - // load current setting - return settings.getInt(Keys.PREF_ALTITUDE_SMOOTHING_VALUE, Keys.DEFAULT_ALTITUDE_SMOOTHING_VALUE) + fun loadAltitudeSmoothingValue(): Int { + return sharedPreferences.getInt(Keys.PREF_ALTITUDE_SMOOTHING_VALUE, Keys.DEFAULT_ALTITUDE_SMOOTHING_VALUE) } /* Loads the state of a map */ - fun loadCurrentBestLocation(context: Context): Location { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - val provider: String = settings.getString(Keys.PREF_CURRENT_BEST_LOCATION_PROVIDER, LocationManager.NETWORK_PROVIDER) ?: LocationManager.NETWORK_PROVIDER + fun loadCurrentBestLocation(): Location { // create location + val provider: String = sharedPreferences.getString(Keys.PREF_CURRENT_BEST_LOCATION_PROVIDER, LocationManager.NETWORK_PROVIDER) ?: LocationManager.NETWORK_PROVIDER val currentBestLocation: Location = Location(provider) // load location attributes - currentBestLocation.latitude = settings.getDouble(Keys.PREF_CURRENT_BEST_LOCATION_LATITUDE, Keys.DEFAULT_LATITUDE) - currentBestLocation.longitude = settings.getDouble(Keys.PREF_CURRENT_BEST_LOCATION_LONGITUDE, Keys.DEFAULT_LONGITUDE) - currentBestLocation.accuracy = settings.getFloat(Keys.PREF_CURRENT_BEST_LOCATION_ACCURACY, Keys.DEFAULT_ACCURACY) - currentBestLocation.altitude = settings.getDouble(Keys.PREF_CURRENT_BEST_LOCATION_ALTITUDE, Keys.DEFAULT_ALTITUDE) - currentBestLocation.time = settings.getLong(Keys.PREF_CURRENT_BEST_LOCATION_TIME, Keys.DEFAULT_TIME) + currentBestLocation.latitude = sharedPreferences.getDouble(Keys.PREF_CURRENT_BEST_LOCATION_LATITUDE, Keys.DEFAULT_LATITUDE) + currentBestLocation.longitude = sharedPreferences.getDouble(Keys.PREF_CURRENT_BEST_LOCATION_LONGITUDE, Keys.DEFAULT_LONGITUDE) + currentBestLocation.accuracy = sharedPreferences.getFloat(Keys.PREF_CURRENT_BEST_LOCATION_ACCURACY, Keys.DEFAULT_ACCURACY) + currentBestLocation.altitude = sharedPreferences.getDouble(Keys.PREF_CURRENT_BEST_LOCATION_ALTITUDE, Keys.DEFAULT_ALTITUDE) + currentBestLocation.time = sharedPreferences.getLong(Keys.PREF_CURRENT_BEST_LOCATION_TIME, Keys.DEFAULT_TIME) return currentBestLocation } /* Saves the state of a map */ - fun saveCurrentBestLocation(context: Context, currentBestLocation: Location) { - // get preferences - val settings = PreferenceManager.getDefaultSharedPreferences(context) - settings.edit { + fun saveCurrentBestLocation(currentBestLocation: Location) { + sharedPreferences.edit { // save location putDouble(Keys.PREF_CURRENT_BEST_LOCATION_LATITUDE, currentBestLocation.latitude) putDouble(Keys.PREF_CURRENT_BEST_LOCATION_LONGITUDE, currentBestLocation.longitude) @@ -161,22 +145,22 @@ object PreferencesHelper { /* 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 + fun loadThemeSelection(): String { + return sharedPreferences.getString(Keys.PREF_THEME_SELECTION, Keys.STATE_THEME_FOLLOW_SYSTEM) ?: Keys.STATE_THEME_FOLLOW_SYSTEM } /* Checks if housekeeping work needs to be done - used usually in DownloadWorker "REQUEST_UPDATE_COLLECTION" */ - fun isHouseKeepingNecessary(context: Context): Boolean { - val settings = PreferenceManager.getDefaultSharedPreferences(context) - return settings.getBoolean(Keys.PREF_ONE_TIME_HOUSEKEEPING_NECESSARY, true) + fun isHouseKeepingNecessary(): Boolean { + return sharedPreferences.getBoolean(Keys.PREF_ONE_TIME_HOUSEKEEPING_NECESSARY, true) } /* Saves state of housekeeping */ - fun saveHouseKeepingNecessaryState(context: Context, state: Boolean = false) { - val settings = PreferenceManager.getDefaultSharedPreferences(context) - settings.edit { putBoolean(Keys.PREF_ONE_TIME_HOUSEKEEPING_NECESSARY, state) } + fun saveHouseKeepingNecessaryState(state: Boolean = false) { + sharedPreferences.edit { + putBoolean(Keys.PREF_ONE_TIME_HOUSEKEEPING_NECESSARY, state) + } } } diff --git a/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt b/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt index 314f644..7e4bd57 100644 --- a/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt +++ b/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt @@ -51,7 +51,7 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter