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