Skip to content

Commit

Permalink
chore: document access to INT data
Browse files Browse the repository at this point in the history
  • Loading branch information
smallTrogdor committed Nov 27, 2024
1 parent 0915774 commit ae6f7a2
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 3 deletions.
24 changes: 21 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ The **SBB Karten** demo application is available both in the SBB Enterprise Play
| Feature | iOS | Android |
|-----------------------------------------| ------------------ | ------------------ |
| Gesture | :white_check_mark: | :white_check_mark: |
| Accessing INT Tiles & POIs | :white_check_mark: | :white_check_mark: |
| Camera | :white_check_mark: | :white_check_mark: |
| Map Styles (including ROKAS Styles) | :white_check_mark: | :white_check_mark: |
| Location (including device tracking) | :white_check_mark: | :white_check_mark: |
Expand Down Expand Up @@ -188,6 +189,24 @@ const SBBMapProperties({
});
```

#### Accessing INT Tiles & POIs

In order to access the INT data from [Journey Maps Tiles INT API], you need to register your application there and receive
a corresponding API Key. API Keys from the PROD API will not work. After that, either set the environment variable
`SBB_MAPS_INT_ENABLED` to `true`:

```bash
SBB_MAPS_INT_ENABLED=true
```

or pass the `useIntegrationData` constructor parameter to a `SBBRokasMapStyler`:

```dart
SBBRokasMapStyler.full(apiKey: Env.MY_INT_API_KEY_NAME, useIntegrationData=true);
```

Using INT data will log to console as an info.

### Gallery and Examples

#### Standard Map
Expand Down Expand Up @@ -272,7 +291,6 @@ See [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).


[Journey Maps API]: (https://developer.sbb.ch/apis/journey-maps/information)

[Flutter Maplibre GL plugin]: (https://github.com/maplibre/flutter-maplibre-gl/tree/main)

[Journey Maps Tiles API]: (https://developer.sbb.ch/apis/journey-maps-tiles/information)
[Journey Maps Tiles API]: (https://developer.sbb.ch/apis/journey-maps-tiles/information)
[Journey Maps Tiles INT API]: (https://developer-int.sbb.ch/apis/journey-maps-tiles/information)
2 changes: 2 additions & 0 deletions example/lib/env.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ part 'env.g.dart';
abstract class Env {
@EnviedField(varName: 'JOURNEY_MAPS_TILES_API_KEY', obfuscate: true)
static String journeyMapsTilesApiKey = _Env.journeyMapsTilesApiKey;
@EnviedField(varName: 'JOURNEY_MAPS_TILES_INT_API_KEY', obfuscate: true)
static String journeyMapsTilesIntApiKey = _Env.journeyMapsTilesIntApiKey;
}
2 changes: 2 additions & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:design_system_flutter/design_system_flutter.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sbb_maps_example/routes/integration_data_route.dart';
import 'routes/camera_route.dart';
import 'routes/custom_ui_route.dart';
import 'routes/display_annotations_route.dart';
Expand Down Expand Up @@ -56,6 +57,7 @@ class _MainAppState extends State<MainApp> {
'/poi': (context) => const POIRoute(),
'/routing': (context) => const RoutingRoute(),
'/map_properties': (context) => const MapPropertiesRoute(),
'/integration_data': (context) => const IntegrationDataRoute(),
'/display_annotations': (context) => const DisplayAnnotationsRoute(),
'/track_device_location': (context) => const TrackDeviceLocationRoute(),
},
Expand Down
4 changes: 4 additions & 0 deletions example/lib/routes/features_route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ class _FeaturesRouteState extends State<FeaturesRoute> {
title: 'Map Properties',
routeName: '/map_properties',
),
_FeatureRoute(
title: 'Integration Data',
routeName: '/integration_data',
),
_FeatureRoute(
title: 'Custom UI',
routeName: '/custom_ui',
Expand Down
107 changes: 107 additions & 0 deletions example/lib/routes/integration_data_route.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import 'package:design_system_flutter/design_system_flutter.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sbb_maps_example/env.dart';
import 'package:sbb_maps_example/theme_provider.dart';
import 'package:sbb_maps_flutter/sbb_maps_flutter.dart';

class IntegrationDataRoute extends StatefulWidget {
const IntegrationDataRoute({super.key});

@override
State<IntegrationDataRoute> createState() => _IntegrationDataRouteState();
}

class _IntegrationDataRouteState extends State<IntegrationDataRoute> {
bool useIntegration = false;

@override
Widget build(BuildContext context) {
final mapStyler = SBBRokasMapStyler.full(
apiKey: useIntegration ? Env.journeyMapsTilesIntApiKey : Env.journeyMapsTilesApiKey,
isDarkMode: Provider.of<ThemeProvider>(context).isDark,
useIntegrationData: useIntegration,
);

return Scaffold(
appBar: const SBBHeader(title: 'Integration Data'),
body: SBBMap(
mapStyler: mapStyler,
isMyLocationEnabled: false,
isFloorSwitchingEnabled: true,
builder: (context) => Align(
alignment: Alignment.topRight,
child: Padding(
padding: const EdgeInsets.all(sbbDefaultSpacing),
child: SBBMapIconButton(
onPressed: () {
showSBBModalSheet<bool>(
context: context,
title: 'Integration Data',
child: _IntegrationDataModalBody(useIntegration: useIntegration),
).then(_setStateWithProperties);
},
icon: SBBIcons.gears_small,
),
),
),
),
);
}

void _setStateWithProperties(bool? useIntegration) {
setState(
() {
if (useIntegration != null) {
this.useIntegration = useIntegration;
}
},
);
}
}

class _IntegrationDataModalBody extends StatefulWidget {
const _IntegrationDataModalBody({required this.useIntegration});

final bool useIntegration;

@override
State<_IntegrationDataModalBody> createState() => _IntegrationDataModalBodyState();
}

class _IntegrationDataModalBodyState extends State<_IntegrationDataModalBody> {
late bool _useIntegration;

@override
void initState() {
_useIntegration = widget.useIntegration;
super.initState();
}

@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(
vertical: sbbDefaultSpacing,
horizontal: sbbDefaultSpacing,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SBBCheckboxListItem(
value: _useIntegration,
label: 'Use INT Data',
secondaryLabel: 'Accesses developer-int.sbb.ch data.',
onChanged: (v) => setState(() {
_useIntegration = v ?? false;
}),
isLastElement: true,
),
const SizedBox(height: sbbDefaultSpacing),
SBBPrimaryButton(label: 'Apply Changes', onPressed: () => Navigator.pop(context, _useIntegration)),
const SizedBox(height: sbbDefaultSpacing),
],
),
);
}
}

0 comments on commit ae6f7a2

Please sign in to comment.