6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit c65c0038
Changed files
comwell_key_app/firebase.json | 122 ++++++++++++++++++++- comwell_key_app/ios/Podfile | 10 ++ .../xcshareddata/xcschemes/Runner.xcscheme | 6 + .../lib/check_in/bloc/check_in_cubit.dart | 6 +- .../lib/common/components/comwell_app_bar.dart | 3 +- comwell_key_app/lib/comwell_app.dart | 2 + .../domain/repositories/bluetooth_repository.dart | 7 +- comwell_key_app/lib/overview/overview_page.dart | 3 + .../pregistration/cubit/preregistration_cubit.dart | 4 - .../bloc/booking_details_cubit.dart | 24 +--- .../booking_details/booking_details_page.dart | 22 ++-- .../bluetooth/bluetooth_permission_screen.dart | 1 - .../bloc/permission_overview_cubit.dart | 16 ++- .../permission_overview_screen.dart | 25 ++++- .../lib/routing/go_router_observer.dart | 93 ++++++++-------- .../lib/services/mappers/booking_mapper.dart | 6 +- comwell_key_app/lib/tracking/comwell_tracking.dart | 17 ++- .../lib/tracking/trackers/firebase_tracker.dart | 9 ++ comwell_key_app/lib/utils/route_utils.dart | 26 +++++ 19 files changed, 310 insertions(+), 92 deletions(-)
Diff
diff --git a/comwell_key_app/firebase.json b/comwell_key_app/firebase.json
index 2c71aef9..8dae0480 100644
--- a/comwell_key_app/firebase.json
+++ b/comwell_key_app/firebase.json
@@ -1 +1,121 @@
-{"flutter":{"platforms":{"android":{"default":{"projectId":"comwell-phoenix","appId":"1:1031550326508:android:04a896341af4f448cdf7c9","fileOutput":"android/app/google-services.json"},"buildConfigurations":{"src/dev":{"projectId":"comwell-phoenix-dev","appId":"1:735004599167:android:3581fdbebd07fd5982f04a","fileOutput":"android/app/src/dev/google-services.json"},"src/stage":{"projectId":"comwell-phoenix-stage","appId":"1:243753787895:android:17b0c823d8c936c6b98ef2","fileOutput":"android/app/src/stage/google-services.json"},"src/test":{"projectId":"comwell-phoenix-test","appId":"1:454092419952:android:67b6371cca729a1ea995b5","fileOutput":"android/app/src/test/google-services.json"},"src/prod":{"projectId":"comwell-phoenix","appId":"1:1031550326508:android:04a896341af4f448cdf7c9","fileOutput":"android/app/src/prod/google-services.json"}}},"ios":{"default":{"projectId":"comwell-phoenix","appId":"1:1031550326508:ios:05ac9b069efbbac9cdf7c9","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"},"buildConfigurations":{"Debug-develop":{"projectId":"comwell-phoenix-dev","appId":"1:735004599167:ios:276b6bc3fc059e9b82f04a","uploadDebugSymbols":false,"fileOutput":"ios/flavors/dev/GoogleService-Info.plist"},"Release-Stage":{"projectId":"comwell-phoenix-stage","appId":"1:243753787895:ios:24f02e213657204db98ef2","uploadDebugSymbols":false,"fileOutput":"ios/flavors/stage/GoogleService-Info.plist"},"Release-releasetest":{"projectId":"comwell-phoenix-test","appId":"1:454092419952:ios:4ebb640eb03646e8a995b5","uploadDebugSymbols":false,"fileOutput":"ios/flavors/test/GoogleService-Info.plist"},"Release-Prod":{"projectId":"comwell-phoenix","appId":"1:1031550326508:ios:05ac9b069efbbac9cdf7c9","uploadDebugSymbols":false,"fileOutput":"ios/flavors/prod/GoogleService-Info.plist"}}},"macos":{"default":{"projectId":"comwell-phoenix-dev","appId":"1:735004599167:ios:33eaf052498b528b82f04a","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"comwell-phoenix","configurations":{"android":"1:1031550326508:android:04a896341af4f448cdf7c9","ios":"1:1031550326508:ios:05ac9b069efbbac9cdf7c9","macos":"1:1031550326508:ios:045894b7b1978c36cdf7c9","web":"1:1031550326508:web:ac21b20cf60305e9cdf7c9","windows":"1:1031550326508:web:fc58da0d89a34cdecdf7c9"}},"lib/firebase_options_dev.dart":{"projectId":"comwell-phoenix-dev","configurations":{"android":"1:735004599167:android:3581fdbebd07fd5982f04a","ios":"1:735004599167:ios:276b6bc3fc059e9b82f04a","macos":"1:735004599167:ios:33eaf052498b528b82f04a","web":"1:735004599167:web:8411274579b222eb82f04a","windows":"1:735004599167:web:97277ae7b23ea63b82f04a"}},"lib/firebase_options_stage.dart":{"projectId":"comwell-phoenix-stage","configurations":{"android":"1:243753787895:android:17b0c823d8c936c6b98ef2","ios":"1:243753787895:ios:24f02e213657204db98ef2","web":"1:243753787895:web:2da67a12aa776b17b98ef2"}},"lib/firebase_options_test.dart":{"projectId":"comwell-phoenix-test","configurations":{"android":"1:454092419952:android:060b8e4744be03cca995b5"}},"lib/firebase_options_prod.dart":{"projectId":"comwell-phoenix","configurations":{"android":"1:1031550326508:android:04a896341af4f448cdf7c9","ios":"1:1031550326508:ios:05ac9b069efbbac9cdf7c9","web":"1:1031550326508:web:ac21b20cf60305e9cdf7c9"}}}}}}
\ No newline at end of file
+{
+ "flutter": {
+ "platforms": {
+ "android": {
+ "default": {
+ "projectId": "comwell-phoenix",
+ "appId": "1:1031550326508:android:04a896341af4f448cdf7c9",
+ "fileOutput": "android/app/google-services.json"
+ },
+ "buildConfigurations": {
+ "src/dev": {
+ "projectId": "comwell-phoenix-dev",
+ "appId": "1:735004599167:android:3581fdbebd07fd5982f04a",
+ "fileOutput": "android/app/src/dev/google-services.json"
+ },
+ "src/stage": {
+ "projectId": "comwell-phoenix-stage",
+ "appId": "1:243753787895:android:17b0c823d8c936c6b98ef2",
+ "fileOutput": "android/app/src/stage/google-services.json"
+ },
+ "src/test": {
+ "projectId": "comwell-phoenix-test",
+ "appId": "1:454092419952:android:67b6371cca729a1ea995b5",
+ "fileOutput": "android/app/src/test/google-services.json"
+ },
+ "src/prod": {
+ "projectId": "comwell-phoenix",
+ "appId": "1:1031550326508:android:04a896341af4f448cdf7c9",
+ "fileOutput": "android/app/src/prod/google-services.json"
+ }
+ }
+ },
+ "ios": {
+ "default": {
+ "projectId": "comwell-phoenix",
+ "appId": "1:1031550326508:ios:05ac9b069efbbac9cdf7c9",
+ "uploadDebugSymbols": false,
+ "fileOutput": "ios/Runner/GoogleService-Info.plist"
+ },
+ "buildConfigurations": {
+ "Debug-develop": {
+ "projectId": "comwell-phoenix-dev",
+ "appId": "1:735004599167:ios:276b6bc3fc059e9b82f04a",
+ "uploadDebugSymbols": false,
+ "fileOutput": "ios/flavors/dev/GoogleService-Info.plist"
+ },
+ "Release-Stage": {
+ "projectId": "comwell-phoenix-stage",
+ "appId": "1:243753787895:ios:24f02e213657204db98ef2",
+ "uploadDebugSymbols": false,
+ "fileOutput": "ios/flavors/stage/GoogleService-Info.plist"
+ },
+ "Release-releasetest": {
+ "projectId": "comwell-phoenix-test",
+ "appId": "1:454092419952:ios:4ebb640eb03646e8a995b5",
+ "uploadDebugSymbols": false,
+ "fileOutput": "ios/flavors/test/GoogleService-Info.plist"
+ },
+ "Release-Prod": {
+ "projectId": "comwell-phoenix",
+ "appId": "1:1031550326508:ios:05ac9b069efbbac9cdf7c9",
+ "uploadDebugSymbols": false,
+ "fileOutput": "ios/flavors/prod/GoogleService-Info.plist"
+ }
+ }
+ },
+ "macos": {
+ "default": {
+ "projectId": "comwell-phoenix-dev",
+ "appId": "1:735004599167:ios:33eaf052498b528b82f04a",
+ "uploadDebugSymbols": false,
+ "fileOutput": "macos/Runner/GoogleService-Info.plist"
+ }
+ },
+ "dart": {
+ "lib/firebase_options.dart": {
+ "projectId": "comwell-phoenix",
+ "configurations": {
+ "android": "1:1031550326508:android:04a896341af4f448cdf7c9",
+ "ios": "1:1031550326508:ios:05ac9b069efbbac9cdf7c9",
+ "macos": "1:1031550326508:ios:045894b7b1978c36cdf7c9",
+ "web": "1:1031550326508:web:ac21b20cf60305e9cdf7c9",
+ "windows": "1:1031550326508:web:fc58da0d89a34cdecdf7c9"
+ }
+ },
+ "lib/firebase_options_dev.dart": {
+ "projectId": "comwell-phoenix-dev",
+ "configurations": {
+ "android": "1:735004599167:android:3581fdbebd07fd5982f04a",
+ "ios": "1:735004599167:ios:276b6bc3fc059e9b82f04a",
+ "macos": "1:735004599167:ios:33eaf052498b528b82f04a",
+ "web": "1:735004599167:web:8411274579b222eb82f04a",
+ "windows": "1:735004599167:web:97277ae7b23ea63b82f04a"
+ }
+ },
+ "lib/firebase_options_stage.dart": {
+ "projectId": "comwell-phoenix-stage",
+ "configurations": {
+ "android": "1:243753787895:android:17b0c823d8c936c6b98ef2",
+ "ios": "1:243753787895:ios:24f02e213657204db98ef2",
+ "web": "1:243753787895:web:2da67a12aa776b17b98ef2"
+ }
+ },
+ "lib/firebase_options_test.dart": {
+ "projectId": "comwell-phoenix-test",
+ "configurations": {
+ "android": "1:454092419952:android:060b8e4744be03cca995b5"
+ }
+ },
+ "lib/firebase_options_prod.dart": {
+ "projectId": "comwell-phoenix",
+ "configurations": {
+ "android": "1:1031550326508:android:04a896341af4f448cdf7c9",
+ "ios": "1:1031550326508:ios:05ac9b069efbbac9cdf7c9",
+ "web": "1:1031550326508:web:ac21b20cf60305e9cdf7c9"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/comwell_key_app/ios/Podfile b/comwell_key_app/ios/Podfile
index d145415d..e1b5da1b 100644
--- a/comwell_key_app/ios/Podfile
+++ b/comwell_key_app/ios/Podfile
@@ -46,6 +46,16 @@ post_install do |installer|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
end
+ # Enable permission_handler_apple permission checks on iOS
+ if target.name == 'permission_handler_apple'
+ target.build_configurations.each do |config|
+ config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
+ config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'PERMISSION_NOTIFICATIONS=1'
+ config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'PERMISSION_BLUETOOTH=1'
+ config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'PERMISSION_LOCATION=1'
+ end
+ end
+
# Workaround to get SQLCipher to work on release config
# https://github.com/simolus3/drift/issues/1810#issuecomment-1119426006
target.build_configurations.each do |config|
diff --git a/comwell_key_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/comwell_key_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index 16b76ec3..70a68387 100644
--- a/comwell_key_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/comwell_key_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -80,6 +80,12 @@
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
+ <CommandLineArguments>
+ <CommandLineArgument
+ argument = "-FIRAnalyticsDebugEnabled"
+ isEnabled = "YES">
+ </CommandLineArgument>
+ </CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
diff --git a/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart b/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
index 45dab4e0..655ade6d 100644
--- a/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
+++ b/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
@@ -2,10 +2,12 @@ import 'package:comwell_key_app/base/base_cubit.dart';
import 'package:comwell_key_app/check_in/bloc/check_in_state.dart';
import 'package:comwell_key_app/check_in/check_in_repository.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
+import 'package:comwell_key_app/tracking/comwell_tracking.dart';
+import 'package:firebase_analytics/firebase_analytics.dart';
class CheckInCubit extends BaseCubit<CheckInState> {
final _checkInRepository = CheckInRepository();
-
+ final ComwellTracking _tracking = ComwellTracking();
late final Booking booking;
CheckInCubit(this.booking) : super(const CheckInState()) {
@@ -44,6 +46,8 @@ class CheckInCubit extends BaseCubit<CheckInState> {
booking.hotelCode,
);
safeEmit(state.copyWith(cardState: CheckInStatus.roomFound));
+ _tracking.trackCheckedIn();
+
await _checkInRepository.checkIfSetup();
await _checkInRepository.provisionKey(booking.id, booking.hotelCode);
await Future<void>.delayed(const Duration(milliseconds: 3000));
diff --git a/comwell_key_app/lib/common/components/comwell_app_bar.dart b/comwell_key_app/lib/common/components/comwell_app_bar.dart
index 88134dd3..7077b8ab 100644
--- a/comwell_key_app/lib/common/components/comwell_app_bar.dart
+++ b/comwell_key_app/lib/common/components/comwell_app_bar.dart
@@ -1,5 +1,6 @@
import 'package:comwell_key_app/common/components/round_icon_button.dart';
import 'package:comwell_key_app/common/const.dart';
+import 'package:comwell_key_app/presentation/screens/profile/profile_route.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/navigation_utils.dart';
@@ -71,7 +72,7 @@ class ComwellAppBar extends StatelessWidget implements PreferredSizeWidget {
color: Colors.white,
icon: "assets/icons/user-open.svg",
onPressed: () {
- context.push(AppRoutes.profile);
+ ProfileRoute().push(context);
},
),
),
diff --git a/comwell_key_app/lib/comwell_app.dart b/comwell_key_app/lib/comwell_app.dart
index 49da3601..9a634e29 100644
--- a/comwell_key_app/lib/comwell_app.dart
+++ b/comwell_key_app/lib/comwell_app.dart
@@ -12,6 +12,7 @@ import 'package:comwell_key_app/themes/app_button_styles.dart';
import 'package:comwell_key_app/themes/app_textstyles.dart';
import 'package:comwell_key_app/themes/dark_theme.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:comwell_key_app/tracking/comwell_tracking.dart';
import 'package:comwell_key_app/utils/context_utils.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:comwell_key_app/utils/seos_repository.dart';
@@ -37,6 +38,7 @@ class ComwellApp extends StatelessWidget {
return AppButtonStyles(theme.colorScheme, context.read());
},
),
+ RepositoryProvider(create: (context) => ComwellTracking()),
],
child: MultiBlocProvider(
providers: [
diff --git a/comwell_key_app/lib/domain/repositories/bluetooth_repository.dart b/comwell_key_app/lib/domain/repositories/bluetooth_repository.dart
index f59ff27e..ad5de724 100644
--- a/comwell_key_app/lib/domain/repositories/bluetooth_repository.dart
+++ b/comwell_key_app/lib/domain/repositories/bluetooth_repository.dart
@@ -1,3 +1,5 @@
+import 'dart:io';
+
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:permission_handler/permission_handler.dart';
@@ -14,7 +16,10 @@ class BluetoothRepository {
// app does not require bluetooth permission (yet).
// Consider remove when app is released and still not needed
Future<bool> isPermissionGranted() async {
- final status = await Permission.bluetoothAdvertise.status;
+ // On iOS, only Permission.bluetooth is supported by permission_handler_apple.
+ // bluetoothAdvertise/Scan/Connect are Android-only and always return denied on iOS.
+ final permission = Platform.isIOS ? Permission.bluetooth : Permission.bluetoothAdvertise;
+ final status = await permission.status;
return status == PermissionStatus.granted;
}
diff --git a/comwell_key_app/lib/overview/overview_page.dart b/comwell_key_app/lib/overview/overview_page.dart
index ee8addfb..6302bc9b 100644
--- a/comwell_key_app/lib/overview/overview_page.dart
+++ b/comwell_key_app/lib/overview/overview_page.dart
@@ -10,6 +10,7 @@ import 'package:comwell_key_app/overview/models/bookings.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/context_utils.dart';
+import 'package:comwell_key_app/utils/cubit_utils.dart';
import 'package:comwell_key_app/utils/l10n_utils.dart';
import 'package:comwell_key_app/utils/urls.dart';
import 'package:flutter/material.dart';
@@ -82,6 +83,7 @@ class OverviewTabViewState extends State<OverviewPage>
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
+ final tracker = context.tracker;
return MultiBlocListener(
listeners: [
BlocListener<OverviewCubit, OverviewState>(
@@ -202,6 +204,7 @@ class OverviewTabViewState extends State<OverviewPage>
),
child: ElevatedButton(
onPressed: () async {
+ tracker.trackBookNewReservation();
bool success = await launchUrl(Uri.parse(ComwellUrls.comwellWebsite));
if (!success) {
if (context.mounted) {
diff --git a/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart b/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
index d103095f..ee40d026 100644
--- a/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
+++ b/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
@@ -86,10 +86,6 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void init() async {
- _tracking.trackScreenView(
- "Pre-registration - Betalingskort",
- "/pre-registration/betalingskort",
- );
setupListeners();
emit(state.copyWith(isLoading: true));
try {
diff --git a/comwell_key_app/lib/presentation/screens/booking_details/bloc/booking_details_cubit.dart b/comwell_key_app/lib/presentation/screens/booking_details/bloc/booking_details_cubit.dart
index cbabc1b2..8621b161 100644
--- a/comwell_key_app/lib/presentation/screens/booking_details/bloc/booking_details_cubit.dart
+++ b/comwell_key_app/lib/presentation/screens/booking_details/bloc/booking_details_cubit.dart
@@ -80,30 +80,18 @@ class BookingDetailsCubit extends BaseCubit<BookingDetailsState> {
}
}
- Future<Booking> getBookingDetails(
+ Future<void> getBookingDetails(
String hmsConfirmationNumber, {
bool fetchRemote = false,
required String hotelCode,
}) async {
safeEmit(state.copyWith(isLoading: true));
try {
- if (fetchRemote) {
- final bookingDetails = await _bookingDetailsRepository.getRemoteBookingDetails(
- hmsConfirmationNumber,
- hotelCode,
- );
- booking = bookingDetails;
- return booking;
- } else {
- user = await _profileRepository.fetchProfileSettings();
- final bookingDetails = await _bookingDetailsRepository.getBookingDetails(
- hmsConfirmationNumber,
- hotelCode,
- );
- booking = bookingDetails;
-
- return booking;
- }
+ final bookingDetails = await _bookingDetailsRepository.getRemoteBookingDetails(
+ hmsConfirmationNumber,
+ hotelCode,
+ );
+ booking = bookingDetails;
} catch (e) {
if (kDebugMode) print("err=$e");
safeEmit(state.copyWith(error: AppError.unknown(e.toString())));
diff --git a/comwell_key_app/lib/presentation/screens/booking_details/booking_details_page.dart b/comwell_key_app/lib/presentation/screens/booking_details/booking_details_page.dart
index a8e0aa71..bdaac13b 100644
--- a/comwell_key_app/lib/presentation/screens/booking_details/booking_details_page.dart
+++ b/comwell_key_app/lib/presentation/screens/booking_details/booking_details_page.dart
@@ -58,7 +58,6 @@ class BookingDetailsPage extends StatelessWidget {
) {
final theme = Theme.of(context);
final screenHeight = MediaQuery.of(context).size.height;
-
return Stack(
children: [
// Background image - fixed
@@ -83,17 +82,6 @@ class BookingDetailsPage extends StatelessWidget {
),
),
),
- // Share button - fixed at top
- if (cubit.booking.reservationStatus == ReservationStatus.preregistered ||
- cubit.booking.reservationStatus == ReservationStatus.preregistered ||
- cubit.booking.reservationStatus == ReservationStatus.checkedin)
- SafeArea(
- child:
- cubit.booking.isPrimaryGuest &&
- cubit.booking.reservationStatus == ReservationStatus.checkedin
- ? ShareButton(guests: state.guests)
- : const SizedBox(),
- ),
// Scrollable content with haptic feedback
_ScrollableBookingContent(
screenHeight: screenHeight,
@@ -103,6 +91,16 @@ class BookingDetailsPage extends StatelessWidget {
buildBookingDetailsInformation: () =>
_buildBookingDetailsInformation(context, state, cubit, theme),
),
+ // Share button - fixed at top, must be after scrollable content to stay tappable
+ if (cubit.booking.reservationStatus == ReservationStatus.preregistered ||
+ cubit.booking.reservationStatus == ReservationStatus.checkedin)
+ SafeArea(
+ child:
+ cubit.booking.isPrimaryGuest &&
+ cubit.booking.reservationStatus == ReservationStatus.checkedin
+ ? ShareButton(guests: state.guests)
+ : const SizedBox(),
+ ),
],
);
}
diff --git a/comwell_key_app/lib/presentation/screens/onboarding/bluetooth/bluetooth_permission_screen.dart b/comwell_key_app/lib/presentation/screens/onboarding/bluetooth/bluetooth_permission_screen.dart
index 8017098e..11aa2667 100644
--- a/comwell_key_app/lib/presentation/screens/onboarding/bluetooth/bluetooth_permission_screen.dart
+++ b/comwell_key_app/lib/presentation/screens/onboarding/bluetooth/bluetooth_permission_screen.dart
@@ -58,7 +58,6 @@ class BluetoothPermissionScreen extends StatelessWidget {
primaryButtonText: context.strings.allow_bluetooth,
primaryButtonOnClick: () async {
await cubit.onRequestPermissionClicked();
- print("qqq cubit.isOnboarding=${cubit.isOnboarding}");
if (context.mounted) {
if (cubit.isOnboarding) {
context.go(AppRoutes.overview);
diff --git a/comwell_key_app/lib/presentation/screens/permission_overview/bloc/permission_overview_cubit.dart b/comwell_key_app/lib/presentation/screens/permission_overview/bloc/permission_overview_cubit.dart
index 9fdeee90..8db5f360 100644
--- a/comwell_key_app/lib/presentation/screens/permission_overview/bloc/permission_overview_cubit.dart
+++ b/comwell_key_app/lib/presentation/screens/permission_overview/bloc/permission_overview_cubit.dart
@@ -50,7 +50,14 @@ class PermissionOverviewCubit extends BaseCubit<PermissionOverviewState> {
}
Future<void> _checkAllowUsageTracking() async {
- safeEmit(state.copyWith(allowUsageTracking: _comwellPreferences.allowUsageTracking));
+ if (Platform.isIOS) {
+ final status = await AppTrackingTransparency.trackingAuthorizationStatus;
+ final isAuthorized = status == TrackingStatus.authorized;
+ await _comwellPreferences.setAllowUsageTracking(isAuthorized);
+ safeEmit(state.copyWith(allowUsageTracking: isAuthorized));
+ } else {
+ safeEmit(state.copyWith(allowUsageTracking: _comwellPreferences.allowUsageTracking));
+ }
}
Future<void> onTogglePushNotifications() async {
@@ -64,8 +71,11 @@ class PermissionOverviewCubit extends BaseCubit<PermissionOverviewState> {
_checkAllowUsageTracking();
} else {
final initialStatus = await AppTrackingTransparency.trackingAuthorizationStatus;
- if (initialStatus != TrackingStatus.authorized) {
- await AppTrackingTransparency.requestTrackingAuthorization();
+ if (initialStatus == TrackingStatus.notDetermined) {
+ final result = await AppTrackingTransparency.requestTrackingAuthorization();
+ await _comwellPreferences.setAllowUsageTracking(result == TrackingStatus.authorized);
+ } else {
+ await AppSettings.openAppSettings(type: AppSettingsType.settings);
}
await _checkAllowUsageTracking();
}
diff --git a/comwell_key_app/lib/presentation/screens/permission_overview/permission_overview_screen.dart b/comwell_key_app/lib/presentation/screens/permission_overview/permission_overview_screen.dart
index b5233040..113f2bbf 100644
--- a/comwell_key_app/lib/presentation/screens/permission_overview/permission_overview_screen.dart
+++ b/comwell_key_app/lib/presentation/screens/permission_overview/permission_overview_screen.dart
@@ -7,9 +7,32 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:comwell_key_app/presentation/screens/permission_overview/bloc/permission_overview_cubit.dart';
import 'package:comwell_key_app/presentation/screens/permission_overview/bloc/permission_overview_state.dart';
-class PermissionOverviewScreen extends StatelessWidget {
+class PermissionOverviewScreen extends StatefulWidget {
const PermissionOverviewScreen({super.key});
+ @override
+ State<PermissionOverviewScreen> createState() => _PermissionOverviewScreenState();
+}
+
+class _PermissionOverviewScreenState extends State<PermissionOverviewScreen> {
+ late final AppLifecycleListener _lifecycleListener;
+
+ @override
+ void initState() {
+ super.initState();
+ _lifecycleListener = AppLifecycleListener(
+ onResume: () {
+ context.read<PermissionOverviewCubit>().init();
+ },
+ );
+ }
+
+ @override
+ void dispose() {
+ _lifecycleListener.dispose();
+ super.dispose();
+ }
+
@override
Widget build(BuildContext context) {
return BlocBuilder<PermissionOverviewCubit, PermissionOverviewState>(
diff --git a/comwell_key_app/lib/routing/go_router_observer.dart b/comwell_key_app/lib/routing/go_router_observer.dart
index b647ffc8..e6d15fcd 100644
--- a/comwell_key_app/lib/routing/go_router_observer.dart
+++ b/comwell_key_app/lib/routing/go_router_observer.dart
@@ -1,5 +1,6 @@
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/tracking/comwell_tracking.dart';
+import 'package:comwell_key_app/utils/cubit_utils.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -43,24 +44,23 @@ final Map<String, SystemUiOverlayStyle> routeSystemUiStyles = {
class GoRouterObserver extends NavigatorObserver {
@override
- void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
- debugPrint('DidPush: $route');
- _setSystemUiForRoute(route);
- final routeName = route.settings.name ?? 'Unknown';
- locator<ComwellTracking>()
- .trackScreenView('$routeName - page', getPath(routeName));
+ void didPush(Route route, Route? previousRoute) {
+ final context = route.navigator?.context;
+ final tracker = context?.tracker;
+ if (tracker != null && context != null) {
+ tracker.trackScreenView(context);
+ }
+ super.didPush(route, previousRoute);
}
@override
- void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
- if (previousRoute != null) {
- _setSystemUiForRoute(previousRoute);
+ void didPop(Route route, Route? previousRoute) {
+ final context = route.navigator?.context;
+ final tracker = context?.tracker;
+ if (tracker != null && context != null) {
+ tracker.trackScreenView(context);
}
- final parentRouteName = previousRoute?.settings.name ?? 'Unknown';
- final trackInfo = '$parentRouteName - page';
- final trackPath = getPath(parentRouteName);
- debugPrint('DidPop: $route, tracking: $trackInfo, path: $trackPath');
- locator<ComwellTracking>().trackScreenView(trackInfo, trackPath);
+ super.didPop(route, previousRoute);
}
@override
@@ -78,8 +78,7 @@ class GoRouterObserver extends NavigatorObserver {
if (!Platform.isAndroid) return;
final routeName = route.settings.name ?? '';
- final style =
- routeSystemUiStyles[routeName] ?? kDefaultSystemUiOverlayStyle;
+ final style = routeSystemUiStyles[routeName] ?? kDefaultSystemUiOverlayStyle;
SystemChrome.setSystemUIOverlayStyle(style);
// Enable edge-to-edge mode for specific routes
@@ -87,49 +86,55 @@ class GoRouterObserver extends NavigatorObserver {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
} else {
// Reset to normal mode for other routes
- SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
- overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom]);
+ SystemChrome.setEnabledSystemUIMode(
+ SystemUiMode.manual,
+ overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom],
+ );
}
}
}
String getPath(String routeName) {
switch (routeName) {
- case 'overview':
+ case '/overview':
return '/overview';
- case 'login':
+ case '/login':
return '/login';
- case 'profile':
- return '/overview/../profile';
- case 'housekeeping':
- return '/overview/bookingsdetails/housekeeping';
- case 'key':
- return '/overview/bookingsdetails/key';
- case 'hotelInformation':
- return '/overview/bookingsdetails/hotelInformation';
- case 'restaurant':
+ case '/booking-details':
+ return '/booking-details';
+ case '/profile':
+ return 'Profile';
+ case '/housekeeping':
+ return 'Bestill housekeeping';
+ case '/key':
+ return 'Keycard - read';
+ case '/hotelInformation':
+ return 'Hotel information';
+ case '/restaurant':
return '/hotelInformation/restaurant';
- case 'spa':
+ case '/my-booking':
+ return 'My booking';
+ case '/spa':
return '/overview/bookingsdetails/hotelInformation/spa';
- case 'parking':
+ case '/parking':
return '/overview/bookingsdetails/hotelInformation/parking';
- case 'paymentCards':
+ case '/paymentCards':
return '/overview/bookingsdetails/paymentCards';
- case 'checkOut':
- return '/overview/bookingsdetails/checkOut';
- case 'checkIn':
- return '/overview/bookingsdetails/checkIn';
- case 'contact':
+ case '/checkOut':
+ return 'Check out';
+ case '/checkIn':
+ return 'Check-in';
+ case '/contact':
return '/overview/bookingsdetails/contact';
- case 'preregistration':
- return '/overview/bookingsdetails/preregistration';
- case 'findBooking':
+ case '/preregistration':
+ return 'Preregistration';
+ case '/findBooking':
return '/overview/findBooking';
- case 'pastCancelledBookings':
+ case '/pastCancelledBookings':
return '/overview/pastCancelledBookings';
- case 'profileSettings':
- return '/overview/profile/profileSettings';
- case 'forceUpdate':
+ case '/profileSettings':
+ return 'Profile - Profilindstillinger';
+ case '/forceUpdate':
return '/forceUpdate';
// Add more cases as needed
diff --git a/comwell_key_app/lib/services/mappers/booking_mapper.dart b/comwell_key_app/lib/services/mappers/booking_mapper.dart
index 146cd756..2954569b 100644
--- a/comwell_key_app/lib/services/mappers/booking_mapper.dart
+++ b/comwell_key_app/lib/services/mappers/booking_mapper.dart
@@ -38,8 +38,8 @@ extension BookingDTOMapper on BookingDTO {
hotelCode: hotelCode,
bookingDate: startDate,
digitalCard: true,
- isPrimaryGuest: false,
- maskedCardNumber: null,
+ isPrimaryGuest: isPrimaryGuest,
+ maskedCardNumber: maskedCardNumber,
guests: mappedGuests,
);
}
@@ -77,7 +77,7 @@ extension BookingMapper on Booking {
adults: adults,
children: children,
balance: balance ?? 0,
- isPrimaryGuest: false,
+ isPrimaryGuest: isPrimaryGuest,
addOnItems: addOnItems ?? [],
);
}
diff --git a/comwell_key_app/lib/tracking/comwell_tracking.dart b/comwell_key_app/lib/tracking/comwell_tracking.dart
index 73aa0d31..7b8d15c4 100644
--- a/comwell_key_app/lib/tracking/comwell_tracking.dart
+++ b/comwell_key_app/lib/tracking/comwell_tracking.dart
@@ -1,11 +1,15 @@
import 'package:comwell_key_app/tracking/models/analytics_event_item.dart';
import 'package:comwell_key_app/tracking/trackers/firebase_tracker.dart';
+import 'package:comwell_key_app/utils/route_utils.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:go_router/go_router.dart';
class ComwellTracking {
final _firebaseTracking = FirebaseTracker();
- void trackScreenView(String name, String path) {
- _firebaseTracking.trackScreen(name: name, path: path);
+ void trackScreenView(BuildContext context) {
+ final currentRoute = context.currentLocation;
+ _firebaseTracking.trackScreen(name: currentRoute, path: currentRoute);
}
void trackBeginCheckout(AnalyticsEventItem analyticsEventItem) {
@@ -25,4 +29,13 @@ class ComwellTracking {
void trackEvent(String name) {
_firebaseTracking.trackEvent(name);
}
+
+ void trackCheckedIn() {
+ _firebaseTracking.trackCheckedIn();
+ }
+
+ void trackBookNewReservation() {
+ print("qqq trackBookNewReservation");
+ _firebaseTracking.trackBookNewReservation();
+ }
}
diff --git a/comwell_key_app/lib/tracking/trackers/firebase_tracker.dart b/comwell_key_app/lib/tracking/trackers/firebase_tracker.dart
index ff4524c4..4e14f7e0 100644
--- a/comwell_key_app/lib/tracking/trackers/firebase_tracker.dart
+++ b/comwell_key_app/lib/tracking/trackers/firebase_tracker.dart
@@ -27,6 +27,14 @@ class FirebaseTracker {
_track(name, null);
}
+ void trackBookNewReservation() {
+ _tracking.logEvent(name: 'click', parameters: {'click_text': 'Book nyt ophold'});
+ }
+
+ void trackCheckedIn() {
+ _tracking.setUserProperty(name: 'checked_in', value: 'true');
+ }
+
void _track(String name, Map<String, dynamic>? parameters) async {
try {
final safeParams = parameters?.map((k, v) {
@@ -45,6 +53,7 @@ class FirebaseTracker {
}
}
void _trackScreen(String name, String screenClass) async {
+ print("qqq _trackScreen $name $screenClass");
try {
await _tracking.logScreenView(
screenName: name,
diff --git a/comwell_key_app/lib/utils/route_utils.dart b/comwell_key_app/lib/utils/route_utils.dart
new file mode 100644
index 00000000..5cfe71b8
--- /dev/null
+++ b/comwell_key_app/lib/utils/route_utils.dart
@@ -0,0 +1,26 @@
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+extension RouteUtils on BuildContext {
+ String get currentLocation {
+ final router = Router.of(this);
+ final routeMatchList =
+ router.routerDelegate.currentConfiguration as RouteMatchList;
+ if (routeMatchList.matches.isEmpty) {
+ return 'empty';
+ }
+ return routeMatchList.last.matchedLocation;
+ }
+
+ String get goRouterCurrentLocation {
+ try {
+ return GoRouter.of(this)
+ .routerDelegate
+ .currentConfiguration
+ .last
+ .matchedLocation;
+ } catch (e, st) {
+ return "Missing router";
+ }
+ }
+}
\ No newline at end of file