LCOV - code coverage report
Current view: top level - lib/domain/usecases/cartographie - load_page_and_place_batiments.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 0 77 0.0 %
Date: 2020-06-26 11:36:11 Functions: 0 0 -

          Line data    Source code
       1             : import 'dart:convert';
       2             : import 'dart:math' as math;
       3             : 
       4             : import 'package:app_pym/core/constants/cartographie.dart';
       5             : import 'package:app_pym/core/usecases/usecase.dart';
       6             : import 'package:app_pym/data/devices/geolocator_device.dart';
       7             : import 'package:app_pym/domain/entities/map_pym/batiment.dart';
       8             : import 'package:app_pym/domain/entities/map_pym/entreprise.dart';
       9             : import 'package:app_pym/domain/repositories/map_pym/batiment_repository.dart';
      10             : import 'package:app_pym/domain/repositories/map_pym/entreprise_repository.dart';
      11             : import 'package:flutter/foundation.dart';
      12             : import 'package:flutter/material.dart';
      13             : import 'package:flutter_unity_widget/flutter_unity_widget.dart';
      14             : import 'package:freezed_annotation/freezed_annotation.dart';
      15             : import 'package:geolocator/geolocator.dart';
      16             : import 'package:injectable/injectable.dart';
      17             : import 'package:vector_math/vector_math_64.dart' show Vector3;
      18             : 
      19             : part 'load_page_and_place_batiments.freezed.dart';
      20             : 
      21             : @freezed
      22             : abstract class LoadPageAndPlaceBatimentParams
      23             :     with _$LoadPageAndPlaceBatimentParams {
      24             :   const factory LoadPageAndPlaceBatimentParams({
      25             :     @required num bearingBetweenCameraAndNorth,
      26             :     @required UnityWidgetController controller,
      27             :   }) = _LoadPageAndPlaceBatimentParams;
      28             : }
      29             : 
      30             : @prod
      31             : @lazySingleton
      32             : class LoadPageAndPlaceBatiments
      33             :     extends Usecase<Future<Position>, LoadPageAndPlaceBatimentParams> {
      34             :   final GeolocatorDevice geolocatorDevice;
      35             :   final BatimentRepository batimentRepository;
      36             :   final EntrepriseRepository entrepriseRepository;
      37             : 
      38           0 :   const LoadPageAndPlaceBatiments({
      39             :     @required this.geolocatorDevice,
      40             :     @required this.batimentRepository,
      41             :     @required this.entrepriseRepository,
      42             :   });
      43             : 
      44             :   @override
      45           0 :   Future<Position> call(LoadPageAndPlaceBatimentParams params) async {
      46             :     final num bearingBetweenCameraAndNorth =
      47           0 :         params.bearingBetweenCameraAndNorth * math.pi / 180;
      48             : 
      49           0 :     final List<Entreprise> entreprises = await entrepriseRepository.fetchAll();
      50             : 
      51           0 :     final UnityWidgetController controller = params.controller;
      52             : 
      53             :     // Throttle to avoid spam
      54           0 :     final Stream<Position> positions = geolocatorDevice.positions;
      55             : 
      56           0 :     final position = positions.first;
      57           0 :     final num latitude = (await position).latitude;
      58           0 :     final num longitude = (await position).longitude;
      59             : 
      60           0 :     if (geolocatorDevice.distanceBetween(
      61             :           latitude,
      62             :           longitude,
      63             :           CartographieConstants.latitudePYM,
      64             :           CartographieConstants.longitudePYM,
      65           0 :         ) <
      66             :         500) {
      67           0 :       await _placeBatiments(
      68             :         latitude,
      69             :         longitude,
      70             :         bearingBetweenCameraAndNorth,
      71             :         entreprises,
      72             :         controller,
      73             :       );
      74             :     } else {
      75           0 :       _placePYM(
      76             :         latitude,
      77             :         longitude,
      78             :         bearingBetweenCameraAndNorth,
      79             :         entreprises,
      80             :         controller,
      81             :       );
      82             :     }
      83             : 
      84             :     return position;
      85             :   }
      86             : 
      87           0 :   Future<void> _placeBatiments(
      88             :     num latitude,
      89             :     num longitude,
      90             :     num bearingBetweenCameraAndNorth,
      91             :     List<Entreprise> entreprises,
      92             :     UnityWidgetController controller,
      93             :   ) async {
      94           0 :     final Future<List<Batiment>> batiments = batimentRepository.fetchAll();
      95             : 
      96           0 :     for (final batiment in (await batiments)
      97           0 :         .where((batiment) => batiment.isVisibleAR)
      98           0 :         .where((batiment) =>
      99           0 :             batiment.latitude != null && batiment.longitude != null)) {
     100             :       final entreprisesOfBatiment = entreprises
     101           0 :           .where((entreprise) => entreprise.idBatiment == batiment.id)
     102           0 :           .toList();
     103             :       final num bearingBetweenCameraAndBatiment =
     104           0 :           geolocatorDevice.bearingBetween(
     105             :         latitude,
     106             :         longitude,
     107           0 :         batiment.latitude,
     108           0 :         batiment.longitude,
     109             :       );
     110             : 
     111             :       final num distanceBetweenCameraAndBatiment =
     112           0 :           geolocatorDevice.distanceBetween(
     113             :         latitude,
     114             :         longitude,
     115           0 :         batiment.latitude,
     116           0 :         batiment.longitude,
     117             :       );
     118             : 
     119             :       // Calculate position in arcore/arkit axis
     120           0 :       final Vector3 vect = Vector3(
     121           0 :         -2 *
     122           0 :             math.sin(
     123           0 :                 bearingBetweenCameraAndNorth - bearingBetweenCameraAndBatiment),
     124             :         0,
     125           0 :         -2 *
     126           0 :             math.cos(
     127           0 :                 bearingBetweenCameraAndNorth - bearingBetweenCameraAndBatiment),
     128             :       );
     129             : 
     130           0 :       controller.spawnBatiment(
     131             :         vect,
     132             :         batiment: batiment,
     133             :         entreprises: entreprisesOfBatiment,
     134             :         distance: distanceBetweenCameraAndBatiment,
     135             :       );
     136             :     }
     137             :   }
     138             : 
     139           0 :   void _placePYM(
     140             :     num latitude,
     141             :     num longitude,
     142             :     num bearingBetweenCameraAndNorth,
     143             :     List<Entreprise> entreprises,
     144             :     UnityWidgetController controller,
     145             :   ) {
     146           0 :     final num bearingBetweenCameraAndPYM = geolocatorDevice.bearingBetween(
     147             :       latitude,
     148             :       longitude,
     149             :       CartographieConstants.latitudePYM,
     150             :       CartographieConstants.longitudePYM,
     151             :     );
     152             : 
     153           0 :     final num distanceBetweenCameraAndPYM = geolocatorDevice.distanceBetween(
     154             :       latitude,
     155             :       longitude,
     156             :       CartographieConstants.latitudePYM,
     157             :       CartographieConstants.longitudePYM,
     158             :     );
     159             : 
     160             :     // Calculate position in arcore/arkit axis
     161           0 :     final Vector3 vect = Vector3(
     162           0 :       -2 * math.sin(bearingBetweenCameraAndNorth - bearingBetweenCameraAndPYM),
     163             :       0,
     164           0 :       -2 * math.cos(bearingBetweenCameraAndNorth - bearingBetweenCameraAndPYM),
     165             :     );
     166             : 
     167           0 :     controller.spawnBatiment(
     168             :       vect,
     169             :       batiment: CartographieConstants.batiment,
     170             :       entreprises: entreprises,
     171             :       distance: distanceBetweenCameraAndPYM,
     172             :     );
     173             :   }
     174             : }
     175             : 
     176             : extension on UnityWidgetController {
     177           0 :   void spawnBatiment(
     178             :     Vector3 vect, {
     179             :     @required Batiment batiment,
     180             :     @required List<Entreprise> entreprises,
     181             :     @required num distance,
     182             :   }) {
     183           0 :     final Map<String, dynamic> data = <String, dynamic>{
     184           0 :       'position': <String, double>{
     185           0 :         'x': vect.x,
     186           0 :         'y': vect.y,
     187           0 :         'z': -vect.z, // Only for Unity axis
     188             :       },
     189           0 :       'color': <String, int>{
     190           0 :         'r': Colors.white.red,
     191           0 :         'g': Colors.white.green,
     192           0 :         'b': Colors.white.blue,
     193             :       },
     194           0 :       'batiment': <String, dynamic>{
     195           0 :         'id': batiment.id,
     196           0 :         'nom': batiment.nom ?? "",
     197           0 :         'nbEtage': batiment.nbEtage ?? 0,
     198           0 :         'description': batiment.description ?? "",
     199           0 :         'accesHandicape': batiment.accesHandicape ?? false,
     200           0 :         'url': batiment.url ?? "",
     201           0 :         'adresse': batiment.adresse ?? "",
     202           0 :         'latitude': batiment.latitude ?? 0.0,
     203           0 :         'longitude': batiment.longitude ?? 0.0,
     204           0 :         'isVisibleAR': batiment.isVisibleAR ?? true,
     205           0 :         'img_url': batiment.img_url ?? "",
     206           0 :         'entreprises': entreprises.map((entreprise) {
     207           0 :           return {
     208           0 :             'id': entreprise.id,
     209           0 :             'nom': entreprise.nom ?? "",
     210           0 :             'site_internet': entreprise.site_internet ?? "",
     211           0 :             'nb_salaries': entreprise.nb_salaries ?? 0,
     212           0 :             'telephone': entreprise.telephone ?? "",
     213           0 :             'mail': entreprise.mail ?? "",
     214           0 :             'logo': entreprise.logo ?? "",
     215           0 :             'idBatiment': entreprise.idBatiment ?? 0,
     216             :           };
     217           0 :         }).toList(),
     218             :       },
     219             :       'distance': distance,
     220             :     };
     221             : 
     222           0 :     this.postMessage(
     223             :       'BatimentSpawner',
     224             :       'FlutterSpawn',
     225           0 :       json.encode(data),
     226             :     );
     227             :   }
     228             : }

Generated by: LCOV version 1.13