Add support for location plugins (#772)
* Cherry pick location refactor * Refactor :data:openstreetmaps to :data:locations * contract, plugin sdk * Implement serialization, module tweaks * Include check for out-of-date departures in SearchableItemVM.requestUpdatedSearchable() * settings for location plugins * Try not to be too lazy * more fiddling with the plugin SDK * add departures in MapView with mock data for debug builds * change icons * add boats * animate departure lazycolumn * Add MarqueeText for text overflow handling * Define height for Departures in case there is no map to display * Don't inclure railway / highway tags for OSM since there will be location plugins for that * sort by time * - Apply pre-merge changes to LocationSettings - Add banner warning about slowed down location search for large search radii * ditch `showLocationOnMap` * LocationItem: make `showOpeningSchedule` toggleable * LocationItem: make Navigation AssistChip work for people that don't have google maps installed * LocationItem: resolve TODOs * MapTiles: ditch unused code, animate userIndicator * Reintroduce departure list * Add LineColor * Add osm tag `stars` as `userRating` https://taginfo.openstreetmap.org/keys/stars#overview * typealias -> import * Don't add Navigation Chip when there is no way to resolve navigation intents * Add settings migration * Set plugin SDK version to 1.2.0-SNAPSHOT * Deduplicate shared plugin classes, use kotlinx.serialization * Fix imports * Use ZonedDateTime for depature times * Add more line types * Rewrite location serialization * Replace street/houseNumber with address * Add attribution field * Add plugin config * Reject location search requests without lat lon parameters * Add default values to plugin location class * Don't crash if column value is null * Add docs comments to LocationCategory values * Refactor OpeningSchedule as polymorphic * remove dead corpse *ahem* code * Split LocationCategory into category and icon (Also update to Kotlin 2.0, please don't do this at home) * Add more location icons * Fix (?) location deserializer * Add more location icons * More icons * Meh * Add Pub * Disable Github Maven repo if credentials are missing * Add location search specific settings to plugin details screen * Add language parameter * Unbreak the build * Refactor plugin SDK (with breaking changes) * Set plugin SDK version to 2.0.0-SNAPSHOT * Document SDK breaking changes * Implement LocationProvider.getQuery * Add a typesafe cursor API * Oops I did it again next time maybe check if the code is actually compiling before pushing * Add missing return statement * Fix list serialization * Departure time UI adjustment * Use typesafe cursor for weather plugins * Add userRatingCount and emailAddress fields * grrr * Rename and extend LineTypes * Add default lineType to Departure to fix serialization errors * Fix refreshing stored plugin locations * Adapt line name column width to available departures * Fix plugin settings screen category overlap * add LocationItem.GenericTransit * Fix crash during deserialization of locations * Update SDK docs * Replace plugin "official" mark with "verified developer" mark before anyone gets sued * show 'now' when departure is in less than one minute * Add typesafe Bundle API * Implement plugin API changes * Plugin SDK: Fix refresh result not being returned * Update docs * apply alpha to departures that have departured * better (maybe): reduce saturation instead of alpha * Add default values for Attribution * Display attribution * Rearrange location result layout * Reduce searchable update interval to 1 minute * Pass last update time to refresh function * Change refresh path and ensure that timestamp is only update when the item was updated * categorize osm location * Update docs * Optimize location search - run providers in parallel - flatten code * add experimental address parsing for OSM * add poi_category_townhall * Fix popup closing when favorites items are updated * Revert "Fix popup closing when favorites items are updated" This reverts commit fc517fd066c7f8109b6d6df2d4f536af66398207. * Fork AndroidAddressFormatter to `:libs:address-formatter` * migrate `:libs:address-formatter` dependencies to version catalog and update them * also consider addr:{suburb,hamlet} for `Address.city` if city tag is missing * Move poi strings back to strings.xml * Update Jetpack Compose * Move address-formatter back to its original package, add license and readme * Move address-formatter back to its original package --------- Co-authored-by: MM20 <15646950+MM2-0@users.noreply.github.com>
This commit is contained in:
@@ -3,6 +3,7 @@ package de.mm20.launcher2.preferences
|
||||
import android.content.Context
|
||||
import de.mm20.launcher2.preferences.migrations.Migration1
|
||||
import de.mm20.launcher2.preferences.migrations.Migration2
|
||||
import de.mm20.launcher2.preferences.migrations.Migration3
|
||||
import de.mm20.launcher2.settings.BaseSettings
|
||||
|
||||
internal class LauncherDataStore(
|
||||
@@ -15,6 +16,7 @@ internal class LauncherDataStore(
|
||||
migrations = listOf(
|
||||
Migration1(legacyDataStore),
|
||||
Migration2(),
|
||||
Migration3(),
|
||||
),
|
||||
) {
|
||||
|
||||
|
||||
@@ -135,7 +135,9 @@ data class LauncherSettingsData internal constructor(
|
||||
val weatherProviderSettings: Map<String, ProviderSettings> = emptyMap(),
|
||||
val weatherImperialUnits: Boolean = false,
|
||||
|
||||
@Deprecated("Use locationSearchProviders instead")
|
||||
val locationSearchEnabled: Boolean = false,
|
||||
val locationSearchProviders: Set<String> = setOf("openstreetmaps"),
|
||||
val locationSearchImperialUnits: Boolean = false,
|
||||
val locationSearchRadius: Int = 1500,
|
||||
val locationSearchHideUncategorized: Boolean = true,
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package de.mm20.launcher2.preferences.migrations
|
||||
|
||||
import androidx.datastore.core.DataMigration
|
||||
import de.mm20.launcher2.preferences.LauncherSettingsData
|
||||
|
||||
class Migration3: DataMigration<LauncherSettingsData> {
|
||||
override suspend fun cleanUp() {
|
||||
}
|
||||
|
||||
override suspend fun shouldMigrate(currentData: LauncherSettingsData): Boolean {
|
||||
return currentData.schemaVersion < 3
|
||||
}
|
||||
|
||||
override suspend fun migrate(currentData: LauncherSettingsData): LauncherSettingsData {
|
||||
return currentData.copy(
|
||||
schemaVersion = 3,
|
||||
locationSearchProviders = buildSet {
|
||||
if (currentData.locationSearchEnabled) {
|
||||
add("openstreetmaps")
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
+27
-16
@@ -1,16 +1,16 @@
|
||||
package de.mm20.launcher2.preferences.search
|
||||
|
||||
import de.mm20.launcher2.preferences.LauncherDataStore
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
|
||||
class LocationSearchSettings internal constructor(
|
||||
private val launcherDataStore: LauncherDataStore,
|
||||
) {
|
||||
|
||||
val data
|
||||
get() = launcherDataStore.data.map {
|
||||
LocationSearchSettingsData(
|
||||
enabled = it.locationSearchEnabled,
|
||||
providers = it.locationSearchProviders,
|
||||
searchRadius = it.locationSearchRadius,
|
||||
hideUncategorized = it.locationSearchHideUncategorized,
|
||||
overpassUrl = it.locationSearchOverpassUrl,
|
||||
@@ -22,12 +22,32 @@ class LocationSearchSettings internal constructor(
|
||||
)
|
||||
}
|
||||
|
||||
val enabled
|
||||
get() = launcherDataStore.data.map { it.locationSearchEnabled }
|
||||
val enabledProviders: Flow<Set<String>>
|
||||
get() = launcherDataStore.data.map { it.locationSearchProviders }
|
||||
|
||||
fun setEnabled(enabled: Boolean) {
|
||||
val osmLocations
|
||||
get() = launcherDataStore.data.map { it.locationSearchProviders.contains("openstreetmaps") }
|
||||
|
||||
fun setOsmLocations(osmLocations: Boolean) {
|
||||
launcherDataStore.update {
|
||||
it.copy(locationSearchEnabled = enabled)
|
||||
if (osmLocations) {
|
||||
it.copy(locationSearchProviders = it.locationSearchProviders + "openstreetmaps")
|
||||
} else {
|
||||
it.copy(locationSearchProviders = it.locationSearchProviders - "openstreetmaps")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val enabledPlugins: Flow<Set<String>>
|
||||
get() = launcherDataStore.data.map { it.locationSearchProviders - "openstreetmaps" }
|
||||
|
||||
fun setPluginEnabled(authority: String, enabled: Boolean) {
|
||||
launcherDataStore.update {
|
||||
if (enabled) {
|
||||
it.copy(locationSearchProviders = it.locationSearchProviders + authority)
|
||||
} else {
|
||||
it.copy(locationSearchProviders = it.locationSearchProviders - authority)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,15 +96,6 @@ class LocationSearchSettings internal constructor(
|
||||
}
|
||||
}
|
||||
|
||||
val showPositionOnMap
|
||||
get() = launcherDataStore.data.map { it.locationSearchShowPositionOnMap }
|
||||
|
||||
fun setShowPositionOnMap(showPositionOnMap: Boolean) {
|
||||
launcherDataStore.update {
|
||||
it.copy(locationSearchShowPositionOnMap = showPositionOnMap)
|
||||
}
|
||||
}
|
||||
|
||||
val themeMap
|
||||
get() = launcherDataStore.data.map { it.locationSearchThemeMap }
|
||||
|
||||
@@ -111,7 +122,7 @@ class LocationSearchSettings internal constructor(
|
||||
}
|
||||
|
||||
data class LocationSearchSettingsData(
|
||||
val enabled: Boolean = false,
|
||||
val providers: Set<String> = setOf("openstreetmaps"),
|
||||
val searchRadius: Int = 1500,
|
||||
val hideUncategorized: Boolean = true,
|
||||
val overpassUrl: String = LocationSearchSettings.DefaultOverpassUrl,
|
||||
|
||||
Reference in New Issue
Block a user