From 65a9c8c1fecdc96912a6d3f2f76c1d97b4cda384 Mon Sep 17 00:00:00 2001 From: Christoph <47949835+Sir-Photch@users.noreply.github.com> Date: Fri, 14 Jun 2024 11:57:03 +0200 Subject: [PATCH] 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> --- .gitignore | 4 +- .idea/inspectionProfiles/Project_Default.xml | 28 + .idea/kotlinc.xml | 2 +- app/app/build.gradle.kts | 4 +- .../de/mm20/launcher2/LauncherApplication.kt | 4 +- app/ui/build.gradle.kts | 7 +- .../launcher2/ui/component/MarqueeText.kt | 101 +++ .../mm20/launcher2/ui/component/RatingBar.kt | 17 +- .../ui/component/ShapedLauncherIcon.kt | 125 +--- .../component/preferences/TextPreference.kt | 2 + .../component/weather/AnimatedWeatherIcon.kt | 8 +- .../ui/component/weather/WeatherIcon.kt | 14 +- .../mm20/launcher2/ui/ktx/ContentDrawState.kt | 24 + .../de/mm20/launcher2/ui/ktx/MutableState.kt | 2 +- .../launcher2/ui/launcher/search/SearchVM.kt | 12 +- .../search/common/SearchableItemVM.kt | 18 +- .../launcher/search/common/grid/GridItem.kt | 3 - .../launcher/search/common/list/ListItem.kt | 2 - .../launcher/search/contacts/ContactItem.kt | 9 +- .../search/filters/KeyboardFilterBar.kt | 14 - .../search/filters/KeyboardFilterBarItem.kt | 2 +- .../launcher/search/filters/SearchFilters.kt | 2 +- .../launcher/search/location/LocationItem.kt | 657 +++++++++++++----- .../ui/launcher/search/location/MapTiles.kt | 65 +- .../clock/parts/BatteryPartProvider.kt | 15 +- .../launcher/widgets/weather/WeatherWidget.kt | 8 +- .../ui/settings/about/AboutSettingsScreen.kt | 6 +- .../filesearch/FileSearchSettingsScreen.kt | 4 +- .../locations/LocationsSettingsScreen.kt | 87 ++- .../locations/LocationsSettingsScreenVM.kt | 40 +- .../settings/plugins/PluginSettingsScreen.kt | 275 +++++--- .../plugins/PluginSettingsScreenVM.kt | 12 + .../settings/plugins/PluginsSettingsScreen.kt | 9 - .../settings/search/SearchSettingsScreen.kt | 11 +- .../settings/search/SearchSettingsScreenVM.kt | 8 - core/base/build.gradle.kts | 3 + .../de/mm20/launcher2}/icons/BatteryIcons.kt | 2 +- .../java/de/mm20/launcher2}/icons/Icons.kt | 332 ++++++++- .../mm20/launcher2/icons/LauncherIconLayer.kt | 6 + .../de/mm20/launcher2/plugin/PluginApi.kt | 26 +- .../de/mm20/launcher2/plugin/PluginPackage.kt | 2 +- .../mm20/launcher2/plugin/QueryPluginApi.kt | 190 +++++ .../plugin/config/SearchPluginConfig.kt | 4 +- .../java/de/mm20/launcher2/search/Location.kt | 507 ++++++++------ .../launcher2/search/UpdatableSearchable.kt | 15 +- .../launcher2/search/OpeningScheduleTest.kt | 2 + .../devicepose/DevicePoseProvider.kt | 2 + core/i18n/src/main/res/values-pl/strings.xml | 2 +- core/i18n/src/main/res/values/strings.xml | 49 ++ .../main/java/de/mm20/launcher2/ktx/Json.kt | 3 +- .../de/mm20/launcher2/ktx/PendingIntent.kt | 10 +- .../preferences/LauncherDataStore.kt | 2 + .../preferences/LauncherSettingsData.kt | 2 + .../preferences/migrations/Migration3.kt | 24 + .../search/LocationSearchSettings.kt | 43 +- core/shared/build.gradle.kts | 22 +- .../de/mm20/launcher2/plugin/PluginType.kt | 1 + ...chPluginConfig.kt => QueryPluginConfig.kt} | 5 +- .../plugin/config/StorageStrategy.kt | 14 +- .../launcher2/plugin/contracts/Columns.kt | 271 ++++++++ .../plugin/contracts/FilePluginContract.kt | 41 +- .../contracts/LocationPluginContract.kt | 143 ++++ .../plugin/contracts/SearchPluginContract.kt | 18 +- .../plugin/contracts/WeatherPluginContract.kt | 50 +- .../de/mm20/launcher2/plugin/data/Bundle.kt | 17 + .../de/mm20/launcher2/plugin/data/Cursor.kt | 77 ++ .../mm20/launcher2/search/location/Address.kt | 35 + .../launcher2/search/location/Attribution.kt | 13 + .../launcher2/search/location/Departure.kt | 47 ++ .../launcher2/search/location/LocationIcon.kt | 139 ++++ .../search/location/OpeningSchedule.kt | 30 + .../serialization/ColorSerializer.kt | 21 + .../serialization/DayOfWeekSerializer.kt | 22 + .../serialization/DurationSerializer.kt | 20 + .../de/mm20/launcher2/serialization/Json.kt | 17 + .../serialization/LocalTimeSerializer.kt | 21 + .../OpeningScheduleSerializer.kt | 55 ++ .../launcher2/serialization/UriSerializer.kt | 21 + .../serialization/ZonedDateTimeSerializer.kt | 27 + .../de/mm20/launcher2/weather/WeatherIcon.kt | 25 + .../mm20/launcher2/files/FileSerialization.kt | 111 +-- .../launcher2/files/providers/DeferredFile.kt | 3 +- .../launcher2/files/providers/PluginFile.kt | 6 +- .../files/providers/PluginFileProvider.kt | 285 +++----- data/{openstreetmaps => locations}/.gitignore | 0 .../build.gradle.kts | 1 + data/locations/consumer-rules.pro | 2 + .../proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../locations/LocationSerialization.kt | 198 ++++++ .../locations/LocationsRepository.kt | 86 +++ .../de/mm20/launcher2/locations/Module.kt | 19 + .../locations/providers/LocationProvider.kt | 16 + .../locations/providers/PluginLocation.kt | 66 ++ .../providers/PluginLocationProvider.kt | 121 ++++ .../providers/openstreetmaps/OsmLocation.kt | 495 +++++++++++++ .../openstreetmaps/OsmLocationProvider.kt | 171 +++++ .../providers}/openstreetmaps/OverpassApi.kt | 2 +- data/openstreetmaps/consumer-rules.pro | 2 - .../mm20/launcher2/openstreetmaps/Module.kt | 13 - .../launcher2/openstreetmaps/OsmLocation.kt | 302 -------- .../launcher2/openstreetmaps/OsmRepository.kt | 195 ------ .../openstreetmaps/OsmSerialization.kt | 107 --- .../weather/plugin/PluginWeatherProvider.kt | 151 +--- .../developer-guide/plugins/get-started.md | 1 + .../developer-guide/plugins/migrations/v2.md | 39 ++ .../plugin-types/common/_get_params.md | 4 + .../common/_query_plugin_config.md | 18 + .../plugin-types/common/_refresh_params.md | 7 + .../plugin-types/common/_search_params.md | 11 + .../common/_search_plugin_config.md | 20 - .../plugins/plugin-types/file-search.md | 52 +- .../plugins/plugin-types/places-search.md | 124 ++++ .../plugins/plugin-types/weather.md | 1 + docs/docs/developer-guide/sidebar.ts | 14 + gradle/libs.versions.toml | 21 +- libs/address-formatter/LICENSE | 21 + libs/address-formatter/Readme.md | 2 + libs/address-formatter/build.gradle | 30 + libs/address-formatter/proguard-rules.pro | 17 + .../OsmAddressFormatter.java | 478 +++++++++++++ .../RegexPatternCache.java | 29 + .../AndroidAddressFormatter/Templates.java | 45 ++ .../src/main/resources/abbreviations.json | 1 + .../src/main/resources/aliases.json | 1 + .../src/main/resources/country2lang.json | 1 + .../src/main/resources/countrynames.json | 1 + .../src/main/resources/countycodes.json | 1 + .../src/main/resources/statecodes.json | 1 + .../src/main/resources/worldwide.json | 1 + plugins/sdk/build.gradle.kts | 16 +- .../launcher2/sdk/base/QueryPluginProvider.kt | 195 ++++++ .../sdk/base/SearchPluginProvider.kt | 123 ---- .../sdk/base/StringPluginProvider.kt | 14 + .../sdk/config/SearchPluginConfig.kt | 4 +- .../mm20/launcher2/sdk/files/FileProvider.kt | 87 +-- .../mm20/launcher2/sdk/locations/Location.kt | 37 + .../sdk/locations/LocationProvider.kt | 80 +++ .../launcher2/sdk/locations/LocationQuery.kt | 8 + .../de/mm20/launcher2/sdk/weather/Forecast.kt | 27 +- .../launcher2/sdk/weather/WeatherProvider.kt | 120 +--- .../ThemedPlaceholderIconProvider.kt | 1 + .../mm20/launcher2/plugins/PluginScanner.kt | 2 + .../mm20/launcher2/plugins/PluginService.kt | 14 +- settings.gradle.kts | 3 +- 145 files changed, 5804 insertions(+), 2199 deletions(-) create mode 100644 app/ui/src/main/java/de/mm20/launcher2/ui/component/MarqueeText.kt create mode 100644 app/ui/src/main/java/de/mm20/launcher2/ui/ktx/ContentDrawState.kt rename {app/ui/src/main/java/de/mm20/launcher2/ui => core/base/src/main/java/de/mm20/launcher2}/icons/BatteryIcons.kt (99%) rename {app/ui/src/main/java/de/mm20/launcher2/ui => core/base/src/main/java/de/mm20/launcher2}/icons/Icons.kt (83%) create mode 100644 core/base/src/main/java/de/mm20/launcher2/plugin/QueryPluginApi.kt create mode 100644 core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration3.kt rename core/shared/src/main/java/de/mm20/launcher2/plugin/config/{SearchPluginConfig.kt => QueryPluginConfig.kt} (67%) create mode 100644 core/shared/src/main/java/de/mm20/launcher2/plugin/contracts/Columns.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/plugin/contracts/LocationPluginContract.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/plugin/data/Bundle.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/plugin/data/Cursor.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/search/location/Address.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/search/location/Attribution.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/search/location/Departure.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/search/location/LocationIcon.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/search/location/OpeningSchedule.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/serialization/ColorSerializer.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/serialization/DayOfWeekSerializer.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/serialization/DurationSerializer.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/serialization/Json.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/serialization/LocalTimeSerializer.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/serialization/OpeningScheduleSerializer.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/serialization/UriSerializer.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/serialization/ZonedDateTimeSerializer.kt create mode 100644 core/shared/src/main/java/de/mm20/launcher2/weather/WeatherIcon.kt rename data/{openstreetmaps => locations}/.gitignore (100%) rename data/{openstreetmaps => locations}/build.gradle.kts (96%) create mode 100644 data/locations/consumer-rules.pro rename data/{openstreetmaps => locations}/proguard-rules.pro (100%) rename data/{openstreetmaps => locations}/src/main/AndroidManifest.xml (100%) create mode 100644 data/locations/src/main/java/de/mm20/launcher2/locations/LocationSerialization.kt create mode 100644 data/locations/src/main/java/de/mm20/launcher2/locations/LocationsRepository.kt create mode 100644 data/locations/src/main/java/de/mm20/launcher2/locations/Module.kt create mode 100644 data/locations/src/main/java/de/mm20/launcher2/locations/providers/LocationProvider.kt create mode 100644 data/locations/src/main/java/de/mm20/launcher2/locations/providers/PluginLocation.kt create mode 100644 data/locations/src/main/java/de/mm20/launcher2/locations/providers/PluginLocationProvider.kt create mode 100644 data/locations/src/main/java/de/mm20/launcher2/locations/providers/openstreetmaps/OsmLocation.kt create mode 100644 data/locations/src/main/java/de/mm20/launcher2/locations/providers/openstreetmaps/OsmLocationProvider.kt rename data/{openstreetmaps/src/main/java/de/mm20/launcher2 => locations/src/main/java/de/mm20/launcher2/locations/providers}/openstreetmaps/OverpassApi.kt (97%) delete mode 100644 data/openstreetmaps/consumer-rules.pro delete mode 100644 data/openstreetmaps/src/main/java/de/mm20/launcher2/openstreetmaps/Module.kt delete mode 100644 data/openstreetmaps/src/main/java/de/mm20/launcher2/openstreetmaps/OsmLocation.kt delete mode 100644 data/openstreetmaps/src/main/java/de/mm20/launcher2/openstreetmaps/OsmRepository.kt delete mode 100644 data/openstreetmaps/src/main/java/de/mm20/launcher2/openstreetmaps/OsmSerialization.kt create mode 100644 docs/docs/developer-guide/plugins/migrations/v2.md create mode 100644 docs/docs/developer-guide/plugins/plugin-types/common/_get_params.md create mode 100644 docs/docs/developer-guide/plugins/plugin-types/common/_query_plugin_config.md create mode 100644 docs/docs/developer-guide/plugins/plugin-types/common/_refresh_params.md create mode 100644 docs/docs/developer-guide/plugins/plugin-types/common/_search_params.md delete mode 100644 docs/docs/developer-guide/plugins/plugin-types/common/_search_plugin_config.md create mode 100644 docs/docs/developer-guide/plugins/plugin-types/places-search.md create mode 100644 libs/address-formatter/LICENSE create mode 100644 libs/address-formatter/Readme.md create mode 100644 libs/address-formatter/build.gradle create mode 100644 libs/address-formatter/proguard-rules.pro create mode 100644 libs/address-formatter/src/main/java/org/woheller69/AndroidAddressFormatter/OsmAddressFormatter.java create mode 100644 libs/address-formatter/src/main/java/org/woheller69/AndroidAddressFormatter/RegexPatternCache.java create mode 100644 libs/address-formatter/src/main/java/org/woheller69/AndroidAddressFormatter/Templates.java create mode 100644 libs/address-formatter/src/main/resources/abbreviations.json create mode 100644 libs/address-formatter/src/main/resources/aliases.json create mode 100644 libs/address-formatter/src/main/resources/country2lang.json create mode 100644 libs/address-formatter/src/main/resources/countrynames.json create mode 100644 libs/address-formatter/src/main/resources/countycodes.json create mode 100644 libs/address-formatter/src/main/resources/statecodes.json create mode 100644 libs/address-formatter/src/main/resources/worldwide.json create mode 100644 plugins/sdk/src/main/java/de/mm20/launcher2/sdk/base/QueryPluginProvider.kt delete mode 100644 plugins/sdk/src/main/java/de/mm20/launcher2/sdk/base/SearchPluginProvider.kt create mode 100644 plugins/sdk/src/main/java/de/mm20/launcher2/sdk/base/StringPluginProvider.kt create mode 100644 plugins/sdk/src/main/java/de/mm20/launcher2/sdk/locations/Location.kt create mode 100644 plugins/sdk/src/main/java/de/mm20/launcher2/sdk/locations/LocationProvider.kt create mode 100644 plugins/sdk/src/main/java/de/mm20/launcher2/sdk/locations/LocationQuery.kt diff --git a/.gitignore b/.gitignore index 7c99b000..90ec7398 100644 --- a/.gitignore +++ b/.gitignore @@ -305,4 +305,6 @@ fabric.properties .idea/deploymentTargetDropDown.xml .idea/deploymentTargetSelector.xml .idea/copilot -.idea/other.xml \ No newline at end of file +.idea/other.xml + +.kotlin \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 7f097246..3e11d4a5 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -2,6 +2,34 @@