Merge pull request 'dynamic location tracking and according logic' (#3) from feature/app-navigation-mockup into main
Some checks failed
Test code / Test code (push) Failing after 43s

Reviewed-on: remoll/fast-network-navigation#3
This commit is contained in:
Remy Moll 2024-05-16 15:01:28 +00:00
commit c2e43622ff
10 changed files with 316 additions and 61 deletions

View File

@ -1,25 +0,0 @@
kind: pipeline
type: kubernetes
name: build-apk
clone:
depth: 1
steps:
- name: build
image: cirrusci/flutter:stable
pull: true
commands:
- flutter packages get
- flutter build apk --release --split-per-abi
- mkdir apks
- mv build/app/outputs/apk/*/*/*.apk apks
- name: Publish APK
image: plugins/gitea-release
settings:
api_key:
from_secret: GITEA_TOKEN
trigger:
event:
- push

View File

@ -1,5 +1,10 @@
on: push on:
name: Test, Build and Release apk pull_request:
branches:
- main
name: Build and release APK
jobs: jobs:
build: build:
name: Build APK name: Build APK
@ -10,6 +15,7 @@ jobs:
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y xz-utils unzip sudo apt-get install -y xz-utils unzip
- uses: https://gitea.com/actions/checkout@v4 - uses: https://gitea.com/actions/checkout@v4
- uses: https://github.com/actions/setup-java@v4 - uses: https://github.com/actions/setup-java@v4
@ -22,19 +28,22 @@ jobs:
channel: stable channel: stable
flutter-version: 3.19.6 flutter-version: 3.19.6
cache: true cache: true
- name: Setup Android SDK - name: Setup Android SDK
uses: https://github.com/android-actions/setup-android@v3 uses: https://github.com/android-actions/setup-android@v3
- run: flutter pub get - run: flutter pub get
# - run: flutter test
- run: flutter build apk --debug --split-per-abi - run: flutter build apk --debug --split-per-abi
- name: Release APK - name: Release APK
uses: https://gitea.com/akkuman/gitea-release-action@v1 uses: https://gitea.com/akkuman/gitea-release-action@v1
with: with:
files: build/app/outputs/flutter-apk/*.apk files: build/app/outputs/flutter-apk/*.apk
name: Testing release
release_name: testing
tag: testing tag: testing
release_name: Testing release tag_name: testing
release_body: "This is a testing release." release_body: "This is a testing release."
prerelease: true prerelease: true
token: ${{ secrets.GITEA_TOKEN }} token: ${{ secrets.GITEA_TOKEN }}

View File

@ -1,21 +1,30 @@
on: push on:
name: Test, Build and Release web pull_request:
branches:
- main
name: Build web
jobs: jobs:
build: build:
name: Build Web name: Build Web
runs-on: k8s runs-on: k8s
steps: steps:
- name: Install prerequisites - name: Install prerequisites
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y xz-utils sudo apt-get install -y xz-utils
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: https://github.com/subosito/flutter-action@v2 - uses: https://github.com/subosito/flutter-action@v2
with: with:
channel: stable channel: stable
flutter-version: 3.19.6 flutter-version: 3.19.6
cache: true cache: true
- run: flutter pub get
# - run: flutter test - run: flutter pub get
- run: flutter build web

View File

@ -0,0 +1,31 @@
on:
push:
pull_request:
branches:
- main
name: Test code
jobs:
test:
name: Test code
runs-on: k8s
steps:
- name: Install prerequisites
run: |
sudo apt-get update
sudo apt-get install -y xz-utils
- uses: actions/checkout@v4
- uses: https://github.com/subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.19.6
cache: true
- run: flutter pub get
- run: flutter test

View File

@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class DestinationCard extends StatefulWidget {
final String title;
final String description;
final String image;
bool visited;
@override
_DestinationCardState createState() => _DestinationCardState();
DestinationCard(this.title, this.description, this.image, this.visited);
Widget build() {
return Card(
child: ListTile(
leading: Icon(Icons.location_on),
title: Text(title),
subtitle: Text(description),
onTap: () {
// Navigator.pushNamed(context, '/destination');
},
),
);
}
}
class _DestinationCardState extends State<DestinationCard> {
@override
Widget build(BuildContext context) {
return Card();
}
}

View File

@ -1,13 +1,62 @@
import 'package:fast_network_navigation/modules/destination_card.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
Widget singleDestination(BuildContext context, String title, String description, String image) {
List<Widget> loadDestinations() {
List<Widget> cities = [
singleDestination(
"New York",
"The Big Apple",
"https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/View_of_New_York_City.jpg/800px-View_of_New_York_City.jpg"
),
singleDestination(
"Los Angeles",
"City of Angels",
"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Los_Angeles_City_Hall_2013.jpg/800px-Los_Angeles_City_Hall_2013.jpg"
),
singleDestination(
"Chicago",
"The Windy City",
"https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Chicago_skyline%2C_viewed_from_John_Hancock_Center.jpg/800px-Chicago_skyline%2C_viewed_from_John_Hancock_Center.jpg"
),
singleDestination(
"San Francisco",
"The Golden City",
"https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/San_Francisco_City_Hall_2013.jpg/800px-San_Francisco_City_Hall_2013.jpg"
),
singleDestination(
"Miami",
"The Magic City",
"https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Miami_collage.jpg/800px-Miami_collage.jpg"
),
singleDestination(
"Las Vegas",
"Sin City",
"https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Las_Vegas_Strip.jpg/800px-Las_Vegas_Strip.jpg"
),
singleDestination(
"Seattle",
"Emerald City",
"https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Seattle_Kerry_Park_Skyline.jpg/800px-Seattle_Kerry_Park_Skyline.jpg"
),
singleDestination(
"Boston",
"Beantown",
"https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Boston_skyline_from_Longfellow_Bridge_September_2017_panorama_2.jpg/800px-Boston"
)
];
cities.shuffle();
return cities;
}
Widget singleDestination(String title, String description, String image) {
return Card( return Card(
child: ListTile( child: ListTile(
leading: Icon(Icons.location_on), leading: Icon(Icons.location_on),
title: Text(title), title: Text(title),
subtitle: Text(description), subtitle: Text(description),
onTap: () { onTap: () {
Navigator.pushNamed(context, '/destination'); // Navigator.pushNamed(context, '/destination');
}, },
), ),
); );

View File

@ -1,14 +1,74 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map/flutter_map.dart';
import 'package:sliding_up_panel/sliding_up_panel.dart'; import 'package:sliding_up_panel/sliding_up_panel.dart';
import 'package:latlong2/latlong.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geocode/geocode.dart';
import 'dart:async';
import 'package:fast_network_navigation/modules/navigation.dart'; import 'package:fast_network_navigation/modules/navigation.dart';
class MapPage extends StatefulWidget { class MapPage extends StatefulWidget {
@override @override
_MapPageState createState() => _MapPageState(); _MapPageState createState() => _MapPageState();
} }
class Debounce {
Duration delay;
Timer? _timer;
Debounce(
this.delay,
);
call(void Function() callback) {
_timer?.cancel();
_timer = Timer(delay, callback);
}
dispose() {
_timer?.cancel();
}
}
class _MapPageState extends State<MapPage> { class _MapPageState extends State<MapPage> {
GeoCode geoCode = GeoCode();
final mapController = MapController();
String _currentCityName = "...";
final Debounce _debounce = Debounce(Duration(seconds: 3));
void _setCurrentCityName() async {
if (mapController.camera.zoom < 9) {
return; // Don't bother if the view is too wide
}
var currentCoordinates = mapController.camera.center;
String? city;
try{
List<Placemark> placemarks = await placemarkFromCoordinates(currentCoordinates.latitude, currentCoordinates.longitude);
city = placemarks[0].locality.toString();
} catch (e) {
debugPrint("Error: $e");
try {
Address address = await geoCode.reverseGeocoding(latitude: currentCoordinates.latitude, longitude: currentCoordinates.longitude);
if (address.city == null || address.city.toString().contains("Throttled!")){
throw Exception("Probably rate limited");
}
city = address.city.toString();
} catch (e) {
debugPrint("Error: $e");
}
}
if (city != null) {
setState(() {
_currentCityName = city!;
});
} else {
_debounce(() async {_setCurrentCityName();});
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -18,8 +78,15 @@ class _MapPageState extends State<MapPage> {
panel: _floatingPanel(theme), panel: _floatingPanel(theme),
collapsed: _floatingCollapsed(theme), collapsed: _floatingCollapsed(theme),
body: FlutterMap( body: FlutterMap(
mapController: mapController,
options: MapOptions( options: MapOptions(
initialZoom: 11, initialZoom: 11,
initialCenter: LatLng(51.509364, -0.128928),
onMapReady: () {
mapController.mapEventStream.listen((evt) {_debounce(() async {_setCurrentCityName();});});
// And any other `MapController` dependent non-movement methods
},
), ),
children: [ children: [
openStreetMapTileLayer, openStreetMapTileLayer,
@ -59,14 +126,7 @@ class _MapPageState extends State<MapPage> {
children: <Widget>[ children: <Widget>[
Greeting(theme), Greeting(theme),
Text("Got a lot to do today! Here is a rundown:"), Text("Got a lot to do today! Here is a rundown:"),
singleDestination(context, "Location 1", "some description", "Further information"), ...loadDestinations(),
singleDestination(context, "Location 2", "some description", "Further information"),
singleDestination(context, "Location 3", "some description", "Further information"),
singleDestination(context, "Location 4", "some description", "Further information"),
singleDestination(context, "Location 5", "some description", "Further information"),
singleDestination(context, "Location 6", "some description", "Further information"),
singleDestination(context, "Location 7", "some description", "Further information"),
singleDestination(context, "Location 8", "some description", "Further information"),
], ],
), ),
), ),
@ -78,7 +138,7 @@ class _MapPageState extends State<MapPage> {
Widget Greeting (ThemeData theme) { Widget Greeting (ThemeData theme) {
return Center( return Center(
child: Text( child: Text(
"Explore Kview", "Explore ${_currentCityName}",
style: TextStyle(color: theme.primaryColor, fontSize: 24.0, fontWeight: FontWeight.bold), style: TextStyle(color: theme.primaryColor, fontSize: 24.0, fontWeight: FontWeight.bold),
), ),
); );

View File

@ -0,0 +1,31 @@
class Destination {
final double latitude;
final double longitude;
final String name;
final String description;
final DestinationType type;
final Duration duration;
final bool visited;
Destination({
required this.latitude,
required this.longitude,
required this.name,
required this.description,
required this.type,
required this.duration,
required this.visited,
});
}
class DestinationType {
final String name;
final String description;
DestinationType({
required this.name,
required this.description,
});
}

View File

@ -83,6 +83,46 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
geocode:
dependency: "direct main"
description:
name: geocode
sha256: cf9727c369bb3703b97d6e440225962dc27b7f3c686662fe3cdcc91cbfb7074d
url: "https://pub.dev"
source: hosted
version: "1.0.3"
geocoding:
dependency: "direct main"
description:
name: geocoding
sha256: d580c801cba9386b4fac5047c4c785a4e19554f46be42f4f5e5b7deacd088a66
url: "https://pub.dev"
source: hosted
version: "3.0.0"
geocoding_android:
dependency: transitive
description:
name: geocoding_android
sha256: "1b13eca79b11c497c434678fed109c2be020b158cec7512c848c102bc7232603"
url: "https://pub.dev"
source: hosted
version: "3.3.1"
geocoding_ios:
dependency: transitive
description:
name: geocoding_ios
sha256: "94ddba60387501bd1c11e18dca7c5a9e8c645d6e3da9c38b9762434941870c24"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
geocoding_platform_interface:
dependency: transitive
description:
name: geocoding_platform_interface
sha256: "8c2c8226e5c276594c2e18bfe88b19110ed770aeb7c1ab50ede570be8b92229b"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
http: http:
dependency: transitive dependency: transitive
description: description:
@ -108,7 +148,7 @@ packages:
source: hosted source: hosted
version: "0.19.0" version: "0.19.0"
latlong2: latlong2:
dependency: transitive dependency: "direct main"
description: description:
name: latlong2 name: latlong2
sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe"
@ -119,26 +159,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker name: leak_tracker
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.0.0" version: "10.0.4"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "3.0.3"
leak_tracker_testing: leak_tracker_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_testing name: leak_tracker_testing
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "3.0.1"
lints: lints:
dependency: transitive dependency: transitive
description: description:
@ -183,10 +223,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.11.0" version: "1.12.0"
mgrs_dart: mgrs_dart:
dependency: transitive dependency: transitive
description: description:
@ -203,6 +243,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.0" version: "1.9.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
polylabel: polylabel:
dependency: transitive dependency: transitive
description: description:
@ -276,10 +324,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.1" version: "0.7.0"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@ -308,10 +356,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "13.0.0" version: "14.2.1"
web: web:
dependency: transitive dependency: transitive
description: description:
@ -330,4 +378,4 @@ packages:
version: "2.0.0" version: "2.0.0"
sdks: sdks:
dart: ">=3.3.4 <4.0.0" dart: ">=3.3.4 <4.0.0"
flutter: ">=3.10.0" flutter: ">=3.18.0-18.0.pre.54"

View File

@ -1,5 +1,5 @@
name: fast_network_navigation name: "fast_network_navigation"
description: "A new Flutter project." description: "An interactive city navigator."
# The following line prevents the package from being accidentally published to # The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages. # pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev publish_to: 'none' # Remove this line if you wish to publish to pub.dev
@ -37,6 +37,9 @@ dependencies:
cupertino_icons: ^1.0.6 cupertino_icons: ^1.0.6
flutter_map: ^6.1.0 flutter_map: ^6.1.0
sliding_up_panel: ^2.0.0+1 sliding_up_panel: ^2.0.0+1
latlong2: ^0.9.1
geocoding: ^3.0.0
geocode: ^1.0.3
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: