Skip to content
Snippets Groups Projects
configuration.dart 9.21 KiB
Newer Older
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
Maximilian Betz's avatar
Maximilian Betz committed
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'sensorconnector.dart';
Future<int> login() async {
  // Get Access to local configuration store. Token must be stored there!
  ConfigurationStoreInstance configuration = ConfigurationStoreInstance();

  String url = 'https://sandbox.sensor.awi.de/rest/sensors/contacts/login';
  debugPrint("Start login to : " + url);

  Map<String, dynamic> body = {'username': configuration.loginInformation.mail, 'authPassword': configuration.loginInformation.password};
  String encodedBody = body.keys.map((key) => "$key=${body[key]}").join("&");
  debugPrint(encodedBody);

  final response = await http.post(Uri.parse(url),
      body: encodedBody,
      headers: {
        'Accept' : 'application/json',
        'Content-Type' : 'application/x-www-form-urlencoded'
      },
      encoding: Encoding.getByName("utf-8")
  );

  if (response.statusCode == 200) {
    debugPrint('Login success');
Maximilian Betz's avatar
Maximilian Betz committed
    //TODO: display feedback to user that credentials are correct
    debugPrint(response.headers['set-cookie']?.split(';')[0].toString());
    debugPrint(response.body.toString());
    debugPrint(response.headers.toString());
    debugPrint(response.headers['set-cookie']);

  } else {
    debugPrint('Header: ' + response.headers.toString());
    debugPrint('Body: ' + response.body.toString());
    debugPrint('StatusCode: ' + response.statusCode.toString());
    throw Exception('Failed to login');
Maximilian Betz's avatar
Maximilian Betz committed

    //TODO: display feedback to user. Only allow export in view events if user is valid.
Future<List<Device>> updateDevices(int collectionId) async {
  debugPrint("Start HTTP GET Collection Devices. Collection Id: " + collectionId.toString());
  String url = 'https://sandbox.sensor.awi.de/rest/sensors/collections/getItemsOfCollection/' + collectionId.toString();
  // Get Access to local device and current event store.
  EventStoreInstance events = EventStoreInstance();
  ConfigurationStoreInstance configuration = ConfigurationStoreInstance();

Maximilian Betz's avatar
Maximilian Betz committed
  List<Device> collectionDevices = [];

  final response = await http
  if (response.statusCode == 200) {
    List<dynamic> data = json.decode(response.body);
    for (var entry in data) {
      collectionDevices.add(Device.fromJson(entry));
    }

    debugPrint("Got the following devices: ");
    for (var device in collectionDevices){
      debugPrint(device.toString());
    }

Maximilian Betz's avatar
Maximilian Betz committed
    /*Update to local device store*/
    configuration.devices = collectionDevices;
Maximilian Betz's avatar
Maximilian Betz committed
    //Update id and urn for the add event widget
    events.currentEvent.id = collectionDevices[0].id;
    events.currentEvent.urn = collectionDevices[0].urn;
    events.currentEvent.description = '';
    events.currentEvent.label = '';
    events.currentEvent.type = configuration.eventTypes[0].name;

    var date = DateTime.now().toUtc();
    events.currentEvent.startDate = '$date';
    events.currentEvent.endDate = '$date';
    configuration.initialized = true;

    return collectionDevices;
  } else {
    throw Exception('Failed to load Collection');
  }
}
Future<List<Collection>> fetchCollections() async {
Maximilian Betz's avatar
Maximilian Betz committed
  debugPrint("Fetching Collections...");
  ConfigurationStoreInstance configuration = ConfigurationStoreInstance();

Maximilian Betz's avatar
Maximilian Betz committed
  List<Collection> collectionList = [];
      .get(Uri.parse('https://sandbox.sensor.awi.de/rest/sensors/collections/getAllCollections?pointInTime=2018-07-03T12%3A30%3A55.389Z'));

  if (response.statusCode == 200) {
    return (json.decode(response.body) as List)
        .map((i) => Collection.fromJson(i))
        .toList();

  } else {
Maximilian Betz's avatar
Maximilian Betz committed
    debugPrint('Failed to load Collection');
    return collectionList;
Future<List<EventType>> fetchEventTypes() async {
  debugPrint("Fetching Event Types...");
  List<EventType> eventTypeList = [];
  ConfigurationStoreInstance configuration = ConfigurationStoreInstance();

  final response = await http
      .get(Uri.parse('https://sandbox.sensor.awi.de/rest/sensors/events/getAllEventTypes'));

  if (response.statusCode == 200) {
    debugPrint(response.body);

    eventTypeList =  (json.decode(response.body) as List)
        .map((i) => EventType.fromJson(i))
        .toList();

    configuration.eventTypes = eventTypeList;
    return eventTypeList;

  } else {
    debugPrint('Failed to load Collection');
    return eventTypeList;
  }




  return eventTypeList;
}


class Configuration extends StatefulWidget {
Maximilian Betz's avatar
Maximilian Betz committed
  const Configuration({Key? key}) : super(key: key);

  @override
  State<Configuration> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<Configuration> {

  late Future<Collection> futureCollection;
  late Future<List<Collection>> futureCollections;
  late Future<List<EventType>> futureEventTypes;
  SensorConnector connector = SensorConnector();

  @override
  void initState() {
    super.initState();
    futureCollections = connector.fetchCollections();
    futureEventTypes = connector.fetchEventTypes();
    fetchEventTypes();
  late Future<String> eventTypes;


  @override
  Widget build(BuildContext context) {

    final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();
    final EventStoreInstance events = EventStoreInstance();
    return Scaffold(
      appBar: AppBar(
Maximilian Betz's avatar
Maximilian Betz committed
        title: const Text('Configuration'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
Maximilian Betz's avatar
Maximilian Betz committed
            const Text(
                'You must be online to do something here!',
                style: TextStyle(fontSize: 14)
Maximilian Betz's avatar
Maximilian Betz committed
            ),
            const SizedBox(height: 50),
            TextFormField(
              keyboardType: TextInputType.emailAddress,
              autofocus: false,
              initialValue: configuration.loginInformation.mail,
              decoration: const InputDecoration(
                labelText: 'Sensor E-Mail',
                hintText: 'User for writing events',
              ),
              onChanged: (value) {
                configuration.loginInformation.mail = value;
              },
            ),
            TextFormField(
              autofocus: false,
              initialValue: configuration.loginInformation.password,
              decoration: const InputDecoration(
                labelText: 'Sensor Password',
                hintText: 'Password for writing events',
              ),
              onChanged: (value){
                configuration.loginInformation.password = value;
              },
            ),
            const SizedBox(height: 50),
            FutureBuilder<List<Collection>>(
                future: futureCollections,
                builder: (context, snapshot){
                  if (snapshot.hasData)
                  {
                    configuration.collections = [];
Maximilian Betz's avatar
Maximilian Betz committed
                    snapshot.data?.forEach((element) {
                      configuration.collections.add(element);
Maximilian Betz's avatar
Maximilian Betz committed
                    });
Maximilian Betz's avatar
Maximilian Betz committed
                    /*Initialize active collection with first received
                    collection if not initialized yet*/
                    if(configuration.currentCollection.id == -1){
                      configuration.currentCollection = configuration.collections[0];
                        value: configuration.currentCollection.collectionName,
                        decoration: const InputDecoration(
                          labelText: 'Chose Collection',
                        configuration.collections.map((Collection collection) {
                          return DropdownMenuItem(
                            value: collection.collectionName,
                            child: Text(collection.collectionName),
                          );
                        }).toList(),
                        onChanged: (value) {
                          configuration.currentCollection = configuration.getCollectionFromName(value.toString());
Maximilian Betz's avatar
Maximilian Betz committed
                    return const CircularProgressIndicator();
            ),
          ],
        ),
      ),
      bottomNavigationBar: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
          FloatingActionButton.extended(
            heroTag: null,
            tooltip: 'Reset all data',
            icon: const Icon(Icons.cancel),
            label: const Text('Reset all'),
            onPressed: () {
              //events.reset();  //TODO: remove before release!
          FloatingActionButton.extended(
            tooltip: 'Select Collection and download corresponding devices',
            icon: const Icon(Icons.save),
            label: const Text('Store'),
              login();
              fetchEventTypes();
              updateDevices(configuration.currentCollection.id);
Maximilian Betz's avatar
Maximilian Betz committed
              HapticFeedback.vibrate();