diff --git a/.github/workflows/deploy_beta.yml b/.github/workflows/deploy_beta.yml index 859692fd..c40fa888 100644 --- a/.github/workflows/deploy_beta.yml +++ b/.github/workflows/deploy_beta.yml @@ -20,16 +20,16 @@ jobs: - name: Install Bundle run: cd ./${{ matrix.platform }} && bundle install - - name: Setup Flutter - uses: subosito/flutter-action@v2 - with: - channel: stable - - if: matrix.platform == 'android' uses: actions/setup-java@v3 with: distribution: 'corretto' - java-version: '17' + java-version: '21' + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable - name: Install Flutter Packages run: | diff --git a/.github/workflows/lint_test_build.yml b/.github/workflows/lint_test_build.yml index 31a26b38..24eb94b2 100644 --- a/.github/workflows/lint_test_build.yml +++ b/.github/workflows/lint_test_build.yml @@ -37,7 +37,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'corretto' - java-version: '17' + java-version: '21' - name: Build iOS run: flutter build ipa --no-codesign diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 27282bc2..065b0d73 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -16,13 +16,13 @@ android { ndkVersion = "28.1.13356709" compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_1_8) + jvmTarget.set(JvmTarget.JVM_21) } } diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 2b0bb37b..881fa166 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -19,9 +19,9 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.13.0" apply false - id("org.jetbrains.kotlin.android") version "2.2.21" apply false - id("org.jetbrains.kotlin.plugin.serialization") version "2.2.21" apply false + id("com.android.application") version "8.13.2" apply false + id("org.jetbrains.kotlin.android") version "2.3.0" apply false + id("org.jetbrains.kotlin.plugin.serialization") version "2.3.0" apply false id("com.google.gms.google-services") version "4.4.4" apply false id("com.google.firebase.crashlytics") version "3.0.6" apply false } diff --git a/assets/images/map/pin.webp b/assets/images/map/pin_blue.webp similarity index 100% rename from assets/images/map/pin.webp rename to assets/images/map/pin_blue.webp diff --git a/assets/images/map/pin_red.webp b/assets/images/map/pin_red.webp new file mode 100644 index 00000000..09d5a6ea Binary files /dev/null and b/assets/images/map/pin_red.webp differ diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b69da177..9c2ef8bc 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,90 +1,82 @@ PODS: - device_info_plus (0.0.1): - Flutter - - Firebase/CoreOnly (12.4.0): - - FirebaseCore (~> 12.4.0) - - Firebase/Crashlytics (12.4.0): + - Firebase/CoreOnly (12.6.0): + - FirebaseCore (~> 12.6.0) + - Firebase/Crashlytics (12.6.0): - Firebase/CoreOnly - - FirebaseCrashlytics (~> 12.4.0) - - Firebase/RemoteConfig (12.4.0): + - FirebaseCrashlytics (~> 12.6.0) + - Firebase/RemoteConfig (12.6.0): - Firebase/CoreOnly - - FirebaseRemoteConfig (~> 12.4.0) - - firebase_core (4.2.0): - - Firebase/CoreOnly (= 12.4.0) + - FirebaseRemoteConfig (~> 12.6.0) + - firebase_core (4.3.0): + - Firebase/CoreOnly (= 12.6.0) - Flutter - - firebase_crashlytics (5.0.3): - - Firebase/Crashlytics (= 12.4.0) + - firebase_crashlytics (5.0.6): + - Firebase/Crashlytics (= 12.6.0) - firebase_core - Flutter - - firebase_remote_config (6.1.0): - - Firebase/RemoteConfig (= 12.4.0) + - firebase_remote_config (6.1.3): + - Firebase/RemoteConfig (= 12.6.0) - firebase_core - Flutter - - FirebaseABTesting (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseCore (12.4.0): - - FirebaseCoreInternal (~> 12.4.0) + - FirebaseABTesting (12.6.0): + - FirebaseCore (~> 12.6.0) + - FirebaseCore (12.6.0): + - FirebaseCoreInternal (~> 12.6.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseCoreInternal (12.4.0): + - FirebaseCoreExtension (12.6.0): + - FirebaseCore (~> 12.6.0) + - FirebaseCoreInternal (12.6.0): - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseCrashlytics (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) - - FirebaseRemoteConfigInterop (~> 12.4.0) - - FirebaseSessions (~> 12.4.0) + - FirebaseCrashlytics (12.6.0): + - FirebaseCore (~> 12.6.0) + - FirebaseInstallations (~> 12.6.0) + - FirebaseRemoteConfigInterop (~> 12.6.0) + - FirebaseSessions (~> 12.6.0) - GoogleDataTransport (~> 10.1) - GoogleUtilities/Environment (~> 8.1) - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) - - FirebaseInstallations (12.4.0): - - FirebaseCore (~> 12.4.0) + - FirebaseInstallations (12.6.0): + - FirebaseCore (~> 12.6.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - FirebaseRemoteConfig (12.4.0): - - FirebaseABTesting (~> 12.4.0) - - FirebaseCore (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) - - FirebaseRemoteConfigInterop (~> 12.4.0) - - FirebaseSharedSwift (~> 12.4.0) + - FirebaseRemoteConfig (12.6.0): + - FirebaseABTesting (~> 12.6.0) + - FirebaseCore (~> 12.6.0) + - FirebaseInstallations (~> 12.6.0) + - FirebaseRemoteConfigInterop (~> 12.6.0) + - FirebaseSharedSwift (~> 12.6.0) - GoogleUtilities/Environment (~> 8.1) - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseRemoteConfigInterop (12.4.0) - - FirebaseSessions (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseCoreExtension (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) + - FirebaseRemoteConfigInterop (12.6.0) + - FirebaseSessions (12.6.0): + - FirebaseCore (~> 12.6.0) + - FirebaseCoreExtension (~> 12.6.0) + - FirebaseInstallations (~> 12.6.0) - GoogleDataTransport (~> 10.1) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - nanopb (~> 3.30910.0) - PromisesSwift (~> 2.1) - - FirebaseSharedSwift (12.4.0) + - FirebaseSharedSwift (12.6.0) - Flutter (1.0.0) - flutter_contacts (0.0.1): - Flutter - flutter_native_splash (2.4.3): - Flutter - - flutter_secure_storage (6.0.0): + - flutter_secure_storage_darwin (10.0.0): - Flutter + - FlutterMacOS - geolocator_apple (1.2.0): - Flutter - FlutterMacOS - - Google-Maps-iOS-Utils (6.1.0): - - GoogleMaps (~> 9.0) - - google_maps_flutter_ios (0.0.1): - - Flutter - - Google-Maps-iOS-Utils (< 7.0, >= 5.0) - - GoogleMaps (< 10.0, >= 8.4) - GoogleDataTransport (10.1.0): - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) - - GoogleMaps (9.4.0): - - GoogleMaps/Maps (= 9.4.0) - - GoogleMaps/Maps (9.4.0) - GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Privacy - GoogleUtilities/Logger (8.1.0): @@ -100,6 +92,10 @@ PODS: - Flutter - map_launcher (0.0.1): - Flutter + - MapLibre (6.19.1) + - maplibre_gl (0.25.0): + - Flutter + - MapLibre (= 6.19.1) - nanopb (3.30910.0): - nanopb/decode (= 3.30910.0) - nanopb/encode (= 3.30910.0) @@ -123,25 +119,25 @@ PODS: - sqflite_darwin (0.0.4): - Flutter - FlutterMacOS - - sqlite3 (3.50.4): - - sqlite3/common (= 3.50.4) - - sqlite3/common (3.50.4) - - sqlite3/dbstatvtab (3.50.4): + - sqlite3 (3.51.1): + - sqlite3/common (= 3.51.1) + - sqlite3/common (3.51.1) + - sqlite3/dbstatvtab (3.51.1): - sqlite3/common - - sqlite3/fts5 (3.50.4): + - sqlite3/fts5 (3.51.1): - sqlite3/common - - sqlite3/math (3.50.4): + - sqlite3/math (3.51.1): - sqlite3/common - - sqlite3/perf-threadsafe (3.50.4): + - sqlite3/perf-threadsafe (3.51.1): - sqlite3/common - - sqlite3/rtree (3.50.4): + - sqlite3/rtree (3.51.1): - sqlite3/common - - sqlite3/session (3.50.4): + - sqlite3/session (3.51.1): - sqlite3/common - sqlite3_flutter_libs (0.0.1): - Flutter - FlutterMacOS - - sqlite3 (~> 3.50.4) + - sqlite3 (~> 3.51.1) - sqlite3/dbstatvtab - sqlite3/fts5 - sqlite3/math @@ -162,11 +158,11 @@ DEPENDENCIES: - Flutter (from `Flutter`) - flutter_contacts (from `.symlinks/plugins/flutter_contacts/ios`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`) - geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`) - - google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`) - home_widget (from `.symlinks/plugins/home_widget/ios`) - map_launcher (from `.symlinks/plugins/map_launcher/ios`) + - maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) @@ -190,10 +186,9 @@ SPEC REPOS: - FirebaseRemoteConfigInterop - FirebaseSessions - FirebaseSharedSwift - - Google-Maps-iOS-Utils - GoogleDataTransport - - GoogleMaps - GoogleUtilities + - MapLibre - nanopb - PromisesObjC - PromisesSwift @@ -214,16 +209,16 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_contacts/ios" flutter_native_splash: :path: ".symlinks/plugins/flutter_native_splash/ios" - flutter_secure_storage: - :path: ".symlinks/plugins/flutter_secure_storage/ios" + flutter_secure_storage_darwin: + :path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin" geolocator_apple: :path: ".symlinks/plugins/geolocator_apple/darwin" - google_maps_flutter_ios: - :path: ".symlinks/plugins/google_maps_flutter_ios/ios" home_widget: :path: ".symlinks/plugins/home_widget/ios" map_launcher: :path: ".symlinks/plugins/map_launcher/ios" + maplibre_gl: + :path: ".symlinks/plugins/maplibre_gl/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: @@ -245,32 +240,31 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe - Firebase: f07b15ae5a6ec0f93713e30b923d9970d144af3e - firebase_core: 744984dbbed8b3036abf34f0b98d80f130a7e464 - firebase_crashlytics: f3a9a4338ab99b67042f64e9e22e1bf349cb44ed - firebase_remote_config: 8a9f8724eb6d1a3c23c6e3e7275e90a004ca08a7 - FirebaseABTesting: c05b5ec9f1d9f21a65909525de301d375032d9a4 - FirebaseCore: bb595f3114953664e3c1dc032f008a244147cfd3 - FirebaseCoreExtension: 7e1f7118ee970e001a8013719fb90950ee5e0018 - FirebaseCoreInternal: d7f5a043c2cd01a08103ab586587c1468047bca6 - FirebaseCrashlytics: a6ece278a837c7e88de2d9b5da0a3542f2342395 - FirebaseInstallations: ae9f4902cb5bf1d0c5eaa31ec1f4e5495a0714e2 - FirebaseRemoteConfig: 28e071a214ec66cdb113ed9ff4ce63e9abe018db - FirebaseRemoteConfigInterop: 1e31ec72b89c9924367c59bfb5ec9ab60d1d6766 - FirebaseSessions: ba7c7a7ca8696a8d540eb3fe3800fbe98c79786d - FirebaseSharedSwift: 93426a1de92f19e1199fac5295a4f8df16458daa + Firebase: a451a7b61536298fd5cbfe3a746fd40443a50679 + firebase_core: ba00a168e719694f38960502ceb560285603d073 + firebase_crashlytics: 13f4b77e9ce2a84b1f8ea07f293db5b6213ce1cf + firebase_remote_config: 4315c34bfba52eb501b69cfa84d519f340385a37 + FirebaseABTesting: 119f0a2b2e68b1ae05d248c5adb2455f148f20c1 + FirebaseCore: 0e38ad5d62d980a47a64b8e9301ffa311457be04 + FirebaseCoreExtension: 032fd6f8509e591fda8cb76f6651f20d926b121f + FirebaseCoreInternal: 69bf1306a05b8ac43004f6cc1f804bb7b05b229e + FirebaseCrashlytics: 3d6248c50726ee7832aef0e53cb84c9e64d9fa7e + FirebaseInstallations: 631b38da2e11a83daa4bfb482f79d286a5dfa7ad + FirebaseRemoteConfig: c5dfe22828a7ae7673d16224ea92743687e993df + FirebaseRemoteConfigInterop: 3443b8cb8fffd76bb3e03b2a84bfd3db952fcda4 + FirebaseSessions: 2e8f808347e665dff3e5843f275715f07045297d + FirebaseSharedSwift: 79f27fff0addd15c3de19b87fba426f3cc2c964f Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_contacts: 5383945387e7ca37cf963d4be57c21f2fc15ca9f flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf - flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e - Google-Maps-iOS-Utils: 0a484b05ed21d88c9f9ebbacb007956edd508a96 - google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleMaps: 0608099d4870cac8754bdba9b6953db543432438 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f + home_widget: 54b4f6b36ed8d64cfee594a476225c35c3e45091 map_launcher: 8051ad5783913cafce93f2414c6858f2904fd8df + MapLibre: 7f24faba45439f80ccb0f83393c29fa32cb81952 + maplibre_gl: a2114567cbd1065866614fbd34dfb75ab782aaa2 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 @@ -280,8 +274,8 @@ SPEC CHECKSUMS: quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779 shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 - sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b - sqlite3_flutter_libs: 83f8e9f5b6554077f1d93119fe20ebaa5f3a9ef1 + sqlite3: 8d708bc63e9f4ce48f0ad9d6269e478c5ced1d9b + sqlite3_flutter_libs: d13b8b3003f18f596e542bcb9482d105577eff41 url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 67b3327c..51be3fd0 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,6 +1,5 @@ import UIKit -import Flutter -import GoogleMaps +import Flutter @main @objc class AppDelegate: FlutterAppDelegate { @@ -8,7 +7,6 @@ import GoogleMaps _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - GMSServices.provideAPIKey("AIzaSyAxUbnUMsXWVzeptXiLuNDMGpGEVFHLT4Y") GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/lib/base/enums/campus.dart b/lib/base/enums/campus.dart index 56fb4cf0..a6d8208e 100644 --- a/lib/base/enums/campus.dart +++ b/lib/base/enums/campus.dart @@ -1,5 +1,5 @@ import 'package:campus_flutter/homeComponent/model/station.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; enum Campus { stammgelaende("Stammgelände"), diff --git a/lib/base/extensions/latlng_to_json.dart b/lib/base/extensions/latlng_to_json.dart index 5daf0858..24284ac3 100644 --- a/lib/base/extensions/latlng_to_json.dart +++ b/lib/base/extensions/latlng_to_json.dart @@ -1,8 +1,7 @@ import 'dart:convert'; +import 'package:maplibre_gl/maplibre_gl.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; - -extension JsonString on LatLng { +extension LatLngJson on LatLng { static String? toJsonString(LatLng? latLng) { if (latLng == null) { return null; @@ -10,4 +9,8 @@ extension JsonString on LatLng { return const JsonEncoder().convert(latLng.toJson()); } } + + static LatLng fromJsonString(List json) { + return LatLng(json[0], json[1]); + } } diff --git a/lib/base/networking/apis/google/protobuf/empty.pb.dart b/lib/base/networking/apis/google/protobuf/empty.pb.dart index cd583381..8c77bb7d 100644 --- a/lib/base/networking/apis/google/protobuf/empty.pb.dart +++ b/lib/base/networking/apis/google/protobuf/empty.pb.dart @@ -8,7 +8,7 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports import 'dart:core' as $core; @@ -55,7 +55,6 @@ class Empty extends $pb.GeneratedMessage { static Empty create() => Empty._(); @$core.override Empty createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static Empty getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); diff --git a/lib/base/networking/apis/google/protobuf/empty.pbenum.dart b/lib/base/networking/apis/google/protobuf/empty.pbenum.dart index 0573bd5a..afbd5aa7 100644 --- a/lib/base/networking/apis/google/protobuf/empty.pbenum.dart +++ b/lib/base/networking/apis/google/protobuf/empty.pbenum.dart @@ -8,4 +8,4 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports diff --git a/lib/base/networking/apis/google/protobuf/empty.pbjson.dart b/lib/base/networking/apis/google/protobuf/empty.pbjson.dart index 1a7b5e48..07cdbb30 100644 --- a/lib/base/networking/apis/google/protobuf/empty.pbjson.dart +++ b/lib/base/networking/apis/google/protobuf/empty.pbjson.dart @@ -8,7 +8,8 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names, unused_import +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports +// ignore_for_file: unused_import import 'dart:convert' as $convert; import 'dart:core' as $core; diff --git a/lib/base/networking/apis/google/protobuf/timestamp.pb.dart b/lib/base/networking/apis/google/protobuf/timestamp.pb.dart index e85b3911..4f92e8ac 100644 --- a/lib/base/networking/apis/google/protobuf/timestamp.pb.dart +++ b/lib/base/networking/apis/google/protobuf/timestamp.pb.dart @@ -9,7 +9,7 @@ // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports, library_prefixes -// ignore_for_file: non_constant_identifier_names +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports import 'dart:core' as $core; @@ -151,15 +151,14 @@ class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { static Timestamp create() => Timestamp._(); @$core.override Timestamp createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static Timestamp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static Timestamp? _defaultInstance; - /// Represents seconds of UTC time since Unix epoch - /// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - /// 9999-12-31T23:59:59Z inclusive. + /// Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must + /// be between -315576000000 and 315576000000 inclusive (which corresponds to + /// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z). @$pb.TagNumber(1) $fixnum.Int64 get seconds => $_getI64(0); @$pb.TagNumber(1) @@ -169,9 +168,10 @@ class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { @$pb.TagNumber(1) void clearSeconds() => $_clearField(1); - /// Non-negative fractions of a second at nanosecond resolution. Negative - /// second values with fractions must still have non-negative nanos values - /// that count forward in time. Must be from 0 to 999,999,999 + /// Non-negative fractions of a second at nanosecond resolution. This field is + /// the nanosecond portion of the duration, not an alternative to seconds. + /// Negative second values with fractions must still have non-negative nanos + /// values that count forward in time. Must be between 0 and 999,999,999 /// inclusive. @$pb.TagNumber(2) $core.int get nanos => $_getIZ(1); diff --git a/lib/base/networking/apis/google/protobuf/timestamp.pbenum.dart b/lib/base/networking/apis/google/protobuf/timestamp.pbenum.dart index f952d36b..cdbd00bc 100644 --- a/lib/base/networking/apis/google/protobuf/timestamp.pbenum.dart +++ b/lib/base/networking/apis/google/protobuf/timestamp.pbenum.dart @@ -8,4 +8,4 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports diff --git a/lib/base/networking/apis/google/protobuf/timestamp.pbjson.dart b/lib/base/networking/apis/google/protobuf/timestamp.pbjson.dart index a1320368..739dd55a 100644 --- a/lib/base/networking/apis/google/protobuf/timestamp.pbjson.dart +++ b/lib/base/networking/apis/google/protobuf/timestamp.pbjson.dart @@ -8,7 +8,8 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names, unused_import +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports +// ignore_for_file: unused_import import 'dart:convert' as $convert; import 'dart:core' as $core; diff --git a/lib/base/networking/apis/tumdev/campus_backend.pb.dart b/lib/base/networking/apis/tumdev/campus_backend.pb.dart index 63f04ee9..a9bcd924 100644 --- a/lib/base/networking/apis/tumdev/campus_backend.pb.dart +++ b/lib/base/networking/apis/tumdev/campus_backend.pb.dart @@ -8,14 +8,15 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports import 'dart:core' as $core; import 'package:fixnum/fixnum.dart' as $fixnum; import 'package:protobuf/protobuf.dart' as $pb; +import 'package:protobuf/well_known_types/google/protobuf/timestamp.pb.dart' + as $1; -import '../google/protobuf/timestamp.pb.dart' as $1; import 'campus_backend.pbenum.dart'; export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; @@ -68,8 +69,6 @@ class CreateDeviceRequest extends $pb.GeneratedMessage { static CreateDeviceRequest create() => CreateDeviceRequest._(); @$core.override CreateDeviceRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateDeviceRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -142,8 +141,6 @@ class CreateDeviceReply extends $pb.GeneratedMessage { static CreateDeviceReply create() => CreateDeviceReply._(); @$core.override CreateDeviceReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateDeviceReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -202,8 +199,6 @@ class DeleteDeviceRequest extends $pb.GeneratedMessage { static DeleteDeviceRequest create() => DeleteDeviceRequest._(); @$core.override DeleteDeviceRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static DeleteDeviceRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -267,8 +262,6 @@ class DeleteDeviceReply extends $pb.GeneratedMessage { static DeleteDeviceReply create() => DeleteDeviceReply._(); @$core.override DeleteDeviceReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static DeleteDeviceReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -351,7 +344,6 @@ class News extends $pb.GeneratedMessage { static News create() => News._(); @$core.override News createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static News getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -497,8 +489,6 @@ class ListNewsReply extends $pb.GeneratedMessage { static ListNewsReply create() => ListNewsReply._(); @$core.override ListNewsReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListNewsReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -554,8 +544,6 @@ class ListNewsRequest extends $pb.GeneratedMessage { static ListNewsRequest create() => ListNewsRequest._(); @$core.override ListNewsRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListNewsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -627,8 +615,6 @@ class ListNewsSourcesRequest extends $pb.GeneratedMessage { static ListNewsSourcesRequest create() => ListNewsSourcesRequest._(); @$core.override ListNewsSourcesRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListNewsSourcesRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -675,8 +661,6 @@ class ListNewsSourcesReply extends $pb.GeneratedMessage { static ListNewsSourcesReply create() => ListNewsSourcesReply._(); @$core.override ListNewsSourcesReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListNewsSourcesReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -730,7 +714,6 @@ class NewsSource extends $pb.GeneratedMessage { static NewsSource create() => NewsSource._(); @$core.override NewsSource createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static NewsSource getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -805,8 +788,6 @@ class ListNewsAlertsRequest extends $pb.GeneratedMessage { static ListNewsAlertsRequest create() => ListNewsAlertsRequest._(); @$core.override ListNewsAlertsRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListNewsAlertsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -863,8 +844,6 @@ class ListNewsAlertsReply extends $pb.GeneratedMessage { static ListNewsAlertsReply create() => ListNewsAlertsReply._(); @$core.override ListNewsAlertsReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListNewsAlertsReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -927,7 +906,6 @@ class NewsAlert extends $pb.GeneratedMessage { static NewsAlert create() => NewsAlert._(); @$core.override NewsAlert createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static NewsAlert getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1036,8 +1014,6 @@ class ListCanteenRatingsRequest extends $pb.GeneratedMessage { static ListCanteenRatingsRequest create() => ListCanteenRatingsRequest._(); @$core.override ListCanteenRatingsRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListCanteenRatingsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1145,8 +1121,6 @@ class ListCanteenRatingsReply extends $pb.GeneratedMessage { static ListCanteenRatingsReply create() => ListCanteenRatingsReply._(); @$core.override ListCanteenRatingsReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListCanteenRatingsReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1249,8 +1223,6 @@ class GetDishRatingsRequest extends $pb.GeneratedMessage { static GetDishRatingsRequest create() => GetDishRatingsRequest._(); @$core.override GetDishRatingsRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetDishRatingsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1372,8 +1344,6 @@ class GetDishRatingsReply extends $pb.GeneratedMessage { static GetDishRatingsReply create() => GetDishRatingsReply._(); @$core.override GetDishRatingsReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetDishRatingsReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1484,8 +1454,6 @@ class SingleRatingReply extends $pb.GeneratedMessage { static SingleRatingReply create() => SingleRatingReply._(); @$core.override SingleRatingReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static SingleRatingReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1569,8 +1537,6 @@ class CreateCanteenRatingReply extends $pb.GeneratedMessage { static CreateCanteenRatingReply create() => CreateCanteenRatingReply._(); @$core.override CreateCanteenRatingReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateCanteenRatingReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1632,8 +1598,6 @@ class CreateCanteenRatingRequest extends $pb.GeneratedMessage { static CreateCanteenRatingRequest create() => CreateCanteenRatingRequest._(); @$core.override CreateCanteenRatingRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateCanteenRatingRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1715,8 +1679,6 @@ class CreateDishRatingReply extends $pb.GeneratedMessage { static CreateDishRatingReply create() => CreateDishRatingReply._(); @$core.override CreateDishRatingReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateDishRatingReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1780,8 +1742,6 @@ class CreateDishRatingRequest extends $pb.GeneratedMessage { static CreateDishRatingRequest create() => CreateDishRatingRequest._(); @$core.override CreateDishRatingRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateDishRatingRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1878,8 +1838,6 @@ class ListAvailableDishTagsRequest extends $pb.GeneratedMessage { ListAvailableDishTagsRequest._(); @$core.override ListAvailableDishTagsRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListAvailableDishTagsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1928,8 +1886,6 @@ class ListAvailableDishTagsReply extends $pb.GeneratedMessage { static ListAvailableDishTagsReply create() => ListAvailableDishTagsReply._(); @$core.override ListAvailableDishTagsReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListAvailableDishTagsReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -1971,8 +1927,6 @@ class ListNameTagsRequest extends $pb.GeneratedMessage { static ListNameTagsRequest create() => ListNameTagsRequest._(); @$core.override ListNameTagsRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListNameTagsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2019,8 +1973,6 @@ class ListNameTagsReply extends $pb.GeneratedMessage { static ListNameTagsReply create() => ListNameTagsReply._(); @$core.override ListNameTagsReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListNameTagsReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2065,8 +2017,6 @@ class ListAvailableCanteenTagsRequest extends $pb.GeneratedMessage { ListAvailableCanteenTagsRequest._(); @$core.override ListAvailableCanteenTagsRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListAvailableCanteenTagsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor( @@ -2117,8 +2067,6 @@ class ListAvailableCanteenTagsReply extends $pb.GeneratedMessage { ListAvailableCanteenTagsReply._(); @$core.override ListAvailableCanteenTagsReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListAvailableCanteenTagsReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2173,8 +2121,6 @@ class TagsOverview extends $pb.GeneratedMessage { static TagsOverview create() => TagsOverview._(); @$core.override TagsOverview createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static TagsOverview getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2249,7 +2195,6 @@ class RatingTag extends $pb.GeneratedMessage { static RatingTag create() => RatingTag._(); @$core.override RatingTag createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static RatingTag getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2316,8 +2261,6 @@ class RatingTagNewRequest extends $pb.GeneratedMessage { static RatingTagNewRequest create() => RatingTagNewRequest._(); @$core.override RatingTagNewRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static RatingTagNewRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2393,8 +2336,6 @@ class RatingTagResult extends $pb.GeneratedMessage { static RatingTagResult create() => RatingTagResult._(); @$core.override RatingTagResult createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static RatingTagResult getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2478,8 +2419,6 @@ class ListCanteensRequest extends $pb.GeneratedMessage { static ListCanteensRequest create() => ListCanteensRequest._(); @$core.override ListCanteensRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListCanteensRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2526,8 +2465,6 @@ class ListCanteensReply extends $pb.GeneratedMessage { static ListCanteensReply create() => ListCanteensReply._(); @$core.override ListCanteensReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListCanteensReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2584,7 +2521,6 @@ class Canteen extends $pb.GeneratedMessage { static Canteen create() => Canteen._(); @$core.override Canteen createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static Canteen getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2675,8 +2611,6 @@ class ListDishesRequest extends $pb.GeneratedMessage { static ListDishesRequest create() => ListDishesRequest._(); @$core.override ListDishesRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListDishesRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2762,8 +2696,6 @@ class ListDishesReply extends $pb.GeneratedMessage { static ListDishesReply create() => ListDishesReply._(); @$core.override ListDishesReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListDishesReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2837,8 +2769,6 @@ class RoomInformationElement extends $pb.GeneratedMessage { static RoomInformationElement create() => RoomInformationElement._(); @$core.override RoomInformationElement createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static RoomInformationElement getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -2965,8 +2895,6 @@ class GetUpdateNoteRequest extends $pb.GeneratedMessage { static GetUpdateNoteRequest create() => GetUpdateNoteRequest._(); @$core.override GetUpdateNoteRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetUpdateNoteRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3024,8 +2952,6 @@ class GetUpdateNoteReply extends $pb.GeneratedMessage { static GetUpdateNoteReply create() => GetUpdateNoteReply._(); @$core.override GetUpdateNoteReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetUpdateNoteReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3093,8 +3019,6 @@ class ListMoviesRequest extends $pb.GeneratedMessage { static ListMoviesRequest create() => ListMoviesRequest._(); @$core.override ListMoviesRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListMoviesRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3162,8 +3086,6 @@ class ListMoviesReply extends $pb.GeneratedMessage { static ListMoviesReply create() => ListMoviesReply._(); @$core.override ListMoviesReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListMoviesReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3259,7 +3181,6 @@ class Movie extends $pb.GeneratedMessage { static Movie create() => Movie._(); @$core.override Movie createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static Movie getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3494,8 +3415,6 @@ class CreateFeedbackRequest extends $pb.GeneratedMessage { static CreateFeedbackRequest create() => CreateFeedbackRequest._(); @$core.override CreateFeedbackRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateFeedbackRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3627,7 +3546,6 @@ class Coordinate extends $pb.GeneratedMessage { static Coordinate create() => Coordinate._(); @$core.override Coordinate createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static Coordinate getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3684,8 +3602,6 @@ class CreateFeedbackReply extends $pb.GeneratedMessage { static CreateFeedbackReply create() => CreateFeedbackReply._(); @$core.override CreateFeedbackReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateFeedbackReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3732,8 +3648,6 @@ class CreateFeedbackImageReply extends $pb.GeneratedMessage { static CreateFeedbackImageReply create() => CreateFeedbackImageReply._(); @$core.override CreateFeedbackImageReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateFeedbackImageReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3793,8 +3707,6 @@ class CreateFeedbackImageRequest extends $pb.GeneratedMessage { static CreateFeedbackImageRequest create() => CreateFeedbackImageRequest._(); @$core.override CreateFeedbackImageRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static CreateFeedbackImageRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3858,8 +3770,6 @@ class GetMemberRequest extends $pb.GeneratedMessage { static GetMemberRequest create() => GetMemberRequest._(); @$core.override GetMemberRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetMemberRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -3920,8 +3830,6 @@ class GetMemberReply extends $pb.GeneratedMessage { static GetMemberReply create() => GetMemberReply._(); @$core.override GetMemberReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetMemberReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -4006,8 +3914,6 @@ class GetUploadStatusReply extends $pb.GeneratedMessage { static GetUploadStatusReply create() => GetUploadStatusReply._(); @$core.override GetUploadStatusReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetUploadStatusReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -4100,8 +4006,6 @@ class GetCanteenHeadCountRequest extends $pb.GeneratedMessage { static GetCanteenHeadCountRequest create() => GetCanteenHeadCountRequest._(); @$core.override GetCanteenHeadCountRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetCanteenHeadCountRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -4168,8 +4072,6 @@ class GetCanteenHeadCountReply extends $pb.GeneratedMessage { static GetCanteenHeadCountReply create() => GetCanteenHeadCountReply._(); @$core.override GetCanteenHeadCountReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static GetCanteenHeadCountReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -4259,8 +4161,6 @@ class ListStudentClubRequest extends $pb.GeneratedMessage { static ListStudentClubRequest create() => ListStudentClubRequest._(); @$core.override ListStudentClubRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListStudentClubRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -4318,8 +4218,6 @@ class ListStudentClubReply extends $pb.GeneratedMessage { static ListStudentClubReply create() => ListStudentClubReply._(); @$core.override ListStudentClubReply createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static ListStudentClubReply getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -4377,7 +4275,6 @@ class StudentClub extends $pb.GeneratedMessage { static StudentClub create() => StudentClub._(); @$core.override StudentClub createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static StudentClub getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); @@ -4477,8 +4374,6 @@ class StudentClubCollection extends $pb.GeneratedMessage { static StudentClubCollection create() => StudentClubCollection._(); @$core.override StudentClubCollection createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); @$core.pragma('dart2js:noInline') static StudentClubCollection getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); diff --git a/lib/base/networking/apis/tumdev/campus_backend.pbenum.dart b/lib/base/networking/apis/tumdev/campus_backend.pbenum.dart index e5b490ff..b62a3c26 100644 --- a/lib/base/networking/apis/tumdev/campus_backend.pbenum.dart +++ b/lib/base/networking/apis/tumdev/campus_backend.pbenum.dart @@ -8,7 +8,7 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports import 'dart:core' as $core; diff --git a/lib/base/networking/apis/tumdev/campus_backend.pbgrpc.dart b/lib/base/networking/apis/tumdev/campus_backend.pbgrpc.dart index 538e54f3..64b52940 100644 --- a/lib/base/networking/apis/tumdev/campus_backend.pbgrpc.dart +++ b/lib/base/networking/apis/tumdev/campus_backend.pbgrpc.dart @@ -8,7 +8,7 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports import 'dart:async' as $async; import 'dart:core' as $core; diff --git a/lib/base/networking/apis/tumdev/campus_backend.pbjson.dart b/lib/base/networking/apis/tumdev/campus_backend.pbjson.dart index 065f0e49..a0ec1282 100644 --- a/lib/base/networking/apis/tumdev/campus_backend.pbjson.dart +++ b/lib/base/networking/apis/tumdev/campus_backend.pbjson.dart @@ -8,7 +8,8 @@ // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names, unused_import +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports +// ignore_for_file: unused_import import 'dart:convert' as $convert; import 'dart:core' as $core; diff --git a/lib/base/util/icon_text.dart b/lib/base/util/icon_text.dart index 6ef0bcc8..be391144 100644 --- a/lib/base/util/icon_text.dart +++ b/lib/base/util/icon_text.dart @@ -1,68 +1,111 @@ import 'package:flutter/material.dart'; -class IconText extends StatelessWidget { - const IconText({ +class SymbolText extends StatelessWidget { + /// Constructor for using an IconData + const SymbolText.icon({ super.key, - required this.iconData, + required IconData this.iconData, required this.label, this.style, this.textColor, this.multipleLines = false, - this.leadingIcon = true, + this.leading = true, this.mainAxisAlignment = MainAxisAlignment.start, this.iconSize, this.iconColor, - }); + this.gap = 4.0, // Added customizable gap + }) : image = null; - final IconData iconData; + /// Constructor for using a Widget (Image, Svg, etc.) + const SymbolText.image({ + super.key, + required Widget this.image, + required this.label, + this.style, + this.textColor, + this.multipleLines = false, + this.leading = true, + this.mainAxisAlignment = MainAxisAlignment.start, + this.iconSize, + this.gap = 4.0, + }) : iconData = null, + iconColor = null; + + final IconData? iconData; + final Widget? + image; // Changed from Image? to Widget? for flexibility (e.g. SVGs) final String label; final TextStyle? style; final Color? textColor; final MainAxisAlignment mainAxisAlignment; final bool multipleLines; - final bool leadingIcon; + final bool leading; final double? iconSize; final Color? iconColor; + final double gap; @override Widget build(BuildContext context) { - var textStyle = style ?? TextStyle(color: textColor); - var iconColor = this.iconColor ?? style?.color; - var iconSize = - this.iconSize ?? (style?.fontSize != null ? style!.fontSize : 20.0); + // 1. Resolve Style and Size + final effectiveTextStyle = + style?.copyWith(color: textColor) ?? TextStyle(color: textColor); + + // Default to the text font size if no icon size is provided, or fallback to 20 + final effectiveIconSize = iconSize ?? effectiveTextStyle.fontSize ?? 20.0; + + final effectiveIconColor = iconColor ?? effectiveTextStyle.color; + + // 2. Build the visual part (The Symbol) + Widget? symbolWidget; + + if (iconData != null) { + symbolWidget = Icon( + iconData, + color: effectiveIconColor, + size: effectiveIconSize, + ); + } else if (image != null) { + // Optional: constrain image to icon size to ensure alignment + symbolWidget = SizedBox( + width: effectiveIconSize, + height: effectiveIconSize, + child: FittedBox(fit: BoxFit.contain, child: image), + ); + } + + // 3. Build the Text Part + Widget textWidget = Text( + label, + style: effectiveTextStyle, + maxLines: multipleLines ? null : 1, + overflow: multipleLines ? null : TextOverflow.ellipsis, + ); + + // If multiple lines, we often need Flexible, but only if inside a Row with constraints. + // To be safe and respect the boolean: + if (multipleLines || !multipleLines) { + textWidget = Flexible(child: textWidget); + } + + // 4. Construct the Children list based on leading/trailing logic + final children = []; + + if (leading && symbolWidget != null) { + children.add(symbolWidget); + children.add(SizedBox(width: gap)); // Only added if symbol exists + } + + children.add(textWidget); + + if (!leading && symbolWidget != null) { + children.add(SizedBox(width: gap)); // Only added if symbol exists + children.add(symbolWidget); + } + return Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: mainAxisAlignment, - children: [ - if (leadingIcon) ...[ - Icon(iconData, color: iconColor, size: iconSize), - const Padding(padding: EdgeInsets.symmetric(horizontal: 4.0)), - multipleLines - ? Flexible(child: Text(label, style: textStyle)) - : Flexible( - child: Text( - label, - style: textStyle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ], - if (!leadingIcon) ...[ - multipleLines - ? Flexible(child: Text(label, style: textStyle)) - : Flexible( - child: Text( - label, - style: textStyle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 4.0)), - Icon(iconData, color: iconColor, size: iconSize), - ], - ], + children: children, ); } } diff --git a/lib/base/util/map_launcher.dart b/lib/base/util/map_launcher.dart index 48dbdabb..deddfdf4 100644 --- a/lib/base/util/map_launcher.dart +++ b/lib/base/util/map_launcher.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:map_launcher/map_launcher.dart'; Future showDirectionsDialog( diff --git a/lib/campusComponent/service/movie_service.dart b/lib/campusComponent/service/movie_service.dart index 7f0483ce..d0afd9d3 100644 --- a/lib/campusComponent/service/movie_service.dart +++ b/lib/campusComponent/service/movie_service.dart @@ -1,7 +1,7 @@ -import 'package:campus_flutter/base/networking/apis/google/protobuf/timestamp.pb.dart'; import 'package:campus_flutter/base/networking/base/grpc_client.dart'; import 'package:campus_flutter/base/networking/apis/tumdev/campus_backend.pbgrpc.dart'; import 'package:campus_flutter/main.dart'; +import 'package:protobuf/well_known_types/google/protobuf/timestamp.pb.dart'; class MovieService { static Future<(DateTime?, List)> fetchMovies( diff --git a/lib/campusComponent/service/news_service.dart b/lib/campusComponent/service/news_service.dart index 067aa657..5776cacc 100644 --- a/lib/campusComponent/service/news_service.dart +++ b/lib/campusComponent/service/news_service.dart @@ -1,7 +1,7 @@ -import 'package:campus_flutter/base/networking/apis/google/protobuf/timestamp.pb.dart'; import 'package:campus_flutter/base/networking/base/grpc_client.dart'; import 'package:campus_flutter/base/networking/apis/tumdev/campus_backend.pbgrpc.dart'; import 'package:campus_flutter/main.dart'; +import 'package:protobuf/well_known_types/google/protobuf/timestamp.pb.dart'; class NewsService { static Future<(DateTime?, List)> fetchRecentNews( diff --git a/lib/homeComponent/model/station.dart b/lib/homeComponent/model/station.dart index e933cb42..e1303189 100644 --- a/lib/homeComponent/model/station.dart +++ b/lib/homeComponent/model/station.dart @@ -1,6 +1,6 @@ -import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:campus_flutter/base/extensions/latlng_to_json.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; part 'station.g.dart'; @@ -9,7 +9,7 @@ part 'station.g.dart'; class Station { final String name; final String apiName; - @JsonKey(fromJson: LatLng.fromJson, toJson: JsonString.toJsonString) + @JsonKey(fromJson: LatLngJson.fromJsonString, toJson: LatLngJson.toJsonString) final LatLng? location; Station({required this.name, required this.apiName, this.location}); diff --git a/lib/homeComponent/model/station.g.dart b/lib/homeComponent/model/station.g.dart index 6d107056..efd260cc 100644 --- a/lib/homeComponent/model/station.g.dart +++ b/lib/homeComponent/model/station.g.dart @@ -9,11 +9,11 @@ part of 'station.dart'; Station _$StationFromJson(Map json) => Station( name: json['name'] as String, apiName: json['apiName'] as String, - location: LatLng.fromJson(json['location']), + location: LatLngJson.fromJsonString(json['location'] as List), ); Map _$StationToJson(Station instance) => { 'name': instance.name, 'apiName': instance.apiName, - 'location': JsonString.toJsonString(instance.location), + 'location': LatLngJson.toJsonString(instance.location), }; diff --git a/lib/homeComponent/view/contactCard/tuition_view.dart b/lib/homeComponent/view/contactCard/tuition_view.dart index b2bfa021..8a15145c 100644 --- a/lib/homeComponent/view/contactCard/tuition_view.dart +++ b/lib/homeComponent/view/contactCard/tuition_view.dart @@ -79,13 +79,13 @@ class TuitionView extends ConsumerWidget { ) { if (snapshot.hasData && snapshot.data!.amount != null) { if (snapshot.data!.amount! <= 0.0) { - return IconText( + return SymbolText.icon( iconData: Icons.check, label: context.tr("tuitionPaid"), style: Theme.of( context, ).textTheme.bodyMedium?.copyWith(color: Colors.green), - leadingIcon: false, + leading: false, ); } else { final numberFormat = NumberFormat.currency( diff --git a/lib/homeComponent/view/departure/departures_details_view.dart b/lib/homeComponent/view/departure/departures_details_view.dart index 381dd4f8..e875af5a 100644 --- a/lib/homeComponent/view/departure/departures_details_view.dart +++ b/lib/homeComponent/view/departure/departures_details_view.dart @@ -123,7 +123,7 @@ class _DeparturesDetailsViewState extends ConsumerState { ); } }, - child: IconText( + child: SymbolText.icon( iconData: Icons.open_in_new, label: context.tr("showDirections"), ), diff --git a/lib/homeComponent/viewmodel/departures_viewmodel.dart b/lib/homeComponent/viewmodel/departures_viewmodel.dart index b6767614..1be1fff4 100644 --- a/lib/homeComponent/viewmodel/departures_viewmodel.dart +++ b/lib/homeComponent/viewmodel/departures_viewmodel.dart @@ -61,8 +61,10 @@ class DeparturesViewModel { UserPreference.departure, ); - if (preferenceId != null && !fetchClosest) { - widgetCampus.add(Campus.values[preferenceId as int]); + if (preferenceId != null && + !fetchClosest && + (preferenceId as int) <= Campus.values.length) { + widgetCampus.add(Campus.values[preferenceId]); assignSelectedStation(); } else { LocationService.getLastKnown().then( @@ -235,10 +237,10 @@ class DeparturesViewModel { (e) => PopupMenuItem( value: e, child: selectedStation.value?.name == e.name - ? IconText( + ? SymbolText.icon( iconData: Icons.check, label: e.name, - leadingIcon: false, + leading: false, ) : Text(e.name), ), diff --git a/lib/navigaTumComponent/views/navigatum_room_building_view.dart b/lib/navigaTumComponent/views/navigatum_room_building_view.dart index 3e713d74..ff12841d 100644 --- a/lib/navigaTumComponent/views/navigatum_room_building_view.dart +++ b/lib/navigaTumComponent/views/navigatum_room_building_view.dart @@ -1,9 +1,10 @@ import 'package:campus_flutter/homeComponent/view/widget/widget_frame_view.dart'; import 'package:campus_flutter/navigaTumComponent/model/details/navigatum_navigation_coordinates.dart'; +import 'package:campus_flutter/placesComponent/model/maps/marker.dart'; import 'package:campus_flutter/placesComponent/views/map_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; class NavigaTumRoomBuildingView extends StatelessWidget { const NavigaTumRoomBuildingView({ @@ -30,7 +31,7 @@ class NavigaTumRoomBuildingView extends StatelessWidget { latLng: LatLng(coordinates.latitude!, coordinates.longitude!), markers: { Marker( - markerId: const MarkerId("1"), + id: "1", position: LatLng(coordinates.latitude!, coordinates.longitude!), ), }, diff --git a/lib/navigaTumComponent/views/navigatum_room_view.dart b/lib/navigaTumComponent/views/navigatum_room_view.dart index c2a24f84..47d95f31 100644 --- a/lib/navigaTumComponent/views/navigatum_room_view.dart +++ b/lib/navigaTumComponent/views/navigatum_room_view.dart @@ -12,7 +12,7 @@ import 'package:campus_flutter/base/extensions/context.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; class NavigaTumRoomScaffold extends ConsumerWidget { const NavigaTumRoomScaffold({super.key, required this.id}); diff --git a/lib/onboardingComponent/views/confirm_view.dart b/lib/onboardingComponent/views/confirm_view.dart index 18d07c67..83887bbb 100644 --- a/lib/onboardingComponent/views/confirm_view.dart +++ b/lib/onboardingComponent/views/confirm_view.dart @@ -189,7 +189,7 @@ class _ConfirmViewState extends ConsumerState { Widget _tumOnlineButton() { return ElevatedButton( onPressed: () => UrlLauncher.urlString("https://campus.tum.de", ref), - child: const IconText( + child: const SymbolText.icon( iconData: Icons.language, label: "TUMOnline", style: TextStyle(color: Colors.white), @@ -246,11 +246,11 @@ class _ConfirmViewState extends ConsumerState { } }); }, - child: IconText( + child: SymbolText.icon( iconData: Icons.arrow_forward, label: context.tr("checkToken"), style: const TextStyle(color: Colors.white), - leadingIcon: false, + leading: false, ), ); } diff --git a/lib/personComponent/model/personDetails/person_details.dart b/lib/personComponent/model/personDetails/person_details.dart index 4ab1c69b..469f4334 100644 --- a/lib/personComponent/model/personDetails/person_details.dart +++ b/lib/personComponent/model/personDetails/person_details.dart @@ -104,16 +104,26 @@ class PersonDetails { if (officialContact != null) { if (officialContact!.phone != null) { - phones.add(Phone(officialContact!.phone!, label: PhoneLabel.work, isPrimary: true)); + phones.add( + Phone( + officialContact!.phone!, + label: PhoneLabel.work, + isPrimary: true, + ), + ); } if (officialContact!.mobilePhone != null) { - phones.add(Phone(officialContact!.mobilePhone!, label: PhoneLabel.workMobile)); + phones.add( + Phone(officialContact!.mobilePhone!, label: PhoneLabel.workMobile), + ); } if (officialContact!.fax != null) { phones.add(Phone(officialContact!.fax!, label: PhoneLabel.faxWork)); } if (officialContact!.homepage != null) { - websites.add(Website(officialContact!.homepage!, label: WebsiteLabel.work)); + websites.add( + Website(officialContact!.homepage!, label: WebsiteLabel.work), + ); } } if (privateContact != null) { @@ -121,28 +131,28 @@ class PersonDetails { phones.add(Phone(privateContact!.phone!, label: PhoneLabel.home)); } if (privateContact!.mobilePhone != null) { - phones.add(Phone(privateContact!.mobilePhone!, label: PhoneLabel.mobile)); + phones.add( + Phone(privateContact!.mobilePhone!, label: PhoneLabel.mobile), + ); } if (privateContact!.fax != null) { phones.add(Phone(privateContact!.fax!, label: PhoneLabel.faxHome)); } if (privateContact!.homepage != null) { - websites.add(Website(privateContact!.homepage!, label: WebsiteLabel.home)); + websites.add( + Website(privateContact!.homepage!, label: WebsiteLabel.home), + ); } } var photo = imageData != null ? base64DecodeImageData(imageData!) : null; - - return Contact(name: Name( - prefix: title ?? "", - first: firstName, - last: name - ), - emails: [ Email(email, label: EmailLabel.work, isPrimary: true)], + return Contact( + name: Name(prefix: title ?? "", first: firstName, last: name), + emails: [Email(email, label: EmailLabel.work, isPrimary: true)], phones: phones, websites: websites, - photo: photo + photo: photo, ); } } diff --git a/lib/placesComponent/model/maps/marker.dart b/lib/placesComponent/model/maps/marker.dart new file mode 100644 index 00000000..d9ee8248 --- /dev/null +++ b/lib/placesComponent/model/maps/marker.dart @@ -0,0 +1,30 @@ +import 'package:maplibre_gl/maplibre_gl.dart'; + +class Marker { + String id; + LatLng position; + bool isRed; + double? rotation; + int? zIndex; + bool? draggable; + double? alpha; + InfoWindow? infoWindow; + + Marker({ + required this.id, + required this.position, + this.rotation, + this.zIndex, + this.draggable = false, + this.alpha, + this.infoWindow, + this.isRed = false, + }); +} + +class InfoWindow { + String title; + void Function()? onTap; + + InfoWindow({required this.title, this.onTap}); +} diff --git a/lib/placesComponent/model/studyRooms/study_room_group.dart b/lib/placesComponent/model/studyRooms/study_room_group.dart index 1c44672f..06fc233a 100644 --- a/lib/placesComponent/model/studyRooms/study_room_group.dart +++ b/lib/placesComponent/model/studyRooms/study_room_group.dart @@ -3,7 +3,7 @@ import 'package:campus_flutter/placesComponent/model/studyRooms/study_room.dart' import 'package:campus_flutter/placesComponent/model/studyRooms/study_room_opening_hours.dart'; import 'package:campus_flutter/searchComponent/model/comparison_token.dart'; import 'package:campus_flutter/searchComponent/protocols/searchable.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:json_annotation/json_annotation.dart'; part 'study_room_group.g.dart'; diff --git a/lib/placesComponent/viewModels/cafeterias_viewmodel.dart b/lib/placesComponent/viewModels/cafeterias_viewmodel.dart index 2cc32e6e..7d9e738d 100644 --- a/lib/placesComponent/viewModels/cafeterias_viewmodel.dart +++ b/lib/placesComponent/viewModels/cafeterias_viewmodel.dart @@ -7,6 +7,7 @@ import 'package:campus_flutter/placesComponent/model/cafeterias/cafeteria.dart'; import 'package:campus_flutter/placesComponent/model/cafeterias/cafeteria_menu.dart'; import 'package:campus_flutter/placesComponent/model/cafeterias/dish.dart'; import 'package:campus_flutter/placesComponent/model/cafeterias/mensa_menu.dart'; +import 'package:campus_flutter/placesComponent/model/maps/marker.dart'; import 'package:campus_flutter/placesComponent/services/cafeterias_service.dart'; import 'package:campus_flutter/placesComponent/services/mealplan_service.dart'; import 'package:campus_flutter/base/services/user_preferences_service.dart'; @@ -16,7 +17,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:geolocator/geolocator.dart'; import 'package:go_router/go_router.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:rxdart/rxdart.dart'; import 'package:uuid/uuid.dart'; @@ -318,9 +319,11 @@ class CafeteriasViewModel { return cafeterias .map( (e) => Marker( - markerId: MarkerId(const Uuid().v4()), + id: const Uuid().v4(), position: LatLng(e.location.latitude, e.location.longitude), - icon: BitmapDescriptor.defaultMarkerWithHue(208), + isRed: true, + // TODO: + //icon: BitmapDescriptor.defaultMarkerWithHue(208), infoWindow: InfoWindow( title: e.name, onTap: () => context.push(cafeteria, extra: e), @@ -338,9 +341,11 @@ class CafeteriasViewModel { return (campusCafeterias.value![campus] ?? []) .map( (e) => Marker( - markerId: MarkerId(e.id.toString()), + id: e.id.toString(), position: LatLng(e.location.latitude, e.location.longitude), - icon: BitmapDescriptor.defaultMarkerWithHue(208), + isRed: true, + // TODO: + //icon: BitmapDescriptor.defaultMarkerWithHue(208), infoWindow: InfoWindow( title: e.name, onTap: () => context.push(cafeteria, extra: e), diff --git a/lib/placesComponent/viewModels/places_viewmodel.dart b/lib/placesComponent/viewModels/places_viewmodel.dart index db2b3f98..b2feb3a1 100644 --- a/lib/placesComponent/viewModels/places_viewmodel.dart +++ b/lib/placesComponent/viewModels/places_viewmodel.dart @@ -1,13 +1,13 @@ import 'package:campus_flutter/base/enums/campus.dart'; import 'package:campus_flutter/base/services/location_service.dart'; +import 'package:campus_flutter/placesComponent/model/maps/marker.dart'; import 'package:campus_flutter/placesComponent/model/studyRooms/study_room_data.dart'; import 'package:campus_flutter/placesComponent/viewModels/cafeterias_viewmodel.dart'; import 'package:campus_flutter/placesComponent/viewModels/study_rooms_viewmodel.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; final placesViewModel = Provider((ref) => PlacesViewModel(ref)); diff --git a/lib/placesComponent/viewModels/study_rooms_viewmodel.dart b/lib/placesComponent/viewModels/study_rooms_viewmodel.dart index 894fe618..b28371c5 100644 --- a/lib/placesComponent/viewModels/study_rooms_viewmodel.dart +++ b/lib/placesComponent/viewModels/study_rooms_viewmodel.dart @@ -3,6 +3,7 @@ import 'package:campus_flutter/base/enums/user_preference.dart'; import 'package:campus_flutter/base/routing/routes.dart'; import 'package:campus_flutter/base/services/location_service.dart'; import 'package:campus_flutter/main.dart'; +import 'package:campus_flutter/placesComponent/model/maps/marker.dart'; import 'package:campus_flutter/placesComponent/model/studyRooms/study_room.dart'; import 'package:campus_flutter/placesComponent/model/studyRooms/study_room_data.dart'; import 'package:campus_flutter/placesComponent/model/studyRooms/study_room_group.dart'; @@ -14,7 +15,7 @@ import 'package:collection/collection.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:geolocator/geolocator.dart'; import 'package:go_router/go_router.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:rxdart/rxdart.dart'; import 'package:uuid/uuid.dart'; @@ -236,7 +237,7 @@ class StudyRoomsViewModel { .where((element) => element.coordinate != null) .map( (e) => Marker( - markerId: MarkerId(const Uuid().v4()), + id: const Uuid().v4(), position: LatLng(e.coordinate!.latitude, e.coordinate!.longitude), infoWindow: InfoWindow( title: e.name, @@ -256,7 +257,7 @@ class StudyRoomsViewModel { .where((element) => element.coordinate != null) .map( (e) => Marker( - markerId: MarkerId(e.id.toString()), + id: e.id.toString(), position: LatLng(e.coordinate!.latitude, e.coordinate!.longitude), infoWindow: InfoWindow( title: e.name, diff --git a/lib/placesComponent/views/cafeterias/cafeteria_view.dart b/lib/placesComponent/views/cafeterias/cafeteria_view.dart index 3a86f5d6..ad3aedae 100644 --- a/lib/placesComponent/views/cafeterias/cafeteria_view.dart +++ b/lib/placesComponent/views/cafeterias/cafeteria_view.dart @@ -7,6 +7,7 @@ import 'package:campus_flutter/base/errorHandling/error_handling_router.dart'; import 'package:campus_flutter/base/util/places_util.dart'; import 'package:campus_flutter/placesComponent/model/cafeterias/cafeteria.dart'; import 'package:campus_flutter/placesComponent/model/cafeterias/opening_hours.dart'; +import 'package:campus_flutter/placesComponent/model/maps/marker.dart'; import 'package:campus_flutter/placesComponent/viewModels/cafeterias_viewmodel.dart'; import 'package:campus_flutter/placesComponent/views/cafeterias/dish_grid_view.dart'; import 'package:campus_flutter/placesComponent/views/map_widget.dart'; @@ -16,7 +17,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:syncfusion_flutter_core/theme.dart'; import 'package:syncfusion_flutter_datepicker/datepicker.dart'; @@ -158,12 +159,14 @@ class _CafeteriaViewState extends ConsumerState { MapWidget.fullPadding( markers: { Marker( - markerId: MarkerId(widget.cafeteria.id), + id: widget.cafeteria.id, position: LatLng( widget.cafeteria.location.latitude, (widget.cafeteria.location.longitude), ), - icon: BitmapDescriptor.defaultMarkerWithHue(208), + isRed: true, + // TODO: implement colored markers + //icon: BitmapDescriptor.defaultMarkerWithHue(208), ), }, latLng: LatLng( diff --git a/lib/placesComponent/views/campuses/campus_map_legend.dart b/lib/placesComponent/views/campuses/campus_map_legend.dart index 2f95288d..bf81cafa 100644 --- a/lib/placesComponent/views/campuses/campus_map_legend.dart +++ b/lib/placesComponent/views/campuses/campus_map_legend.dart @@ -1,5 +1,5 @@ import 'package:campus_flutter/base/extensions/context.dart'; -import 'package:campus_flutter/base/util/icon_text.dart' show IconText; +import 'package:campus_flutter/base/util/icon_text.dart' show SymbolText; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -27,18 +27,16 @@ class CampusMapLegend extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - IconText( - iconData: Icons.place, + SymbolText.image( + image: Image.asset("assets/images/map/pin_blue.webp"), label: context.tr("cafeterias"), - iconColor: Colors.blue, ), Padding( padding: EdgeInsets.symmetric(vertical: context.halfPadding), ), - IconText( - iconData: Icons.place, + SymbolText.image( + image: Image.asset("assets/images/map/pin_red.webp"), label: context.tr("studyRooms"), - iconColor: Colors.red, ), ], ), diff --git a/lib/placesComponent/views/campuses/campus_map_view.dart b/lib/placesComponent/views/campuses/campus_map_view.dart index 44f26ae4..f5af0d72 100644 --- a/lib/placesComponent/views/campuses/campus_map_view.dart +++ b/lib/placesComponent/views/campuses/campus_map_view.dart @@ -5,7 +5,7 @@ import 'package:campus_flutter/placesComponent/views/campuses/campus_map_legend. import 'package:campus_flutter/placesComponent/views/map_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; class CampusMapScaffold extends StatelessWidget { const CampusMapScaffold({super.key, required this.campus}); @@ -38,7 +38,7 @@ class CampusMapView extends ConsumerWidget { latLng: LatLng(campus.location.latitude, campus.location.longitude), zoom: 15, roundedCorners: false, - controlPadding: const EdgeInsets.all(20), + //controlPadding: const EdgeInsets.all(20), mapLegend: CampusMapLegend(), ); } diff --git a/lib/placesComponent/views/campuses/campus_view.dart b/lib/placesComponent/views/campuses/campus_view.dart index 1a7b26f3..d9737566 100644 --- a/lib/placesComponent/views/campuses/campus_view.dart +++ b/lib/placesComponent/views/campuses/campus_view.dart @@ -16,7 +16,7 @@ import 'package:campus_flutter/placesComponent/views/map_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; class AdaptedCampusView extends StatelessWidget { const AdaptedCampusView({ @@ -119,11 +119,11 @@ class _CampusViewState extends ConsumerState { children: [ if (cafeterias.isNotEmpty) WidgetFrameView( - titleWidget: IconText( - iconData: Icons.location_pin, + titleWidget: SymbolText.image( + image: Image.asset("assets/images/map/pin_blue.webp"), label: context.tr("cafeterias"), style: Theme.of(context).textTheme.titleMedium, - leadingIcon: false, + leading: false, ), child: Card( child: SeparatedList.list( @@ -134,12 +134,11 @@ class _CampusViewState extends ConsumerState { ), if (studyRooms.isNotEmpty) WidgetFrameView( - titleWidget: IconText( - iconData: Icons.location_pin, + titleWidget: SymbolText.image( + image: Image.asset("assets/images/map/pin_red.webp"), label: context.tr("studyRooms"), - iconColor: Colors.red, style: Theme.of(context).textTheme.titleMedium, - leadingIcon: false, + leading: false, ), child: Card( child: SeparatedList.list( diff --git a/lib/placesComponent/views/map_widget.dart b/lib/placesComponent/views/map_widget.dart index d3f5e287..0ce3b7f5 100644 --- a/lib/placesComponent/views/map_widget.dart +++ b/lib/placesComponent/views/map_widget.dart @@ -1,18 +1,18 @@ import 'dart:async'; +import 'dart:developer'; import 'package:campus_flutter/base/extensions/context.dart'; +import 'package:campus_flutter/placesComponent/model/maps/marker.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:maplibre_gl/maplibre_gl.dart' as maplibre; +import 'package:maplibre_gl/maplibre_gl.dart'; class MapWidget extends ConsumerStatefulWidget { factory MapWidget.fullPadding({ required Set markers, LatLng? latLng, - EdgeInsets? controlPadding, double? zoom, double? aspectRatio, bool aspectRatioNeeded = true, @@ -21,7 +21,6 @@ class MapWidget extends ConsumerStatefulWidget { }) { return MapWidget._( markers: markers, - controlPadding: controlPadding, latLng: latLng, zoom: zoom, aspectRatio: aspectRatio, @@ -34,7 +33,6 @@ class MapWidget extends ConsumerStatefulWidget { factory MapWidget.noPadding({ required Set markers, LatLng? latLng, - EdgeInsets? controlPadding, double? zoom, double? aspectRatio, bool aspectRatioNeeded = true, @@ -47,7 +45,6 @@ class MapWidget extends ConsumerStatefulWidget { zoom: zoom, aspectRatio: aspectRatio, padding: EdgeInsets.zero, - controlPadding: controlPadding, aspectRatioNeeded: aspectRatioNeeded, roundedCorners: roundedCorners, mapLegend: mapLegend, @@ -57,7 +54,6 @@ class MapWidget extends ConsumerStatefulWidget { factory MapWidget.customPadding({ required Set markers, required EdgeInsets padding, - EdgeInsets? controlPadding, LatLng? latLng, double? zoom, double? aspectRatio, @@ -68,7 +64,6 @@ class MapWidget extends ConsumerStatefulWidget { return MapWidget._( markers: markers, padding: padding, - controlPadding: controlPadding, latLng: latLng, zoom: zoom, aspectRatio: aspectRatio, @@ -84,7 +79,6 @@ class MapWidget extends ConsumerStatefulWidget { this.zoom, this.aspectRatio, this.padding, - this.controlPadding, required this.aspectRatioNeeded, required this.roundedCorners, this.mapLegend, @@ -97,7 +91,6 @@ class MapWidget extends ConsumerStatefulWidget { final bool aspectRatioNeeded; final bool roundedCorners; final EdgeInsets? padding; - final EdgeInsets? controlPadding; final Widget? mapLegend; @override @@ -105,11 +98,19 @@ class MapWidget extends ConsumerStatefulWidget { } class _MapWidgetState extends ConsumerState { - late final Completer _controller = - Completer(); - + MapLibreMapController? _mapController; bool isMapVisible = false; + final Set _loadedImages = {}; + + @override + void didUpdateWidget(covariant MapWidget oldWidget) { + super.didUpdateWidget(oldWidget); + if (_mapController != null && widget.markers != oldWidget.markers) { + _updateMarkers(_mapController!); + } + } + @override Widget build(BuildContext context) { return Padding( @@ -128,27 +129,27 @@ class _MapWidgetState extends ConsumerState { child: widget.aspectRatioNeeded ? AspectRatio( aspectRatio: widget.aspectRatio ?? 1.0, - child: _mapWidget(), + child: _buildMapStack(), ) - : _mapWidget(), + : _buildMapStack(), ), ); } - Widget _mapWidget() { + Widget _buildMapStack() { return AnimatedOpacity( curve: Curves.fastOutSlowIn, opacity: isMapVisible ? 1.0 : 0.01, duration: const Duration(milliseconds: 200), child: Stack( - alignment: Alignment.topRight, children: [ - maplibre.MapLibreMap( - styleString: "https://nav.tum.de/martin/style/navigatum-basemap.json", - initialCameraPosition: maplibre.CameraPosition( + MapLibreMap( + styleString: + "https://nav.tum.de/martin/style/navigatum-basemap.json", + initialCameraPosition: CameraPosition( target: // mapLibre and Google Maps have different latLng classes. This converts between them and also provides a default location. - Nathan - maplibre.LatLng( + LatLng( widget.latLng?.latitude ?? 48.26307794976663, widget.latLng?.longitude ?? 11.668018668778569, ), @@ -164,105 +165,40 @@ class _MapWidgetState extends ConsumerState { tiltGesturesEnabled: false, zoomGesturesEnabled: true, myLocationEnabled: true, - myLocationRenderMode: maplibre.MyLocationRenderMode.compass, - onMapCreated: (maplibre.MapLibreMapController controller) { - _controller.complete(controller); - }, - - onStyleLoadedCallback: () => { - _controller.future.then((controller) async { - final ByteData pinData = await rootBundle.load("assets/images/map/pin.webp"); - controller.addImage("pin", pinData.buffer.asUint8List()); - controller.symbolManager?.setIconAllowOverlap(true); - controller.symbolManager?.setIconIgnorePlacement(true); - controller.symbolManager?.setTextAllowOverlap(true); - controller.symbolManager?.setTextIgnorePlacement(true); - - for (var marker in widget.markers) { - controller.addSymbol( - maplibre.SymbolOptions( - iconSize: 3, - iconImage: "pin", // Theoretically this could be set based on the marker ID. But in the current app it's always the same anyway. - iconRotate: marker.rotation, - iconOffset: Offset(0, -5), - textField: marker.infoWindow.title, - textOffset: Offset(0, -3), - iconOpacity: marker.alpha, - geometry: maplibre.LatLng( - marker.position.latitude, - marker.position.longitude, - ), - zIndex: marker.zIndexInt, - draggable: marker.draggable, - fontNames: ["Roboto Regular"], - textColor: "#000000", - textHaloColor: "#FFFFFF", - textHaloWidth: 3.0, // magic number (done by eye) - textHaloBlur: 0, - textOpacity: 0, // Starts hidden (handled on tap) - textMaxWidth: -1, // No limit - ), - ); - } - - controller.onSymbolTapped.add((symbol) { - // display text on tapped symbol & remove text from other symbols - for (var symbol in controller.symbols) { - controller.updateSymbol( - symbol, - maplibre.SymbolOptions(textOpacity: 0), - ); - } - controller.updateSymbol( - symbol, - maplibre.SymbolOptions(textOpacity: 1), - ); - controller.animateCamera( - maplibre.CameraUpdate.newLatLng(symbol.options.geometry ?? maplibre.LatLng(0, 0)), // something will have gone very wrong if it goes to 0,0 - duration: Duration(seconds: 1) // magic number (felt right) - ); - }); - - if (mounted) { - setState(() { - isMapVisible = true; - }); - } - }), + myLocationRenderMode: MyLocationRenderMode.compass, + onMapCreated: (controller) { + _mapController = controller; + _setupSymbolHandler(controller); }, + onStyleLoadedCallback: () => _onStyleLoaded(), + attributionButtonPosition: AttributionButtonPosition.bottomLeft, ), + if (widget.mapLegend != null) - Padding( - padding: EdgeInsets.all(context.padding), - child: widget.mapLegend!, + Align( + alignment: Alignment.topRight, + child: Padding( + padding: EdgeInsets.all(context.padding), + child: widget.mapLegend!, + ), ), + Positioned( - top: 10, - left: 10, + right: context.padding, + bottom: context.padding, child: FloatingActionButton( - shape: CircleBorder(), + shape: const CircleBorder(), heroTag: "geolocation_button", - onPressed: () { - _controller.future.then((controller) { - controller.requestMyLocationLatLng().then((latlng) => { - controller.animateCamera( - maplibre.CameraUpdate.newLatLng( - maplibre.LatLng( - // Default to TUM Garching campus - latlng?.latitude ?? 48.26307794976663, - latlng?.longitude ?? 11.668018668778569, - ), - ), - duration: Duration(seconds: 1) - )}); - }); - }, - backgroundColor: Colors.white, - elevation: 2e31, + backgroundColor: context.theme.cardColor, + elevation: 6, + onPressed: _onLocateMePressed, child: Image.asset( - "assets/images/map/locate.webp", - height: 36, - width: 36, + "assets/images/map/locate.webp", + height: 36, + width: 36, + color: context.theme.brightness == Brightness.dark + ? Colors.white + : Colors.black, ), ), ), @@ -270,4 +206,123 @@ class _MapWidgetState extends ConsumerState { ), ); } + + Future _onStyleLoaded() async { + final controller = _mapController; + if (controller == null) return; + + await _loadMarkerImages(controller); + _updateMarkers(controller); + + if (mounted) { + setState(() { + isMapVisible = true; + }); + } + } + + Future _loadMarkerImages(MapLibreMapController controller) async { + Future load(String name, String path) async { + if (_loadedImages.contains(name)) return; + try { + final ByteData data = await rootBundle.load(path); + await controller.addImage(name, data.buffer.asUint8List()); + _loadedImages.add(name); + } catch (e) { + log("Error loading map asset $path: $e"); + } + } + + await load("pin_blue", "assets/images/map/pin_blue.webp"); + await load("pin_red", "assets/images/map/pin_red.webp"); + } + + void _updateMarkers(MapLibreMapController controller) async { + await controller.clearSymbols(); + + await controller.symbolManager?.setIconAllowOverlap(true); + await controller.symbolManager?.setIconIgnorePlacement(true); + await controller.symbolManager?.setTextAllowOverlap(true); + await controller.symbolManager?.setTextIgnorePlacement(true); + + List options = []; + List> data = []; + + for (var marker in widget.markers) { + options.add( + SymbolOptions( + iconSize: 3, + iconImage: marker.isRed ? "pin_red" : "pin_blue", + iconRotate: marker.rotation, + iconOffset: const Offset(0, -5), + textField: marker.infoWindow?.title, + textOffset: const Offset(0, -3), + iconOpacity: marker.alpha, + geometry: LatLng(marker.position.latitude, marker.position.longitude), + zIndex: marker.zIndex, + draggable: marker.draggable, + fontNames: ["Roboto Regular"], + textColor: "#000000", + textHaloColor: "#FFFFFF", + textHaloWidth: 3.0, // magic number (done by eye) + textHaloBlur: 0, + textOpacity: 0, // Starts hidden (handled on tap) + textMaxWidth: -1, // No limit + ), + ); + + data.add({"id": marker.id, "onTap": marker.infoWindow?.onTap}); + } + + for (int i = 0; i < options.length; i++) { + await controller.addSymbol(options[i], data[i]); + } + } + + void _setupSymbolHandler(MapLibreMapController controller) { + controller.onSymbolTapped.add((symbol) { + // display text on tapped symbol & remove text from other symbols + // if text is already displayed and item has onTap callback, callback is executed + final onTap = symbol.data?["onTap"]; + + if (symbol.options.textOpacity == 1 && onTap is void Function()) { + onTap(); + } + + for (var s in controller.symbols) { + if (s.options.textOpacity == 1) { + controller.updateSymbol(s, const SymbolOptions(textOpacity: 0)); + } + } + + controller.updateSymbol(symbol, const SymbolOptions(textOpacity: 1)); + + if (symbol.options.geometry != null) { + controller.animateCamera( + CameraUpdate.newLatLng( + symbol.options.geometry!, + ), // something will have gone very wrong if it goes to 0,0 + duration: const Duration(seconds: 1), // magic number (felt right) + ); + } + }); + } + + void _onLocateMePressed() async { + if (_mapController == null) return; + + final myLoc = await _mapController!.requestMyLocationLatLng(); + + final target = myLoc != null + ? LatLng(myLoc.latitude, myLoc.longitude) + : const LatLng( + 48.26307794976663, + 11.668018668778569, + ); // Default to TUM Garching campus + + _mapController!.animateCamera( + CameraUpdate.newLatLng(target), + duration: const Duration(seconds: 1), + ); + } } diff --git a/lib/placesComponent/views/studyGroups/study_room_group_scaffold.dart b/lib/placesComponent/views/studyGroups/study_room_group_scaffold.dart index 64683635..8e10c3a5 100644 --- a/lib/placesComponent/views/studyGroups/study_room_group_scaffold.dart +++ b/lib/placesComponent/views/studyGroups/study_room_group_scaffold.dart @@ -9,7 +9,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; class StudyRoomGroupScaffold extends ConsumerWidget { factory StudyRoomGroupScaffold(StudyRoomGroup? studyRoomGroup) { diff --git a/lib/placesComponent/views/studyGroups/study_room_group_view.dart b/lib/placesComponent/views/studyGroups/study_room_group_view.dart index 7d4fefc7..e0562a69 100644 --- a/lib/placesComponent/views/studyGroups/study_room_group_view.dart +++ b/lib/placesComponent/views/studyGroups/study_room_group_view.dart @@ -5,6 +5,7 @@ import 'package:campus_flutter/base/util/last_updated_text.dart'; import 'package:campus_flutter/base/errorHandling/error_handling_router.dart'; import 'package:campus_flutter/base/util/padded_divider.dart'; import 'package:campus_flutter/homeComponent/view/widget/widget_frame_view.dart'; +import 'package:campus_flutter/placesComponent/model/maps/marker.dart'; import 'package:campus_flutter/placesComponent/model/studyRooms/study_room.dart'; import 'package:campus_flutter/placesComponent/model/studyRooms/study_room_group.dart'; import 'package:campus_flutter/placesComponent/viewModels/study_rooms_viewmodel.dart'; @@ -14,7 +15,7 @@ import 'package:collection/collection.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; class StudyRoomGroupView extends ConsumerWidget { factory StudyRoomGroupView(StudyRoomGroup? studyRoomGroup, bool isSplitView) { @@ -194,7 +195,7 @@ class StudyRoomGroupView extends ConsumerWidget { return MapWidget.fullPadding( markers: { Marker( - markerId: const MarkerId("studyRoomMarker"), + id: "studyRoomMarker", position: LatLng( studyRoomGroup!.coordinate!.latitude, studyRoomGroup.coordinate!.longitude, @@ -216,7 +217,7 @@ class StudyRoomGroupView extends ConsumerWidget { markers: studyRoomGroup != null ? { Marker( - markerId: const MarkerId("studyRoomMarker"), + id: "studyRoomMarker", position: LatLng( studyRoomGroup.coordinate?.latitude ?? 0.0, studyRoomGroup.coordinate?.longitude ?? 0.0, diff --git a/lib/searchComponent/views/resultViews/calendar_search_result_view.dart b/lib/searchComponent/views/resultViews/calendar_search_result_view.dart index e39d7944..55b68109 100644 --- a/lib/searchComponent/views/resultViews/calendar_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/calendar_search_result_view.dart @@ -27,7 +27,7 @@ class CalendarSearchResultView extends ConsumerWidget { subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - IconText( + SymbolText.icon( iconData: Icons.hourglass_top, label: calendarEvent.timePeriodText(context), style: Theme.of(context).textTheme.bodySmall?.copyWith( @@ -35,7 +35,7 @@ class CalendarSearchResultView extends ConsumerWidget { ), iconColor: context.primaryColor, ), - IconText( + SymbolText.icon( iconData: Icons.location_pin, label: calendarEvent.locations.firstOrNull ?? context.tr("unknown"), diff --git a/lib/settingsComponent/viewModels/settings_viewmodel.dart b/lib/settingsComponent/viewModels/settings_viewmodel.dart index dd083f0f..02dd32e4 100644 --- a/lib/settingsComponent/viewModels/settings_viewmodel.dart +++ b/lib/settingsComponent/viewModels/settings_viewmodel.dart @@ -80,7 +80,7 @@ class SettingsViewModel { .map( (e) => DropdownMenuItem( value: e, - child: IconText( + child: SymbolText.icon( iconData: e.icon, iconColor: context.primaryColor, label: Localizations.localeOf(context).languageCode == "de" diff --git a/lib/studiesComponent/view/grade/chart_view.dart b/lib/studiesComponent/view/grade/chart_view.dart index f0f69a09..98c7e23a 100644 --- a/lib/studiesComponent/view/grade/chart_view.dart +++ b/lib/studiesComponent/view/grade/chart_view.dart @@ -34,12 +34,12 @@ class ChartView extends ConsumerWidget { onSelected: (selected) { ref.read(gradeViewModel).setSelectedDegree(selected); }, - child: IconText( + child: SymbolText.icon( iconData: Icons.keyboard_arrow_down, label: "$title ($degreeShort)", style: Theme.of(context).textTheme.bodyLarge, mainAxisAlignment: MainAxisAlignment.center, - leadingIcon: false, + leading: false, ), ), SfCartesianChart( diff --git a/lib/studiesComponent/view/grade/grade_view.dart b/lib/studiesComponent/view/grade/grade_view.dart index a7095862..b595d742 100644 --- a/lib/studiesComponent/view/grade/grade_view.dart +++ b/lib/studiesComponent/view/grade/grade_view.dart @@ -39,7 +39,7 @@ class GradeRow extends StatelessWidget { } Widget _subtitle(String text, IconData iconData, BuildContext context) { - return IconText( + return SymbolText.icon( iconData: iconData, label: text, style: TextStyle(color: Theme.of(context).colorScheme.secondary), diff --git a/lib/studiesComponent/view/lecture/lecture_view.dart b/lib/studiesComponent/view/lecture/lecture_view.dart index 387c441b..2f6eb99e 100644 --- a/lib/studiesComponent/view/lecture/lecture_view.dart +++ b/lib/studiesComponent/view/lecture/lecture_view.dart @@ -51,7 +51,7 @@ class LectureView extends ConsumerWidget { } Widget _subtitle(String text, IconData iconData, BuildContext context) { - return IconText( + return SymbolText.icon( iconData: iconData, label: text, style: TextStyle(color: Theme.of(context).colorScheme.secondary), diff --git a/lib/studiesComponent/view/lectureDetail/lecture_info_card_view.dart b/lib/studiesComponent/view/lectureDetail/lecture_info_card_view.dart index 2f43a89e..f8f1b945 100644 --- a/lib/studiesComponent/view/lectureDetail/lecture_info_card_view.dart +++ b/lib/studiesComponent/view/lectureDetail/lecture_info_card_view.dart @@ -18,7 +18,7 @@ class LectureInfoCardView extends StatelessWidget { @override Widget build(BuildContext context) { return WidgetFrameView( - titleWidget: IconText( + titleWidget: SymbolText.icon( iconData: icon, label: title, style: Theme.of(context).textTheme.titleMedium, diff --git a/lib/studiesComponent/viewModel/grade_viewmodel.dart b/lib/studiesComponent/viewModel/grade_viewmodel.dart index 219f8104..f55d4b8f 100644 --- a/lib/studiesComponent/viewModel/grade_viewmodel.dart +++ b/lib/studiesComponent/viewModel/grade_viewmodel.dart @@ -102,10 +102,10 @@ class GradeViewModel { return PopupMenuItem( value: studyId, child: selectedStudyId == studyId - ? IconText( + ? SymbolText.icon( iconData: Icons.check, label: "$studyDesignation ($degreeShort)", - leadingIcon: false, + leading: false, ) : Text("$studyDesignation ($degreeShort)"), ); diff --git a/pubspec.lock b/pubspec.lock index fa61dae0..27b356b9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,26 +5,26 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f + sha256: c209688d9f5a5f26b2fb47a188131a6fb9e876ae9e47af3737c0b4f58a93470d url: "https://pub.dev" source: hosted - version: "85.0.0" + version: "91.0.0" _flutterfire_internals: dependency: transitive description: name: _flutterfire_internals - sha256: "8a1f5f3020ef2a74fb93f7ab3ef127a8feea33a7a2276279113660784ee7516a" + sha256: e4a1b612fd2955908e26116075b3a4baf10c353418ca645b4deae231c82bf144 url: "https://pub.dev" source: hosted - version: "1.3.64" + version: "1.3.65" analyzer: dependency: transitive description: name: analyzer - sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" + sha256: f51c8499b35f9b26820cfe914828a6a98a94efd5cc78b37bb7d03debae3a1d08 url: "https://pub.dev" source: hosted - version: "7.7.1" + version: "8.4.1" ansicolor: dependency: transitive description: @@ -93,10 +93,10 @@ packages: dependency: transitive description: name: build - sha256: ce76b1d48875e3233fde17717c23d1f60a91cc631597e49a400c89b475395b1d + sha256: c1668065e9ba04752570ad7e038288559d1e2ca5c6d0131c0f5f55e39e777413 url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.3" build_config: dependency: transitive description: @@ -113,30 +113,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.1" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - sha256: d1d57f7807debd7349b4726a19fd32ec8bc177c71ad0febf91a20f84cd2d4b46 - url: "https://pub.dev" - source: hosted - version: "3.0.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b24597fceb695969d47025c958f3837f9f0122e237c6a22cb082a5ac66c3ca30 + sha256: "110c56ef29b5eb367b4d17fc79375fa8c18a6cd7acd92c05bb3986c17a079057" url: "https://pub.dev" source: hosted - version: "2.7.1" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: "066dda7f73d8eb48ba630a55acb50c4a84a2e6b453b1cb4567f581729e794f7b" - url: "https://pub.dev" - source: hosted - version: "9.3.1" + version: "2.10.4" built_collection: dependency: transitive description: @@ -229,10 +213,10 @@ packages: dependency: transitive description: name: code_builder - sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" url: "https://pub.dev" source: hosted - version: "4.11.0" + version: "4.11.1" collection: dependency: "direct main" description: @@ -277,10 +261,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.3" dbus: dependency: transitive description: @@ -293,10 +277,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: dd0e8e02186b2196c7848c9d394a5fd6e5b57a43a546082c5820b1ec72317e33 + sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c" url: "https://pub.dev" source: hosted - version: "12.2.0" + version: "12.3.0" device_info_plus_platform_interface: dependency: transitive description: @@ -325,18 +309,18 @@ packages: dependency: "direct main" description: name: drift - sha256: "83290a32ae006a7535c5ecf300722cb77177250d9df4ee2becc5fa8a36095114" + sha256: "3669e1b68d7bffb60192ac6ba9fd2c0306804d7a00e5879f6364c69ecde53a7f" url: "https://pub.dev" source: hosted - version: "2.29.0" + version: "2.30.0" drift_dev: dependency: "direct dev" description: name: drift_dev - sha256: "6019f827544e77524ffd5134ae0cb75dfd92ef5ef3e269872af92840c929cd43" + sha256: afe4d1d2cfce6606c86f11a6196e974a2ddbfaa992956ce61e054c9b1899c769 url: "https://pub.dev" source: hosted - version: "2.29.0" + version: "2.30.0" easy_localization: dependency: "direct main" description: @@ -365,10 +349,10 @@ packages: dependency: transitive description: name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + sha256: d07d37192dbf97461359c1518788f203b0c9102cfd2c35a716b823741219542c url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" file: dependency: transitive description: @@ -381,10 +365,10 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: "1f2dfd9f535d81f8b06d7a50ecda6eac1e6922191ed42e09ca2c84bd2288927c" + sha256: "29cfa93c771d8105484acac340b5ea0835be371672c91405a300303986f4eba9" url: "https://pub.dev" source: hosted - version: "4.2.1" + version: "4.3.0" firebase_core_platform_interface: dependency: transitive description: @@ -397,50 +381,50 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: ff18fabb0ad0ed3595d2f2c85007ecc794aadecdff5b3bb1460b7ee47cded398 + sha256: a631bbfbfa26963d68046aed949df80b228964020e9155b086eff94f462bbf1f url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.1" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics - sha256: bd4eadd620071ae48ef0e3617499be2a0ea4062d6d5c6fea6c1cec41ebbb2435 + sha256: "8d52022ee6fdd224e92c042f297d1fd0ec277195c49f39fa61b8cc500a639f00" url: "https://pub.dev" source: hosted - version: "5.0.5" + version: "5.0.6" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: a8ca502fe3aa48b4f0b9e6e3bc0019085a247b5d1214cd342a189457975662db + sha256: "97c6a97b35e3d3dafe38fb053a65086a1efb125022d292161405848527cc25a4" url: "https://pub.dev" source: hosted - version: "3.8.15" + version: "3.8.16" firebase_remote_config: dependency: "direct main" description: name: firebase_remote_config - sha256: "5d23c7021e69fbc9ef489ebcf4b1b941575e34ebacc7f20173c2a97f37f45b74" + sha256: "50cbbef2acf135fa94ed17b585a49d38248951892044ceedd7a26269eff3447b" url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.3" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface - sha256: b9c80a6cbc43367fdb2d4f441546e7c5330e5dc256659b58f5c0ab67cd332f43 + sha256: effb7be478767bc60a46d79175a862607fc4904cffea27b2a2d049da774887c6 url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.6" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web - sha256: "2a465562d7d35c3a7f4956d440d5ac171e6ce65974b2225fd17b45303f88aa94" + sha256: "20f1d40cb2b345dc5e7db1603c33d0403c78b09036f5cf3a5c778baa2594bbb5" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.2" fixnum: dependency: transitive description: @@ -509,70 +493,62 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.7" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 - url: "https://pub.dev" - source: hosted - version: "2.0.33" flutter_riverpod: dependency: "direct main" description: name: flutter_riverpod - sha256: "9e2d6907f12cc7d23a846847615941bddee8709bf2bfd274acdf5e80bcf22fde" + sha256: "38ec6c303e2c83ee84512f5fc2a82ae311531021938e63d7137eccc107bf3c02" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.1.0" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + sha256: da922f2aab2d733db7e011a6bcc4a825b844892d4edd6df83ff156b09a9b2e40 url: "https://pub.dev" source: hosted - version: "9.2.4" - flutter_secure_storage_linux: + version: "10.0.0" + flutter_secure_storage_darwin: dependency: transitive description: - name: flutter_secure_storage_linux - sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + name: flutter_secure_storage_darwin + sha256: "8878c25136a79def1668c75985e8e193d9d7d095453ec28730da0315dc69aee3" url: "https://pub.dev" source: hosted - version: "1.2.3" - flutter_secure_storage_macos: + version: "0.2.0" + flutter_secure_storage_linux: dependency: transitive description: - name: flutter_secure_storage_macos - sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + name: flutter_secure_storage_linux + sha256: "2b5c76dce569ab752d55a1cee6a2242bcc11fdba927078fb88c503f150767cda" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.0.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "2.0.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + sha256: "6a1137df62b84b54261dca582c1c09ea72f4f9a4b2fcee21b025964132d5d0c3" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "2.1.0" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "4.1.0" flutter_staggered_grid_view: dependency: "direct main" description: @@ -643,10 +619,10 @@ packages: dependency: transitive description: name: geolocator_linux - sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 + sha256: d64112a205931926f4363bb6bd48f14cb38e7326833041d170615586cd143797 url: "https://pub.dev" source: hosted - version: "0.2.3" + version: "0.2.4" geolocator_platform_interface: dependency: transitive description: @@ -675,10 +651,10 @@ packages: dependency: "direct main" description: name: get_it - sha256: "368c1abda38084fb5c0c280bfdd5e4ddb010eaa022ff3e953e8b503f7b334b7d" + sha256: "1d648d2dd2047d7f7450d5727ca24ee435f240385753d90b49650e3cdff32e56" url: "https://pub.dev" source: hosted - version: "9.1.0" + version: "9.2.0" glob: dependency: transitive description: @@ -691,10 +667,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: d8f590a69729f719177ea68eb1e598295e8dbc41bbc247fed78b2c8a25660d7c + sha256: eff94d2a6fc79fa8b811dde79c7549808c2346037ee107a1121b4a644c745f2a url: "https://pub.dev" source: hosted - version: "16.3.0" + version: "17.0.1" google_identity_services_web: dependency: transitive description: @@ -703,54 +679,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.3+1" - google_maps: - dependency: transitive - description: - name: google_maps - sha256: "5d410c32112d7c6eb7858d359275b2aa04778eed3e36c745aeae905fb2fa6468" - url: "https://pub.dev" - source: hosted - version: "8.2.0" - google_maps_flutter: - dependency: "direct main" - description: - name: google_maps_flutter - sha256: "819985697596a42e1054b5feb2f407ba1ac92262e02844a40168e742b9f36dca" - url: "https://pub.dev" - source: hosted - version: "2.14.0" - google_maps_flutter_android: - dependency: transitive - description: - name: google_maps_flutter_android - sha256: "3835f6ae5e8b8d4d454d913575069513c9f216e088b87aa5c18cb3610951c6b4" - url: "https://pub.dev" - source: hosted - version: "2.18.6" - google_maps_flutter_ios: - dependency: transitive - description: - name: google_maps_flutter_ios - sha256: "115b03c2e637e74d084a78c0e1faf42884fcd8e65d1a9ce58d909ca5493afa32" - url: "https://pub.dev" - source: hosted - version: "2.15.7" - google_maps_flutter_platform_interface: - dependency: transitive - description: - name: google_maps_flutter_platform_interface - sha256: e8b1232419fcdd35c1fdafff96843f5a40238480365599d8ca661dde96d283dd - url: "https://pub.dev" - source: hosted - version: "2.14.1" - google_maps_flutter_web: - dependency: transitive - description: - name: google_maps_flutter_web - sha256: d416602944e1859f3cbbaa53e34785c223fa0a11eddb34a913c964c5cbb5d8cf - url: "https://pub.dev" - source: hosted - version: "0.5.14+3" googleapis_auth: dependency: transitive description: @@ -772,10 +700,10 @@ packages: description: path: "." ref: master - resolved-ref: f08461901dc175642b689283573c2feab4ce39e7 + resolved-ref: "2ed7db5f3f1d6ce1218a76f933ab530a588fbe77" url: "https://github.com/jakobkoerber/grpc-dart.git" source: git - version: "5.0.0" + version: "5.1.0" gsettings: dependency: transitive description: @@ -788,10 +716,10 @@ packages: dependency: "direct main" description: name: home_widget - sha256: "908d033514a981f829fd98213909e11a428104327be3b422718aa643ac9d084a" + sha256: d794a73894012459a4c63b94a6dc2cb3ccaa6eb08fb15b974aa7ac642594aed5 url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.9.0" html: dependency: "direct main" description: @@ -836,10 +764,10 @@ packages: dependency: transitive description: name: image - sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + sha256: "492bd52f6c4fbb6ee41f781ff27765ce5f627910e1e0cbecfa3d9add5562604c" url: "https://pub.dev" source: hosted - version: "4.5.4" + version: "4.7.2" intl: dependency: "direct main" description: @@ -860,10 +788,10 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.2" json_annotation: dependency: "direct main" description: @@ -948,26 +876,26 @@ packages: dependency: "direct main" description: name: maplibre_gl - sha256: "5c7b1008396b2a321bada7d986ed60f9423406fbc7bd16f7ce91b385dfa054cd" + sha256: d9773555ae4ebab94bbc3ae2176b077cfda486ec729eefe01e1613f164cb8410 url: "https://pub.dev" source: hosted - version: "0.22.0" + version: "0.25.0" maplibre_gl_platform_interface: dependency: transitive description: name: maplibre_gl_platform_interface - sha256: "08ee0a2d0853ea945a0ab619d52c0c714f43144145cd67478fc6880b52f37509" + sha256: bd7de401dea24dd7e8a6f2fa736ddee7dbbee3e24a9027f0afdd619994702047 url: "https://pub.dev" source: hosted - version: "0.22.0" + version: "0.25.0" maplibre_gl_web: dependency: transitive description: name: maplibre_gl_web - sha256: "2b13d4b1955a9a54e38a718f2324e56e4983c080fc6de316f6f4b5458baacb58" + sha256: af0e48bf96e8dd99f8b958a1953126971eb8a0527b9735441d4f24df3913f5a2 url: "https://pub.dev" source: hosted - version: "0.22.0" + version: "0.25.0" matcher: dependency: transitive description: @@ -1008,14 +936,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: "1f81ed9e41909d44162d7ec8663b2c647c202317cc0b56d3d56f6a13146a0b64" - url: "https://pub.dev" - source: hosted - version: "9.1.0" octo_image: dependency: transitive description: @@ -1036,10 +956,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + sha256: f69da0d3189a4b4ceaeb1a3defb0f329b3b352517f52bed4290f83d4f06bc08d url: "https://pub.dev" source: hosted - version: "8.3.1" + version: "9.0.0" package_info_plus_platform_interface: dependency: transitive description: @@ -1084,10 +1004,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "6192e477f34018ef1ea790c56fffc7302e3bc3efede9e798b934c252c8c105ba" + sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.5.1" path_provider_linux: dependency: transitive description: @@ -1204,10 +1124,10 @@ packages: dependency: "direct main" description: name: protobuf - sha256: "2fcc8a202ca7ec17dab7c97d6b6d91cf03aa07fe6f65f8afbb6dfa52cc5bd902" + sha256: "75ec242d22e950bdcc79ee38dd520ce4ee0bc491d7fadc4ea47694604d22bf06" url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "6.0.0" pub_semver: dependency: transitive description: @@ -1276,10 +1196,10 @@ packages: dependency: transitive description: name: riverpod - sha256: c406de02bff19d920b832bddfb8283548bfa05ce41c59afba57ce643e116aa59 + sha256: "16ff608d21e8ea64364f2b7c049c94a02ab81668f78845862b6e88b71dd4935a" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.1.0" rxdart: dependency: "direct main" description: @@ -1288,30 +1208,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.28.0" - sanitize_html: - dependency: transitive - description: - name: sanitize_html - sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989" - url: "https://pub.dev" - source: hosted - version: "2.1.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "46a46fd64659eff15f4638bbe19de43f9483f0e0bf024a9fb6b3582064bacc7b" + sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc" url: "https://pub.dev" source: hosted - version: "2.4.17" + version: "2.4.18" shared_preferences_foundation: dependency: transitive description: @@ -1401,10 +1313,10 @@ packages: dependency: transitive description: name: source_gen - sha256: "800f12fb87434defa13432ab37e33051b43b290a174e15259563b043cda40c46" + sha256: "07b277b67e0096c45196cbddddf2d8c6ffc49342e88bf31d460ce04605ddac75" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.1" source_helper: dependency: transitive description: @@ -1489,18 +1401,18 @@ packages: dependency: "direct main" description: name: sqlite3_flutter_libs - sha256: "69c80d812ef2500202ebd22002cbfc1b6565e9ff56b2f971e757fac5d42294df" + sha256: "1e800ebe7f85a80a66adacaa6febe4d5f4d8b75f244e9838a27cb2ffc7aec08d" url: "https://pub.dev" source: hosted - version: "0.5.40" + version: "0.5.41" sqlparser: dependency: transitive description: name: sqlparser - sha256: "54eea43e36dd3769274c3108625f9ea1a382f8d2ac8b16f3e4589d9bd9b0e16c" + sha256: "162435ede92bcc793ea939fdc0452eef0a73d11f8ed053b58a89792fba749da5" url: "https://pub.dev" source: hosted - version: "0.42.0" + version: "0.42.1" stack_trace: dependency: transitive description: @@ -1545,42 +1457,42 @@ packages: dependency: "direct main" description: name: syncfusion_flutter_calendar - sha256: "350a76d7846573d0d1b82f4b1378bc2002081494ebc357d0056ec3be109be995" + sha256: c2af1a3b2ca8c9f71f30904a89634138eb15d6ffd994623088d218958c969b5a url: "https://pub.dev" source: hosted - version: "31.2.12" + version: "32.1.22" syncfusion_flutter_charts: dependency: "direct main" description: name: syncfusion_flutter_charts - sha256: "8706ae9ca5dcb5f56ebc04e150d8f3af8d0ad1fc2fc6ec52f148420b5a15cbfa" + sha256: "2a0bf92a9d582b18fcdfaa794a130f83b596ffcb3efc758ee96191e7f91373b7" url: "https://pub.dev" source: hosted - version: "31.2.12" + version: "32.1.22" syncfusion_flutter_core: dependency: "direct main" description: name: syncfusion_flutter_core - sha256: fea2b5f6c976455d20b19bf77d29bf96a740d14579127b4fc1cdafde42b48177 + sha256: "7363e3a7489c71874c624945d8dcbbe1e2486bb7bce7ee5b7693f14c00581f52" url: "https://pub.dev" source: hosted - version: "31.2.12" + version: "32.1.22" syncfusion_flutter_datepicker: dependency: "direct main" description: name: syncfusion_flutter_datepicker - sha256: "3dd5e250755ca10dfdff658cabb39436e67137177e0d41c890a749fab3032e4a" + sha256: "4a910c5135ef60d35310dd6c4bb452b99bb8853789963826c96f05e7f03d8cf6" url: "https://pub.dev" source: hosted - version: "31.2.12" + version: "32.1.22" syncfusion_localizations: dependency: transitive description: name: syncfusion_localizations - sha256: "4e84bdec8def9c4ef37f448cf75c8e86cd5903b03a8261ff2e041ebd2f6b2090" + sha256: c564865c6a6637b1f30a477800c053f86fe4aa568b4dec607fe2ae53c3e1578e url: "https://pub.dev" source: hosted - version: "31.2.12" + version: "32.1.22" synchronized: dependency: transitive description: @@ -1601,26 +1513,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" url: "https://pub.dev" source: hosted - version: "1.26.2" + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.7" test_core: dependency: transitive description: name: test_core - sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "0.6.11" + version: "0.6.12" timeago: dependency: "direct main" description: @@ -1637,14 +1549,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.10.1" - timing: - dependency: transitive - description: - name: timing - sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" - url: "https://pub.dev" - source: hosted - version: "1.0.2" typed_data: dependency: transitive description: @@ -1777,18 +1681,18 @@ packages: dependency: transitive description: name: video_player_android - sha256: "3f7ef3fb7b29f510e58f4d56b6ffbc3463b1071f2cf56e10f8d25f5b991ed85b" + sha256: ee4fd520b0cafa02e4a867a0f882092e727cdaa1a2d24762171e787f8a502b0a url: "https://pub.dev" source: hosted - version: "2.8.21" + version: "2.9.1" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: "6bced1739cf1f96f03058118adb8ac0dd6f96aa1a1a6e526424ab92fd2a6a77d" + sha256: d1eb970495a76abb35e5fa93ee3c58bd76fb6839e2ddf2fbb636674f2b971dd4 url: "https://pub.dev" source: hosted - version: "2.8.7" + version: "2.8.9" video_player_platform_interface: dependency: transitive description: @@ -1817,10 +1721,10 @@ packages: dependency: transitive description: name: watcher - sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.2.1" web: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ccf15a33..65459291 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: campus_flutter description: "TUM Campus App" publish_to: 'none' -version: 5.1.6+1 +version: 5.2.0+1 environment: sdk: ^3.9.2 @@ -19,13 +19,13 @@ dependencies: json_serializable: ^6.6.1 cached_network_image: ^3.2.3 grpc: ^3.2.4 - protobuf: ^5.0.0 + protobuf: ^6.0.0 xml: ^6.2.2 xml2json: ^6.1.0 # state management rxdart: ^0.28.0 - go_router: ^16.0.0 + go_router: ^17.0.1 flutter_riverpod: ^3.0.0 get_it: ^9.0.5 @@ -34,15 +34,14 @@ dependencies: flutter_staggered_grid_view: ^0.7.0 flutter_svg: ^2.0.9 flutter_linkify: ^6.0.0 - home_widget: ^0.8.0 + home_widget: ^0.9.0 auto_size_text: ^3.0.0 quick_actions: ^1.0.7 flutter_native_splash: ^2.2.19 - syncfusion_flutter_core: ^31.1.19 - syncfusion_flutter_calendar: ^31.1.19 - syncfusion_flutter_charts: ^31.1.19 - syncfusion_flutter_datepicker: ^31.1.19 - google_maps_flutter: ^2.5.3 + syncfusion_flutter_core: ^32.1.22 + syncfusion_flutter_calendar: ^32.1.22 + syncfusion_flutter_charts: ^32.1.22 + syncfusion_flutter_datepicker: ^32.1.22 video_player: ^2.6.1 barcode_widget: ^2.0.4 lottie: ^3.0.0 @@ -52,13 +51,13 @@ dependencies: url: https://github.com/mchome/flutter_colorpicker.git ref: master flutter_contacts: ^1.1.9+2 - maplibre_gl: ^0.22.0 + maplibre_gl: ^0.25.0 # helpers device_info_plus: ^12.1.0 - flutter_secure_storage: ^9.2.3 + flutter_secure_storage: ^10.0.0 geolocator: ^14.0.0 - package_info_plus: ^8.0.0 + package_info_plus: ^9.0.0 path_provider: ^2.0.15 path: ^1.9.0 url_launcher: ^6.1.10 @@ -134,4 +133,5 @@ flutter: - assets/images/campus/campus-stamm.jpeg - assets/images/location.png - assets/images/map/locate.webp - - assets/images/map/pin.webp + - assets/images/map/pin_blue.webp + - assets/images/map/pin_red.webp