Skip to content

Commit

Permalink
feat(#95): allow to override local app settings
Browse files Browse the repository at this point in the history
  • Loading branch information
sgrimault committed Mar 2, 2024
1 parent 49d48e5 commit 3c0592f
Show file tree
Hide file tree
Showing 69 changed files with 2,798 additions and 586 deletions.
34 changes: 33 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ Based on [datasync module](https://github.com/PnX-SI/gn_mobile_core) to synchron

## Settings

Example:
The app settings file is automatically updated when the application is started, as soon as the *GeoNature* URL is defined.
This settings file `settings_occtax.json` can be found in the `Android/data/fr.geonature.occtax2/` directory of the terminal's main storage. Example:

```json
{
Expand Down Expand Up @@ -268,6 +269,37 @@ Each property may be a simple string representing the nomenclature attribute to
}
```

### Override parameters from app settings

As this settings file is updated automatically, we advise you not to update it directly by hand.
To do this, you can overwrite the values from the *GeoNature* server by creating a `settings_occtax.local.json` file in the same location as the app settings file.
Then simply copy the parameters to be overwritten, respecting the JSON structure of the app settings file. Example, to override map layers configuration:

```json
{
"map": {
"layers": [
{
"label": "OpenStreetMap",
"source": [
"https://a.tile.openstreetmap.org",
"https://b.tile.openstreetmap.org",
"https://c.tile.openstreetmap.org"
]
},
{
"label": "My awesome layer",
"source": "custom.mbtiles"
}
]
}
}
```

**⚠ Note:** When using such a configuration, which can potentially replace all the application's parameters, it's your responsibility to ensure that the final configuration is always valid and keeps pace with any changes made to *GeoNature*.

In case of errors, if the final configuration is incorrect, the application will automatically ignore the settings file that allows you to replace the parameters and load the default configuration from *GeoNature*. Any errors reported can be found in the application logs.

## Upgrade git sub modules

Do **NOT** modify directly any git sub modules (e.g. `commons`, `compat`, `mountpoint`, `viewpager`
Expand Down
2 changes: 1 addition & 1 deletion gn_mobile_core
Submodule gn_mobile_core updated 30 files
+1 −1 commons/build.gradle
+14 −11 commons/src/main/java/fr/geonature/commons/data/entity/AbstractTaxon.kt
+9 −7 commons/src/main/java/fr/geonature/commons/data/entity/InputObserver.kt
+2 −1 commons/src/main/java/fr/geonature/commons/data/entity/TaxonWithArea.kt
+1 −1 commons/src/main/java/fr/geonature/commons/data/entity/Taxonomy.kt
+0 −45 commons/src/main/java/fr/geonature/commons/data/helper/EntityHelper.kt
+62 −0 commons/src/main/java/fr/geonature/commons/data/helper/SQLStringHelper.kt
+0 −109 commons/src/main/java/fr/geonature/commons/settings/AppSettingsManagerImpl.kt
+0 −42 commons/src/main/java/fr/geonature/commons/settings/AppSettingsViewModel.kt
+0 −10 commons/src/main/java/fr/geonature/commons/settings/IAppSettings.kt
+0 −19 commons/src/main/java/fr/geonature/commons/settings/IAppSettingsManager.kt
+0 −22 commons/src/main/java/fr/geonature/commons/settings/error/AppSettingsException.kt
+0 −126 commons/src/main/java/fr/geonature/commons/settings/io/AppSettingsJsonReader.kt
+5 −5 commons/src/test/java/fr/geonature/commons/data/entity/InputObserverTest.kt
+7 −7 commons/src/test/java/fr/geonature/commons/data/entity/TaxonTest.kt
+2 −2 commons/src/test/java/fr/geonature/commons/data/entity/TaxonWithAreaTest.kt
+0 −13 commons/src/test/java/fr/geonature/commons/data/helper/EntityHelperTest.kt
+36 −0 commons/src/test/java/fr/geonature/commons/data/helper/SQLStringHelperTest.kt
+0 −148 commons/src/test/java/fr/geonature/commons/settings/AppSettingsManagerTest.kt
+0 −79 commons/src/test/java/fr/geonature/commons/settings/AppSettingsViewModelTest.kt
+0 −35 commons/src/test/java/fr/geonature/commons/settings/DummyAppSettings.kt
+0 −81 commons/src/test/java/fr/geonature/commons/settings/io/AppSettingsJsonReaderTest.kt
+0 −3 commons/src/test/resources/fixtures/settings_dummy.json
+2 −2 commons/version.properties
+1 −1 datasync/build.gradle
+3 −1 datasync/src/main/java/fr/geonature/datasync/settings/DataSyncSettings.kt
+4 −2 datasync/src/main/java/fr/geonature/datasync/settings/io/DataSyncSettingsJsonReader.kt
+38 −0 datasync/src/test/java/fr/geonature/datasync/settings/io/DataSyncSettingsJsonReaderTest.kt
+5 −0 datasync/src/test/resources/fixtures/settings_datasync_partial.json
+2 −2 datasync/version.properties
2 changes: 1 addition & 1 deletion gn_mobile_maps
Submodule gn_mobile_maps updated 50 files
+8 −3 app/build.gradle
+2 −0 app/src/main/java/fr/geonature/maps/sample/MainApplication.kt
+1 −1 app/src/main/java/fr/geonature/maps/sample/ui/home/HomeListFragment.kt
+2 −0 app/src/main/java/fr/geonature/maps/sample/ui/map/MapActivity.kt
+1 −1 app/src/main/java/fr/geonature/maps/sample/ui/settings/PreferencesFragment.kt
+3 −0 build.gradle
+14 −2 maps/build.gradle
+49 −0 maps/src/main/java/fr/geonature/maps/layer/LayerModule.kt
+0 −446 maps/src/main/java/fr/geonature/maps/layer/LayerSettingsViewModel.kt
+33 −0 maps/src/main/java/fr/geonature/maps/layer/data/ILayerLocalDataSource.kt
+25 −0 maps/src/main/java/fr/geonature/maps/layer/data/ISelectedLayersLocalDataSource.kt
+282 −0 maps/src/main/java/fr/geonature/maps/layer/data/LayerLocalDataSourceImpl.kt
+47 −0 maps/src/main/java/fr/geonature/maps/layer/data/SelectedLayersLocalDataSourceImpl.kt
+16 −4 maps/src/main/java/fr/geonature/maps/layer/error/LayerException.kt
+329 −0 maps/src/main/java/fr/geonature/maps/layer/presentation/LayerSettingsViewModel.kt
+43 −0 maps/src/main/java/fr/geonature/maps/layer/repository/ILayerRepository.kt
+95 −0 maps/src/main/java/fr/geonature/maps/layer/repository/LayerRepositoryImpl.kt
+1 −1 maps/src/main/java/fr/geonature/maps/layer/tilesource/GeoportailWMTSOnlineLayerTileSource.kt
+1 −1 maps/src/main/java/fr/geonature/maps/layer/tilesource/OSMOnlineLayerTileSource.kt
+1 −1 maps/src/main/java/fr/geonature/maps/layer/tilesource/OpenTopoMapOnlineLayerTileSource.kt
+4 −8 maps/src/main/java/fr/geonature/maps/layer/tilesource/TileSourceFactory.kt
+1 −1 maps/src/main/java/fr/geonature/maps/layer/tilesource/WikimediaOnlineLayerTileSource.kt
+14 −1 maps/src/main/java/fr/geonature/maps/settings/LayerSettings.kt
+54 −70 maps/src/main/java/fr/geonature/maps/settings/MapSettings.kt
+18 −2 maps/src/main/java/fr/geonature/maps/settings/io/MapSettingsReader.kt
+106 −43 maps/src/main/java/fr/geonature/maps/ui/MapFragment.kt
+67 −44 maps/src/main/java/fr/geonature/maps/ui/dialog/LayerSettingsBottomSheetDialogFragment.kt
+1 −1 maps/src/main/java/fr/geonature/maps/ui/dialog/LayerSettingsRecyclerViewAdapter.kt
+50 −0 maps/src/main/java/fr/geonature/maps/util/LiveDataHelper.kt
+5 −38 maps/src/main/java/fr/geonature/maps/util/MapSettingsPreferencesUtils.kt
+10 −0 maps/src/main/res/drawable/ic_add_layer.xml
+10 −0 maps/src/main/res/drawable/ic_close.xml
+42 −0 maps/src/main/res/layout/bottom_sheet_layers.xml
+0 −21 maps/src/main/res/layout/fragment_recycler_view.xml
+1 −0 maps/src/main/res/layout/list_layer_header.xml
+12 −0 maps/src/main/res/menu/layer_add.xml
+1 −0 maps/src/main/res/values-fr/strings.xml
+1 −0 maps/src/main/res/values/strings.xml
+26 −0 maps/src/test/java/fr/geonature/maps/CoroutineTestRule.kt
+340 −0 maps/src/test/java/fr/geonature/maps/layer/data/LayerLocalDataSourceTest.kt
+1 −1 maps/src/test/java/fr/geonature/maps/layer/tilesource/GeoportailWMTSOnlineLayerTileSourceTest.kt
+1 −1 maps/src/test/java/fr/geonature/maps/layer/tilesource/OSMOnlineLayerTileSourceTest.kt
+1 −1 maps/src/test/java/fr/geonature/maps/layer/tilesource/OpenTopoMapOnlineLayerTileSourceTest.kt
+3 −6 maps/src/test/java/fr/geonature/maps/layer/tilesource/TileSourceFactoryTest.kt
+1 −1 maps/src/test/java/fr/geonature/maps/layer/tilesource/WikimediaOnlineLayerTileSourceTest.kt
+66 −10 maps/src/test/java/fr/geonature/maps/settings/LayerSettingsTest.kt
+8 −8 maps/src/test/java/fr/geonature/maps/settings/MapSettingsTest.kt
+106 −8 maps/src/test/java/fr/geonature/maps/settings/io/MapSettingsReaderTest.kt
+8 −0 maps/src/test/resources/fixtures/map_settings_partial_layers.json
+2 −2 maps/version.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package fr.geonature.occtax.features.nomenclature.data

import fr.geonature.occtax.features.nomenclature.domain.EditableField
import fr.geonature.occtax.settings.PropertySettings
import fr.geonature.occtax.features.settings.domain.PropertySettings

/**
* Local data source about nomenclature types settings.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import fr.geonature.occtax.features.nomenclature.domain.EditableField
import fr.geonature.occtax.features.record.domain.AllMediaRecord
import fr.geonature.occtax.features.record.domain.CountingRecord
import fr.geonature.occtax.features.record.domain.PropertyValue
import fr.geonature.occtax.settings.PropertySettings
import fr.geonature.occtax.features.settings.domain.PropertySettings

/**
* Default implementation of [INomenclatureSettingsLocalDataSource].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import fr.geonature.commons.lifecycle.BaseViewModel
import fr.geonature.occtax.features.nomenclature.domain.EditableField
import fr.geonature.occtax.features.nomenclature.usecase.GetEditableFieldsUseCase
import fr.geonature.occtax.features.nomenclature.usecase.GetNomenclatureValuesByTypeAndTaxonomyUseCase
import fr.geonature.occtax.settings.PropertySettings
import fr.geonature.occtax.features.settings.domain.PropertySettings
import org.tinylog.Logger
import javax.inject.Inject

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package fr.geonature.occtax.features.nomenclature.repository

import fr.geonature.occtax.features.nomenclature.domain.EditableField
import fr.geonature.occtax.settings.PropertySettings
import fr.geonature.occtax.features.settings.domain.PropertySettings
import fr.geonature.commons.features.nomenclature.repository.INomenclatureRepository as IBaseNomenclatureRepository

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import fr.geonature.commons.features.nomenclature.error.NomenclatureException
import fr.geonature.occtax.features.nomenclature.data.INomenclatureSettingsLocalDataSource
import fr.geonature.occtax.features.nomenclature.domain.EditableField
import fr.geonature.occtax.features.record.domain.PropertyValue
import fr.geonature.occtax.settings.PropertySettings
import fr.geonature.occtax.features.settings.domain.PropertySettings
import org.tinylog.Logger
import fr.geonature.commons.features.nomenclature.repository.NomenclatureRepositoryImpl as BaseNomenclatureRepositoryImpl

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import fr.geonature.occtax.features.nomenclature.domain.EditableField
import fr.geonature.occtax.features.nomenclature.repository.IAdditionalFieldRepository
import fr.geonature.occtax.features.nomenclature.repository.IDefaultPropertyValueRepository
import fr.geonature.occtax.features.nomenclature.repository.INomenclatureRepository
import fr.geonature.occtax.settings.PropertySettings
import fr.geonature.occtax.features.settings.domain.PropertySettings
import javax.inject.Inject

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import dagger.hilt.components.SingletonComponent
import fr.geonature.commons.data.GeoNatureModuleName
import fr.geonature.commons.features.nomenclature.data.INomenclatureLocalDataSource
import fr.geonature.commons.features.taxon.data.ITaxonLocalDataSource
import fr.geonature.commons.settings.IAppSettingsManager
import fr.geonature.datasync.api.IGeoNatureAPIClient
import fr.geonature.datasync.auth.IAuthManager
import fr.geonature.occtax.api.IOcctaxAPIClient
Expand All @@ -25,7 +24,7 @@ import fr.geonature.occtax.features.record.repository.ISynchronizeObservationRec
import fr.geonature.occtax.features.record.repository.MediaRecordRepositoryImpl
import fr.geonature.occtax.features.record.repository.ObservationRecordRepositoryImpl
import fr.geonature.occtax.features.record.repository.SynchronizeObservationRecordRepositoryImpl
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.repository.IAppSettingsRepository
import javax.inject.Singleton

/**
Expand Down Expand Up @@ -85,7 +84,7 @@ object ObservationRecordModule {
@ApplicationContext appContext: Context,
geoNatureAPIClient: IGeoNatureAPIClient,
authManager: IAuthManager,
appSettingsManager: IAppSettingsManager<AppSettings>,
appSettingsRepository: IAppSettingsRepository,
nomenclatureLocalDataSource: INomenclatureLocalDataSource,
observationRecordLocalDataSource: IObservationRecordLocalDataSource,
observationRecordRemoteDataSource: IObservationRecordRemoteDataSource,
Expand All @@ -95,7 +94,7 @@ object ObservationRecordModule {
appContext,
geoNatureAPIClient,
authManager,
appSettingsManager,
appSettingsRepository,
nomenclatureLocalDataSource,
observationRecordLocalDataSource,
observationRecordRemoteDataSource,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package fr.geonature.occtax.features.record.data

import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.features.record.error.ObservationRecordException
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings

/**
* Local data source about [ObservationRecord].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package fr.geonature.occtax.features.record.data

import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.features.record.domain.TaxonRecord
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings

/**
* Remote data source about [ObservationRecord].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.features.record.error.ObservationRecordException
import fr.geonature.occtax.features.record.io.ObservationRecordJsonReader
import fr.geonature.occtax.features.record.io.ObservationRecordJsonWriter
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.asFlow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.features.record.error.ObservationRecordException
import fr.geonature.occtax.features.record.io.ObservationRecordJsonWriter
import fr.geonature.occtax.features.record.io.TaxonRecordJsonWriter
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings
import org.json.JSONObject
import retrofit2.await
import retrofit2.awaitResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import fr.geonature.maps.jts.geojson.io.GeoJsonWriter
import fr.geonature.occtax.features.record.domain.DatesRecord
import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.features.record.domain.PropertyValue
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.settings.InputDateSettings
import fr.geonature.occtax.features.settings.domain.AppSettings
import fr.geonature.occtax.features.settings.domain.InputDateSettings
import java.io.IOException
import java.io.StringWriter
import java.io.Writer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import fr.geonature.occtax.features.record.domain.CountingRecord
import fr.geonature.occtax.features.record.domain.MediaRecord
import fr.geonature.occtax.features.record.domain.PropertyValue
import fr.geonature.occtax.features.record.domain.TaxonRecord
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings
import java.io.IOException
import java.io.StringWriter
import java.io.Writer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import fr.geonature.occtax.features.record.usecase.ExportObservationRecordUseCas
import fr.geonature.occtax.features.record.usecase.GetAllObservationRecordsUseCase
import fr.geonature.occtax.features.record.usecase.SaveObservationRecordUseCase
import fr.geonature.occtax.features.record.worker.SynchronizeObservationRecordsWorker
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings
import kotlinx.coroutines.delay
import org.tinylog.kotlin.Logger
import java.util.UUID
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package fr.geonature.occtax.features.record.repository

import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings

/**
* [ObservationRecord] repository.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package fr.geonature.occtax.features.record.repository
import fr.geonature.commons.features.taxon.data.ITaxonLocalDataSource
import fr.geonature.occtax.features.record.data.IObservationRecordLocalDataSource
import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings

/**
* Default implementation of [IObservationRecordRepository].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package fr.geonature.occtax.features.record.repository
import android.content.Context
import fr.geonature.commons.data.entity.Nomenclature
import fr.geonature.commons.features.nomenclature.data.INomenclatureLocalDataSource
import fr.geonature.commons.settings.IAppSettingsManager
import fr.geonature.commons.settings.error.AppSettingsException
import fr.geonature.datasync.api.IGeoNatureAPIClient
import fr.geonature.datasync.api.model.AuthUser
import fr.geonature.datasync.auth.IAuthManager
Expand All @@ -17,7 +15,8 @@ import fr.geonature.occtax.features.record.data.IObservationRecordRemoteDataSour
import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.features.record.domain.TaxonRecord
import fr.geonature.occtax.features.record.error.ObservationRecordException
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.error.AppSettingsException
import fr.geonature.occtax.features.settings.repository.IAppSettingsRepository
import org.tinylog.kotlin.Logger
import retrofit2.await
import retrofit2.awaitResponse
Expand All @@ -34,7 +33,7 @@ class SynchronizeObservationRecordRepositoryImpl(
private val context: Context,
private val geoNatureAPIClient: IGeoNatureAPIClient,
private val authManager: IAuthManager,
private val appSettingsManager: IAppSettingsManager<AppSettings>,
private val appSettingsRepository: IAppSettingsRepository,
private val nomenclatureLocalDataSource: INomenclatureLocalDataSource,
private val observationRecordLocalDataSource: IObservationRecordLocalDataSource,
private val observationRecordRemoteDataSource: IObservationRecordRemoteDataSource,
Expand All @@ -49,11 +48,16 @@ class SynchronizeObservationRecordRepositoryImpl(
val authUser = authManager.getAuthLogin()?.user
?: return Result.failure(AuthException.NotConnectedException)

val appSettings = appSettingsManager.loadAppSettings()
?: return Result.failure(AppSettingsException.NoAppSettingsFoundLocallyException)
val appSettings = appSettingsRepository.loadAppSettings()
.let {
it.getOrNull() ?: return Result.failure(
it.exceptionOrNull()
?.let { t -> if (t is AppSettingsException.MissingAttributeException && t.attributeName == "sync") DataSyncSettingsNotFoundException() else t }
?: AppSettingsException.NotFoundException
)
}

val dataSyncSettings = appSettings.dataSyncSettings
?: return Result.failure(DataSyncSettingsNotFoundException())

observationRecordRemoteDataSource.setBaseUrl(dataSyncSettings.geoNatureServerUrl)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package fr.geonature.occtax.features.record.usecase
import fr.geonature.commons.interactor.BaseResultUseCase
import fr.geonature.occtax.features.record.domain.ObservationRecord
import fr.geonature.occtax.features.record.repository.IObservationRecordRepository
import fr.geonature.occtax.settings.AppSettings
import fr.geonature.occtax.features.settings.domain.AppSettings
import javax.inject.Inject

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package fr.geonature.occtax.features.settings

import android.content.Context
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import fr.geonature.datasync.settings.AppSettingsFilename
import fr.geonature.occtax.features.settings.data.AppSettingsFileLocalDataSourceImpl
import fr.geonature.occtax.features.settings.data.IAppSettingsLocalDataSource
import fr.geonature.occtax.features.settings.domain.AppSettings
import fr.geonature.occtax.features.settings.repository.AppSettingsRepositoryImpl
import fr.geonature.occtax.features.settings.repository.IAppSettingsRepository
import javax.inject.Singleton

/**
* [AppSettings] module.
*
* @author S. Grimault
*/
@Module
@InstallIn(SingletonComponent::class)
object AppSettingsModule {

@Singleton
@Provides
fun provideAppSettingsDataSource(
@ApplicationContext appContext: Context,
@AppSettingsFilename appSettingsFilename: String
): IAppSettingsLocalDataSource {
return AppSettingsFileLocalDataSourceImpl(
appContext,
appSettingsFilename
)
}

@Singleton
@Provides
fun provideAppSettingsRepository(
appSettingsLocalDataSource: IAppSettingsLocalDataSource
): IAppSettingsRepository {
return AppSettingsRepositoryImpl(appSettingsLocalDataSource)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package fr.geonature.occtax.features.settings.data

import android.content.Context
import fr.geonature.mountpoint.model.MountPoint
import fr.geonature.mountpoint.util.FileUtils.getFile
import fr.geonature.mountpoint.util.FileUtils.getRootFolder
import fr.geonature.occtax.features.settings.domain.AppSettings
import fr.geonature.occtax.features.settings.error.AppSettingsException
import fr.geonature.occtax.features.settings.io.AppSettingsJsonReader
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.tinylog.Logger
import java.io.FileReader

/**
* Loads [AppSettings] from `JSON` file.
*
* @author S. Grimault
*/
class AppSettingsFileLocalDataSourceImpl(
private val context: Context,
private val appSettingsFilename: String,
private val dispatcher: CoroutineDispatcher = Dispatchers.IO
) : IAppSettingsLocalDataSource {
override suspend fun load(appSettings: AppSettings?): AppSettings = withContext(dispatcher) {
val appSettingsJsonFile = getFile(
getRootFolder(
context,
MountPoint.StorageType.INTERNAL
),
if (appSettings == null) appSettingsFilename else "${appSettingsFilename.substringBeforeLast(".json")}.local.json"
)

Logger.info { "loading${if (appSettings == null) " " else " additional "}settings from '${appSettingsJsonFile.absolutePath}'..." }

if (!appSettingsJsonFile.exists()) {
throw AppSettingsException.NoAppSettingsFoundLocallyException(appSettingsJsonFile.absolutePath)
}

run {
AppSettingsJsonReader(appSettings).read(FileReader(appSettingsJsonFile))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package fr.geonature.occtax.features.settings.data

import fr.geonature.occtax.features.settings.error.AppSettingsException
import fr.geonature.occtax.features.settings.domain.AppSettings

/**
* [AppSettings] local data source.
*
* @author S. Grimault
*/
interface IAppSettingsLocalDataSource {

/**
* Loads [AppSettings].
*
* @param appSettings existing [AppSettings] to override.
* @return [AppSettings] or throws [AppSettingsException] if something goes wrong.
*/
suspend fun load(appSettings: AppSettings? = null): AppSettings
}
Loading

0 comments on commit 3c0592f

Please sign in to comment.