Skip to content
Snippets Groups Projects
addevent.dart 8.54 KiB
Newer Older
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'datamodel.dart';
Maximilian Betz's avatar
Maximilian Betz committed
import 'dart:async';
import 'package:geolocator/geolocator.dart';
Maximilian Betz's avatar
Maximilian Betz committed
class AddEvent extends StatefulWidget {
  @override
  State<AddEvent> createState() => _AddEventPageState();
}

class _AddEventPageState extends State<AddEvent>  {
Maximilian Betz's avatar
Maximilian Betz committed
  final List<bool> _isGNSSSelected = [true];
  bool servicestatus = false;
  bool haspermission = false;
  late LocationPermission permission;
  late Position position;
  late String long = "";
  late String lat = "";
  late String alt = "";
Maximilian Betz's avatar
Maximilian Betz committed
  late double accuracy = 0.0;
  late StreamSubscription<Position> positionStream;
  LocationSettings locationSettings = const LocationSettings(
    accuracy: LocationAccuracy.high,
    distanceFilter: 0,
  );

  getLocation() async {
    position =
    await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    print('Get Location: Lat:' + position.latitude.toString() +
        ' Long:' + position.longitude.toString() +
        ' Alt:' + position.altitude.toString());

    long = position.longitude.toString();
    lat = position.latitude.toString();
    alt = position.altitude.toString();
Maximilian Betz's avatar
Maximilian Betz committed
    accuracy = position.accuracy;

    setState(() {
      //refresh UI
    });
    StreamSubscription<Position> positionStream = Geolocator.getPositionStream(
        locationSettings: locationSettings).listen((Position position) {
      print('Get Location: Lat:' + position.latitude.toString() +
          ' Long:' + position.longitude.toString() +
          ' Alt:' + position.altitude.toString());

      long = position.longitude.toString();
      lat = position.latitude.toString();
      alt = position.altitude.toString();
Maximilian Betz's avatar
Maximilian Betz committed
      accuracy = position.accuracy;

      setState(() {
        //refresh UI on update
      });
    });
  }


  checkGnssPermission() async {
    print("CheckGnssPermission");
    servicestatus = await Geolocator.isLocationServiceEnabled();
    if(servicestatus){
      permission = await Geolocator.checkPermission();

      if (permission == LocationPermission.denied) {
        permission = await Geolocator.requestPermission();
        if (permission == LocationPermission.denied) {
          print('Location permissions are denied');
        }else if(permission == LocationPermission.deniedForever){
          print('Location permissions are permanently denied');
        }else{
          haspermission = true;
        }
      }else{
        haspermission = true;
      }

      if(haspermission){
        print('Location permissions granted');
        setState(() {
          //refresh the UI
        });

        getLocation();
      }
    }else{
      print("GPS Service is not enabled, turn on GPS location");
    }

    setState(() {
      //refresh the UI
    });
  }
Maximilian Betz's avatar
Maximilian Betz committed

  @override
  void initState() {
    checkGnssPermission();
Maximilian Betz's avatar
Maximilian Betz committed
    super.initState();
  }

  void _storeCurrentEvent() {
    final EventStoreInstance storedEvents = EventStoreInstance();
    final EventCurrentInstance currentEvent = EventCurrentInstance();
    storedEvents.store.add(
        Event(
          currentEvent.store.id,
          currentEvent.store.urn,
          currentEvent.store.label,
          currentEvent.store.type,
          currentEvent.store.description,
          currentEvent.store.status,
        ));
  }

  //TODO: add field validators for freetext fields. Check allowed characters in sensor.awi.de
  //TODO: (Description, Label, Latitude, Longitude, Elevation, )

  @override
  Widget build(BuildContext context) {
    /* Get singletons to access relevant data here.*/
    final EventTypeStoreInstance eventTypes = EventTypeStoreInstance();
    final DeviceStoreInstance availableDevice = DeviceStoreInstance();
    final EventStoreInstance storedEvents = EventStoreInstance();
    final EventCurrentInstance currentEvent = EventCurrentInstance();
Maximilian Betz's avatar
Maximilian Betz committed
    final bool _disable_gnss_editing = _isGNSSSelected[0];
    String _gnss_status_text = "";

    //print("###"+currentEvent.store.toString());

    //final TextEditingController _controllerLat = TextEditingController(text: currentEvent.store.latitude);
    final TextEditingController _controllerLat = TextEditingController(text: "LAT123");
    //final TextEditingController _controllerLong = TextEditingController(text: currentEvent.store.longitude);
    final TextEditingController _controllerLong = TextEditingController(text: "Long123");
    //final TextEditingController _controllerAlt = TextEditingController(text: currentEvent.store.elevation);
    final TextEditingController _controllerAlt = TextEditingController(text: "Alt123");

    //currentEvent.store.
    if (true == _isGNSSSelected[0]){
      _controllerLat.text = lat;
      _controllerLong.text = long;
      _controllerAlt.text = alt;

      _gnss_status_text = "Precision: "+ accuracy.toStringAsFixed(2) +"m";
    }
    else{
      _gnss_status_text = "Off";
      // do nothing and keep old value,
    }


    return Scaffold(
      appBar: AppBar(title: const Text("Add Event")),
      body:
      Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            TextFormField(
              initialValue: currentEvent.store.label,
              decoration: const InputDecoration(
                  labelText: 'Label'
              ),
              onChanged: (value) {
                currentEvent.store.label = value;
              },
            ),
            DropdownButtonFormField(
                value: currentEvent.store.type,
                decoration: const InputDecoration(
                  labelText: 'Event Type',
                ),
Maximilian Betz's avatar
Maximilian Betz committed
                eventTypes.store.map((EventType event) {
                  return DropdownMenuItem(
                    value: event.name,
                    child: Text(event.name),
                  );
                }).toList(),
                onChanged: (value) {
                  currentEvent.store.type = value.toString();
                }
            ),
            DropdownButtonFormField(
                value: currentEvent.store.urn,
                decoration: const InputDecoration(
                  labelText: 'URN',
                ),
                items:
                availableDevice.store.map((Device device) {
                  return DropdownMenuItem(
                    value: device.urn,
                    child: Text(device.urn),
                  );
                }).toList(),
                onChanged: (value) {
                  currentEvent.store.urn = value.toString();
                  currentEvent.store.id = availableDevice.getDeviceIdFromUrn(value.toString());
              initialValue: currentEvent.store.description,
              decoration: const InputDecoration(
                  labelText: 'Description'
              ),
              onChanged: (value) {
                currentEvent.store.description = value;
              },
            TextField(
              readOnly: true,
Maximilian Betz's avatar
Maximilian Betz committed
              enabled: !_disable_gnss_editing,
              controller: _controllerLat,
              decoration: InputDecoration(
                labelText: 'Latitude',
                border: OutlineInputBorder(),
            TextField(
              readOnly: true,
Maximilian Betz's avatar
Maximilian Betz committed
              enabled: !_disable_gnss_editing,
              controller: _controllerLong,
              decoration: InputDecoration(
                labelText: 'Longitude',
                border: OutlineInputBorder(),
            TextField(
              readOnly: true,
Maximilian Betz's avatar
Maximilian Betz committed
              enabled: !_disable_gnss_editing,
              controller: _controllerAlt,
              decoration: InputDecoration(
                labelText: 'Elevation',
                border: OutlineInputBorder(),
          ]),
      bottomNavigationBar: Row(
        mainAxisAlignment: MainAxisAlignment.end,
Maximilian Betz's avatar
Maximilian Betz committed
          Text(_gnss_status_text),
          SizedBox(width: 50),
Maximilian Betz's avatar
Maximilian Betz committed
          ToggleButtons(
            children: <Widget>[
              Icon(Icons.my_location),
            ],
Maximilian Betz's avatar
Maximilian Betz committed
            isSelected: _isGNSSSelected,
Maximilian Betz's avatar
Maximilian Betz committed
            onPressed: (int index) {
              setState(() {
Maximilian Betz's avatar
Maximilian Betz committed
                _isGNSSSelected[index] = !_isGNSSSelected[index];
          ),
          SizedBox(width: 50),
          FloatingActionButton(
            heroTag: null,
            onPressed: _storeCurrentEvent,
            tooltip: 'Add Event',
            child: Icon(Icons.add),
          ),
          SizedBox(width: 20),
        ],
      ),
    );
  }
}