diff --git a/.gitignore b/.gitignore
index f4f4b3cb..ab834a97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@
/build
/captures
/docs/.asciidoctor
+/docs/images/uml
/docs/vendor
/docs/*.html
.externalNativeBuild
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 00000000..61a9130c
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 3b84fa5b..f4f4cccb 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -18,6 +18,7 @@
+
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 00000000..a5f05cd8
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index db29518c..a623051b 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,5 +5,5 @@
-
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 1bac1d4c..8cc327f6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.3.72'
+ ext.kotlin_version = '1.4.21'
repositories {
google()
@@ -12,9 +12,9 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.0.1'
+ classpath 'com.android.tools.build:gradle:4.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- classpath "org.jlleitschuh.gradle:ktlint-gradle:9.1.1"
+ classpath "org.jlleitschuh.gradle:ktlint-gradle:9.4.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
diff --git a/commons/build.gradle b/commons/build.gradle
index fdb016ac..94c12d7b 100644
--- a/commons/build.gradle
+++ b/commons/build.gradle
@@ -1,8 +1,7 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-version = "0.7.6"
+version = "0.8.0"
android {
compileSdkVersion 29
@@ -43,21 +42,23 @@ dependencies {
api project(':mountpoint')
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha03"
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1"
+
+ implementation 'androidx.appcompat:appcompat:1.3.0-beta01'
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-rc01"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
- implementation 'androidx.preference:preference:1.1.1'
- implementation 'com.google.android.material:material:1.1.0'
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.4"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0"
- api 'androidx.room:room-runtime:2.2.5'
-
- testImplementation 'androidx.test:core:1.2.0'
+ implementation 'androidx.preference:preference-ktx:1.1.1'
+ implementation 'com.google.android.material:material:1.3.0-rc01'
+
+ api 'androidx.room:room-runtime:2.2.6'
+
testImplementation 'androidx.arch.core:core-testing:2.1.0'
- testImplementation 'junit:junit:4.13'
+ testImplementation 'androidx.test:core:1.3.0'
+ testImplementation 'junit:junit:4.13.1'
testImplementation 'org.mockito:mockito-core:3.0.0'
testImplementation 'org.robolectric:robolectric:4.3.1'
- androidTestImplementation 'androidx.test:runner:1.2.0'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+ androidTestImplementation 'androidx.test:runner:1.3.0'
}
\ No newline at end of file
diff --git a/commons/src/main/java/fr/geonature/commons/data/DefaultNomenclature.kt b/commons/src/main/java/fr/geonature/commons/data/DefaultNomenclature.kt
index e7a6353d..7182e152 100644
--- a/commons/src/main/java/fr/geonature/commons/data/DefaultNomenclature.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/DefaultNomenclature.kt
@@ -18,12 +18,14 @@ import fr.geonature.commons.data.helper.get
@Entity(
tableName = DefaultNomenclature.TABLE_NAME,
primaryKeys = [DefaultNomenclature.COLUMN_MODULE, DefaultNomenclature.COLUMN_NOMENCLATURE_ID],
- foreignKeys = [ForeignKey(
- entity = Nomenclature::class,
- parentColumns = [Nomenclature.COLUMN_ID],
- childColumns = [DefaultNomenclature.COLUMN_NOMENCLATURE_ID],
- onDelete = ForeignKey.CASCADE
- )]
+ foreignKeys = [
+ ForeignKey(
+ entity = Nomenclature::class,
+ parentColumns = [Nomenclature.COLUMN_ID],
+ childColumns = [DefaultNomenclature.COLUMN_NOMENCLATURE_ID],
+ onDelete = ForeignKey.CASCADE
+ )
+ ]
)
open class DefaultNomenclature : Parcelable {
diff --git a/commons/src/main/java/fr/geonature/commons/data/NomenclatureTaxonomy.kt b/commons/src/main/java/fr/geonature/commons/data/NomenclatureTaxonomy.kt
index 8ae5a410..61770948 100644
--- a/commons/src/main/java/fr/geonature/commons/data/NomenclatureTaxonomy.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/NomenclatureTaxonomy.kt
@@ -19,17 +19,19 @@ import fr.geonature.commons.data.helper.get
tableName = NomenclatureTaxonomy.TABLE_NAME,
primaryKeys = [NomenclatureTaxonomy.COLUMN_NOMENCLATURE_ID, Taxonomy.COLUMN_KINGDOM, Taxonomy.COLUMN_GROUP],
indices = [Index(value = [Taxonomy.COLUMN_KINGDOM, Taxonomy.COLUMN_GROUP])],
- foreignKeys = [ForeignKey(
- entity = Nomenclature::class,
- parentColumns = [Nomenclature.COLUMN_ID],
- childColumns = [NomenclatureTaxonomy.COLUMN_NOMENCLATURE_ID],
- onDelete = ForeignKey.CASCADE
- ), ForeignKey(
- entity = Taxonomy::class,
- parentColumns = [Taxonomy.COLUMN_KINGDOM, Taxonomy.COLUMN_GROUP],
- childColumns = [Taxonomy.COLUMN_KINGDOM, Taxonomy.COLUMN_GROUP],
- onDelete = ForeignKey.CASCADE
- )]
+ foreignKeys = [
+ ForeignKey(
+ entity = Nomenclature::class,
+ parentColumns = [Nomenclature.COLUMN_ID],
+ childColumns = [NomenclatureTaxonomy.COLUMN_NOMENCLATURE_ID],
+ onDelete = ForeignKey.CASCADE
+ ), ForeignKey(
+ entity = Taxonomy::class,
+ parentColumns = [Taxonomy.COLUMN_KINGDOM, Taxonomy.COLUMN_GROUP],
+ childColumns = [Taxonomy.COLUMN_KINGDOM, Taxonomy.COLUMN_GROUP],
+ onDelete = ForeignKey.CASCADE
+ )
+ ]
)
class NomenclatureTaxonomy(
@ColumnInfo(name = COLUMN_NOMENCLATURE_ID)
diff --git a/commons/src/main/java/fr/geonature/commons/data/NomenclatureType.kt b/commons/src/main/java/fr/geonature/commons/data/NomenclatureType.kt
index 7b7a3596..9151e062 100644
--- a/commons/src/main/java/fr/geonature/commons/data/NomenclatureType.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/NomenclatureType.kt
@@ -19,10 +19,12 @@ import fr.geonature.commons.data.helper.get
*/
@Entity(
tableName = NomenclatureType.TABLE_NAME,
- indices = [Index(
- value = [NomenclatureType.COLUMN_MNEMONIC],
- unique = true
- )]
+ indices = [
+ Index(
+ value = [NomenclatureType.COLUMN_MNEMONIC],
+ unique = true
+ )
+ ]
)
data class NomenclatureType(
diff --git a/commons/src/main/java/fr/geonature/commons/data/Taxon.kt b/commons/src/main/java/fr/geonature/commons/data/Taxon.kt
index 56a2d6aa..00a59cd3 100644
--- a/commons/src/main/java/fr/geonature/commons/data/Taxon.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/Taxon.kt
@@ -157,5 +157,5 @@ class Taxon : AbstractTaxon {
/**
* Order by query builder.
*/
- class OrderBy: AbstractTaxon.OrderBy(TABLE_NAME)
+ class OrderBy : AbstractTaxon.OrderBy(TABLE_NAME)
}
diff --git a/commons/src/main/java/fr/geonature/commons/data/TaxonArea.kt b/commons/src/main/java/fr/geonature/commons/data/TaxonArea.kt
index f228b252..3bfbb623 100644
--- a/commons/src/main/java/fr/geonature/commons/data/TaxonArea.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/TaxonArea.kt
@@ -21,12 +21,14 @@ import java.util.Date
@Entity(
tableName = TaxonArea.TABLE_NAME,
primaryKeys = [TaxonArea.COLUMN_TAXON_ID, TaxonArea.COLUMN_AREA_ID],
- foreignKeys = [ForeignKey(
- entity = Taxon::class,
- parentColumns = [AbstractTaxon.COLUMN_ID],
- childColumns = [TaxonArea.COLUMN_TAXON_ID],
- onDelete = ForeignKey.CASCADE
- )]
+ foreignKeys = [
+ ForeignKey(
+ entity = Taxon::class,
+ parentColumns = [AbstractTaxon.COLUMN_ID],
+ childColumns = [TaxonArea.COLUMN_TAXON_ID],
+ onDelete = ForeignKey.CASCADE
+ )
+ ]
)
@TypeConverters(Converters::class)
data class TaxonArea(
diff --git a/commons/src/main/java/fr/geonature/commons/data/TaxonWithArea.kt b/commons/src/main/java/fr/geonature/commons/data/TaxonWithArea.kt
index c99fc94a..f980e464 100644
--- a/commons/src/main/java/fr/geonature/commons/data/TaxonWithArea.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/TaxonWithArea.kt
@@ -141,7 +141,7 @@ class TaxonWithArea : AbstractTaxon {
TaxonArea.COLUMN_COLOR,
TaxonArea.TABLE_NAME
)} IN (${color.filter { it != "none" }
- .joinToString(", ") { "'${it}'" }})${color.find { it == "none" }
+ .joinToString(", ") { "'$it'" }})${color.find { it == "none" }
?.let {
" OR (${getColumnAlias(
TaxonArea.COLUMN_COLOR,
@@ -159,5 +159,5 @@ class TaxonWithArea : AbstractTaxon {
/**
* Order by query builder.
*/
- class OrderBy: AbstractTaxon.OrderBy(Taxon.TABLE_NAME)
+ class OrderBy : AbstractTaxon.OrderBy(Taxon.TABLE_NAME)
}
diff --git a/commons/src/main/java/fr/geonature/commons/data/Taxonomy.kt b/commons/src/main/java/fr/geonature/commons/data/Taxonomy.kt
index 2c4292af..96a2e989 100644
--- a/commons/src/main/java/fr/geonature/commons/data/Taxonomy.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/Taxonomy.kt
@@ -23,6 +23,7 @@ class Taxonomy : Parcelable {
@ColumnInfo(name = COLUMN_KINGDOM)
var kingdom: String
+
@ColumnInfo(name = COLUMN_GROUP)
var group: String
diff --git a/commons/src/main/java/fr/geonature/commons/data/helper/EntityHelper.kt b/commons/src/main/java/fr/geonature/commons/data/helper/EntityHelper.kt
index fcdbd5e2..68020487 100644
--- a/commons/src/main/java/fr/geonature/commons/data/helper/EntityHelper.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/helper/EntityHelper.kt
@@ -14,7 +14,9 @@ object EntityHelper {
columnName: String,
tableAlias: String? = null
): Pair {
- return Pair("${tableAlias.orEmpty()}${if (tableAlias.isNullOrBlank()) "" else "."}\"$columnName\"",
- "${tableAlias.orEmpty()}${if (tableAlias.isNullOrBlank()) "" else "_"}$columnName")
+ return Pair(
+ "${tableAlias.orEmpty()}${if (tableAlias.isNullOrBlank()) "" else "."}\"$columnName\"",
+ "${tableAlias.orEmpty()}${if (tableAlias.isNullOrBlank()) "" else "_"}$columnName"
+ )
}
}
diff --git a/commons/src/main/java/fr/geonature/commons/data/helper/Provider.kt b/commons/src/main/java/fr/geonature/commons/data/helper/Provider.kt
index 6d7e449c..b35f1cd8 100644
--- a/commons/src/main/java/fr/geonature/commons/data/helper/Provider.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/helper/Provider.kt
@@ -34,7 +34,8 @@ object Provider {
val baseUri = Uri.parse("content://$AUTHORITY/$resource")
return if (path.isEmpty()) baseUri
- else withAppendedPath(baseUri,
+ else withAppendedPath(
+ baseUri,
path.asSequence().filter { it.isNotBlank() }.joinToString("/")
)
}
diff --git a/commons/src/main/java/fr/geonature/commons/data/helper/SQLiteSelectQueryBuilder.kt b/commons/src/main/java/fr/geonature/commons/data/helper/SQLiteSelectQueryBuilder.kt
index ffc3dbd7..2355fb91 100644
--- a/commons/src/main/java/fr/geonature/commons/data/helper/SQLiteSelectQueryBuilder.kt
+++ b/commons/src/main/java/fr/geonature/commons/data/helper/SQLiteSelectQueryBuilder.kt
@@ -323,7 +323,8 @@ class SQLiteSelectQueryBuilder private constructor(private val tables: MutableSe
this.orderBy.joinToString(", ")
.let { if (it.isEmpty()) it else "ORDER BY $it" }
- val sql = """
+ val sql =
+ """
|SELECT ${if (this.columns.isNotEmpty() && this.distinct) "DISTINCT " else ""}$selectedColumns
|FROM $tables
|$joinClauses
@@ -333,11 +334,11 @@ class SQLiteSelectQueryBuilder private constructor(private val tables: MutableSe
|$orderByClauses
|${this.limit}
""".trimMargin()
- .trim()
- .replace(
- "\n{2,}".toRegex(RegexOption.MULTILINE),
- "\n"
- )
+ .trim()
+ .replace(
+ "\n{2,}".toRegex(RegexOption.MULTILINE),
+ "\n"
+ )
Log.d(
TAG,
diff --git a/commons/src/main/java/fr/geonature/commons/input/InputManager.kt b/commons/src/main/java/fr/geonature/commons/input/InputManager.kt
index 1cf5065a..80739c6b 100644
--- a/commons/src/main/java/fr/geonature/commons/input/InputManager.kt
+++ b/commons/src/main/java/fr/geonature/commons/input/InputManager.kt
@@ -46,7 +46,7 @@ class InputManager private constructor(
*/
suspend fun readInputs(): List = withContext(IO) {
preferenceManager.all.filterKeys { it.startsWith("${KEY_PREFERENCE_INPUT}_") }
- .values.mapNotNull { if (it is String && !it.isBlank()) inputJsonReader.read(it) else null }
+ .values.mapNotNull { if (it is String && it.isNotBlank()) inputJsonReader.read(it) else null }
.sortedBy { it.id }
.also { inputs.postValue(it) }
}
@@ -174,14 +174,14 @@ class InputManager private constructor(
* @return `true` if the given [AbstractInput] has been successfully exported, `false` otherwise
*/
suspend fun exportInput(input: I): Boolean {
- val inputExportFile = withContext(IO) {
- val inputExportFile = getInputExportFile(input)
+ val inputExportFile = getInputExportFile(input)
+
+ @Suppress("BlockingMethodInNonBlockingContext")
+ withContext(IO) {
inputJsonWriter.write(
FileWriter(inputExportFile),
input
)
-
- return@withContext inputExportFile
}
Log.i(
@@ -205,11 +205,11 @@ class InputManager private constructor(
}
@Throws(IOException::class)
- private fun getInputExportFile(input: AbstractInput): File {
+ private suspend fun getInputExportFile(input: AbstractInput): File = withContext(IO) {
val inputDir = FileUtils.getInputsFolder(application)
inputDir.mkdirs()
- return File(
+ return@withContext File(
inputDir,
"input_${input.module}_${input.id}.json"
)
diff --git a/commons/src/main/java/fr/geonature/commons/input/InputViewModel.kt b/commons/src/main/java/fr/geonature/commons/input/InputViewModel.kt
index 40947bb4..a681f473 100644
--- a/commons/src/main/java/fr/geonature/commons/input/InputViewModel.kt
+++ b/commons/src/main/java/fr/geonature/commons/input/InputViewModel.kt
@@ -23,9 +23,11 @@ open class InputViewModel(
inputJsonWriterListener: InputJsonWriter.OnInputJsonWriterListener
) : AndroidViewModel(application) {
- private val inputManager = InputManager.getInstance(application,
- inputJsonReaderListener,
- inputJsonWriterListener)
+ private val inputManager = InputManager.getInstance(
+ application,
+ inputJsonReaderListener,
+ inputJsonWriterListener
+ )
private var deletedInputToRestore: I? = null
@@ -45,7 +47,7 @@ open class InputViewModel(
*
* @param id The [AbstractInput] ID to read. If omitted, read the current saved [AbstractInput].
*/
- fun readInput(id: Long? = null): LiveData {
+ open fun readInput(id: Long? = null): LiveData {
viewModelScope.launch {
inputManager.readInput(id)
}
@@ -123,7 +125,8 @@ open class InputViewModel(
*
* @author [S. Grimault](mailto:sebastien.grimault@gmail.com)
*/
- class Factory, I : AbstractInput>(val creator: () -> T) : ViewModelProvider.Factory {
+ class Factory, I : AbstractInput>(val creator: () -> T) :
+ ViewModelProvider.Factory {
override fun create(modelClass: Class): T {
@Suppress("UNCHECKED_CAST") return creator() as T
}
diff --git a/commons/src/main/java/fr/geonature/commons/settings/AppSettingsManager.kt b/commons/src/main/java/fr/geonature/commons/settings/AppSettingsManager.kt
index b731f60a..32a63b00 100644
--- a/commons/src/main/java/fr/geonature/commons/settings/AppSettingsManager.kt
+++ b/commons/src/main/java/fr/geonature/commons/settings/AppSettingsManager.kt
@@ -51,7 +51,7 @@ class AppSettingsManager private constructor(
*
* @return [IAppSettings] or `null` if not found
*/
- suspend fun loadAppSettings(): AS? = withContext(IO) {
+ suspend fun loadAppSettings(): AS? {
val settingsJsonFile = getAppSettingsAsFile()
Log.i(
@@ -65,25 +65,28 @@ class AppSettingsManager private constructor(
"'${settingsJsonFile.absolutePath}' not found"
)
- return@withContext null
+ return null
}
- return@withContext try {
- val appSettings = appSettingsJsonReader.read(FileReader(settingsJsonFile))
+ @Suppress("BlockingMethodInNonBlockingContext")
+ return withContext(IO) {
+ try {
+ val appSettings = appSettingsJsonReader.read(FileReader(settingsJsonFile))
- Log.i(
- TAG,
- "Settings loaded"
- )
+ Log.i(
+ TAG,
+ "Settings loaded"
+ )
- appSettings
- } catch (e: IOException) {
- Log.w(
- TAG,
- "Failed to load '${settingsJsonFile.name}'"
- )
+ appSettings
+ } catch (e: IOException) {
+ Log.w(
+ TAG,
+ "Failed to load '${settingsJsonFile.name}'"
+ )
- null
+ null
+ }
}
}
diff --git a/commons/src/main/java/fr/geonature/commons/ui/adapter/AbstractListItemRecyclerViewAdapter.kt b/commons/src/main/java/fr/geonature/commons/ui/adapter/AbstractListItemRecyclerViewAdapter.kt
index aa8438c6..c5c208d2 100644
--- a/commons/src/main/java/fr/geonature/commons/ui/adapter/AbstractListItemRecyclerViewAdapter.kt
+++ b/commons/src/main/java/fr/geonature/commons/ui/adapter/AbstractListItemRecyclerViewAdapter.kt
@@ -19,49 +19,51 @@ abstract class AbstractListItemRecyclerViewAdapter(private val listener: OnLi
val items: List = _items
init {
- this.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
- override fun onChanged() {
- super.onChanged()
+ this.registerAdapterDataObserver(
+ object : RecyclerView.AdapterDataObserver() {
+ override fun onChanged() {
+ super.onChanged()
- listener?.showEmptyTextView(itemCount == 0)
- }
+ listener?.showEmptyTextView(itemCount == 0)
+ }
- override fun onItemRangeChanged(
- positionStart: Int,
- itemCount: Int
- ) {
- super.onItemRangeChanged(
- positionStart,
- itemCount
- )
+ override fun onItemRangeChanged(
+ positionStart: Int,
+ itemCount: Int
+ ) {
+ super.onItemRangeChanged(
+ positionStart,
+ itemCount
+ )
- listener?.showEmptyTextView(itemCount == 0)
- }
+ listener?.showEmptyTextView(itemCount == 0)
+ }
- override fun onItemRangeInserted(
- positionStart: Int,
- itemCount: Int
- ) {
- super.onItemRangeInserted(
- positionStart,
- itemCount
- )
+ override fun onItemRangeInserted(
+ positionStart: Int,
+ itemCount: Int
+ ) {
+ super.onItemRangeInserted(
+ positionStart,
+ itemCount
+ )
- listener?.showEmptyTextView(false)
- }
+ listener?.showEmptyTextView(false)
+ }
- override fun onItemRangeRemoved(
- positionStart: Int,
- itemCount: Int
- ) {
- super.onItemRangeRemoved(
- positionStart,
- itemCount
- )
+ override fun onItemRangeRemoved(
+ positionStart: Int,
+ itemCount: Int
+ ) {
+ super.onItemRangeRemoved(
+ positionStart,
+ itemCount
+ )
- listener?.showEmptyTextView(itemCount == 0)
+ listener?.showEmptyTextView(itemCount == 0)
+ }
}
- })
+ )
}
override fun onCreateViewHolder(
@@ -123,39 +125,41 @@ abstract class AbstractListItemRecyclerViewAdapter(private val listener: OnLi
return
}
- val diffResult = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
- override fun getOldListSize(): Int {
- return this@AbstractListItemRecyclerViewAdapter._items.size
- }
+ val diffResult = DiffUtil.calculateDiff(
+ object : DiffUtil.Callback() {
+ override fun getOldListSize(): Int {
+ return this@AbstractListItemRecyclerViewAdapter._items.size
+ }
- override fun getNewListSize(): Int {
- return newItems.size
- }
+ override fun getNewListSize(): Int {
+ return newItems.size
+ }
- override fun areItemsTheSame(
- oldItemPosition: Int,
- newItemPosition: Int
- ): Boolean {
- return this@AbstractListItemRecyclerViewAdapter.areItemsTheSame(
- this@AbstractListItemRecyclerViewAdapter._items,
- newItems,
- oldItemPosition,
- newItemPosition
- )
- }
+ override fun areItemsTheSame(
+ oldItemPosition: Int,
+ newItemPosition: Int
+ ): Boolean {
+ return this@AbstractListItemRecyclerViewAdapter.areItemsTheSame(
+ this@AbstractListItemRecyclerViewAdapter._items,
+ newItems,
+ oldItemPosition,
+ newItemPosition
+ )
+ }
- override fun areContentsTheSame(
- oldItemPosition: Int,
- newItemPosition: Int
- ): Boolean {
- return this@AbstractListItemRecyclerViewAdapter.areContentsTheSame(
- this@AbstractListItemRecyclerViewAdapter._items,
- newItems,
- oldItemPosition,
- newItemPosition
- )
+ override fun areContentsTheSame(
+ oldItemPosition: Int,
+ newItemPosition: Int
+ ): Boolean {
+ return this@AbstractListItemRecyclerViewAdapter.areContentsTheSame(
+ this@AbstractListItemRecyclerViewAdapter._items,
+ newItems,
+ oldItemPosition,
+ newItemPosition
+ )
+ }
}
- })
+ )
this._items.clear()
this._items.addAll(newItems)
diff --git a/commons/src/main/java/fr/geonature/commons/ui/adapter/AbstractStickyRecyclerViewAdapter.kt b/commons/src/main/java/fr/geonature/commons/ui/adapter/AbstractStickyRecyclerViewAdapter.kt
index 02e0fc0c..b1e9cc2f 100644
--- a/commons/src/main/java/fr/geonature/commons/ui/adapter/AbstractStickyRecyclerViewAdapter.kt
+++ b/commons/src/main/java/fr/geonature/commons/ui/adapter/AbstractStickyRecyclerViewAdapter.kt
@@ -35,4 +35,4 @@ abstract class AbstractStickyRecyclerViewAdapter {
* @see [onBindHeaderViewHolder]
*/
fun onCreateHeaderViewHolder(parent: ViewGroup): SVH
-}
\ No newline at end of file
+}
diff --git a/commons/src/main/java/fr/geonature/commons/ui/adapter/StickyHeaderItemDecorator.kt b/commons/src/main/java/fr/geonature/commons/ui/adapter/StickyHeaderItemDecorator.kt
index 3005bcf0..60f0ce30 100644
--- a/commons/src/main/java/fr/geonature/commons/ui/adapter/StickyHeaderItemDecorator.kt
+++ b/commons/src/main/java/fr/geonature/commons/ui/adapter/StickyHeaderItemDecorator.kt
@@ -85,10 +85,7 @@ class StickyHeaderItemDecorator(
return
}
- if (preOverlappedPosition != overlappedHeaderPosition && shouldMoveHeader(
- viewOverlappedByHeader
- )
- ) {
+ if (preOverlappedPosition != overlappedHeaderPosition && shouldMoveHeader(viewOverlappedByHeader)) {
updateStickyHeader(topChildPosition)
moveHeader(
c,
@@ -174,55 +171,57 @@ class StickyHeaderItemDecorator(
private fun fixLayoutSize(recyclerView: RecyclerView) {
val currentStickyHolder = currentStickyHolder ?: return
- recyclerView.addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
- override fun onLayoutChange(
- v: View?,
- left: Int,
- top: Int,
- right: Int,
- bottom: Int,
- oldLeft: Int,
- oldTop: Int,
- oldRight: Int,
- oldBottom: Int
- ) {
- recyclerView.removeOnLayoutChangeListener(this)
-
- // Specs for parent (RecyclerView)
- val widthSpec = View.MeasureSpec.makeMeasureSpec(
- recyclerView.width,
- View.MeasureSpec.EXACTLY
- )
-
- val heightSpec = View.MeasureSpec.makeMeasureSpec(
- recyclerView.height,
- View.MeasureSpec.UNSPECIFIED
- )
-
- // Specs for children (headers)
- val childWidthSpec = ViewGroup.getChildMeasureSpec(
- widthSpec,
- recyclerView.paddingLeft + recyclerView.paddingRight,
- currentStickyHolder.itemView.layoutParams.width
- )
-
- val childHeightSpec = ViewGroup.getChildMeasureSpec(
- heightSpec,
- recyclerView.paddingTop + recyclerView.paddingBottom,
- currentStickyHolder.itemView.layoutParams.height
- )
-
- currentStickyHolder.itemView.measure(
- childWidthSpec,
- childHeightSpec
- )
- currentStickyHolder.itemView.layout(
- 0,
- 0,
- currentStickyHolder.itemView.measuredWidth,
- currentStickyHolder.itemView.measuredHeight
- )
+ recyclerView.addOnLayoutChangeListener(
+ object : View.OnLayoutChangeListener {
+ override fun onLayoutChange(
+ v: View?,
+ left: Int,
+ top: Int,
+ right: Int,
+ bottom: Int,
+ oldLeft: Int,
+ oldTop: Int,
+ oldRight: Int,
+ oldBottom: Int
+ ) {
+ recyclerView.removeOnLayoutChangeListener(this)
+
+// Specs for parent (RecyclerView)
+ val widthSpec = View.MeasureSpec.makeMeasureSpec(
+ recyclerView.width,
+ View.MeasureSpec.EXACTLY
+ )
+
+ val heightSpec = View.MeasureSpec.makeMeasureSpec(
+ recyclerView.height,
+ View.MeasureSpec.UNSPECIFIED
+ )
+
+// Specs for children (headers)
+ val childWidthSpec = ViewGroup.getChildMeasureSpec(
+ widthSpec,
+ recyclerView.paddingLeft + recyclerView.paddingRight,
+ currentStickyHolder.itemView.layoutParams.width
+ )
+
+ val childHeightSpec = ViewGroup.getChildMeasureSpec(
+ heightSpec,
+ recyclerView.paddingTop + recyclerView.paddingBottom,
+ currentStickyHolder.itemView.layoutParams.height
+ )
+
+ currentStickyHolder.itemView.measure(
+ childWidthSpec,
+ childHeightSpec
+ )
+ currentStickyHolder.itemView.layout(
+ 0,
+ 0,
+ currentStickyHolder.itemView.measuredWidth,
+ currentStickyHolder.itemView.measuredHeight
+ )
+ }
}
- })
+ )
}
-}
\ No newline at end of file
+}
diff --git a/commons/src/main/java/fr/geonature/commons/util/EditTextHelper.kt b/commons/src/main/java/fr/geonature/commons/util/EditTextHelper.kt
index 6a76ea59..c2936c2f 100644
--- a/commons/src/main/java/fr/geonature/commons/util/EditTextHelper.kt
+++ b/commons/src/main/java/fr/geonature/commons/util/EditTextHelper.kt
@@ -14,25 +14,27 @@ import android.widget.EditText
* Extension function to simplify setting an afterTextChanged action to EditText components.
*/
fun EditText.afterTextChanged(afterTextChanged: (Editable?) -> Unit) {
- this.addTextChangedListener(object : TextWatcher {
- override fun afterTextChanged(editable: Editable?) {
- afterTextChanged.invoke(editable)
- }
+ this.addTextChangedListener(
+ object : TextWatcher {
+ override fun afterTextChanged(editable: Editable?) {
+ afterTextChanged.invoke(editable)
+ }
- override fun beforeTextChanged(
- s: CharSequence,
- start: Int,
- count: Int,
- after: Int
- ) {
- }
+ override fun beforeTextChanged(
+ s: CharSequence,
+ start: Int,
+ count: Int,
+ after: Int
+ ) {
+ }
- override fun onTextChanged(
- s: CharSequence,
- start: Int,
- before: Int,
- count: Int
- ) {
+ override fun onTextChanged(
+ s: CharSequence,
+ start: Int,
+ before: Int,
+ count: Int
+ ) {
+ }
}
- })
+ )
}
diff --git a/commons/src/main/java/fr/geonature/commons/util/FileUtilsHelper.kt b/commons/src/main/java/fr/geonature/commons/util/FileUtilsHelper.kt
index 41fe9263..e65d3c9c 100644
--- a/commons/src/main/java/fr/geonature/commons/util/FileUtilsHelper.kt
+++ b/commons/src/main/java/fr/geonature/commons/util/FileUtilsHelper.kt
@@ -56,4 +56,4 @@ fun FileUtils.getDatabaseFolder(
),
"databases"
)
-}
\ No newline at end of file
+}
diff --git a/commons/src/main/java/fr/geonature/commons/util/LiveDataHelper.kt b/commons/src/main/java/fr/geonature/commons/util/LiveDataHelper.kt
index 2beb56f4..70121b18 100644
--- a/commons/src/main/java/fr/geonature/commons/util/LiveDataHelper.kt
+++ b/commons/src/main/java/fr/geonature/commons/util/LiveDataHelper.kt
@@ -5,7 +5,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
/**
- * Helpers for [LiveData] utilities.
+ * Helpers for LiveData utilities.
*
* @author [S. Grimault](mailto:sebastien.grimault@gmail.com)
*/
@@ -22,7 +22,8 @@ fun LiveData.observeOnce(owner: LifecycleOwner, observer: (T?) -> Unit) {
removeObserver(this)
observer(value)
}
- })
+ }
+ )
}
/**
@@ -44,5 +45,6 @@ fun LiveData.observeUntil(
removeObserver(this)
}
}
- })
-}
\ No newline at end of file
+ }
+ )
+}
diff --git a/commons/src/main/java/fr/geonature/commons/util/PermissionUtils.kt b/commons/src/main/java/fr/geonature/commons/util/PermissionUtils.kt
index 85e40e45..00276a3d 100644
--- a/commons/src/main/java/fr/geonature/commons/util/PermissionUtils.kt
+++ b/commons/src/main/java/fr/geonature/commons/util/PermissionUtils.kt
@@ -1,14 +1,9 @@
package fr.geonature.commons.util
-import android.app.Activity
-import android.content.Context
import android.content.pm.PackageManager
-import android.view.View
-import androidx.annotation.NonNull
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
-import androidx.fragment.app.Fragment
-import com.google.android.material.snackbar.BaseTransientBottomBar
-import com.google.android.material.snackbar.Snackbar
/**
* Helper class about Android permissions.
@@ -17,185 +12,81 @@ import com.google.android.material.snackbar.Snackbar
*/
object PermissionUtils {
- /**
- * Checks that all given permissions have been granted by verifying that each entry in the
- * given array is of the value [PackageManager.PERMISSION_GRANTED].
- *
- * @see Activity.onRequestPermissionsResult
- */
- fun checkPermissions(grantResults: IntArray): Boolean {
- // At least one result must be checked.
- if (grantResults.isEmpty()) {
- return false
- }
-
- // Verify that each required permission has been granted, otherwise return false.
- for (result in grantResults) {
- if (result != PackageManager.PERMISSION_GRANTED) {
- return false
- }
- }
-
- return true
- }
-
- /**
- * Determines whether the user have been granted a set of permissions.
- *
- * @param context the current `Context`.
- * @param permissions a set of permissions being checked
- */
- fun checkSelfPermissions(
- context: Context,
- vararg permissions: String
- ): Boolean {
- var granted = true
- val iterator = permissions.iterator()
-
- while (iterator.hasNext() && granted) {
- granted = ActivityCompat.checkSelfPermission(
- context,
- iterator.next()
- ) == PackageManager.PERMISSION_GRANTED
- }
-
- return granted
- }
-
- /**
- * Determines whether the user have been granted a set of permissions.
- *
- * @param context the current `Context`.
- * @param onCheckSelfPermissionListener the callback to use to notify if these permissions was
- * granted or not
- * @param permissions a set of permissions being checked
- */
- fun checkSelfPermissions(
- context: Context,
- onCheckSelfPermissionListener: OnCheckSelfPermissionListener,
- @NonNull
- vararg permissions: String
- ) {
- if (checkSelfPermissions(
- context,
- *permissions
- )
- ) {
- onCheckSelfPermissionListener.onPermissionsGranted()
- } else {
- onCheckSelfPermissionListener.onRequestPermissions(*permissions)
- }
- }
-
/**
* Requests a set of permissions from `Activity`.
*
- * If a permission has been denied previously, a `Snackbar` will prompt the user to grant
- * the permission, otherwise it is requested directly.
- *
- * @param activity the current `Activity`
- * @param snackbarParentView the parent view on which to display the `Snackbar`
- * @param snackbarMessageResourceId the message resource ID to display
- * @param requestCode application specific request code to match with a result
- * reported to `ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])`.
+ * @param fromActivity the current `Activity`
* @param permissions a set of permissions to request
+ * @param isGranted called when permissions were granted or not
+ * @param shouldShowRequestPermissionRationale called if we want to show UI with rationale
+ * before requesting a permission
*/
fun requestPermissions(
- activity: Activity,
- snackbarParentView: View,
- snackbarMessageResourceId: Int,
- requestCode: Int,
- vararg permissions: String
+ fromActivity: AppCompatActivity,
+ permissions: List,
+ isGranted: (result: Map) -> Unit,
+ shouldShowRequestPermissionRationale: ((callback: () -> Unit) -> Unit)? = null
) {
- var shouldShowRequestPermissions = false
- val iterator = permissions.iterator()
-
- while (iterator.hasNext() && !shouldShowRequestPermissions) {
- shouldShowRequestPermissions = ActivityCompat.shouldShowRequestPermissionRationale(
- activity,
- iterator.next()
- )
- }
-
- if (shouldShowRequestPermissions) {
- Snackbar.make(
- snackbarParentView,
- snackbarMessageResourceId,
- BaseTransientBottomBar.LENGTH_INDEFINITE
- )
- .setAction(android.R.string.ok) {
- ActivityCompat.requestPermissions(
- activity,
- permissions,
- requestCode
+ val requestPermissionLauncher =
+ fromActivity.registerForActivityResult(
+ ActivityResultContracts.RequestPermission()
+ ) {
+ isGranted(
+ mapOf(
+ Pair(
+ permissions.first(),
+ it
+ )
)
- }
- .show()
- } else {
- ActivityCompat.requestPermissions(
- activity,
- permissions,
- requestCode
- )
- }
- }
-
- /**
- * Requests a set of permissions from a `Fragment`.
- *
- * If a permission has been denied previously, a `Snackbar` will prompt the user to grant
- * the permission, otherwise it is requested directly.
- *
- * @param fragment the current `Fragment`
- * @param snackbarParentView the parent view on which to display the `Snackbar`
- * @param snackbarMessageResourceId the message resource ID to display
- * @param requestCode application specific request code to match with a result
- * reported to `ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])`.
- * @param permissions a set of permissions to request
- */
- fun requestPermissions(
- fragment: Fragment,
- snackbarParentView: View,
- snackbarMessageResourceId: Int,
- requestCode: Int,
- vararg permissions: String
- ) {
- var shouldShowRequestPermissions = false
- val iterator = permissions.iterator()
-
- while (iterator.hasNext() && !shouldShowRequestPermissions) {
- shouldShowRequestPermissions =
- fragment.shouldShowRequestPermissionRationale(iterator.next())
- }
+ )
+ }
- if (shouldShowRequestPermissions) {
- Snackbar.make(
- snackbarParentView,
- snackbarMessageResourceId,
- BaseTransientBottomBar.LENGTH_INDEFINITE
+ val requestPermissionsLauncher =
+ fromActivity.registerForActivityResult(
+ ActivityResultContracts.RequestMultiplePermissions()
+ ) { isGranted(it) }
+
+ val checkSelfPermissions = permissions.asSequence()
+ .map {
+ Pair(
+ it,
+ ActivityCompat.checkSelfPermission(
+ fromActivity,
+ it
+ ) == PackageManager.PERMISSION_GRANTED
+ )
+ }
+ .toMap()
+
+ when {
+ // all permissions were granted
+ checkSelfPermissions.values.all { it } -> isGranted(
+ permissions.asSequence()
+ .map {
+ Pair(
+ it,
+ true
+ )
+ }
+ .toMap()
)
- .setAction(android.R.string.ok) {
- fragment.requestPermissions(
- permissions,
- requestCode
- )
- }
- .show()
- } else {
- fragment.requestPermissions(
- permissions,
- requestCode
+ // show request permission rationale only for one non granted permission
+ shouldShowRequestPermissionRationale != null && permissions.size == 1 && ActivityCompat.shouldShowRequestPermissionRationale(
+ fromActivity,
+ permissions.first()
+ ) -> shouldShowRequestPermissionRationale {
+ requestPermissionLauncher.launch(permissions.first())
+ }
+ // ask for one permission
+ permissions.size == 1 -> requestPermissionLauncher.launch(permissions.first())
+ // ask for several permissions
+ else -> requestPermissionsLauncher.launch(
+ checkSelfPermissions.asSequence()
+ .filter { !it.value }
+ .map { it.key }
+ .toList()
+ .toTypedArray()
)
}
}
-
- /**
- * Callback about [PermissionUtils.checkSelfPermissions].
- *
- * @author [S. Grimault](mailto:sebastien.grimault@gmail.com)
- */
- interface OnCheckSelfPermissionListener {
- fun onPermissionsGranted()
- fun onRequestPermissions(vararg permissions: String)
- }
}
diff --git a/commons/src/test/java/fr/geonature/commons/OneTimeObserver.kt b/commons/src/test/java/fr/geonature/commons/OneTimeObserver.kt
index 6ae1c9a4..dcf8a70f 100644
--- a/commons/src/test/java/fr/geonature/commons/OneTimeObserver.kt
+++ b/commons/src/test/java/fr/geonature/commons/OneTimeObserver.kt
@@ -14,7 +14,8 @@ import androidx.lifecycle.Observer
*
* @author [S. Grimault](mailto:sebastien.grimault@gmail.com)
*/
-class OneTimeObserver(private val handler: (T?) -> Unit) : Observer,
+class OneTimeObserver(private val handler: (T?) -> Unit) :
+ Observer,
LifecycleOwner {
private val lifecycle = LifecycleRegistry(this)
diff --git a/commons/src/test/java/fr/geonature/commons/data/AppSyncTest.kt b/commons/src/test/java/fr/geonature/commons/data/AppSyncTest.kt
index 6db39b54..f6fd75e5 100644
--- a/commons/src/test/java/fr/geonature/commons/data/AppSyncTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/data/AppSyncTest.kt
@@ -3,8 +3,6 @@ package fr.geonature.commons.data
import android.database.Cursor
import android.os.Parcel
import fr.geonature.commons.data.AppSync.Companion.defaultProjection
-import java.time.Instant
-import java.util.Date
import org.junit.Assert.assertArrayEquals
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
@@ -13,6 +11,8 @@ import org.junit.runner.RunWith
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.robolectric.RobolectricTestRunner
+import java.time.Instant
+import java.util.Date
/**
* Unit tests about [AppSync].
diff --git a/commons/src/test/java/fr/geonature/commons/data/NomenclatureWithTaxonomyTest.kt b/commons/src/test/java/fr/geonature/commons/data/NomenclatureWithTaxonomyTest.kt
index 8d51b3fa..d6ffef9d 100644
--- a/commons/src/test/java/fr/geonature/commons/data/NomenclatureWithTaxonomyTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/data/NomenclatureWithTaxonomyTest.kt
@@ -76,25 +76,26 @@ class NomenclatureWithTaxonomyTest {
)
)
- assertEquals(NomenclatureWithTaxonomy(
- NomenclatureWithType(
- 2,
- "SN",
- "1234:002",
- "label",
- 1234,
- NomenclatureType(
+ assertEquals(
+ NomenclatureWithTaxonomy(
+ NomenclatureWithType(
+ 2,
+ "SN",
+ "1234:002",
+ "label",
1234,
- "SGR",
- "label"
+ NomenclatureType(
+ 1234,
+ "SGR",
+ "label"
+ )
)
- )
- ).also {
- it.taxonony = Taxonomy(
- "Animalia",
- "Ascidies"
- )
- },
+ ).also {
+ it.taxonony = Taxonomy(
+ "Animalia",
+ "Ascidies"
+ )
+ },
NomenclatureWithTaxonomy(
NomenclatureWithType(
2,
@@ -113,7 +114,8 @@ class NomenclatureWithTaxonomyTest {
"Animalia",
"Ascidies"
)
- })
+ }
+ )
}
@Test
diff --git a/commons/src/test/java/fr/geonature/commons/data/TaxonAreaTest.kt b/commons/src/test/java/fr/geonature/commons/data/TaxonAreaTest.kt
index 2ce0faaa..d1beb6f8 100644
--- a/commons/src/test/java/fr/geonature/commons/data/TaxonAreaTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/data/TaxonAreaTest.kt
@@ -5,8 +5,6 @@ import android.os.Parcel
import fr.geonature.commons.data.TaxonArea.Companion.defaultProjection
import fr.geonature.commons.data.TaxonArea.Companion.fromCursor
import fr.geonature.commons.data.helper.EntityHelper.column
-import java.time.Instant
-import java.util.Date
import org.junit.Assert.assertArrayEquals
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
@@ -16,6 +14,8 @@ import org.junit.runner.RunWith
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.robolectric.RobolectricTestRunner
+import java.time.Instant
+import java.util.Date
/**
* Unit tests about [TaxonArea].
diff --git a/commons/src/test/java/fr/geonature/commons/data/TaxonWithAreaTest.kt b/commons/src/test/java/fr/geonature/commons/data/TaxonWithAreaTest.kt
index c3ad67dd..e34b359a 100644
--- a/commons/src/test/java/fr/geonature/commons/data/TaxonWithAreaTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/data/TaxonWithAreaTest.kt
@@ -417,8 +417,10 @@ class TaxonWithAreaTest {
assertTrue(taxonFilterByAreaColors.second.isEmpty())
val taxonFilterByNameAndAreaColors =
- (TaxonWithArea.Filter()
- .byNameOrDescriptionOrRank("as") as TaxonWithArea.Filter)
+ (
+ TaxonWithArea.Filter()
+ .byNameOrDescriptionOrRank("as") as TaxonWithArea.Filter
+ )
.byAreaColors(
"red",
"grey"
diff --git a/commons/src/test/java/fr/geonature/commons/data/dao/BaseDaoTest.kt b/commons/src/test/java/fr/geonature/commons/data/dao/BaseDaoTest.kt
index 30925a5e..0b904118 100644
--- a/commons/src/test/java/fr/geonature/commons/data/dao/BaseDaoTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/data/dao/BaseDaoTest.kt
@@ -44,7 +44,7 @@ class BaseDaoTest {
"""
SELECT *
FROM entity_table entity_table
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -62,7 +62,7 @@ class BaseDaoTest {
"""
SELECT *
FROM entity_table entity_table
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -71,8 +71,10 @@ class BaseDaoTest {
fun getQueryBuilderWithSelectionWithNoArgs() {
// given a simple query builder from DAO
val sqLiteQuery =
- (SimpleEntityDao().QB()
- .whereSelection("col = 1") as SimpleEntityDao.QB).getQueryBuilder()
+ (
+ SimpleEntityDao().QB()
+ .whereSelection("col = 1") as SimpleEntityDao.QB
+ ).getQueryBuilder()
.build()
// then
@@ -82,7 +84,7 @@ class BaseDaoTest {
SELECT *
FROM entity_table entity_table
WHERE (col = 1)
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -94,14 +96,16 @@ class BaseDaoTest {
@Test
fun getQueryBuilderWithSelectionWithArgs() {
// given a simple query builder from DAO
- val sqLiteQuery = (SimpleEntityDao().QB()
- .whereSelection(
- "col = ? OR col = ?",
- arrayOf(
- 12,
- "some_args"
- )
- ) as SimpleEntityDao.QB).getQueryBuilder()
+ val sqLiteQuery = (
+ SimpleEntityDao().QB()
+ .whereSelection(
+ "col = ? OR col = ?",
+ arrayOf(
+ 12,
+ "some_args"
+ )
+ ) as SimpleEntityDao.QB
+ ).getQueryBuilder()
.build()
// then
@@ -111,7 +115,7 @@ class BaseDaoTest {
SELECT *
FROM entity_table entity_table
WHERE (col = ? OR col = ?)
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
diff --git a/commons/src/test/java/fr/geonature/commons/data/helper/ConvertersTest.kt b/commons/src/test/java/fr/geonature/commons/data/helper/ConvertersTest.kt
index 34e0f868..dba3e9de 100644
--- a/commons/src/test/java/fr/geonature/commons/data/helper/ConvertersTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/data/helper/ConvertersTest.kt
@@ -2,11 +2,11 @@ package fr.geonature.commons.data.helper
import fr.geonature.commons.data.helper.Converters.dateToTimestamp
import fr.geonature.commons.data.helper.Converters.fromTimestamp
-import java.time.Instant
-import java.util.Date
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
+import java.time.Instant
+import java.util.Date
/**
* Unit tests about [Converters].
diff --git a/commons/src/test/java/fr/geonature/commons/data/helper/SQLiteSelectQueryBuilderTest.kt b/commons/src/test/java/fr/geonature/commons/data/helper/SQLiteSelectQueryBuilderTest.kt
index 48c866ed..1359ae5a 100644
--- a/commons/src/test/java/fr/geonature/commons/data/helper/SQLiteSelectQueryBuilderTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/data/helper/SQLiteSelectQueryBuilderTest.kt
@@ -26,7 +26,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT *
FROM user
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
@@ -43,7 +43,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT *
FROM user u
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -61,7 +61,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT email
FROM user
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
@@ -82,7 +82,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT u.email AS user_email
FROM user u
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
@@ -109,7 +109,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT u.email, u.login
FROM user u
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
@@ -128,7 +128,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT u.email, u.login
FROM user u
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -146,7 +146,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT *
FROM user
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
@@ -166,7 +166,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT DISTINCT u.email, u.login
FROM user u
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -193,7 +193,7 @@ class SQLiteSelectQueryBuilderTest {
"""
SELECT u.email, u.login, p.role
FROM user u, profile p
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -223,7 +223,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.id, u.email, u.login, p.role
FROM user u
LEFT JOIN profile AS p ON p.user_id = u.id
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
@@ -265,7 +265,7 @@ class SQLiteSelectQueryBuilderTest {
JOIN group AS g ON g.name = ?
LEFT OUTER JOIN user_group AS ug ON ug.group_id = g.id AND ug.user_id = u.id
LEFT JOIN profile AS p ON p.user_id = u.id
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -296,7 +296,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
WHERE u.email = ?
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -324,7 +324,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
WHERE (u.email = ?)
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -352,7 +352,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
WHERE (u.email = ?)
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -385,7 +385,7 @@ class SQLiteSelectQueryBuilderTest {
FROM user u
WHERE (u.email = ?)
AND (u.login = ?)
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -415,7 +415,7 @@ class SQLiteSelectQueryBuilderTest {
FROM user u
WHERE (u.email = ?)
OR (u.login = 'user')
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -447,7 +447,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
WHERE u.login = ?
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -479,7 +479,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
WHERE u.login = ?
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -510,7 +510,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
WHERE u.email = ?
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
assertEquals(
@@ -552,7 +552,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login AS login
FROM user u
GROUP BY login
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -603,7 +603,7 @@ class SQLiteSelectQueryBuilderTest {
LEFT JOIN input AS i ON i.user_id = p.id
GROUP BY u.email
HAVING SUM(i.id) > 0
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -637,7 +637,7 @@ class SQLiteSelectQueryBuilderTest {
FROM user u
INNER JOIN input AS i ON i.user_id = p.id
ORDER BY count
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -665,7 +665,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
ORDER BY u.email COLLATE NOCASE ASC
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -702,7 +702,7 @@ class SQLiteSelectQueryBuilderTest {
FROM user u
INNER JOIN input AS i ON i.user_id = p.id
ORDER BY count DESC
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -730,7 +730,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
ORDER BY u.login COLLATE NOCASE DESC
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -756,7 +756,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
ORDER BY u.login asc
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -783,7 +783,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login, u.username
FROM user u
ORDER BY u.email, COALESCE(u.login, u.username) desc
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
@@ -807,7 +807,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
LIMIT 10
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
@@ -831,7 +831,7 @@ class SQLiteSelectQueryBuilderTest {
SELECT u.email, u.login
FROM user u
LIMIT 10, 3
- """.trimIndent(),
+ """.trimIndent(),
sqLiteQuery.sql
)
}
diff --git a/commons/src/test/java/fr/geonature/commons/settings/AppSettingsManagerTest.kt b/commons/src/test/java/fr/geonature/commons/settings/AppSettingsManagerTest.kt
index 352ee0bf..d0bcb15a 100644
--- a/commons/src/test/java/fr/geonature/commons/settings/AppSettingsManagerTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/settings/AppSettingsManagerTest.kt
@@ -38,22 +38,24 @@ class AppSettingsManagerTest {
initMocks(this)
onAppSettingsJsonJsonReaderListener =
- spy(object : AppSettingsJsonReader.OnAppSettingsJsonReaderListener {
- override fun createAppSettings(): DummyAppSettings {
- return DummyAppSettings()
- }
+ spy(
+ object : AppSettingsJsonReader.OnAppSettingsJsonReaderListener {
+ override fun createAppSettings(): DummyAppSettings {
+ return DummyAppSettings()
+ }
- override fun readAdditionalAppSettingsData(
- reader: JsonReader,
- keyName: String,
- appSettings: DummyAppSettings
- ) {
- when (keyName) {
- "attribute" -> appSettings.attribute = reader.nextString()
- else -> reader.skipValue()
+ override fun readAdditionalAppSettingsData(
+ reader: JsonReader,
+ keyName: String,
+ appSettings: DummyAppSettings
+ ) {
+ when (keyName) {
+ "attribute" -> appSettings.attribute = reader.nextString()
+ else -> reader.skipValue()
+ }
}
}
- })
+ )
val application = getApplicationContext()
appSettingsManager = spy(
diff --git a/commons/src/test/java/fr/geonature/commons/util/DateHelperTest.kt b/commons/src/test/java/fr/geonature/commons/util/DateHelperTest.kt
index 95d37127..e4f2d3de 100644
--- a/commons/src/test/java/fr/geonature/commons/util/DateHelperTest.kt
+++ b/commons/src/test/java/fr/geonature/commons/util/DateHelperTest.kt
@@ -3,11 +3,9 @@ package fr.geonature.commons.util
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
-import org.junit.Assert.assertTrue
import org.junit.Test
import java.text.SimpleDateFormat
import java.util.Calendar
-import java.util.Date
import java.util.TimeZone
/**
@@ -67,4 +65,4 @@ class DateHelperTest {
?.toIsoDateString()
)
}
-}
\ No newline at end of file
+}
diff --git a/commons/version.properties b/commons/version.properties
index 12744b52..0bacf366 100644
--- a/commons/version.properties
+++ b/commons/version.properties
@@ -1,2 +1,2 @@
-#Sat Oct 10 14:42:14 CEST 2020
-VERSION_CODE=2560
+#Tue Feb 02 20:36:43 CET 2021
+VERSION_CODE=2680
diff --git a/docs/sync.adoc b/docs/sync.adoc
index 1cd62bb0..7ff94455 100644
--- a/docs/sync.adoc
+++ b/docs/sync.adoc
@@ -2,7 +2,7 @@
== Check for update
-[plantuml, images/sync_update, svg]
+[plantuml,images/uml/sync_update,svg]
....
participant "mobile/sync" as sync << mobile >>
participant "GeoNature" as gn
@@ -10,8 +10,17 @@ participant "GeoNature" as gn
activate sync
group Fetch common configuration data
- sync -> gn ++ : **GET** : ""/api/gn_commons/t_mobile_apps""
- gn -> sync -- : **200** : ""array""
+ sync -> gn ++ : **GET** ""/api/gn_commons/t_mobile_apps""
+ gn -> sync -- : **200**: ""[AppPackage]""
+ note left
+ **""AppPackage"":**
+ {
+ "url_apk": ,
+ "package": ,
+ "app_code": ,
+ "version_code":
+ }
+ end note
end
group Check for update
@@ -21,69 +30,183 @@ group Check for update
sync -> sync : notify if we want to upgrade
end
end
-
....
-== Update local database from GeoNature
+== Authentication
-[plantuml, images/sync_data, svg]
+[plantuml,images/uml/sync_auth,svg]
....
participant "mobile/sync" as sync << mobile >>
participant "GeoNature" as gn
activate sync
-group Fetch common configuration data
- sync -> gn ++ : **GET** : ""/api/gn_commons/t_mobile_apps""
- gn -> sync -- : **200** : ""array""
- sync -> sync : update //settings_sync.json//
+group Check for login
+ sync -> sync : Set login and password
+ sync -> gn ++ : **POST** ""/api/auth/login""
+ gn -> sync -- : **200**: ""AuthLogin""
+ note left
+ **""AuthLogin"":**
+ {
+ "user": {
+ "id_application": ,
+ "id_organisme": ,
+ "identifiant":
+ },
+ "expires":
+ }
+ end note
+ sync -> sync : Set cookie
end
+....
-alt Check for login
- sync -> sync : Set login and password
- sync -> gn ++ : **POST** : ""/api/auth/login""
- gn -> sync -- : **200** : ""Cookie""
-end
+== Update local database
+
+[plantuml,images/uml/sync_data,svg]
+....
+participant "mobile/sync" as sync << mobile >>
+participant "GeoNature" as gn
+
+activate sync
+
+ref over sync, gn : Check for login
group Fetch GeoNature data
- sync -> gn ++ : **GET** : ""/api/meta/datasets""
- gn -> sync -- : **200** : ""[dataset]""
- sync -> sync : update //dataset// table
- sync -> gn ++ : **GET** : ""/api/users/menu/:observers_list_id""
- gn -> sync -- : **200** : ""[user]""
- sync -> sync : update //observers// table
- sync -> gn ++ : **GET** : ""/api/taxref/regnewithgroupe2""
- gn -> sync -- : **200** : ""[taxonomy]""
- sync -> sync : update //taxonomy// table
- sync -> gn ++ : **GET** : ""/api/taxref/allnamebylist/:taxa_list_id""
- gn -> sync -- : **200** : ""[taxon]""
- sync -> sync : update //taxa// table
- sync -> gn ++ : **GET** : ""/api/synthese/color_taxon""
- gn -> sync -- : **200** : ""[taxrefArea]""
- sync -> sync : update //taxa_area// table
- sync -> gn ++ : **GET** : ""/api/nomenclatures/nomenclatures/taxonomy""
- gn -> sync -- : **200** : ""[nomenclatureType]""
- sync -> sync : update //nomenclature_types// table
- sync -> sync : update //nomenclatures// table
- sync -> sync : update //nomenclatures_taxonomy// table
-
- note over sync : **TODO:**\nfetch registered modules from GeoNature
-
- loop for each registered module
- sync -> gn ++ : **GET** : ""/api/:module/defaultNomenclatures""
- gn -> sync -- : **200** : ""[DefaultNomenclature]""
- sync -> sync : update //default_nomenclatures// table
- end
-end
+ group Dataset
+ sync -> gn ++ : **GET** ""/api/meta/datasets""
+ gn -> sync -- : **200**: ""[Dataset]""
+ note right of sync
+ **""Dataset"":**
+ {
+ "id_dataset": ,
+ "dataset_name": ,
+ "dataset_desc": ,
+ "active": ,
+ "meta_create_date": ,
+ "modules": {
+ "module_path":
+ }[]
+ }
+ end note
+ sync -> sync : update //dataset// table
+ end
-deactivate sync
+ group Observers
+ sync -> gn ++ : **GET** ""/api/users/menu/:observers_list_id""
+ note right of sync
+ ""observers_list_id"" from settings
+ end note
+ gn -> sync -- : **200**: ""[User]""
+ note right of sync
+ **""User"":**
+ {
+ "id_role": ,
+ "nom_role": ,
+ "prenom_role":
+ }
+ end note
+ sync -> sync : update //observers// table
+ end
+
+ group Taxonomy
+ sync -> gn ++ : **GET** ""/api/taxref/regnewithgroupe2""
+ gn -> sync -- : **200**: ""[Taxonomy]""
+ note right of sync
+ **""Taxonomy"":**
+ {
+ : []
+ }
+ end note
+ sync -> sync : update //taxonomy// table
+ end
+
+ group Taxa
+ loop while response is not empty\nand response size matches ""page_size"" from settings\nand loop doesn't exceed ""page_max_retry"" from settings
+ sync -> gn ++ : **GET** ""/api/taxref/allnamebylist/:taxa_list_id""
+ note right of sync
+ ""taxa_list_id"" from settings
+ end note
+ gn -> sync -- : **200**: ""[Taxref]""
+ note right of sync
+ **""Taxref"":**
+ {
+ "cd_nom": ,
+ "lb_nom": ,
+ "nom_vern": ,
+ "nom_valide": ,
+ "regne": ,
+ "group2_inpn": ,
+ "search_name":
+ }
+ end note
+ sync -> sync : update //taxa// table
+ end
+ loop while response is not empty\nand response size matches ""page_size"" from settings\nand loop doesn't exceed ""page_max_retry"" from settings
+ sync -> gn ++ : **GET** ""/api/synthese/color_taxon?:code_area_type""
+ note right of sync
+ ""code_area_type"" from settings
+ end note
+ gn -> sync -- : **200**: ""[TaxrefArea]""
+ note right of sync
+ **""TaxrefArea"":**
+ {
+ "cd_nom": ,
+ "id_area": ,
+ "color": ,
+ "nb_obs": ,
+ "last_date":
+ }
+ end note
+ sync -> sync : update //taxa_area// table
+ end
+ end
+
+ group Nomenclature
+ sync -> gn ++ : **GET** ""/api/nomenclatures/nomenclatures/taxonomy""
+ gn -> sync -- : **200**: ""[NomenclatureType]""
+ note right of sync
+ **""NomenclatureType"":**
+ {
+ "id_type": ,
+ "mnemonique": ,
+ "label_default": ,
+ "nomenclatures": {
+ "id_nomenclature": ,
+ "cd_nomenclature": ,
+ "hierarchy": ,
+ "label_default": ,
+ "taxref": {
+ "regne": ,
+ "group2_inpn": ,
+ }[],
+ }[],
+ }
+ end note
+ note over sync #FFAA88 : **TODO:**\nfetch registered modules from GeoNature
+ loop for each registered module
+ sync -> gn ++ : **GET** ""/api/:module/defaultNomenclatures""
+ gn -> sync -- : **200**: ""[DefaultNomenclature]""
+ note right of sync
+ **""DefaultNomenclature"":**
+ {
+ :
+ }
+ end note
+ end
+ sync -> sync : update //nomenclature_types// table
+ sync -> sync : update //nomenclatures// table
+ sync -> sync : update //nomenclatures_taxonomy// table
+ sync -> sync : update //default_nomenclatures// table
+ end
+
+end
....
== Synchronize local inputs
-[plantuml, images/sync_input, svg]
+[plantuml,images/uml/sync_input,svg]
....
participant "mobile/sync" as sync << mobile >>
participant "GeoNature" as gn
@@ -92,30 +215,28 @@ activate sync
group Fetch exported inputs from installed app
- sync -> sync: fetch installed apps
- note left : from Android ""PackageManager""
-
- loop for each app
- sync -> sync : read exported inputs
-
- loop for each input
- sync -> sync : get module name from input
- sync -> gn ++ : **POST** : ""api/:module/releve""
- note left
- **input:**
- {
- "id": ,
- "module": ,
- ...
- }
- end note
- gn -> sync -- : **200**
- sync -> sync : delete input
+ sync -> sync: fetch installed apps
+ note left : from Android ""PackageManager""
+
+ loop for each app
+ sync -> sync : read exported inputs
+
+ loop for each input
+ sync -> sync : get module name from input
+ sync -> gn ++ : **POST** ""api/:module/releve""
+ note left
+ **""SyncInput"":**
+ {
+ "packageInfo": ,
+ "filePath": ,
+ "module": ,
+ "payload":
Paramètres
+ Synchroniser
Se connecter
Se déconnecter
@@ -19,6 +20,7 @@
Synchronisation des jeux de données : %1$d
Synchronisation des observateurs : %1$d
Synchronisation des taxons : %1$d
+ Synchronisation des unités géographiques : %1$d
Synchronisation des types de nomenclature : %1$d
Synchronisation de la nomenclature : %1$d
Synchronisation des valeurs par défaut de la nomenclature : %1$d
@@ -68,8 +70,6 @@
Erreur lors du chargement des paramètres \'%1$s\'
Paramètres \'%1$s\' à jour
Les permissions n\'ont pas été accordées
- Les permissions ont été accordées
L\'application requiert la permission d\'accéder au contenu de la mémoire de stockage
- L\'accès à la mémoire de stockage a été accordée
diff --git a/sync/src/main/res/values/colors.xml b/sync/src/main/res/values/colors.xml
index a5208abc..85dd9a8e 100644
--- a/sync/src/main/res/values/colors.xml
+++ b/sync/src/main/res/values/colors.xml
@@ -9,7 +9,7 @@
#40000000
@android:color/white
- #80ffffff
+ #40FFFFFF
#64DD17
#D50000
diff --git a/sync/src/main/res/values/dimens.xml b/sync/src/main/res/values/dimens.xml
index 91503b8e..7113a493 100644
--- a/sync/src/main/res/values/dimens.xml
+++ b/sync/src/main/res/values/dimens.xml
@@ -2,6 +2,6 @@
16dp
8dp
- 2dp
+ 4dp
4dp
diff --git a/sync/src/main/res/values/prefs.xml b/sync/src/main/res/values/prefs.xml
index 63f1b519..92846177 100644
--- a/sync/src/main/res/values/prefs.xml
+++ b/sync/src/main/res/values/prefs.xml
@@ -9,7 +9,6 @@
https://demo.geonature.fr/taxhub
server_taxhub_url
Storage
- storage
Internal storage
storage_internal
External storage
diff --git a/sync/src/main/res/values/strings.xml b/sync/src/main/res/values/strings.xml
index 4d4c209a..6b6c533c 100644
--- a/sync/src/main/res/values/strings.xml
+++ b/sync/src/main/res/values/strings.xml
@@ -8,6 +8,7 @@
Sign in
Settings
+ Start sync
Sign in
Sign out
@@ -22,6 +23,7 @@
Synchronize dataset: %1$d
Synchronize observers: %1$d
Synchronize taxa: %1$d
+ Synchronize taxa by area: %1$d
Synchronize nomenclature type: %1$d
Synchronize nomenclature: %1$d
Synchronize nomenclature default values: %1$d
@@ -71,8 +73,6 @@
Unable to load settings \'%1$s\'
Settings \'%1$s\' updated
Permissions were not granted
- Permissions were been granted
External storage permission is needed
- External storage Permissions have been granted
diff --git a/sync/src/main/res/values/styles.xml b/sync/src/main/res/values/styles.xml
index 25818d31..0b87d6a9 100644
--- a/sync/src/main/res/values/styles.xml
+++ b/sync/src/main/res/values/styles.xml
@@ -30,14 +30,4 @@
- @color/primary_dark
-
-
-
-
-
-
diff --git a/sync/src/test/java/fr/geonature/sync/settings/io/OnAppSettingsJsonReaderListenerImplTest.kt b/sync/src/test/java/fr/geonature/sync/settings/io/OnAppSettingsJsonReaderListenerImplTest.kt
index 0e58be20..058d13be 100644
--- a/sync/src/test/java/fr/geonature/sync/settings/io/OnAppSettingsJsonReaderListenerImplTest.kt
+++ b/sync/src/test/java/fr/geonature/sync/settings/io/OnAppSettingsJsonReaderListenerImplTest.kt
@@ -22,7 +22,7 @@ import org.robolectric.annotation.Config
@Config(application = Application::class)
class OnAppSettingsJsonReaderListenerImplTest {
- lateinit var appSettingsJsonReader: AppSettingsJsonReader
+ private lateinit var appSettingsJsonReader: AppSettingsJsonReader
@Before
fun setUp() {
diff --git a/sync/src/test/java/fr/geonature/sync/sync/io/TaxonomyJsonReaderTest.kt b/sync/src/test/java/fr/geonature/sync/sync/io/TaxonomyJsonReaderTest.kt
index abc5ac0b..dfd35459 100644
--- a/sync/src/test/java/fr/geonature/sync/sync/io/TaxonomyJsonReaderTest.kt
+++ b/sync/src/test/java/fr/geonature/sync/sync/io/TaxonomyJsonReaderTest.kt
@@ -66,21 +66,23 @@ class TaxonomyJsonReaderTest {
// then
assertNotNull(taxonomy)
- assertArrayEquals(arrayOf(
- Taxonomy.ANY,
- "Animalia",
- "Bacteria",
- "Chromista",
- "Fungi",
- "Plantae",
- "Protozoa"
- ),
+ assertArrayEquals(
+ arrayOf(
+ Taxonomy.ANY,
+ "Animalia",
+ "Bacteria",
+ "Chromista",
+ "Fungi",
+ "Plantae",
+ "Protozoa"
+ ),
taxonomy.map { it.kingdom }.distinct().toTypedArray()
)
- assertArrayEquals(arrayOf(
- Taxonomy.ANY,
- "Lichens"
- ),
+ assertArrayEquals(
+ arrayOf(
+ Taxonomy.ANY,
+ "Lichens"
+ ),
taxonomy.asSequence().filter { it.kingdom == "Fungi" }.map { it.group }.toList().toTypedArray()
)
}
diff --git a/sync/version.properties b/sync/version.properties
index 460f675c..006ed490 100644
--- a/sync/version.properties
+++ b/sync/version.properties
@@ -1,2 +1,2 @@
-#Mon Oct 26 21:09:56 CET 2020
-VERSION_CODE=2485
+#Sun Feb 07 15:44:25 CET 2021
+VERSION_CODE=2620
diff --git a/viewpager/build.gradle b/viewpager/build.gradle
index a6fa4221..cbd73e48 100644
--- a/viewpager/build.gradle
+++ b/viewpager/build.gradle
@@ -1,8 +1,7 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-version = "0.1.5"
+version = "0.1.9"
android {
compileSdkVersion 29
@@ -41,17 +40,17 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.4"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0"
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1"
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation 'androidx.preference:preference:1.1.1'
- implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ implementation 'androidx.appcompat:appcompat:1.3.0-beta01'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ implementation 'androidx.preference:preference-ktx:1.1.1'
- testImplementation 'junit:junit:4.13'
- testImplementation 'androidx.test:core:1.2.0'
+ testImplementation 'androidx.test:core:1.3.0'
+ testImplementation 'junit:junit:4.13.1'
testImplementation 'org.robolectric:robolectric:4.3.1'
- androidTestImplementation 'androidx.test:runner:1.2.0'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+ androidTestImplementation 'androidx.test:runner:1.3.0'
}
diff --git a/viewpager/src/main/java/fr/geonature/viewpager/pager/PagerManager.kt b/viewpager/src/main/java/fr/geonature/viewpager/pager/PagerManager.kt
index 47b5031f..8df72275 100644
--- a/viewpager/src/main/java/fr/geonature/viewpager/pager/PagerManager.kt
+++ b/viewpager/src/main/java/fr/geonature/viewpager/pager/PagerManager.kt
@@ -80,7 +80,7 @@ class PagerManager(application: Application) {
!preferenceManager.contains(buildPagerPreferenceKey(pagerId))
}
- private fun buildPagerPreferenceKey(pagerId: Long): String? {
+ private fun buildPagerPreferenceKey(pagerId: Long): String {
return "KEY_PAGER_$pagerId"
}
diff --git a/viewpager/src/main/java/fr/geonature/viewpager/ui/AbstractNavigationHistoryPagerFragmentActivity.kt b/viewpager/src/main/java/fr/geonature/viewpager/ui/AbstractNavigationHistoryPagerFragmentActivity.kt
index 8c851ceb..f9a9f7e0 100644
--- a/viewpager/src/main/java/fr/geonature/viewpager/ui/AbstractNavigationHistoryPagerFragmentActivity.kt
+++ b/viewpager/src/main/java/fr/geonature/viewpager/ui/AbstractNavigationHistoryPagerFragmentActivity.kt
@@ -22,11 +22,10 @@ abstract class AbstractNavigationHistoryPagerFragmentActivity : AbstractPagerFra
override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
- historyPrevious =
- savedInstanceState != null && savedInstanceState.getBoolean(
- KEY_HISTORY_PREVIOUS,
- false
- )
+ historyPrevious = savedInstanceState != null && savedInstanceState.getBoolean(
+ KEY_HISTORY_PREVIOUS,
+ false
+ )
val pager = pager ?: return
diff --git a/viewpager/src/main/java/fr/geonature/viewpager/ui/AbstractPagerFragmentActivity.kt b/viewpager/src/main/java/fr/geonature/viewpager/ui/AbstractPagerFragmentActivity.kt
index 87802595..6493e9bb 100644
--- a/viewpager/src/main/java/fr/geonature/viewpager/ui/AbstractPagerFragmentActivity.kt
+++ b/viewpager/src/main/java/fr/geonature/viewpager/ui/AbstractPagerFragmentActivity.kt
@@ -21,7 +21,8 @@ import java.util.ArrayList
*
* @author [S. Grimault](mailto:sebastien.grimault@gmail.com)
*/
-abstract class AbstractPagerFragmentActivity : AppCompatActivity(),
+abstract class AbstractPagerFragmentActivity :
+ AppCompatActivity(),
View.OnClickListener,
ViewPager.OnPageChangeListener {
@@ -370,8 +371,10 @@ abstract class AbstractPagerFragmentActivity : AppCompatActivity(),
val fragment =
supportFragmentManager.findFragmentByTag(
- "android:switcher:" + R.id.pager + ":" + (position
- ?: currentItem)
+ "android:switcher:" + R.id.pager + ":" + (
+ position
+ ?: currentItem
+ )
)
return if (fragment != null && fragment is IValidateFragment) {
@@ -379,8 +382,10 @@ abstract class AbstractPagerFragmentActivity : AppCompatActivity(),
} else {
Log.w(
TAG,
- "getPageFragment: no fragment found through getSupportFragmentManager() at position " + (position
- ?: currentItem)
+ "getPageFragment: no fragment found through getSupportFragmentManager() at position " + (
+ position
+ ?: currentItem
+ )
)
null
diff --git a/viewpager/src/main/res/values/strings.xml b/viewpager/src/main/res/values/strings.xml
index f370de2a..0fb39aef 100644
--- a/viewpager/src/main/res/values/strings.xml
+++ b/viewpager/src/main/res/values/strings.xml
@@ -1,7 +1,8 @@
+
- ViewPager
%1$d - %2$s
+
Previous
Next
Finish
diff --git a/viewpager/src/test/java/fr/geonature/viewpager/pager/io/PagerJsonReaderTest.kt b/viewpager/src/test/java/fr/geonature/viewpager/pager/io/PagerJsonReaderTest.kt
index cdc1c932..8e833a75 100644
--- a/viewpager/src/test/java/fr/geonature/viewpager/pager/io/PagerJsonReaderTest.kt
+++ b/viewpager/src/test/java/fr/geonature/viewpager/pager/io/PagerJsonReaderTest.kt
@@ -1,6 +1,5 @@
package fr.geonature.viewpager.pager.io
-import java.io.StringReader
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
@@ -8,6 +7,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
+import java.io.StringReader
/**
* Unit test for [PagerJsonReader].
@@ -16,7 +16,7 @@ import org.robolectric.RobolectricTestRunner
*/
@RunWith(RobolectricTestRunner::class)
class PagerJsonReaderTest {
- lateinit var pagerJsonReader: PagerJsonReader
+ private lateinit var pagerJsonReader: PagerJsonReader
@Before
fun setUp() {
diff --git a/viewpager/src/test/java/fr/geonature/viewpager/pager/io/PagerJsonWriterTest.kt b/viewpager/src/test/java/fr/geonature/viewpager/pager/io/PagerJsonWriterTest.kt
index 9309f298..a98f08c3 100644
--- a/viewpager/src/test/java/fr/geonature/viewpager/pager/io/PagerJsonWriterTest.kt
+++ b/viewpager/src/test/java/fr/geonature/viewpager/pager/io/PagerJsonWriterTest.kt
@@ -1,13 +1,13 @@
package fr.geonature.viewpager.pager.io
import fr.geonature.viewpager.pager.Pager
-import java.io.StringWriter
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
+import java.io.StringWriter
/**
* Unit test for [PagerJsonWriter].
@@ -16,7 +16,7 @@ import org.robolectric.RobolectricTestRunner
*/
@RunWith(RobolectricTestRunner::class)
class PagerJsonWriterTest {
- lateinit var pagerJsonWriter: PagerJsonWriter
+ private lateinit var pagerJsonWriter: PagerJsonWriter
@Before
fun setUp() {
diff --git a/viewpager/version.properties b/viewpager/version.properties
index ebc3823f..cf393176 100644
--- a/viewpager/version.properties
+++ b/viewpager/version.properties
@@ -1,2 +1,2 @@
-#Sun Jun 07 13:36:46 CEST 2020
-VERSION_CODE=830
+#Tue Feb 02 20:36:43 CET 2021
+VERSION_CODE=960