Update translations + add language selection on download + beacon update

This commit is contained in:
Fransolet Thomas 2023-02-15 16:41:17 +01:00
parent 30dda83111
commit 6d6871e440
12 changed files with 241 additions and 89 deletions

View File

@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"audio_session","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\audio_session-0.1.13\\\\","native_build":true,"dependencies":[]},{"name":"flutter_beacon","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\flutter_beacon-0.5.1\\\\","native_build":true,"dependencies":[]},{"name":"just_audio","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\just_audio-0.9.31\\\\","native_build":true,"dependencies":["audio_session"]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.1.1\\\\","native_build":true,"dependencies":[]},{"name":"permission_handler","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\permission_handler-8.3.0\\\\","native_build":true,"dependencies":[]},{"name":"qr_code_scanner","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\qr_code_scanner-1.0.1\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.2.4+1\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"audio_session","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\audio_session-0.1.13\\\\","native_build":true,"dependencies":[]},{"name":"flutter_beacon","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\flutter_beacon-0.5.1\\\\","native_build":true,"dependencies":[]},{"name":"just_audio","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\just_audio-0.9.31\\\\","native_build":true,"dependencies":["audio_session"]},{"name":"path_provider_android","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_android-2.0.22\\\\","native_build":true,"dependencies":[]},{"name":"permission_handler","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\permission_handler-8.3.0\\\\","native_build":true,"dependencies":[]},{"name":"qr_code_scanner","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\qr_code_scanner-1.0.1\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.2.4+1\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"audio_session","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\audio_session-0.1.13\\\\","native_build":true,"dependencies":[]},{"name":"just_audio","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\just_audio-0.9.31\\\\","native_build":true,"dependencies":["audio_session"]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.1.1\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.2.4+1\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_linux-2.1.7\\\\","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_windows-2.1.3\\\\","native_build":false,"dependencies":[]}],"web":[{"name":"audio_session","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\audio_session-0.1.13\\\\","dependencies":[]},{"name":"just_audio_web","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\just_audio_web-0.4.7\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"audio_session","dependencies":[]},{"name":"flutter_beacon","dependencies":[]},{"name":"just_audio","dependencies":["just_audio_web","audio_session","path_provider"]},{"name":"just_audio_web","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":[]},{"name":"qr_code_scanner","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2023-02-15 14:23:51.471028","version":"3.7.0"} {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"audio_session","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\audio_session-0.1.13\\\\","native_build":true,"dependencies":[]},{"name":"flutter_beacon","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\flutter_beacon-0.5.1\\\\","native_build":true,"dependencies":[]},{"name":"just_audio","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\just_audio-0.9.31\\\\","native_build":true,"dependencies":["audio_session"]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.1.1\\\\","native_build":true,"dependencies":[]},{"name":"permission_handler","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\permission_handler-8.3.0\\\\","native_build":true,"dependencies":[]},{"name":"qr_code_scanner","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\qr_code_scanner-1.0.1\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.2.4+1\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"audio_session","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\audio_session-0.1.13\\\\","native_build":true,"dependencies":[]},{"name":"flutter_beacon","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\flutter_beacon-0.5.1\\\\","native_build":true,"dependencies":[]},{"name":"just_audio","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\just_audio-0.9.31\\\\","native_build":true,"dependencies":["audio_session"]},{"name":"path_provider_android","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_android-2.0.22\\\\","native_build":true,"dependencies":[]},{"name":"permission_handler","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\permission_handler-8.3.0\\\\","native_build":true,"dependencies":[]},{"name":"qr_code_scanner","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\qr_code_scanner-1.0.1\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.2.4+1\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"audio_session","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\audio_session-0.1.13\\\\","native_build":true,"dependencies":[]},{"name":"just_audio","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\just_audio-0.9.31\\\\","native_build":true,"dependencies":["audio_session"]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.1.1\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.2.4+1\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_linux-2.1.7\\\\","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_windows-2.1.3\\\\","native_build":false,"dependencies":[]}],"web":[{"name":"audio_session","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\audio_session-0.1.13\\\\","dependencies":[]},{"name":"just_audio_web","path":"C:\\\\Users\\\\thoma\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\just_audio_web-0.4.7\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"audio_session","dependencies":[]},{"name":"flutter_beacon","dependencies":[]},{"name":"just_audio","dependencies":["just_audio_web","audio_session","path_provider"]},{"name":"just_audio_web","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":[]},{"name":"qr_code_scanner","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2023-02-15 16:22:54.587703","version":"3.7.0"}

View File

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:manager_api/api.dart'; import 'package:manager_api/api.dart';
import 'package:mymuseum_visitapp/Models/articleRead.dart';
import 'package:mymuseum_visitapp/Models/resourceModel.dart'; import 'package:mymuseum_visitapp/Models/resourceModel.dart';
import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
@ -10,7 +11,8 @@ enum DatabaseTableType {
main, main,
configurations, configurations,
sections, sections,
resources resources,
articleRead
} }
class DatabaseHelper { class DatabaseHelper {
@ -49,6 +51,9 @@ class DatabaseHelper {
static final columnSource = 'source'; static final columnSource = 'source';
static final articleReadTable = 'articleRead';
static final columnLastTimeOpen = 'readTime';
DatabaseHelper._privateConstructor(); DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor(); static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
@ -71,6 +76,7 @@ class DatabaseHelper {
$columnInstanceId TEXT NOT NULL $columnInstanceId TEXT NOT NULL
) )
'''); ''');
await db.execute(''' await db.execute('''
CREATE TABLE $configurationsTable ( CREATE TABLE $configurationsTable (
$columnId TEXT NOT NULL PRIMARY KEY, $columnId TEXT NOT NULL PRIMARY KEY,
@ -116,6 +122,13 @@ class DatabaseHelper {
$columnType INT NOT NULL $columnType INT NOT NULL
) )
'''); ''');
await db.execute('''
CREATE TABLE $articleReadTable (
$columnId TEXT NOT NULL PRIMARY KEY,
$columnLastTimeOpen INT NOT NULL
)
''');
} }
Future<int> insert(DatabaseTableType type, Map<String, Object?> info) async { Future<int> insert(DatabaseTableType type, Map<String, Object?> info) async {
@ -221,21 +234,21 @@ class DatabaseHelper {
); );
break; break;
case DatabaseTableType.configurations: case DatabaseTableType.configurations:
var test = getConfigurationFromDB(element);
dataToReturn.add(getConfigurationFromDB(element)); dataToReturn.add(getConfigurationFromDB(element));
//print("DB - dataToReturn --- $test --> "); //print("DB - dataToReturn --- $test --> ");
break; break;
case DatabaseTableType.sections: case DatabaseTableType.sections:
var test = getSectionFromDB(element);
dataToReturn.add(getSectionFromDB(element)); dataToReturn.add(getSectionFromDB(element));
//print("DB - dataToReturn --- $test --> "); //print("DB - dataToReturn --- $test --> ");
break; break;
case DatabaseTableType.resources: case DatabaseTableType.resources:
var test = getResourceFromDB(element);
dataToReturn.add(getResourceFromDB(element)); dataToReturn.add(getResourceFromDB(element));
//print("DB - dataToReturn --- $test --> "); //print("DB - dataToReturn --- $test --> ");
break; break;
case DatabaseTableType.articleRead:
dataToReturn.add(getArticleReadFromDB(element));
//print("DB - dataToReturn --- $test --> ");
break;
} }
}); });
}).catchError((error) { }).catchError((error) {
@ -254,6 +267,8 @@ class DatabaseHelper {
return sectionsTable; return sectionsTable;
case DatabaseTableType.resources: case DatabaseTableType.resources:
return resourcesTable; return resourcesTable;
case DatabaseTableType.articleRead:
return articleReadTable;
} }
} }
@ -303,4 +318,11 @@ class DatabaseHelper {
type: ResourceType.values[element["type"]] type: ResourceType.values[element["type"]]
); );
} }
ArticleRead getArticleReadFromDB(dynamic element) {
return ArticleRead(
id: element["id"],
readTime: element["readTime"]
);
}
} }

View File

@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
import 'package:manager_api/api.dart';
class ArticleRead {
String id = "";
int readTime;
ArticleRead({required this.id, required this.readTime});
Map<String, dynamic> toMap() {
return {
'id': id,
'readTime': readTime
};
}
factory ArticleRead.fromJson(Map<String, dynamic> json) {
return ArticleRead(
id: json['id'] as String,
readTime: json['readTime'] as int
);
}
@override
String toString() {
return 'ArticleRead{id: $id, readTime: $readTime}';
}
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:manager_api/api.dart'; import 'package:manager_api/api.dart';
import 'package:mymuseum_visitapp/Models/articleRead.dart';
import 'package:mymuseum_visitapp/Models/beaconSection.dart'; import 'package:mymuseum_visitapp/Models/beaconSection.dart';
class VisitAppContext with ChangeNotifier{ class VisitAppContext with ChangeNotifier{
@ -11,6 +12,7 @@ class VisitAppContext with ChangeNotifier{
List<String?>? sectionIds; // Use to valid QR code found List<String?>? sectionIds; // Use to valid QR code found
List<BeaconSection?>? beaconSections; List<BeaconSection?>? beaconSections;
List<SectionDTO?>? currentSections; List<SectionDTO?>? currentSections;
List<ArticleRead> readArticles = [];
bool isArticleCurrentlyShown = false; bool isArticleCurrentlyShown = false;
bool isScanningBeacons = false; bool isScanningBeacons = false;

View File

@ -10,6 +10,7 @@ import 'package:mymuseum_visitapp/Components/SliderImages.dart';
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
import 'package:mymuseum_visitapp/Helpers/networkCheck.dart'; import 'package:mymuseum_visitapp/Helpers/networkCheck.dart';
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
import 'package:mymuseum_visitapp/Models/articleRead.dart';
import 'package:mymuseum_visitapp/Models/resourceModel.dart'; import 'package:mymuseum_visitapp/Models/resourceModel.dart';
import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart';
import 'package:mymuseum_visitapp/Screens/Article/audio_player.dart'; import 'package:mymuseum_visitapp/Screens/Article/audio_player.dart';
@ -255,6 +256,16 @@ class _ArticlePageState extends State<ArticlePage> {
List<Map<String, dynamic>> sectionTest = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.sections, articleId); List<Map<String, dynamic>> sectionTest = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.sections, articleId);
if(sectionTest.isNotEmpty) { if(sectionTest.isNotEmpty) {
sectionDTO = DatabaseHelper.instance.getSectionFromDB(sectionTest.first); sectionDTO = DatabaseHelper.instance.getSectionFromDB(sectionTest.first);
try {
ArticleRead articleRead = ArticleRead(id: sectionDTO!.id!, readTime: DateTime.now().millisecondsSinceEpoch);
await DatabaseHelper.instance.insert(DatabaseTableType.articleRead, articleRead.toMap());
visitAppContext!.readArticles.add(articleRead);
appContext.setContext(visitAppContext!);
} catch (e) {
print("DATABASE ERROR ARTICLEREAD");
print(e);
}
} else { } else {
print("EMPTY SECTION"); print("EMPTY SECTION");
} }

View File

@ -4,6 +4,7 @@ import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:manager_api/api.dart'; import 'package:manager_api/api.dart';
import 'package:mymuseum_visitapp/Components/LanguageSelection.dart';
import 'package:mymuseum_visitapp/Components/Loading.dart'; import 'package:mymuseum_visitapp/Components/Loading.dart';
import 'package:mymuseum_visitapp/Components/SearchBox.dart'; import 'package:mymuseum_visitapp/Components/SearchBox.dart';
import 'package:mymuseum_visitapp/Components/SearchNumberBox.dart'; import 'package:mymuseum_visitapp/Components/SearchNumberBox.dart';
@ -213,34 +214,78 @@ class _ConfigurationsListState extends State<ConfigurationsList> {
} }
Future<void> downloadClicked(AppContext appContext, ConfigurationDTO configuration) async { Future<void> downloadClicked(AppContext appContext, ConfigurationDTO configuration) async {
String loadingtext = TranslationHelper.getFromLocale("downloadConfiguration", appContext.getContext()); bool isCancel = false;
showDialog( if(alreadyDownloaded.any((c) => c == configuration.id)) {
barrierDismissible: false, await showDialog(
context: context, context: context,
builder: (_) { barrierDismissible: false,
return Dialog( builder: (_) {
backgroundColor: Colors.white, return AlertDialog(
child: Padding( backgroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 20), content: Padding(
child: Column( padding: const EdgeInsets.symmetric(vertical: 20),
mainAxisSize: MainAxisSize.min, child: Column(
children: [ mainAxisSize: MainAxisSize.min,
const CircularProgressIndicator(), children: [
const SizedBox( Text(TranslationHelper.getFromLocale("downloadLanguage", appContext.getContext()), style: TextStyle(color: kMainColor)),
height: 15, const SizedBox(
), height: 25,
Text(loadingtext) ),
], LanguageSelection()
],
),
), ),
), actions: <Widget>[
); TextButton(
}); child: Text(TranslationHelper.getFromLocale("close", appContext.getContext()), style: TextStyle(color: kMainColor)),
onPressed: () {
isCancel = true;
Navigator.of(context).pop();
},
),
TextButton(
child: Text(TranslationHelper.getFromLocale("ok", appContext.getContext()), style: TextStyle(color: kMainColor)),
onPressed: () async {
Navigator.of(context).pop();
},
)
],
actionsAlignment: MainAxisAlignment.spaceAround,
contentPadding: EdgeInsets.zero,
);
});
}
var isFinish = await DownloadConfiguration.downloadClicked(appContext, configuration); if(!isCancel) {
print("C4EST FINIITO"); String loadingText = TranslationHelper.getFromLocale("downloadConfiguration", appContext.getContext());
print(isFinish); showDialog(
barrierDismissible: false,
context: context,
builder: (_) {
return Dialog(
backgroundColor: Colors.white,
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const CircularProgressIndicator(),
const SizedBox(
height: 15,
),
Text(loadingText)
],
),
),
);
});
Navigator.of(context).pop(); var isFinish = await DownloadConfiguration.download(appContext, configuration);
print("C4EST FINIITO");
print(isFinish);
Navigator.of(context).pop();
}
} }
} }

View File

@ -5,6 +5,7 @@ import 'package:mymuseum_visitapp/Components/SearchBox.dart';
import 'package:mymuseum_visitapp/Components/SearchNumberBox.dart'; import 'package:mymuseum_visitapp/Components/SearchNumberBox.dart';
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
import 'package:mymuseum_visitapp/Models/articleRead.dart';
import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart';
import 'package:mymuseum_visitapp/Screens/Article/article.dart'; import 'package:mymuseum_visitapp/Screens/Article/article.dart';
import 'package:mymuseum_visitapp/Services/apiService.dart'; import 'package:mymuseum_visitapp/Services/apiService.dart';

View File

@ -3,7 +3,9 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:manager_api/api.dart'; import 'package:manager_api/api.dart';
import 'package:mymuseum_visitapp/Components/Loading.dart'; import 'package:mymuseum_visitapp/Components/Loading.dart';
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
import 'package:mymuseum_visitapp/Models/articleRead.dart';
import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart';
import 'package:mymuseum_visitapp/Services/apiService.dart'; import 'package:mymuseum_visitapp/Services/apiService.dart';
import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/app_context.dart';
@ -29,6 +31,7 @@ class SectionCard extends StatelessWidget {
// It will provide us total height and width of our screen // It will provide us total height and width of our screen
Size size = MediaQuery.of(context).size; Size size = MediaQuery.of(context).size;
final appContext = Provider.of<AppContext>(context); final appContext = Provider.of<AppContext>(context);
VisitAppContext visitAppContext = appContext.getContext();
bool isOffline = (appContext.getContext() as VisitAppContext).configuration!.isOffline!; bool isOffline = (appContext.getContext() as VisitAppContext).configuration!.isOffline!;
return Container( return Container(
@ -56,7 +59,7 @@ class SectionCard extends StatelessWidget {
child: Container( child: Container(
margin: const EdgeInsets.only(right: 10), margin: const EdgeInsets.only(right: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: visitAppContext.readArticles.any((element) => element.id == sectionDTO.id) ? kBackgroundGrey : Colors.white,
border: Border.all( border: Border.all(
color: kBlue2, color: kBlue2,
width: 0.2, width: 0.2,
@ -157,7 +160,7 @@ class SectionCard extends StatelessWidget {
), ),
), ),
child: Text( child: Text(
"${itemIndex+1}", "${sectionDTO.order!+1}",
//style: Theme.of(context).textTheme.button, //style: Theme.of(context).textTheme.button,
style: const TextStyle(color: Colors.white) style: const TextStyle(color: Colors.white)
), ),
@ -171,6 +174,4 @@ class SectionCard extends StatelessWidget {
), ),
); );
} }
} }

View File

@ -33,7 +33,9 @@ class VisitPage extends StatefulWidget {
class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver { class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
ConfigurationDTO? configuration; ConfigurationDTO? configuration;
int timeBetweenBeaconPopUp = 25000; // 25 sec int timeBetweenBeaconPopUp = 20000; // 20 sec
int meterToBeacon = 15; // 15 meters
bool modeDebugBeacon = true;
// Beacon specific // Beacon specific
final controller = Get.find<RequirementStateController>(); final controller = Get.find<RequirementStateController>();
@ -73,11 +75,26 @@ class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
controller.updateAuthorizationStatus(authorizationStatus); controller.updateAuthorizationStatus(authorizationStatus);
print('AUTHORIZATION $authorizationStatus'); print('AUTHORIZATION $authorizationStatus');
final locationServiceEnabled = final locationServiceEnabled = await flutterBeacon.checkLocationServicesIfEnabled;
await flutterBeacon.checkLocationServicesIfEnabled;
controller.updateLocationService(locationServiceEnabled); controller.updateLocationService(locationServiceEnabled);
print('LOCATION SERVICE $locationServiceEnabled'); print('LOCATION SERVICE $locationServiceEnabled');
var status = await Permission.bluetoothScan.status;
if (status.isDenied) {
print("IS DENIIIED");
// We didn't ask for permission yet or the permission has been denied before but not permanently.
}
// You can request multiple permissions at once.
Map<Permission, PermissionStatus> statuses = await [
Permission.bluetoothScan,
Permission.bluetoothConnect,
].request();
print(statuses[Permission.bluetoothScan]);
print(statuses[Permission.bluetoothConnect]);
print(status);
if (controller.bluetoothEnabled && if (controller.bluetoothEnabled &&
controller.authorizationStatusOk && controller.authorizationStatusOk &&
controller.locationServiceEnabled) { controller.locationServiceEnabled) {
@ -86,23 +103,6 @@ class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
print('SCANNING'); print('SCANNING');
//controller.startScanning(); //controller.startScanning();
var status = await Permission.bluetoothScan.status;
if (status.isDenied) {
print("IS DENIIIED");
// We didn't ask for permission yet or the permission has been denied before but not permanently.
}
// You can request multiple permissions at once.
Map<Permission, PermissionStatus> statuses = await [
Permission.bluetoothScan,
Permission.bluetoothConnect,
].request();
print(statuses[Permission.bluetoothScan]);
print(statuses[Permission.bluetoothConnect]);
print(status);
/*controller.startStream.listen((flag) { /*controller.startStream.listen((flag) {
if (flag == true) { if (flag == true) {
initScanBeacon(); initScanBeacon();
@ -156,35 +156,32 @@ class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
print(result.beacons.map((b) => b.macAddress)); print(result.beacons.map((b) => b.macAddress));
print(visitAppContext.beaconSections!.map((bb) => bb!.macAddress)); print(visitAppContext.beaconSections!.map((bb) => bb!.macAddress));
var beaconList = visitAppContext.beaconSections!.where((bs) => result.beacons.any((element) => element.macAddress == bs!.macAddress && element.accuracy < 15)); // less than 15 meter away var beaconList = visitAppContext.beaconSections!.where((bs) => result.beacons.any((element) => element.macAddress == bs!.macAddress && element.accuracy < meterToBeacon));
if(beaconList.isNotEmpty) {
// FILTER CONFIG
beaconList = beaconList.where((beacon) => beacon!.configurationId == visitAppContext.configuration!.id!);
}
if(beaconList.isNotEmpty && !modeDebugBeacon) {
// FILTER ALREADY READ
beaconList = beaconList.where((b) => !visitAppContext.readArticles.any((ra) => ra.id == b!.sectionId));
}
if(beaconList.isNotEmpty) if(beaconList.isNotEmpty)
{ {
print("GOT ONE BEACON THAT I KNOOOOOOOOW");
print(beaconList);
var milliLastTime = lastTimePopUpWasClosed == null ? 0 : lastTimePopUpWasClosed!.millisecondsSinceEpoch; var milliLastTime = lastTimePopUpWasClosed == null ? 0 : lastTimePopUpWasClosed!.millisecondsSinceEpoch;
var checkIfMoreThanSec = (DateTime.now().millisecondsSinceEpoch - milliLastTime) > timeBetweenBeaconPopUp; var checkIfMoreThanSec = (DateTime.now().millisecondsSinceEpoch - milliLastTime) > timeBetweenBeaconPopUp;
if(!_isDialogShowing && !visitAppContext.isArticleCurrentlyShown && checkIfMoreThanSec && visitAppContext.isScanningBeacons) { if(!_isDialogShowing && !visitAppContext.isArticleCurrentlyShown && checkIfMoreThanSec && visitAppContext.isScanningBeacons) {
print("CONFIGURATIOON"); _onBeaconFound(visitAppContext, beaconList.first);
print(visitAppContext.configuration!.id);
var beaconListConfig = beaconList.where((beacon) => beacon!.configurationId == visitAppContext.configuration!.id!);
print("AFTERRRR");
print(beaconListConfig);
_onBeaconFound(visitAppContext, beaconListConfig.first);
} else { } else {
print("Non pas possible d'afficher pour le moment"); print("Non pas possible d'afficher pour le moment");
} }
//print("BEFORE SNACKBAR");
/*ScaffoldMessenger.of(context).showSnackBar( /*ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('BEACON - ${result.beacons.first.macAddress} - ${result.beacons.first.accuracy} - ${result.beacons.first.proximity.name}'), backgroundColor: kBlue2), SnackBar(content: Text('BEACON - ${result.beacons.first.macAddress} - ${result.beacons.first.accuracy} - ${result.beacons.first.proximity.name}'), backgroundColor: kBlue2),
); );*/
print("AFTER SNACKBAR");*/
} }
} }
@ -209,7 +206,7 @@ class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
} }
}*/ }*/
int _compareParameters(Beacon a, Beacon b) { /*int _compareParameters(Beacon a, Beacon b) {
int compare = a.proximityUUID.compareTo(b.proximityUUID); int compare = a.proximityUUID.compareTo(b.proximityUUID);
if (compare == 0) { if (compare == 0) {
@ -221,7 +218,7 @@ class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
} }
return compare; return compare;
} }*/
@override @override
void didChangeAppLifecycleState(AppLifecycleState state) async { void didChangeAppLifecycleState(AppLifecycleState state) async {
@ -287,10 +284,6 @@ class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
@override @override
void dispose() { void dispose() {
print("DISPOSE VISIT PAGE -------------------------------");
/*listener = null;
controller.dispose();
WidgetsBinding.instance.removeObserver(this);*/
controller.pauseScanning(); controller.pauseScanning();
super.dispose(); super.dispose();
} }
@ -331,6 +324,26 @@ class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
child: FloatingActionButton( child: FloatingActionButton(
heroTag: "beacon", heroTag: "beacon",
onPressed: () async { onPressed: () async {
if(!controller.authorizationStatusOk) {
//await handleOpenLocationSettings();
Map<Permission, PermissionStatus> statuses = await [
Permission.bluetoothScan,
Permission.bluetoothConnect,
Permission.location,
].request();
print("STATUUSSSS ? ");
print(statuses[Permission.bluetoothScan]);
print(statuses[Permission.bluetoothConnect]);
print(statuses[Permission.location]);
var status = await Permission.bluetoothScan.status;
print(status);
}
if(!visitAppContext.isScanningBeacons) { if(!visitAppContext.isScanningBeacons) {
print("Start Scan"); print("Start Scan");
print(_streamRanging); print(_streamRanging);

View File

@ -9,7 +9,7 @@ import 'package:mymuseum_visitapp/Services/apiService.dart';
import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/app_context.dart';
class DownloadConfiguration { class DownloadConfiguration {
static Future<bool> downloadClicked(AppContext appContext, ConfigurationDTO configuration) async { static Future<bool> download(AppContext appContext, ConfigurationDTO configuration) async {
print("COUCOUCOU IIIIINNNN"); print("COUCOUCOU IIIIINNNN");
// TODO ADD POPUP LANGUAGE SELECTION // TODO ADD POPUP LANGUAGE SELECTION

View File

@ -6,6 +6,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_beacon/flutter_beacon.dart'; import 'package:flutter_beacon/flutter_beacon.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:mymuseum_visitapp/Helpers/requirement_state_controller.dart'; import 'package:mymuseum_visitapp/Helpers/requirement_state_controller.dart';
import 'package:mymuseum_visitapp/Models/articleRead.dart';
import 'package:mymuseum_visitapp/Screens/Home/home.dart'; import 'package:mymuseum_visitapp/Screens/Home/home.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'Helpers/DatabaseHelper.dart'; import 'Helpers/DatabaseHelper.dart';
@ -23,9 +24,17 @@ void main() async {
if(localContext != null) { if(localContext != null) {
print("we've got an local db !"); print("we've got an local db !");
print(localContext); print(localContext);
List<ArticleRead> articleReadTest = List<ArticleRead>.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead));
localContext.readArticles = articleReadTest;
} else { } else {
localContext = VisitAppContext(language: "FR", id: "UserId_Init", instanceId: "633ee379d9405f32f166f047"); localContext = VisitAppContext(language: "FR", id: "UserId_Init", instanceId: "633ee379d9405f32f166f047");
DatabaseHelper.instance.insert(DatabaseTableType.main, localContext.toMap()); DatabaseHelper.instance.insert(DatabaseTableType.main, localContext.toMap());
List<ArticleRead> articleReadTest = List<ArticleRead>.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead));
localContext.readArticles = articleReadTest;
print(localContext.readArticles);
print("NO LOCAL DB !"); print("NO LOCAL DB !");
} }

View File

@ -14,7 +14,9 @@ List<Translation> translations = [
"pause": "Pause", "pause": "Pause",
"stop": "Arrêt", "stop": "Arrêt",
"open": "Ouvrir", "open": "Ouvrir",
"close": "Fermer" "close": "Fermer",
"downloadLanguage": "Sélectionner la langue de la visite",
"ok": "OK"
}), }),
Translation(language: "EN", data: { Translation(language: "EN", data: {
"visitTitle": "List of tours", "visitTitle": "List of tours",
@ -29,7 +31,9 @@ List<Translation> translations = [
"pause": "Pause", "pause": "Pause",
"stop": "Stop", "stop": "Stop",
"open": "Open", "open": "Open",
"close": "Close" "close": "Close",
"downloadLanguage": "Select the tour language",
"ok": "OK"
}), }),
Translation(language: "DE", data: { Translation(language: "DE", data: {
"visitTitle": "Liste der Touren", "visitTitle": "Liste der Touren",
@ -44,7 +48,9 @@ List<Translation> translations = [
"pause": "Pause", "pause": "Pause",
"stop": "Stopp", "stop": "Stopp",
"open": "Offen", "open": "Offen",
"close": "Schließen" "close": "Schließen",
"downloadLanguage": "Wählen Sie die Sprache des Besuchs aus",
"ok": "OK"
}), }),
Translation(language: "NL", data: { Translation(language: "NL", data: {
"visitTitle": "Lijst met rondleidingen", "visitTitle": "Lijst met rondleidingen",
@ -59,7 +65,9 @@ List<Translation> translations = [
"pause": "Pauze", "pause": "Pauze",
"stop": "Stop", "stop": "Stop",
"open": "Open", "open": "Open",
"close": "Sluiten" "close": "Sluiten",
"downloadLanguage": "Selecteer de taal van de tour",
"ok": "OK"
}), }),
Translation(language: "IT", data: { Translation(language: "IT", data: {
"visitTitle": "Elenco dei tour", "visitTitle": "Elenco dei tour",
@ -74,7 +82,9 @@ List<Translation> translations = [
"pause": "Pausa", "pause": "Pausa",
"stop": "Fermare", "stop": "Fermare",
"open": "Aprire", "open": "Aprire",
"close": "Chiudere" "close": "Chiudere",
"downloadLanguage": "Seleziona la lingua del tour",
"ok": "OK"
}), }),
Translation(language: "ES", data: { Translation(language: "ES", data: {
"visitTitle": "Lista de recorridos", "visitTitle": "Lista de recorridos",
@ -89,7 +99,9 @@ List<Translation> translations = [
"pause": "Pausa", "pause": "Pausa",
"stop": "Parada", "stop": "Parada",
"open": "Abrir", "open": "Abrir",
"close": "Cerca" "close": "Cerca",
"downloadLanguage": "Selecciona el idioma del tour",
"ok": "Ok"
}), }),
Translation(language: "PL", data: { Translation(language: "PL", data: {
"visitTitle": "Lista wycieczek", "visitTitle": "Lista wycieczek",
@ -104,7 +116,9 @@ List<Translation> translations = [
"pause": "Pauza", "pause": "Pauza",
"stop": "Stop", "stop": "Stop",
"open": "Otwarty", "open": "Otwarty",
"close": "Zamknąć" "close": "Zamknąć",
"downloadLanguage": "Wybierz język wycieczki",
"ok": "OK"
}), }),
Translation(language: "CN", data: { Translation(language: "CN", data: {
"visitTitle": "旅游清单", "visitTitle": "旅游清单",
@ -119,7 +133,9 @@ List<Translation> translations = [
"pause": "暫停", "pause": "暫停",
"stop": "停止", "stop": "停止",
"open": "打开", "open": "打开",
"close": "关闭" "close": "关闭",
"downloadLanguage": "选择游览语言",
"ok": "好的"
}), }),
Translation(language: "UK", data: { Translation(language: "UK", data: {
"visitTitle": "Список турів", "visitTitle": "Список турів",
@ -134,7 +150,9 @@ List<Translation> translations = [
"pause": "Пауза", "pause": "Пауза",
"stop": "Стоп", "stop": "Стоп",
"open": "ВІДЧИНЕНО", "open": "ВІДЧИНЕНО",
"close": "Закрити" "close": "Закрити",
"downloadLanguage": "Виберіть мову туру",
"ok": "В порядку"
}), }),
Translation(language: "AR", data: { Translation(language: "AR", data: {
"visitTitle": "قائمة الجولات", "visitTitle": "قائمة الجولات",
@ -149,6 +167,8 @@ List<Translation> translations = [
"pause": "وقفة", "pause": "وقفة",
"stop": "قف", "stop": "قف",
"open": "يفتح", "open": "يفتح",
"close": "يغلق" "close": "يغلق",
"downloadLanguage": "حدد لغة الجولة",
"ok": "نعم"
}), }),
]; ];