diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9e8dbf5b..69bee057 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,6 +6,7 @@ plugins { id("kotlin-android") id("kotlin-parcelize") id("kotlin-kapt") + id("com.google.devtools.ksp").version("2.0.21-1.0.28") id("androidx.navigation.safeargs.kotlin") id("com.mikepenz.aboutlibraries.plugin") } @@ -16,14 +17,18 @@ android { defaultConfig { applicationId = "net.vonforst.evmap" - compileSdk = 34 + compileSdk = 35 minSdk = 21 - targetSdk = 34 + targetSdk = 35 // NOTE: always increase versionCode by 2 since automotive flavor uses versionCode + 1 versionCode = 256 versionName = "1.9.18" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + ksp { + arg("room.schemaLocation", "$projectDir/schemas") + } } val isRunningOnCI = System.getenv("CI") == "true" @@ -91,18 +96,12 @@ android { compileOptions { isCoreLibraryDesugaringEnabled = true - targetCompatibility = JavaVersion.VERSION_1_8 - sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8.toString() - } - - tasks.withType().configureEach { - kotlinOptions { - jvmTarget = "1.8" - } + jvmTarget = JavaVersion.VERSION_17.toString() } buildFeatures { @@ -302,8 +301,8 @@ dependencies { implementation("com.squareup.retrofit2:converter-moshi:2.9.0") implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("com.squareup.okhttp3:okhttp-urlconnection:4.12.0") - implementation("com.squareup.moshi:moshi-kotlin:1.15.0") - implementation("com.squareup.moshi:moshi-adapters:1.15.0") + implementation("com.squareup.moshi:moshi-kotlin:1.15.2") + implementation("com.squareup.moshi:moshi-adapters:1.15.2") implementation("com.markomilos.jsonapi:jsonapi-retrofit:1.1.0") implementation("io.coil-kt:coil:2.6.0") implementation("com.github.ev-map:StfalconImageViewer:5082ebd392") @@ -352,9 +351,9 @@ dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version") // room library - val room_version = "2.6.1" + val room_version = "2.7.1" implementation("androidx.room:room-runtime:$room_version") - kapt("androidx.room:room-compiler:$room_version") + ksp("androidx.room:room-compiler:$room_version") implementation("androidx.room:room-ktx:$room_version") implementation("com.github.anboralabs:spatia-room:0.3.0") { exclude("com.github.dalgarins", "android-spatialite") @@ -396,7 +395,7 @@ dependencies { androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation("androidx.arch.core:core-testing:2.2.0") - kapt("com.squareup.moshi:moshi-kotlin-codegen:1.15.0") + ksp("com.squareup.moshi:moshi-kotlin-codegen:1.15.2") coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") } diff --git a/app/schemas/net.vonforst.evmap.storage.AppDatabase/22.json b/app/schemas/net.vonforst.evmap.storage.AppDatabase/22.json new file mode 100644 index 00000000..b2435760 --- /dev/null +++ b/app/schemas/net.vonforst.evmap.storage.AppDatabase/22.json @@ -0,0 +1,904 @@ +{ + "formatVersion": 1, + "database": { + "version": 22, + "identityHash": "5dbaaa5adf8cb9b6e8a8314bb7766447", + "entities": [ + { + "tableName": "ChargeLocation", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `dataSource` TEXT NOT NULL, `name` TEXT NOT NULL, `coordinates` BLOB NOT NULL, `chargepoints` TEXT NOT NULL, `network` TEXT, `url` TEXT NOT NULL, `editUrl` TEXT, `verified` INTEGER NOT NULL, `barrierFree` INTEGER, `operator` TEXT, `generalInformation` TEXT, `amenities` TEXT, `locationDescription` TEXT, `photos` TEXT, `chargecards` TEXT, `license` TEXT, `networkUrl` TEXT, `chargerUrl` TEXT, `timeRetrieved` INTEGER NOT NULL, `isDetailed` INTEGER NOT NULL, `city` TEXT, `country` TEXT, `postcode` TEXT, `street` TEXT, `fault_report_created` INTEGER, `fault_report_description` TEXT, `twentyfourSeven` INTEGER, `description` TEXT, `mostart` TEXT, `moend` TEXT, `tustart` TEXT, `tuend` TEXT, `westart` TEXT, `weend` TEXT, `thstart` TEXT, `thend` TEXT, `frstart` TEXT, `frend` TEXT, `sastart` TEXT, `saend` TEXT, `sustart` TEXT, `suend` TEXT, `hostart` TEXT, `hoend` TEXT, `freecharging` INTEGER, `freeparking` INTEGER, `descriptionShort` TEXT, `descriptionLong` TEXT, `chargepricecountry` TEXT, `chargepricenetwork` TEXT, `chargepriceplugTypes` TEXT, PRIMARY KEY(`id`, `dataSource`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dataSource", + "columnName": "dataSource", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "coordinates", + "columnName": "coordinates", + "affinity": "BLOB", + "notNull": true + }, + { + "fieldPath": "chargepoints", + "columnName": "chargepoints", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "network", + "columnName": "network", + "affinity": "TEXT" + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "editUrl", + "columnName": "editUrl", + "affinity": "TEXT" + }, + { + "fieldPath": "verified", + "columnName": "verified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "barrierFree", + "columnName": "barrierFree", + "affinity": "INTEGER" + }, + { + "fieldPath": "operator", + "columnName": "operator", + "affinity": "TEXT" + }, + { + "fieldPath": "generalInformation", + "columnName": "generalInformation", + "affinity": "TEXT" + }, + { + "fieldPath": "amenities", + "columnName": "amenities", + "affinity": "TEXT" + }, + { + "fieldPath": "locationDescription", + "columnName": "locationDescription", + "affinity": "TEXT" + }, + { + "fieldPath": "photos", + "columnName": "photos", + "affinity": "TEXT" + }, + { + "fieldPath": "chargecards", + "columnName": "chargecards", + "affinity": "TEXT" + }, + { + "fieldPath": "license", + "columnName": "license", + "affinity": "TEXT" + }, + { + "fieldPath": "networkUrl", + "columnName": "networkUrl", + "affinity": "TEXT" + }, + { + "fieldPath": "chargerUrl", + "columnName": "chargerUrl", + "affinity": "TEXT" + }, + { + "fieldPath": "timeRetrieved", + "columnName": "timeRetrieved", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDetailed", + "columnName": "isDetailed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "address.city", + "columnName": "city", + "affinity": "TEXT" + }, + { + "fieldPath": "address.country", + "columnName": "country", + "affinity": "TEXT" + }, + { + "fieldPath": "address.postcode", + "columnName": "postcode", + "affinity": "TEXT" + }, + { + "fieldPath": "address.street", + "columnName": "street", + "affinity": "TEXT" + }, + { + "fieldPath": "faultReport.created", + "columnName": "fault_report_created", + "affinity": "INTEGER" + }, + { + "fieldPath": "faultReport.description", + "columnName": "fault_report_description", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.twentyfourSeven", + "columnName": "twentyfourSeven", + "affinity": "INTEGER" + }, + { + "fieldPath": "openinghours.description", + "columnName": "description", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.monday.start", + "columnName": "mostart", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.monday.end", + "columnName": "moend", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.tuesday.start", + "columnName": "tustart", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.tuesday.end", + "columnName": "tuend", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.wednesday.start", + "columnName": "westart", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.wednesday.end", + "columnName": "weend", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.thursday.start", + "columnName": "thstart", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.thursday.end", + "columnName": "thend", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.friday.start", + "columnName": "frstart", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.friday.end", + "columnName": "frend", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.saturday.start", + "columnName": "sastart", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.saturday.end", + "columnName": "saend", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.sunday.start", + "columnName": "sustart", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.sunday.end", + "columnName": "suend", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.holiday.start", + "columnName": "hostart", + "affinity": "TEXT" + }, + { + "fieldPath": "openinghours.days.holiday.end", + "columnName": "hoend", + "affinity": "TEXT" + }, + { + "fieldPath": "cost.freecharging", + "columnName": "freecharging", + "affinity": "INTEGER" + }, + { + "fieldPath": "cost.freeparking", + "columnName": "freeparking", + "affinity": "INTEGER" + }, + { + "fieldPath": "cost.descriptionShort", + "columnName": "descriptionShort", + "affinity": "TEXT" + }, + { + "fieldPath": "cost.descriptionLong", + "columnName": "descriptionLong", + "affinity": "TEXT" + }, + { + "fieldPath": "chargepriceData.country", + "columnName": "chargepricecountry", + "affinity": "TEXT" + }, + { + "fieldPath": "chargepriceData.network", + "columnName": "chargepricenetwork", + "affinity": "TEXT" + }, + { + "fieldPath": "chargepriceData.plugTypes", + "columnName": "chargepriceplugTypes", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id", + "dataSource" + ] + } + }, + { + "tableName": "Favorite", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`favoriteId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `chargerId` INTEGER NOT NULL, `chargerDataSource` TEXT NOT NULL, FOREIGN KEY(`chargerId`, `chargerDataSource`) REFERENCES `ChargeLocation`(`id`, `dataSource`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "favoriteId", + "columnName": "favoriteId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "chargerId", + "columnName": "chargerId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "chargerDataSource", + "columnName": "chargerDataSource", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "favoriteId" + ] + }, + "indices": [ + { + "name": "index_Favorite_chargerId_chargerDataSource", + "unique": false, + "columnNames": [ + "chargerId", + "chargerDataSource" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_Favorite_chargerId_chargerDataSource` ON `${TABLE_NAME}` (`chargerId`, `chargerDataSource`)" + } + ], + "foreignKeys": [ + { + "table": "ChargeLocation", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "chargerId", + "chargerDataSource" + ], + "referencedColumns": [ + "id", + "dataSource" + ] + } + ] + }, + { + "tableName": "BooleanFilterValue", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `value` INTEGER NOT NULL, `dataSource` TEXT NOT NULL, `profile` INTEGER NOT NULL, PRIMARY KEY(`key`, `profile`, `dataSource`), FOREIGN KEY(`profile`, `dataSource`) REFERENCES `FilterProfile`(`id`, `dataSource`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dataSource", + "columnName": "dataSource", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "profile", + "columnName": "profile", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "key", + "profile", + "dataSource" + ] + }, + "indices": [ + { + "name": "index_BooleanFilterValue_profile_dataSource", + "unique": false, + "columnNames": [ + "profile", + "dataSource" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_BooleanFilterValue_profile_dataSource` ON `${TABLE_NAME}` (`profile`, `dataSource`)" + } + ], + "foreignKeys": [ + { + "table": "FilterProfile", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "profile", + "dataSource" + ], + "referencedColumns": [ + "id", + "dataSource" + ] + } + ] + }, + { + "tableName": "MultipleChoiceFilterValue", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `values` TEXT NOT NULL, `all` INTEGER NOT NULL, `dataSource` TEXT NOT NULL, `profile` INTEGER NOT NULL, PRIMARY KEY(`key`, `profile`, `dataSource`), FOREIGN KEY(`profile`, `dataSource`) REFERENCES `FilterProfile`(`id`, `dataSource`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "values", + "columnName": "values", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "all", + "columnName": "all", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dataSource", + "columnName": "dataSource", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "profile", + "columnName": "profile", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "key", + "profile", + "dataSource" + ] + }, + "indices": [ + { + "name": "index_MultipleChoiceFilterValue_profile_dataSource", + "unique": false, + "columnNames": [ + "profile", + "dataSource" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_MultipleChoiceFilterValue_profile_dataSource` ON `${TABLE_NAME}` (`profile`, `dataSource`)" + } + ], + "foreignKeys": [ + { + "table": "FilterProfile", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "profile", + "dataSource" + ], + "referencedColumns": [ + "id", + "dataSource" + ] + } + ] + }, + { + "tableName": "SliderFilterValue", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `value` INTEGER NOT NULL, `dataSource` TEXT NOT NULL, `profile` INTEGER NOT NULL, PRIMARY KEY(`key`, `profile`, `dataSource`), FOREIGN KEY(`profile`, `dataSource`) REFERENCES `FilterProfile`(`id`, `dataSource`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dataSource", + "columnName": "dataSource", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "profile", + "columnName": "profile", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "key", + "profile", + "dataSource" + ] + }, + "indices": [ + { + "name": "index_SliderFilterValue_profile_dataSource", + "unique": false, + "columnNames": [ + "profile", + "dataSource" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_SliderFilterValue_profile_dataSource` ON `${TABLE_NAME}` (`profile`, `dataSource`)" + } + ], + "foreignKeys": [ + { + "table": "FilterProfile", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "profile", + "dataSource" + ], + "referencedColumns": [ + "id", + "dataSource" + ] + } + ] + }, + { + "tableName": "FilterProfile", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `dataSource` TEXT NOT NULL, `id` INTEGER NOT NULL, `order` INTEGER NOT NULL, PRIMARY KEY(`dataSource`, `id`))", + "fields": [ + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "dataSource", + "columnName": "dataSource", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "order", + "columnName": "order", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "dataSource", + "id" + ] + }, + "indices": [ + { + "name": "index_FilterProfile_dataSource_name", + "unique": true, + "columnNames": [ + "dataSource", + "name" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_FilterProfile_dataSource_name` ON `${TABLE_NAME}` (`dataSource`, `name`)" + } + ] + }, + { + "tableName": "RecentAutocompletePlace", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `dataSource` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `primaryText` TEXT NOT NULL, `secondaryText` TEXT NOT NULL, `latLng` TEXT NOT NULL, `viewport` TEXT, `types` TEXT NOT NULL, PRIMARY KEY(`id`, `dataSource`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "dataSource", + "columnName": "dataSource", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "primaryText", + "columnName": "primaryText", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondaryText", + "columnName": "secondaryText", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "latLng", + "columnName": "latLng", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "viewport", + "columnName": "viewport", + "affinity": "TEXT" + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id", + "dataSource" + ] + } + }, + { + "tableName": "GEPlug", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, PRIMARY KEY(`name`))", + "fields": [ + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "name" + ] + } + }, + { + "tableName": "GENetwork", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, PRIMARY KEY(`name`))", + "fields": [ + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "name" + ] + } + }, + { + "tableName": "GEChargeCard", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "OCMConnectionType", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `formalName` TEXT, `discontinued` INTEGER, `obsolete` INTEGER, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "formalName", + "columnName": "formalName", + "affinity": "TEXT" + }, + { + "fieldPath": "discontinued", + "columnName": "discontinued", + "affinity": "INTEGER" + }, + { + "fieldPath": "obsolete", + "columnName": "obsolete", + "affinity": "INTEGER" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "OCMCountry", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `isoCode` TEXT NOT NULL, `continentCode` TEXT, `title` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isoCode", + "columnName": "isoCode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "continentCode", + "columnName": "continentCode", + "affinity": "TEXT" + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "OCMOperator", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `websiteUrl` TEXT, `title` TEXT NOT NULL, `contactEmail` TEXT, `contactTelephone1` TEXT, `contactTelephone2` TEXT, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "websiteUrl", + "columnName": "websiteUrl", + "affinity": "TEXT" + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contactEmail", + "columnName": "contactEmail", + "affinity": "TEXT" + }, + { + "fieldPath": "contactTelephone1", + "columnName": "contactTelephone1", + "affinity": "TEXT" + }, + { + "fieldPath": "contactTelephone2", + "columnName": "contactTelephone2", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "SavedRegion", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`region` BLOB NOT NULL, `dataSource` TEXT NOT NULL, `timeRetrieved` INTEGER NOT NULL, `filters` TEXT, `isDetailed` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)", + "fields": [ + { + "fieldPath": "region", + "columnName": "region", + "affinity": "BLOB", + "notNull": true + }, + { + "fieldPath": "dataSource", + "columnName": "dataSource", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timeRetrieved", + "columnName": "timeRetrieved", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "filters", + "columnName": "filters", + "affinity": "TEXT" + }, + { + "fieldPath": "isDetailed", + "columnName": "isDetailed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_SavedRegion_filters_dataSource", + "unique": false, + "columnNames": [ + "filters", + "dataSource" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_SavedRegion_filters_dataSource` ON `${TABLE_NAME}` (`filters`, `dataSource`)" + } + ] + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5dbaaa5adf8cb9b6e8a8314bb7766447')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt b/app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt index 8e3bbb73..1cb04d07 100644 --- a/app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt +++ b/app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt @@ -379,7 +379,7 @@ class ChargerDetailScreen( var text = formatTeslaPricing(teslaPricing, carContext) as CharSequence formatTeslaParkingFee(teslaPricing, carContext)?.let { text += "\n\n" + it } addText(text) - } ?: { + } ?: run { addText(carContext.getString(if (prediction != null) R.string.auto_no_data else R.string.loading)) } }.build()) diff --git a/app/src/main/java/net/vonforst/evmap/auto/Utils.kt b/app/src/main/java/net/vonforst/evmap/auto/Utils.kt index dc1b4ac7..ca6bdd6b 100644 --- a/app/src/main/java/net/vonforst/evmap/auto/Utils.kt +++ b/app/src/main/java/net/vonforst/evmap/auto/Utils.kt @@ -202,7 +202,7 @@ fun List.paginate(nSingle: Int, nFirst: Int, nOther: Int, nLast: Int): Li fun getAndroidAutoVersion(ctx: Context): List { val info = ctx.packageManager.getPackageInfoCompat("com.google.android.projection.gearhead", 0) - return info.versionName.split(".") + return info.versionName!!.split(".") } fun supportsCarApiLevel3(ctx: CarContext): Boolean { diff --git a/app/src/main/java/net/vonforst/evmap/storage/TypeConverters.kt b/app/src/main/java/net/vonforst/evmap/storage/TypeConverters.kt index f2fe6d9a..50c0cb19 100644 --- a/app/src/main/java/net/vonforst/evmap/storage/TypeConverters.kt +++ b/app/src/main/java/net/vonforst/evmap/storage/TypeConverters.kt @@ -117,6 +117,16 @@ class Converters { return stringSetAdapter.fromJson(value) } + @TypeConverter + fun fromStringMutableSet(value: MutableSet?): String { + return stringSetAdapter.toJson(value) + } + + @TypeConverter + fun toStringMutableSet(value: String): MutableSet? { + return stringSetAdapter.fromJson(value)?.toMutableSet() + } + @TypeConverter fun fromStringList(value: List?): String { return stringListAdapter.toJson(value) diff --git a/build.gradle.kts b/build.gradle.kts index e1d47c52..2e1b3e34 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - val kotlinVersion by extra("1.9.24") + val kotlinVersion by extra("2.0.21") val aboutLibsVersion by extra("10.9.1") val navVersion by extra("2.7.7") repositories { @@ -10,7 +10,7 @@ buildscript { gradlePluginPortal() } dependencies { - classpath("com.android.tools.build:gradle:8.4.2") + classpath("com.android.tools.build:gradle:8.9.3") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") classpath("com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$aboutLibsVersion") classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$navVersion") diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0066ff22..3221abe3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sat Aug 06 15:33:46 CEST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME