Merge branch 'master' into othmane6
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
commit
1eb9d648e9
After Width: | Height: | Size: 6.6 KiB |
@ -0,0 +1,70 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:smartfit_app_mobile/common/colo_extension.dart';
|
||||||
|
import 'package:smartfit_app_mobile/main.dart';
|
||||||
|
|
||||||
|
class ProfileSwitch extends StatefulWidget {
|
||||||
|
final String title;
|
||||||
|
final String description;
|
||||||
|
final String iconFilename;
|
||||||
|
|
||||||
|
const ProfileSwitch(this.title, this.description, this.iconFilename,
|
||||||
|
{super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<ProfileSwitch> createState() => _ProfileSwitchState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ProfileSwitchState extends State<ProfileSwitch> {
|
||||||
|
bool switchValue = localDB.getSaveLocally();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: TColor.white,
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
boxShadow: const [BoxShadow(color: Colors.black12, blurRadius: 2)]),
|
||||||
|
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||||
|
Text(
|
||||||
|
widget.title,
|
||||||
|
style: TextStyle(
|
||||||
|
color: TColor.black,
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w700,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 30,
|
||||||
|
child:
|
||||||
|
Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
|
||||||
|
Image.asset("assets/img/${widget.iconFilename}",
|
||||||
|
height: 28, width: 28, fit: BoxFit.contain),
|
||||||
|
const SizedBox(
|
||||||
|
width: 15,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
widget.description,
|
||||||
|
style: TextStyle(
|
||||||
|
color: TColor.black,
|
||||||
|
fontSize: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Switch(
|
||||||
|
value: switchValue,
|
||||||
|
activeColor: Colors.orange,
|
||||||
|
onChanged: (bool value) {
|
||||||
|
setState(() {
|
||||||
|
switchValue = value;
|
||||||
|
localDB.setSaveLocally(switchValue);
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
]))
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:path/path.dart' as p;
|
||||||
|
import "package:path_provider/path_provider.dart";
|
||||||
|
import 'package:smartfit_app_mobile/main.dart';
|
||||||
|
|
||||||
|
class ActivitySaver {
|
||||||
|
String saveDirectory = "activities";
|
||||||
|
late final Directory applicationDocumentsDir;
|
||||||
|
|
||||||
|
ActivitySaver._create(this.applicationDocumentsDir);
|
||||||
|
|
||||||
|
Uint8List getActivity(String uuid) {
|
||||||
|
String filename = localDB.getActivityFilenameByUuid(uuid);
|
||||||
|
|
||||||
|
final file =
|
||||||
|
File(p.join(applicationDocumentsDir.path, saveDirectory, filename));
|
||||||
|
return file.readAsBytesSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> saveActivity(Uint8List activityFile, String filename) async {
|
||||||
|
stdout.write("Creating activity file...\n");
|
||||||
|
final file = await File(
|
||||||
|
p.join(applicationDocumentsDir.path, saveDirectory, filename))
|
||||||
|
.create(recursive: true); // To create dir if not exists
|
||||||
|
file.writeAsBytesSync(activityFile);
|
||||||
|
stdout.write("Activity file created\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteActivity(String uuid) {
|
||||||
|
String filename = localDB.getActivityFilenameByUuid(uuid);
|
||||||
|
final file =
|
||||||
|
File(p.join(applicationDocumentsDir.path, saveDirectory, filename));
|
||||||
|
file.deleteSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<ActivitySaver> create() async {
|
||||||
|
stdout.write("Activity Saver: Created\n");
|
||||||
|
final appDir = await getApplicationDocumentsDirectory();
|
||||||
|
return ActivitySaver._create(appDir);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
|
class Helper {
|
||||||
|
static bool isPlatformWeb() {
|
||||||
|
if (kIsWeb) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
import 'package:smartfit_app_mobile/modele/activity.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/user.dart';
|
||||||
|
|
||||||
|
class DbDummy implements DbImpl {
|
||||||
|
DbDummy._create();
|
||||||
|
DbDummy();
|
||||||
|
@override
|
||||||
|
Future<DbDummy> create() async {
|
||||||
|
return DbDummy._create();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> init() {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==== USER ====
|
||||||
|
@override
|
||||||
|
void addUser(String username, String email, String token) {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
User getUser() {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool hasUser() {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void deleteUser() {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setUserMail(String email) {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setUserName(String username) {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setUserToken(String token) {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==== ACTIVITY ====
|
||||||
|
@override
|
||||||
|
void addActivity(String uuid, String filename, String category, String info) {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void removeActivity(String uuid) {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void removeAllActivities() {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String getActivityFilenameByUuid(String uuid) {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<ActivityOfUser> getAllActivities() {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==== CONFIG ====
|
||||||
|
@override
|
||||||
|
void initConfig() {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setSaveLocally(bool saveLocally) {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool getSaveLocally() {
|
||||||
|
throw Exception();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
import 'package:smartfit_app_mobile/modele/user.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/activity.dart';
|
||||||
|
|
||||||
|
abstract class DbImpl {
|
||||||
|
DbImpl._create();
|
||||||
|
|
||||||
|
Future<DbImpl> create();
|
||||||
|
|
||||||
|
Future<void> init();
|
||||||
|
|
||||||
|
// ==== USER ====
|
||||||
|
void addUser(String username, String email, String token);
|
||||||
|
User getUser();
|
||||||
|
bool hasUser();
|
||||||
|
void deleteUser();
|
||||||
|
void setUserMail(String email);
|
||||||
|
void setUserName(String username);
|
||||||
|
void setUserToken(String token);
|
||||||
|
|
||||||
|
// ==== ACTIVITY ====
|
||||||
|
void addActivity(String uuid, String filename, String category, String info);
|
||||||
|
void removeActivity(String uuid);
|
||||||
|
void removeAllActivities();
|
||||||
|
String getActivityFilenameByUuid(String uuid);
|
||||||
|
List<ActivityOfUser> getAllActivities();
|
||||||
|
|
||||||
|
// ==== CONFIG ====
|
||||||
|
void initConfig();
|
||||||
|
void setSaveLocally(bool saveLocally);
|
||||||
|
bool getSaveLocally();
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/local_db/objectbox.dart';
|
||||||
|
|
||||||
|
DbImpl getDbImpl() {
|
||||||
|
DbImpl db = ObjectBox();
|
||||||
|
return db;
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/local_db/db_dummy.dart';
|
||||||
|
|
||||||
|
DbImpl getDbImpl() {
|
||||||
|
DbImpl db = DbDummy();
|
||||||
|
return db;
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
import 'package:objectbox/objectbox.dart';
|
||||||
|
|
||||||
|
@Entity()
|
||||||
|
class User {
|
||||||
|
@Id()
|
||||||
|
int id = 0;
|
||||||
|
String username;
|
||||||
|
String email;
|
||||||
|
String token;
|
||||||
|
|
||||||
|
User(this.id, this.username, this.email, this.token);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity()
|
||||||
|
class Activity {
|
||||||
|
int id;
|
||||||
|
@Unique()
|
||||||
|
String uuid;
|
||||||
|
String filename;
|
||||||
|
String category;
|
||||||
|
String info;
|
||||||
|
|
||||||
|
Activity(this.id, this.uuid, this.filename, this.category, this.info);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity()
|
||||||
|
class Config {
|
||||||
|
@Id()
|
||||||
|
int id = 0;
|
||||||
|
bool saveLocally;
|
||||||
|
|
||||||
|
Config(this.id, this.saveLocally);
|
||||||
|
}
|
@ -0,0 +1,156 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:smartfit_app_mobile/modele/user.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/activity.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart';
|
||||||
|
import 'package:smartfit_app_mobile/objectbox.g.dart';
|
||||||
|
import 'package:path/path.dart' as p;
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/local_db/model.dart' as db;
|
||||||
|
import 'package:smartfit_app_mobile/modele/local_db/db_impl.dart';
|
||||||
|
|
||||||
|
class ObjectBox implements DbImpl {
|
||||||
|
late final Store store;
|
||||||
|
late final Box userBox;
|
||||||
|
late final Box activityBox;
|
||||||
|
late final Box configBox;
|
||||||
|
late final Directory applicationDocumentDir;
|
||||||
|
|
||||||
|
ObjectBox._create(this.store);
|
||||||
|
|
||||||
|
ObjectBox();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<ObjectBox> create() async {
|
||||||
|
final docsDir = await getApplicationDocumentsDirectory();
|
||||||
|
final store = await openStore(directory: p.join(docsDir.path, "database"));
|
||||||
|
return ObjectBox._create(store);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> init() async {
|
||||||
|
applicationDocumentDir = await getApplicationDocumentsDirectory();
|
||||||
|
userBox = store.box<db.User>();
|
||||||
|
activityBox = store.box<db.Activity>();
|
||||||
|
configBox = store.box<db.Config>();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== USER =====
|
||||||
|
@override
|
||||||
|
bool hasUser() {
|
||||||
|
return !userBox.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
User getUser() {
|
||||||
|
db.User userRes = userBox.get(1);
|
||||||
|
|
||||||
|
return User.create(userRes.username, userRes.email, userRes.token);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setUserMail(String email) {
|
||||||
|
db.User user = userBox.get(1);
|
||||||
|
user.email = email;
|
||||||
|
userBox.put(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setUserName(String username) {
|
||||||
|
db.User user = userBox.get(1);
|
||||||
|
user.username = username;
|
||||||
|
userBox.put(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setUserToken(String token) {
|
||||||
|
db.User user = userBox.get(1);
|
||||||
|
user.token = token;
|
||||||
|
userBox.put(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void deleteUser() {
|
||||||
|
userBox.removeAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void addUser(String username, String email, String token) {
|
||||||
|
userBox.put(db.User(0, username, email, token));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== Activity =====
|
||||||
|
@override
|
||||||
|
void addActivity(String uuid, String filename, String category, String info) {
|
||||||
|
db.Activity act =
|
||||||
|
db.Activity(0, uuid, filename, category, jsonEncode(info));
|
||||||
|
|
||||||
|
try {
|
||||||
|
activityBox.put(act);
|
||||||
|
} on ObjectBoxException {
|
||||||
|
print("Activity already exists");
|
||||||
|
} catch (e) {
|
||||||
|
print("Unknown exception");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: try catch
|
||||||
|
@override
|
||||||
|
void removeActivity(String uuid) {
|
||||||
|
final Query query = activityBox.query(Activity_.uuid.equals(uuid)).build();
|
||||||
|
final db.Activity act = query.findFirst();
|
||||||
|
|
||||||
|
activityBox.remove(act.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String getActivityFilenameByUuid(String uuid) {
|
||||||
|
final Query query = activityBox.query(Activity_.uuid.equals(uuid)).build();
|
||||||
|
final db.Activity act = query.findFirst();
|
||||||
|
|
||||||
|
return act.filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void removeAllActivities() {
|
||||||
|
activityBox.removeAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== FIT Files =====
|
||||||
|
@override
|
||||||
|
List<ActivityOfUser> getAllActivities() {
|
||||||
|
List<dynamic> activityDBList = activityBox.getAll();
|
||||||
|
List<ActivityOfUser> userActivityList = List.empty(growable: true);
|
||||||
|
|
||||||
|
for (db.Activity act in activityDBList) {
|
||||||
|
ActivityInfo actInfo = ActivityInfo.fromJson(jsonDecode(act.info));
|
||||||
|
userActivityList
|
||||||
|
.add(ActivityOfUser(actInfo, act.category, act.uuid, act.filename));
|
||||||
|
}
|
||||||
|
|
||||||
|
return userActivityList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== Config =====
|
||||||
|
@override
|
||||||
|
void initConfig() {
|
||||||
|
db.Config config = db.Config(0, true);
|
||||||
|
configBox.put(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setSaveLocally(bool saveLocally) {
|
||||||
|
db.Config config = configBox.get(1);
|
||||||
|
config.saveLocally = saveLocally;
|
||||||
|
configBox.put(config);
|
||||||
|
stdout.write("(Config) setSaveLocally: $saveLocally\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool getSaveLocally() {
|
||||||
|
db.Config config = configBox.get(1);
|
||||||
|
stdout.write("(Config) getSaveLocally: ${config.saveLocally}\n");
|
||||||
|
return config.saveLocally;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'package:smartfit_app_mobile/modele/activity.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/activity_saver.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
|
||||||
|
import 'package:tuple/tuple.dart';
|
||||||
|
import 'package:smartfit_app_mobile/modele/user.dart';
|
||||||
|
import 'dart:io';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
import 'package:smartfit_app_mobile/main.dart';
|
||||||
|
|
||||||
|
class RequestLocal implements IDataStrategy {
|
||||||
|
@override
|
||||||
|
Future<Tuple2> getInfoUser(String token) async {
|
||||||
|
final User user = localDB.getUser();
|
||||||
|
Map<String, String> json = {"email": user.email, "username": user.username};
|
||||||
|
return Tuple2(true, jsonEncode(json));
|
||||||
|
}
|
||||||
|
|
||||||
|
// need to save file on request_api.upload() beforehand.
|
||||||
|
@override
|
||||||
|
Future<Tuple2> getFile(String token, String fileUuid) async {
|
||||||
|
ActivitySaver actSaver = await ActivitySaver.create();
|
||||||
|
Uint8List fileBytes = actSaver.getActivity(fileUuid);
|
||||||
|
|
||||||
|
return Tuple2(true, fileBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Tuple2> getFiles(String token) async {
|
||||||
|
final List<ActivityOfUser> activities = localDB.getAllActivities();
|
||||||
|
List<Map<String, dynamic>> jsonList = List.empty(growable: true);
|
||||||
|
|
||||||
|
for (ActivityOfUser act in activities) {
|
||||||
|
Map<String, dynamic> json = {
|
||||||
|
"uuid": act.fileUuid,
|
||||||
|
"filename": act.nameFile,
|
||||||
|
"category": act.category,
|
||||||
|
"info": act.activityInfo
|
||||||
|
};
|
||||||
|
jsonList.add(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Tuple2(true, jsonEncode(activities));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Tuple2<bool, String>> modifAttribut(
|
||||||
|
String token, String nameAttribut, String newValue) async {
|
||||||
|
return const Tuple2(false, "not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Tuple2<bool, String>> postUser(
|
||||||
|
String email, String hash, String username) async {
|
||||||
|
return const Tuple2(false, "not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Tuple2<bool, String>> deleteUser(String token) async {
|
||||||
|
return const Tuple2(false, "not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Tuple2<bool, String>> connexion(String email, String hash) async {
|
||||||
|
return const Tuple2(false, "not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Tuple2<bool, String>> uploadFile(String token, File file) async {
|
||||||
|
return const Tuple2(false, "not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Tuple2<bool, String>> uploadFileByte(
|
||||||
|
String token,
|
||||||
|
Uint8List contentFile,
|
||||||
|
String nameFile,
|
||||||
|
String category,
|
||||||
|
DateTime date,
|
||||||
|
ActivityInfo activityInfo) async {
|
||||||
|
return const Tuple2(false, "not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> deleteFile(String token, String fileUuid) async {
|
||||||
|
throw Exception("Not Implemented");
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +0,0 @@
|
|||||||
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
|
|
||||||
import 'package:smartfit_app_mobile/modele/api/request_api.dart';
|
|
||||||
|
|
||||||
class ProfileUtil {
|
|
||||||
final IDataStrategy _dataStrategy = RequestApi();
|
|
||||||
|
|
||||||
void modifyDataUser(String token, String attribut, String newUsername) {
|
|
||||||
_dataStrategy.modifAttribut(token, attribut, newUsername);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in new issue