Première version preeeeeesque fonctionelle du programme.

This commit is contained in:
Samy Avrillon 2021-12-10 19:45:20 +01:00
parent 16916f624e
commit 4a851f73d4
37 changed files with 2469 additions and 61 deletions

View File

@ -6,7 +6,7 @@ android {
compileSdk 31
defaultConfig {
applicationId "com.bernard.calchulator"
applicationId "com.bernard.emorph"
minSdk 21
targetSdk 31
versionCode 1
@ -27,6 +27,7 @@ android {
}
buildFeatures {
viewBinding true
dataBinding true
}
}
@ -34,10 +35,9 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'androidx.navigation:navigation-fragment:2.3.5'
implementation 'androidx.navigation:navigation-ui:2.3.5'
implementation 'com.jjoe64:graphview:4.2.2'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

View File

@ -1,26 +0,0 @@
package com.bernard.calchulator;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.bernard.calchulator", appContext.getPackageName());
}
}

View File

@ -1,19 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bernard.calchulator">
package="com.bernard.emorph">
<application
android:name=".EMorphApplication"
android:allowBackup="true"
android:fullBackupOnly="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.CalcHulator">
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.CalcHulator.NoActionBar">
android:name=".activities.GraphActivity"
android:exported="false" />
<activity
android:name=".activities.PrepareMeasureActivity"
android:exported="false" />
<activity
android:name=".activities.NewMeasureOnSubjectActivity"
android:exported="false" />
<activity
android:name=".activities.NewMeasureActivity"
android:exported="false" />
<activity
android:name=".activities.EditSubjectListActivity"
android:exported="false" />
<activity
android:name=".activities.NewGroupActivity"
android:exported="false" />
<activity
android:name=".activities.GroupListActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -0,0 +1,923 @@
package com.bernard.emorph;
import android.app.Application;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import com.bernard.emorph.model.Group;
import com.bernard.emorph.model.MeasureOnSubject;
import com.bernard.emorph.model.Subject;
import java.util.ArrayList;
import java.util.List;
public class EMorphApplication extends Application {
public static final String APP_PREFERENCES_FILE = "emorph.prefs";
public static final String DB_FILE = "app.db";
SQLiteDatabase db;
@Override
public void onCreate() {
super.onCreate();
EMorphDbHelper dbHelper = new EMorphDbHelper(getApplicationContext());
db = dbHelper.getWritableDatabase();
//putInitialData(db);
}
@Override
public void onTerminate() {
super.onTerminate();
db.close();
}
public List<Group> listGroups(){
Cursor dbResult = db.query("groups",new String[]{"ID","name"},
null,null, null, null, null);
ArrayList<Group> list = new ArrayList<>();
dbResult.moveToFirst();
while(!dbResult.isAfterLast()) {
list.add(new Group(dbResult.getInt(0), dbResult.getString(1)));
dbResult.moveToNext();
}
dbResult.close();
return list;
}
public List<Subject> getSubjects(long groupID){
Cursor dbResult = db.query("subjects",new String[]{"ID","name","dateNaissance"},
"groupID=?",new String[]{Long.toString(groupID)}, null, null, null);
ArrayList<Subject> list = new ArrayList<>();
dbResult.moveToFirst();
while(!dbResult.isAfterLast()) {
list.add(new Subject(dbResult.getInt(0), dbResult.getString(1), dbResult.getInt(2)));
dbResult.moveToNext();
}
dbResult.close();
return list;
}
public long newGroup(String name){
ContentValues cv = new ContentValues();
cv.put("name", name);
return db.insert("groups", null, cv);
}
public void removeSubject(long subjectID) {
db.delete("subjectID","ID=?", new String[]{Long.toString(subjectID)});
}
public void renameSubject(long subjectID, String newName) {
ContentValues cv = new ContentValues();
cv.put("name", newName);
db.update("subjectID", cv,"ID=?", new String[]{Long.toString(subjectID)});
}
public long newSubject(String newName, int dateNaissance) {
ContentValues cv = new ContentValues();
cv.put("name", newName);
cv.put("dateNaissance", dateNaissance);
return db.insert("subjects", null, cv);
}
public boolean hasData(long groupID){
Cursor result = db.query("measures",new String[]{"ID"},"groupID=?", new String[]{Long.toString(groupID)},null,null,null);
boolean out = result.getCount()>0;
result.close();
return out;
}
public String getGroupName(long groupID) {
Cursor result = db.query("groups",new String[]{"name"},"ID=?", new String[]{Long.toString(groupID)},null,null,null);
if(result.getCount()==0)return null;
result.moveToFirst();
String out = result.getString(0);
result.close();
return out;
}
public String getSubjectName(long subjectId) {
Cursor result = db.query("subjects",new String[]{"name"},"ID=?", new String[]{Long.toString(subjectId)},null,null,null);
if(result.getCount()==0)return null;
result.moveToFirst();
String out = result.getString(0);
result.close();
return out;
}
public long newMeasure(long groupMeasured){
ContentValues values = new ContentValues();
values.put("groupID", groupMeasured);
values.put("time", System.currentTimeMillis()/1000);
return db.insert("measures", null, values);
}
public MeasureOnSubject newMOS(long measureID,
long subjectId,
float abdomen,
float bras,
float epaules,
float taille,
float cuisse,
float cheville,
float avantBras) {
ContentValues values = new ContentValues();
values.put("measureID", measureID);
values.put("subjectID", subjectId);
values.put("circAbdomen", abdomen);
values.put("circBras", bras);
values.put("circEpaules", epaules);
values.put("circTaille", taille);
values.put("circCuisse", cuisse);
values.put("circCheville", cheville);
values.put("circAvantBras", avantBras);
long newId = db.insert("measureOnSubject", null, values);
return new MeasureOnSubject(newId, subjectId, abdomen, bras, epaules, taille, cuisse, cheville, avantBras);
}
public static class EMorphDbHelper extends SQLiteOpenHelper {
// If you change the database schema, you must increment the database version.
public static final int DATABASE_VERSION = 2;
// ,[0-9.]+,[0-9]+,[A-Za-zïçéèëà- ]+,[0-9]+,"[0-9,]+",
public static final String SQL_CREATE_GROUPS =
"CREATE TABLE `groups` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL UNIQUE); ";
public static final String SQL_CREATE_SUBJECTS =
"CREATE TABLE `subjects` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
"`name` TEXT NOT NULL UNIQUE,`groupID` INTEGER NOT NULL,`dateNaissance` INTEGER);";
public static final String SQL_CREATE_MEASURES =
"CREATE TABLE `measures` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
"`groupID` INTEGER NOT NULL,`time` INTEGER NOT NULL);";
public static final String SQL_CREATE_MOS =
"CREATE TABLE `measuresOnSubjects` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,`measureID` INTEGER NOT NULL," +
"`subjectID` INTEGER NOT NULL,`circAbdomen` REAL,`circBras` REAL,`circEpaules` REAL," +
"`circTaille` REAL,`circCuisse` REAL,`circCheville` REAL,`circAvantBras` REAL);";
public EMorphDbHelper(Context context) {
super(context, DB_FILE, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
Log.v("EMorphDbHelper", "Creating the database");
db.execSQL(SQL_CREATE_GROUPS);
db.execSQL(SQL_CREATE_SUBJECTS);
db.execSQL(SQL_CREATE_MEASURES);
db.execSQL(SQL_CREATE_MOS);
putInitialData(db);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("DBUpgrade", "I don't know how to upgrade the DB, it should work i guess ...");
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
public static void putInitialData(SQLiteDatabase db){
for (double[] testDatum : testData) {
ContentValues cv = new ContentValues();
cv.put("ID", testDatum[0]);
cv.put("measureID", testDatum[1]);
cv.put("subjectID", testDatum[2]);
cv.put("circAbdomen", testDatum[3]);
cv.put("circBras", testDatum[4]);
cv.put("circEpaules", testDatum[5]);
cv.put("circTaille", testDatum[6]);
cv.put("circCuisse", testDatum[7]);
cv.put("circCheville", testDatum[8]);
cv.put("circAvantBras", testDatum[9]);
db.insert("measuresOnSubjects", null, cv);
}
for (Object[] testDatum : testData2) {
ContentValues cv = new ContentValues();
cv.put("ID", (Integer)testDatum[0]);
cv.put("name", (String)testDatum[1]);
cv.put("groupID", (Integer)testDatum[2]);
cv.put("dateNaissance", (Integer)testDatum[3]);
db.insert("subjects", null, cv);
}
for(int i=1;i<=15;i++){
ContentValues cv = new ContentValues();
cv.put("ID", i);
cv.put("name", "Groupe num "+i);
db.insert("groups", null, cv);
}
for(int i=1;i<=15;i++){
ContentValues cv = new ContentValues();
cv.put("ID", i);
cv.put("groupID", i);
cv.put("time", System.currentTimeMillis()/1000);
db.insert("measures", null, cv);
}
}
public static final double[][] testData = {{1,1,1,26.4,64.5,28.5,33.3,108,86.5,92.3},{
2,1,2,27.7,60.4,27.8,28.9,100.9,86.6,91.3},{
3,1,3,26.6,64.5,27.3,31,111,90.2,98.5},{
4,1,4,23.2,54,24.7,25.3,103.1,72.6,75.5},{
5,1,5,25.6,54.3,27.8,29.5,105.5,75.5,81.5},{
6,1,6,27,65.7,28.8,32.6,105.5,87.9,90.8},{
7,1,7,27.2,59,26.8,29,109,83.7,90.5},{
8,1,8,24.3,55.7,25,28.7,100.5,77.5,82},{
9,1,9,26,56.6,26.4,28.4,111.5,78.8,84.2},{
10,1,10,28.8,68,30.5,36.4,117,97.8,106.4},{
11,1,11,28.5,71.5,28.6,33.4,99.8,95.8,104.6},{
12,1,12,25.8,54.3,26.3,27.8,106.5,74.5,76},{
13,1,13,28.6,68,29,35.6,112.1,96.7,103.1},{
14,1,14,27,64,26.7,30.9,106.6,96.8,99.2},{
15,1,15,27.6,74.4,29.5,34.5,113,113.5,117.8},{
16,1,16,26.8,60.9,28.8,33.2,111.2,86.6,90.1},{
17,1,17,27.3,63.2,26.9,29.4,97.6,89,94.3},{
18,1,18,25.3,54.8,24.4,25.6,99.2,77.3,78.7},{
19,1,19,24.9,54.1,25,27.8,97,73.7,79.4},{
20,1,20,27.2,60.4,27.3,29,110.4,81,86},{
21,1,21,25,59.6,24.5,27.5,98.2,82.3,89},{
22,1,22,26.7,63.1,26.6,32.5,99.5,81.8,90.4},{
23,1,23,26.5,56.5,28,30,113.8,73.5,79},{
24,1,24,25.2,59.8,24.8,28.5,95.5,81.5,84.5},{
25,1,25,28.2,62.5,26.6,29.5,102,80.9,84.5},{
26,1,26,25.2,53.8,26.2,27.1,104.8,72.7,78.5},{
27,1,27,26.6,56.1,26.5,27.7,102,71,75.6},{
28,1,28,25.8,63.3,28,28.8,108.9,81.5,84},{
29,1,29,28.7,65.5,28.8,32.8,111.5,88.4,102.1},{
30,1,30,24.7,56,24.4,26.5,102.5,73,82.7},{
31,1,31,26.5,65,27.2,31.3,100,94.5,97.8},{
32,1,32,26.9,61.7,29.3,33.6,119,80,83},{
33,1,33,27.5,62,27.4,29.1,120,89.9,98},{
34,1,34,27,53,26.4,27,107.5,70,73.1},{
35,1,35,25.1,52.3,25.6,24.9,100.1,72.7,80.1},{
36,1,36,27.2,63.2,28.2,32.8,104.6,85,87.8},{
37,1,37,29.9,78.2,30.3,34.9,110.2,116.3,115.4},{
38,1,38,25,58.4,27,30.2,98.7,92.3,97},{
39,1,39,35.7,66.8,26.4,29.2,102.2,97.2,106.7},{
40,1,40,24.1,56.6,24.2,26.5,98.6,84,87.9},{
41,1,41,25.5,65,27,30,103,88.5,89.8},{
42,1,42,25.2,54.5,24.4,26.8,96,71.6,77},{
43,1,43,27,60.1,26.3,28.2,96,84.8,89},{
44,1,44,28.2,56,28.5,28.6,108,73.5,77},{
45,1,45,25,69.4,30.4,35.7,117.8,96.5,106.5},{
46,1,46,27.1,68.9,31.4,33.3,117.9,98.4,101.4},{
47,1,47,24.8,58.9,26.3,27,97.5,74.8,80},{
48,1,48,26.9,50,24.5,24.4,103,74,79.5},{
49,2,49,27.8,51.3,25.3,26.5,105.5,72.9,78.2},{
50,2,50,26.6,64.2,26.5,32.4,102.6,84.8,92.3},{
51,2,51,27.4,63.2,28.7,31,110,93,98.5},{
52,2,52,27.4,71.1,28.9,31,112,94.5,105},{
53,2,53,26.7,64.3,28.1,31.9,104.8,89.7,94.5},{
54,2,54,26.7,61.3,29.5,32.6,111.6,87.6,93},{
55,2,55,28.3,74.8,28.7,35.6,124.6,114,121},{
56,2,56,26,71.4,30.6,33.9,107.1,100.3,105.2},{
57,2,57,26.8,74,29.2,33,116.2,98.5,109.5},{
58,2,58,27.3,63.6,29.9,34.5,117.4,90.2,98.1},{
59,2,59,27.3,63.8,27.8,30.7,101.6,83.6,87.9},{
60,2,60,28.6,66.6,29.1,32.2,109,94,100.7},{
61,2,61,27.7,53.1,26,26,102.6,72.5,76.5},{
62,2,62,28,61,27.5,30.8,110.2,93.5,100.7},{
63,2,63,27.5,62.8,28.8,31.3,110,78.6,79.4},{
64,2,64,24.5,51.5,24,24.8,96,66.5,72.2},{
65,2,65,25.5,61.5,25.6,29.3,104.6,85,92},{
66,2,66,27,57.9,24.6,26.5,101.3,82.9,88.6},{
67,2,67,26.2,54.1,24.8,25.4,95.7,70.2,79.5},{
68,2,68,25.8,56.6,28.2,28.7,109.5,74,78.4},{
69,2,69,28.2,68.6,31.3,34.7,110.5,93.7,102.7},{
70,2,70,27.3,61.8,29.8,31.2,108.6,82.6,88.4},{
71,2,71,31.2,67.6,31.6,33.1,119.2,97.1,100.7},{
72,3,72,25.9,47.8,23.7,22.8,92.7,69.3,76.8},{
73,3,73,26.2,48.9,24,24.5,92,68,73.8},{
74,3,74,25.8,51.5,23.8,25.7,99.4,71,75.3},{
75,3,75,27.7,54.7,23.7,24.9,103,73.4,79.2},{
76,3,76,27.6,67,29.2,31.7,108.4,92,97.9},{
77,3,77,25.1,63.4,26.9,29.1,109.7,81.4,83},{
78,3,78,24.4,59.8,26.1,28.4,104,81,83.5},{
79,3,79,29.8,63.2,28.5,32,111,88.2,96.5},{
80,3,80,28.1,66.4,28.1,34.7,103.5,104.7,109.5},{
81,3,81,24.8,47.9,24.8,22.5,101.7,70.5,73.2},{
82,3,82,27,51.8,25.8,26.5,103.5,74.4,78.1},{
83,3,83,28.7,66.8,28,31.5,108.4,92.9,99.1},{
84,3,84,26.2,65.7,26.8,30.2,100.4,86.2,91.5},{
85,3,85,26.3,60.8,27.3,29.6,103.2,92.2,96.7},{
86,3,86,26.5,54,24.5,25.3,99,76,81},{
87,4,87,27.5,60.8,27.7,30.9,106.6,78.2,86.1},{
88,4,88,27,65.5,29,31.3,113.5,86,94.5},{
89,4,89,27.9,63.4,25.6,30.6,101.7,87.3,99.1},{
90,4,90,27.5,59.3,28.1,31.3,105.9,83,89.8},{
91,4,91,28.7,76.3,30.8,33,118,111.5,118.6},{
92,4,92,27.5,53.7,25,26.5,98.7,70,77},{
93,4,93,28,55,26.5,27.2,102.2,77.7,83},{
94,5,94,26,68,27.7,32.6,110.2,106.5,110.7},{
95,5,95,28.8,70.4,29.2,34.1,99.3,101.7,105.3},{
96,5,96,26.5,50.8,24.5,25,100.5,70,76},{
97,5,97,27.6,66,28.5,34,106,104.5,110.8},{
98,5,98,27.4,55.3,25.5,27,100,74,83.2},{
99,5,99,23.5,40.5,22.2,21.5,87.8,63,66.8},{
100,5,100,27,68.8,26.9,31.9,106.7,103.5,113.2},{
101,5,101,28.3,58.1,26.6,29.8,107.5,81.4,88.4},{
102,5,102,25.3,67,28.5,31.9,105,93.4,104},{
103,5,103,24.3,50,25,25.2,102.5,74.1,74.5},{
104,5,104,25.2,56.4,25.7,29,108.5,76.8,81.1},{
105,5,105,25.5,57.5,23.6,27.4,89.5,79.9,86.1},{
106,5,106,26,57.2,24.9,29,103.5,91.4,98.4},{
107,5,107,25.8,53.3,25.5,25.8,93.5,74.6,81.3},{
108,5,108,26.3,66.5,27.1,28.6,112,97.6,107.3},{
109,5,109,25.2,58.7,24.8,28,94,83.8,89},{
110,5,110,27.1,80.3,30.8,36.6,113.7,102.7,113.2},{
111,5,111,25.6,64.5,25,29.3,104.4,87.3,97.3},{
112,5,112,25,49.1,24.2,24.3,93.2,71,73.2},{
113,5,113,24.8,60.5,27,30.5,105.2,85,92},{
114,5,114,25,63.8,27.5,31.3,104.1,84.5,87.2},{
115,5,115,24,50.7,24.8,25.2,98,76.3,83},{
116,5,116,26.4,55,25.9,27.5,99,69.2,74.5},{
117,5,117,28.7,60,26.3,28.8,102.3,83.5,89},{
118,5,118,26.2,57.4,25.3,26.5,105.3,76.6,82.3},{
119,5,119,25.6,57.1,25.8,28.9,91.7,79.4,89.3},{
120,5,120,26.3,57.2,25.6,31,100.5,85.5,89},{
121,5,121,28.6,60.5,27.9,29.5,108.8,80.5,88.9},{
122,6,122,26,58.3,26.5,30,102,85.5,90.4},{
123,6,123,26.9,63.4,27.7,32.7,106.7,85.3,89.6},{
124,6,124,24.7,58,25.4,27.9,93.3,80.1,85.6},{
125,6,125,26.5,58.5,27.7,29.2,104.4,78.3,85},{
126,6,126,26.8,62.5,27.9,32.9,109.8,89.7,95.4},{
127,6,127,27.1,63.7,27.1,30,98.7,79.6,88.5},{
128,6,128,26.9,52,25.7,25.5,102.7,72.2,76.3},{
129,7,129,27.9,54.5,26.4,26.5,104,76,80.2},{
130,7,130,25.4,54.5,26,28.5,99,74.7,83.7},{
131,7,131,26.9,58.6,26,27.5,108.7,75.5,86.5},{
132,7,132,25.9,57.3,25.6,26.4,98.8,89,89.7},{
133,7,133,25.3,70.9,27.8,32.2,106.3,97.8,103.2},{
134,7,134,25.4,56.4,25.4,26.5,97.5,80.8,88},{
135,7,135,27.2,66.8,25.5,29.3,106.3,92.4,103.5},{
136,7,136,23,52.3,23.5,25.5,91,75.5,82.2},{
137,7,137,24.6,57.5,25.1,27.1,93.2,74.7,80},{
138,7,138,24.7,54.3,25.8,27.3,92.7,69.5,72.2},{
139,7,139,25.6,45,23.5,23.1,97.6,69.9,73.6},{
140,7,140,27.4,59.8,25.6,30.3,100.3,88,94.2},{
141,7,141,23.3,45.2,20.7,20.3,83.5,63.6,66.7},{
142,7,142,27.1,58.3,26.4,29,100.1,77.6,84.1},{
143,7,143,27.7,60.5,27,30,100.2,86.3,90.1},{
144,7,144,28.2,62.9,26.4,29.3,103,85.2,91},{
145,7,145,27.7,49.5,25.7,27.5,93.4,80.2,85.6},{
146,7,146,26.2,59,27.2,28.7,102.2,82.2,90.5},{
147,7,147,24.2,50.7,24,25.2,86.7,76.7,83.2},{
148,7,148,23.9,45,21.8,21.9,95.7,64.6,70.8},{
149,7,149,27.1,54.3,26.1,26.8,98.2,74.5,78.9},{
150,7,150,25.5,46.6,23.2,25.4,89.7,71.7,76.6},{
151,7,151,26.6,54.3,25.5,27.4,90.5,73.7,77},{
152,7,152,25.7,48.5,23.8,25.3,92.5,75.7,80},{
153,7,153,27.3,64,25.7,29,95.7,88.8,95.3},{
154,7,154,27.4,49.2,23.3,25.2,89.1,76.2,80.2},{
155,7,155,22.7,47.1,23.5,23.4,93.2,69.3,68.4},{
156,7,156,27.5,49.8,24.9,25.1,98.3,68.2,77.6},{
157,7,157,27.3,62.9,27.1,30.7,103.2,94.2,97.9},{
158,7,158,25.7,49,24.8,23.7,92.2,68.4,72.2},{
159,7,159,25,53.2,25,27.9,91.5,74.6,83.7},{
160,7,160,26.9,50.5,24,26.6,93.5,68.7,72.9},{
161,7,161,26.5,58,25.5,27.9,96.8,78,84.2},{
162,7,162,23.7,43.4,20.9,21.5,88.1,63.5,63.7},{
163,7,163,25.2,43.7,21,21.6,85.8,65.5,67.6},{
164,7,164,24.6,53.6,23.7,24.4,79,70.2,73.2},{
165,7,165,26.8,51,26.1,27.1,96.7,77.8,86.8},{
166,8,166,24.2,47.3,23.5,22.3,95.7,66.4,68.9},{
167,8,167,26.1,59.5,26.2,27.2,92.2,80.1,84.7},{
168,8,168,23.3,47,23.6,24,77.6,63.3,68.2},{
169,8,169,20.8,45.4,20.5,21.3,86.3,63.3,69.1},{
170,8,170,28.4,59,27.7,21.7,94.3,89.5,96.7},{
171,8,171,25.2,53.7,24.7,26.4,95.8,76.5,83.1},{
172,8,172,22.6,38.2,19.8,19,74.1,58.4,51.1},{
173,8,173,25.2,52.6,25.5,27.2,92.6,80.1,85.6},{
174,8,174,24.5,50.5,25.4,25.9,88.8,71.7,73.7},{
175,8,175,24,41.1,21.2,20.6,80.2,65.1,63.5},{
176,8,176,21.1,44.5,21.6,20.1,82.7,63.1,65},{
177,8,177,26.2,54.1,23.6,25.8,87.5,76.9,82.3},{
178,8,178,26.1,50.7,24.9,27.3,92,83.9,90},{
179,8,179,21.5,47,21,21.7,80.5,63.5,66.2},{
180,8,180,24.3,56.5,25.2,26.3,95.8,86.1,89.8},{
181,8,181,26.9,54.7,25.9,27.4,101.7,82.3,91.5},{
182,8,182,19.5,39.2,19.1,19.5,79.1,59.3,58.7},{
183,8,183,24.2,42.7,20.9,20.9,81.7,63.7,63.8},{
184,8,184,25.6,60.2,26.1,28.7,93.9,76.4,85.2},{
185,8,185,24.5,44.6,21.5,21.2,83.7,63.3,67.3},{
186,8,186,23.7,40.1,20.1,20.1,78.1,59.9,64.8},{
187,8,187,21.2,44.5,20.6,20.8,78.5,61.7,62.7},{
188,9,188,24.9,54.2,24.6,25.6,86.6,82.7,88.4},{
189,9,189,23.3,44.5,22.9,22.1,76.2,61.8,64.6},{
190,9,190,22.1,44.6,22.1,23.4,83.3,69.9,72.5},{
191,9,191,23.9,44.7,23.3,22.4,84.6,68,67.9},{
192,9,192,24.1,51.2,24.9,28.3,90.5,81.9,86.7},{
193,9,193,23.2,48.9,22.7,23.6,82.5,62.5,67.8},{
194,9,194,24.6,50.5,24.2,26.5,92.5,70.8,76.7},{
195,9,195,24.8,51.4,22.5,23.1,96.5,70.1,71.6},{
196,9,196,23.7,44.2,21,21.4,84,62.1,70.3},{
197,9,197,24,49.5,22.9,22.8,91,69,69.6},{
198,9,198,28.2,57.9,26,27.2,97,76.7,83.3},{
199,9,199,23.8,48.7,22.5,22.3,86.5,65.5,71.6},{
200,9,200,25.4,63,25,28.3,93.9,82,89},{
201,9,201,26.5,53.8,25.5,26.6,96.6,73.5,77.2},{
202,9,202,24.2,54.3,23.6,26.4,87,69.8,74},{
203,9,203,22.6,43.9,20.5,19.9,82.5,63.5,64.4},{
204,9,204,25.4,26.8,24.7,27.1,91.3,75,77.3},{
205,9,205,24.3,55.9,24.5,25.8,96.9,72.9,80.9},{
206,9,206,24.9,61.7,23.9,28,91.6,76.4,92.3},{
207,9,207,23,51,21.8,24.4,87.5,71.4,75.6},{
208,9,208,22.2,48.6,21.1,24.3,82.3,63.9,67.6},{
209,9,209,27.5,71,29.6,32.8,109.2,101,107.1},{
210,9,210,26.8,55.4,24.7,25.4,100,74.5,81},{
211,9,211,24.4,56.1,23.9,26.3,85.8,76.5,85},{
212,9,212,23.1,58,23.5,27.7,92.3,79.6,89.8},{
213,9,213,20.2,50.3,23.7,24,91.3,71,73.5},{
214,10,214,23,36.5,21.3,19.7,80.2,60.1,65},{
215,10,215,23.2,47.2,23.3,24.7,84.8,70.2,73.8},{
216,10,216,24.5,54.3,25.2,29.5,94.9,80.9,88.9},{
217,10,217,24.7,46.9,22.9,26.4,69.4,67.7,75.7},{
218,10,218,25,51.5,22.7,23.4,88.5,69.4,76.8},{
219,10,219,24.2,50.4,22.5,22.2,92.3,70.3,75},{
220,10,220,24.1,49.1,23.7,26.6,87,74.4,83.1},{
221,10,221,23.1,49.9,23.9,25.9,87.8,78.5,85.1},{
222,10,222,24.6,52.7,23,23.2,86.2,69.2,70.4},{
223,10,223,22.6,49,24,25.6,94.4,74.1,78.2},{
224,10,224,21.7,51.2,22.5,23.5,86.6,68.3,71.1},{
225,10,225,21.5,36.5,18.5,19,77.4,61.7,63.7},{
226,10,226,23.6,51.8,23.2,25.9,84.5,74.7,79},{
227,10,227,21.6,42.1,19.4,18.6,80.4,62.8,68.8},{
228,10,228,23.5,50.9,21.9,24.3,80.5,75.6,79.7},{
229,10,229,24.8,46.4,22.4,22.6,80.6,58.8,67},{
230,10,230,26.8,61,26.1,30.2,93.2,84.2,92.9},{
231,10,231,23.6,46.1,21.9,21,81.2,63.5,63.8},{
232,10,232,25.3,50,22,23,89.5,77.7,81.3},{
233,10,233,24.8,48.7,23.7,24.9,88.2,66.5,72.7},{
234,10,234,24.2,60.2,25.5,30.7,91.9,85,89.1},{
235,10,235,22.4,40.7,20,20.2,84.7,63.9,65.7},{
236,10,236,23.8,52.1,21.7,24.9,88.5,69.8,75.8},{
237,11,237,22.1,47,21.2,22,78.4,68.4,72.3},{
238,11,238,22.1,54.5,24.2,26,89.6,77.6,83.1},{
239,11,239,23.7,43.6,20.7,20.2,82,63.8,64.5},{
240,11,240,22.3,47.8,22,23.3,85.1,69.2,70.3},{
241,11,241,24.5,57.3,23.6,25.9,89.4,79.6,82.5},{
242,11,242,22.3,47.8,22,23.3,85.1,69.2,70.3},{
243,12,243,20.6,46.5,20.9,23,79.6,64.5,64.9},{
244,12,244,20.5,39.1,18.4,18.4,77,57,60.5},{
245,12,245,23.3,51.3,21.2,24.7,85,72.1,76.2},{
246,12,246,21.1,43.9,21.6,22,83.5,66,64.2},{
247,12,247,20.8,46.6,24.9,24.1,86.8,67.2,68.9},{
248,12,248,27.2,60.5,25,28.9,97.5,80.5,88.6},{
249,12,249,23,43.9,20.2,21.3,80.9,66.2,67.5},{
250,12,250,21.5,44.5,20.6,21.9,85.5,62.3,65.3},{
251,12,251,24,47.1,22.5,21.9,84.3,63,62.3},{
252,12,252,23.5,53.7,22.1,25.2,87,71,74.5},{
253,12,253,25.6,51.6,24.7,25.9,92.3,70,75},{
254,12,254,25,50.5,24.2,24.5,94.8,70.1,73},{
255,12,255,24,49.2,20.9,22.4,82.5,67.5,73},{
256,12,256,22,39.5,20,19.9,82.5,58,61.5},{
257,12,257,21.7,47.3,21.2,22.6,86.6,66.4,67.6},{
258,12,258,26.4,50.3,23.1,22.5,89.4,70,75.3},{
259,12,259,24,45.5,20.7,22.3,80.6,66.7,67.3},{
260,12,260,24,48.2,22.1,23.5,85.5,69.2,71.8},{
261,12,261,22.1,40.8,21.3,21.5,84.8,70.1,72.3},{
262,12,262,23.3,40.9,21.4,21.6,77.2,65.3,71.9},{
263,12,263,21.4,42.5,19.5,19.6,80.4,66.7,66.6},{
264,12,264,22,46,21.6,22.5,85.2,65.6,68.1},{
265,12,265,21.5,39.8,20.2,20.3,80.5,61.5,63.5},{
266,12,266,21.4,39.6,19.7,19.6,75.3,60.2,63.8},{
267,12,267,21.8,42.6,20.6,20.1,81.6,59.2,61.8},{
268,12,268,23.6,42.9,22.9,22.7,78.1,64.8,67.3},{
269,12,269,23.4,43.2,22,21.4,84.4,67,69.7},{
270,12,270,25.2,57.2,25,29.9,95.2,78.4,85.4},{
271,12,271,25.4,48.8,22.5,24.4,88.4,70.4,76.1},{
272,12,272,22.8,41.9,21.1,22.2,79,63.6,66.2},{
273,12,273,23.6,40.3,20.3,19,76.5,60.2,61.5},{
274,12,274,24.2,48.2,23.2,26.1,88.8,70.2,76.4},{
275,12,275,20.2,30.9,19.6,19,74.9,59.2,57.4},{
276,12,276,22.1,50,22.6,24.7,87.7,74.6,81.4},{
277,12,277,24.4,46.3,21.9,22.2,82.7,60.1,64.7},{
278,12,278,23.2,46.9,22.9,23.1,83.5,65.2,69.5},{
279,13,279,24.1,51.9,23.3,25,83.7,81.6,83},{
280,13,280,23.9,48.3,22.2,22.5,79.6,64.9,67.9},{
281,13,281,22.6,42.8,21.5,20.9,80.8,61.1,62.5},{
282,13,282,22.1,39.7,20.2,19.1,79.2,58.3,63.1},{
283,13,283,23.3,46.2,21.5,21.1,80.6,64.9,64.5},{
284,13,284,21.6,46.5,20.7,22.9,79.6,69.5,75},{
285,13,285,21.2,37.7,19.9,18.7,77,57.6,57.1},{
286,13,286,22.6,47.6,22.8,24.5,85.4,72,75.4},{
287,13,287,22.1,54.1,23.7,24.6,86.9,65.5,76.5},{
288,13,288,23.7,52.8,21.6,23,85.2,69.5,76.9},{
289,13,289,21,38.1,18.5,17.7,75.8,60.9,61.4},{
290,13,290,22.5,39,19.1,18.1,77,66.9,60.7},{
291,13,291,21.6,45.5,20.4,20.6,83,60.5,65.8},{
292,13,292,22.8,41.3,20.7,20.4,75.2,61.9,61.4},{
293,13,293,22.1,46.8,22.3,22.3,78.6,65.8,68.4},{
294,13,294,23.3,43.2,22,22.2,79.6,59.5,61.8},{
295,13,295,26.6,63.4,26.3,30.7,100.5,97.9,100.9},{
296,13,296,23.5,48.5,20.9,23.1,76.7,68.8,72},{
297,13,297,22.7,42.2,20.5,22.5,78.3,68.6,70.2},{
298,13,298,22.4,48.5,23,24.4,85.3,71.3,75.2},{
299,13,299,21.1,42,20,20.2,74.5,63.8,69.1},{
300,13,300,22.1,43.4,20.6,20.2,78.5,59.2,65.1},{
301,13,301,23.7,45.9,21.7,21.7,85.2,67.2,69.4},{
302,13,302,20.7,39.5,18,17.6,76.5,57.2,57.6},{
303,13,303,24.5,48.8,23,23.5,86.9,68,68.2},{
304,13,304,23.3,54.5,22.1,25.5,82.9,68.4,73},{
305,13,305,22.8,52.6,23,26.8,90.8,80.6,84.4},{
306,13,306,24,43.9,21.4,20.5,83.3,69.5,65.8},{
307,13,307,22,47.8,20.9,22.2,89,63,69.5},{
308,13,308,24.6,55.4,24.3,26.6,94.5,81.5,78.4},{
309,13,309,25.7,60.3,26.6,30,102.5,91.5,94},{
310,13,310,24.2,55,21.5,23,93,71,79.3},{
311,13,311,23.4,51.7,22,24.4,87,73.5,76.5},{
312,13,312,22.6,42.9,21.6,21.9,81.2,59.9,60.5},{
313,13,313,21.7,43.6,20.3,21.3,76.3,62.3,67.2},{
314,13,314,23.7,47.1,23.2,25,86.7,67.7,69.1},{
315,13,315,22.1,38,19.7,18,75.2,60.2,62.6},{
316,13,316,21.6,47.2,21,22.7,80.6,65.8,71.5},{
317,13,317,23.3,48.7,24.1,26.4,84.5,72.2,79.8},{
318,13,318,22.5,43.5,21.3,21.3,80.7,66,66.5},{
319,13,319,19.6,39.3,18.7,18.8,77.2,57.5,60.3},{
320,13,320,22.8,50,21.6,24.4,84.8,72.5,79.2},{
321,14,321,24.1,49.6,23.6,23.4,85.2,70,70.4},{
322,14,322,20.9,44.1,21.4,22.2,78.1,62.1,67},{
323,14,323,21.3,39.2,19.5,19.1,78.7,59.4,61.8},{
324,14,324,22.3,41.9,21.2,22,80.6,63.7,63.2},{
325,14,325,20,41.7,21,20.5,73.8,61.8,64.2},{
326,14,326,22.6,40.9,21.6,21.8,81.4,63.5,65.7},{
327,14,327,24.3,51.9,23.3,24.8,83.8,68.8,74.5},{
328,14,328,22.7,48,22.5,23.9,75.7,64.8,67.7},{
329,14,329,21.1,40.3,19.5,18,75.2,57.3,56.5},{
330,14,330,20.8,44.7,20,21.3,76.7,65.8,64.5},{
331,14,331,20.3,39.4,18.3,18.1,70.9,58.3,59.6},{
332,14,332,22.8,50,23.9,25.9,86.6,71.6,75},{
333,14,333,22.3,40.9,20.2,19.6,81.5,60.8,63.9},{
334,14,334,24.2,50.3,23.4,24.8,88.1,72,75.4},{
335,14,335,24.2,49.9,23.1,25,88.7,73.9,79.9},{
336,14,336,22.4,41.6,20.4,20.6,78.1,61,62.9},{
337,14,337,22.5,46.9,21.5,22.3,81,63.5,64.6},{
338,14,338,24.2,48.7,22.3,23.7,83.4,67.2,69.9},{
339,14,339,21.5,39.1,18.7,18.5,78.2,56.6,59},{
340,14,340,21.3,40.6,20.3,19.6,77.1,59,65.4},{
341,14,341,23.7,51.5,22.9,24.7,89.2,73.6,77.2},{
342,14,342,23.5,44.2,19.6,19.7,77.4,59.4,62.6},{
343,14,343,23.4,51.1,22.5,25,90.2,76.6,78.3},{
344,14,344,23,48.3,24.5,23.2,83.5,70.5,78},{
345,15,345,23.7,49.3,21.5,22.4,86,68.1,74.8},{
346,15,346,20.5,41.1,19.8,21.5,78.6,61.5,64.4},{
347,15,347,23.2,47.7,21.9,24,83.6,72,74.5}};
public static final Object[][] testData2 = {{1,"Sylviane",1,1618039019},
{2,"Perrine",1,1618067838},
{3,"Friedrich",1,1618089452},
{4,"Fabrice",1,1618121873},
{5,"Florian",1,1618136283},
{6,"Aude",1,1618183113},
{7,"Adam",1,1618204728},
{8,"Jonas",1,1618219137},
{9,"Freddy",1,1618229944},
{10,"Pascaline",1,1618233546},
{11,"Anaïs",1,1618251558},
{12,"Marie-Joseph",1,1618269570},
{13,"Yannick",1,1618280377},
{14,"Chiara",1,1618283980},
{15,"Simone",1,1618298389},
{16,"Allan-David",1,1618312799},
{17,"Ulrika",1,1618327208},
{18,"Claire",1,1618327208},
{19,"Tito",1,1618348822},
{20,"Jennifer",1,1618363232},
{21,"Nasser",1,1618377641},
{22,"Marie-Claire",1,1618406460},
{23,"Samantha",1,1618478507},
{24,"Fabio",1,1618492917},
{25,"Joaquim",1,1618496519},
{26,"Stefanie",1,1618503724},
{27,"Marieva",1,1618514531},
{28,"Marie-Reine",1,1618521736},
{29,"Lyna",1,1618543350},
{30,"Benjamin",1,1618586578},
{31,"Suzanna",1,1618608193},
{32,"Alexander",1,1618622602},
{33,"Willem",1,1618633409},
{34,"Brian",1,1618637012},
{35,"Marie-Françoise",1,1618647819},
{36,"Stewart",1,1618716264},
{37,"Jean-Max",1,1618737878},
{38,"Anne-Marie",1,1618748685},
{39,"Florence",1,1618752287},
{40,"Miloud",1,1618755890},
{41,"Eléonore",1,1618784709},
{42,"Natacha",1,1618795516},
{43,"Ulla",1,1618799118},
{44,"Zoubida",1,1618799118},
{45,"Ludovic",1,1618817130},
{46,"Estelle",1,1618824335},
{47,"Tanguy",1,1618845949},
{48,"Bruno",1,1618853154},
{49,"Ian",2,1618853154},
{50,"Marianne",2,1618853154},
{51,"Adolf",2,1618867563},
{52,"Lauretta",2,1618881973},
{53,"Jeanine",2,1618896382},
{54,"Reynald",2,1618979236},
{55,"Emmanuelle",2,1619008055},
{56,"Anne-Charlotte",2,1619026067},
{57,"Anna-Lisa",2,1619029670},
{58,"Ludiwine",2,1619029670},
{59,"Magaly",2,1619094512},
{60,"Roselyne",2,1619108922},
{61,"Johanna",2,1619130536},
{62,"Erick",2,1619130536},
{63,"Alain",2,1619162957},
{64,"Marine",2,1619180969},
{65,"Maria",2,1619191776},
{66,"Colette",2,1619191776},
{67,"Oswald",2,1619198981},
{68,"Carlo",2,1619213390},
{69,"Hector",2,1619216993},
{70,"Antoni",2,1619267426},
{71,"Pierre-Alain",2,1619278233},
{72,"Joëlle",3,1619357485},
{73,"Andrea",3,1619357485},
{74,"Cendrine",3,1619400713},
{75,"Franck",3,1619411521},
{76,"Manuela",3,1619429532},
{77,"Raymonde",3,1619458351},
{78,"Julien",3,1619483568},
{79,"Gervais",3,1619505182},
{80,"Marie-Joëlle",3,1619508784},
{81,"Jean-Francis",3,1619526796},
{82,"Mylène",3,1619606048},
{83,"J.M.",3,1619616855},
{84,"Xavier",3,1619660084},
{85,"Jean-Noël",3,1619667289},
{86,"Sylvette",3,1619685300},
{87,"Eugénie",4,1619688903},
{88,"Gad",4,1619710517},
{89,"Miguel",4,1619714119},
{90,"Augusta",4,1619714119},
{91,"Raymond",4,1619717722},
{92,"Habib",4,1619735734},
{93,"Laetitia",4,1619750143},
{94,"Guy",5,1619829395},
{95,"François",5,1619836600},
{96,"Lucy",5,1619847407},
{97,"Thierry",5,1619858214},
{98,"Séverine",5,1619869021},
{99,"Gabriel",5,1619876226},
{100,"Jurgen",5,1619876226},
{101,"Rolande",5,1619876226},
{102,"Jean-Luc",5,1619915852},
{103,"Brice",5,1619919454},
{104,"Patricia",5,1619926659},
{105,"Tomy",5,1619955478},
{106,"Alan",5,1619955478},
{107,"Nathan",5,1619977092},
{108,"Renaud",5,1619977092},
{109,"Bruce",5,1620049140},
{110,"Benaïcha",5,1620088766},
{111,"Josephus",5,1620113982},
{112,"Léo",5,1620200439},
{113,"Célia",5,1620204041},
{114,"Franz-Georg",5,1620236463},
{115,"Reinhard",5,1620250872},
{116,"Renato",5,1620254474},
{117,"Yolande",5,1620254474},
{118,"Dounia",5,1620276089},
{119,"Juliana",5,1620290498},
{120,"Bérengère",5,1620301305},
{121,"Fanny",5,1620301305},
{122,"Sandrino",6,1620315715},
{123,"Dany",6,1620330124},
{124,"Nicole",6,1620333727},
{125,"Nathalie",6,1620337329},
{126,"Mark",6,1620409376},
{127,"Alison",6,1620449002},
{128,"Francis",6,1620456207},
{129,"Mohammad",7,1620528254},
{130,"Yvonne",7,1620564278},
{131,"Jean-Loïc",7,1620567880},
{132,"Cyril",7,1620571483},
{133,"Jean-François",7,1620589495},
{134,"Fernand",7,1620600302},
{135,"Rudy",7,1620600302},
{136,"Sidonie",7,1620632723},
{137,"Lucette",7,1620661542},
{138,"Chrystel",7,1620665144},
{139,"Karl-Otto",7,1620675951},
{140,"Jean-Hugues",7,1620697566},
{141,"Lorenzo",7,1620766011},
{142,"Brian-John",7,1620780420},
{143,"Aurélien",7,1620787625},
{144,"Sandie",7,1620856070},
{145,"Lawrence",7,1620859672},
{146,"Maïté",7,1620859672},
{147,"Vladimir",7,1620884889},
{148,"Judith",7,1620931719},
{149,"Madeline",7,1620946129},
{150,"Annabel",7,1620953334},
{151,"Marco",7,1621010972},
{152,"Marie-Paule",7,1621054200},
{153,"Sabrina",7,1621068609},
{154,"Pedro",7,1621137054},
{155,"Flavie",7,1621180283},
{156,"Faridah",7,1621183885},
{157,"Audebert",7,1621223511},
{158,"Henri-Charles",7,1621291956},
{159,"Otto",7,1621313570},
{160,"Giorgio",7,1621349594},
{161,"Émile",7,1621443256},
{162,"Fernando",7,1621475677},
{163,"Corine",7,1621508098},
{164,"Ralph",7,1621518905},
{165,"Nicaise",7,1621558531},
{166,"Pierre-Loïc",8,1621583748},
{167,"Rafaël",8,1621594555},
{168,"Géraud",8,1621623374},
{169,"Gino",8,1621681012},
{170,"Marc",8,1621681012},
{171,"Nadège",8,1621713433},
{172,"Corinne",8,1621720638},
{173,"Jean-Nicolas",8,1621745854},
{174,"Vivian",8,1621756662},
{175,"Desmond",8,1621825106},
{176,"César",8,1621839516},
{177,"Kurt",8,1621893551},
{178,"Brahim",8,1621940382},
{179,"Johannes",8,1621947587},
{180,"Emmanuelle",8,1622152922},
{181,"Elena",8,1622167331},
{182,"Arnaud",8,1622174536},
{183,"Richard",8,1622196150},
{184,"Jean-Claude",8,1622250186},
{185,"Frederik",8,1622257391},
{186,"Jean-Patrick",8,1622318631},
{187,"Gaëtan",8,1622333040},
{188,"Mariana",9,1622365462},
{189,"Alexia",9,1622520363},
{190,"Chloé",9,1622527568},
{191,"Amina",9,1622574399},
{192,"Camille",9,1622578001},
{193,"Anne-Lise",9,1622585206},
{194,"Siegfried",9,1622621230},
{195,"Oscar",9,1622624832},
{196,"Anouk",9,1622624832},
{197,"Henri",9,1622624832},
{198,"Marie-Jo",9,1622624832},
{199,"Marie-Régine",9,1622624832},
{200,"Jean-Paul",9,1622624832},
{201,"Claudius",9,1622624832},
{202,"Océane",9,1622624832},
{203,"Andrée",9,1622624832},
{204,"Vanina",9,1622624832},
{205,"Houria",9,1622624832},
{206,"Natanael",9,1622624832},
{207,"Karina",9,1622624832},
{208,"Joanna",9,1622624832},
{209,"Mourad",9,1622624832},
{210,"Louise",9,1622624832},
{211,"Romuald",9,1622624832},
{212,"Juliette",9,1622624832},
{213,"Wolfgang",9,1622624832},
{214,"Pierre-Marc",10,1622660856},
{215,"Léone",10,1622686072},
{216,"Gwen",10,1622722096},
{217,"Jean-Baptiste",10,1622750915},
{218,"Sophie",10,1622891407},
{219,"Maria-Lisa",10,1622902214},
{220,"Léonard",10,1622923828},
{221,"Gonzague",10,1622945443},
{222,"Stéphane",10,1622970659},
{223,"Lionel",10,1623006683},
{224,"Warren",10,1623057116},
{225,"Simon",10,1623345305},
{226,"Gerardo",10,1623413750},
{227,"Harold",10,1623453376},
{228,"Loïc",10,1623467786},
{229,"Raphaëlle",10,1623554243},
{230,"Auguste",10,1623565050},
{231,"Dorothée",10,1623583062},
{232,"Claudie",10,1623593869},
{233,"Eugenio",10,1623619085},
{234,"Alec",10,1623647904},
{235,"Jean-Philippe",10,1623687530},
{236,"Donald",10,1623737963},
{237,"Ahmad",11,1623788397},
{238,"Anne-Clotilde",11,1623838830},
{239,"Tatiana",11,1623846034},
{240,"Darlène",11,1623939696},
{241,"Jean-Frédéric",11,1623939696},
{242,"Maxence",11,1623939696},
{243,"Darren",12,1623939696},
{244,"Marie-Sophie",12,1623939696},
{245,"Cynthia",12,1623939696},
{246,"Pietro",12,1623939696},
{247,"Gunther",12,1623939696},
{248,"Jean-Antoine",12,1623939696},
{249,"Yvan",12,1623939696},
{250,"Karima",12,1623939696},
{251,"Rosine",12,1623939696},
{252,"J.M.",12,1623939696},
{253,"Pierre-Emmanuel",12,1623939696},
{254,"Thibaut",12,1623939696},
{255,"Cyprien",12,1623939696},
{256,"Stéphanie",12,1623939696},
{257,"Aristide",12,1623939696},
{258,"Hassan",12,1623939696},
{259,"Lorraine",12,1623946901},
{260,"Emmanuelle",12,1624105405},
{261,"Mathieu",12,1624170247},
{262,"Jan",12,1624253102},
{263,"Paule",12,1624256704},
{264,"Gwenaëlle",12,1624281921},
{265,"Concepcion",12,1624296330},
{266,"Marie-Noëlle",12,1624325149},
{267,"Gabriele",12,1624350366},
{268,"Mélanie",12,1624393594},
{269,"Stephen",12,1624408004},
{270,"Anne-France",12,1624415208},
{271,"Michelle",12,1624415208},
{272,"Marylaine",12,1624451232},
{273,"Sidney",12,1624458437},
{274,"Paul-Antoine",12,1624462039},
{275,"Félix",12,1624530484},
{276,"Hughes",12,1624566508},
{277,"José",12,1624656567},
{278,"Gaetano",12,1624670977},
{279,"Annie",13,1624699795},
{280,"Johann",13,1624717807},
{281,"Annette",13,1624779048},
{282,"Jacques-Olivier",13,1624818674},
{283,"Manuel",13,1624833083},
{284,"Philip",13,1624923142},
{285,"Samy",13,1624933949},
{286,"Diogo",13,1624948359},
{287,"Charles-Emile",13,1624962768},
{288,"Linda",13,1625005997},
{289,"Albert",13,1625024009},
{290,"Enrico",13,1625024009},
{291,"Léopold",13,1625031213},
{292,"Tobias",13,1625038418},
{293,"Jérémie",13,1625038418},
{294,"Rosette",13,1625063635},
{295,"Étienne",13,1625067237},
{296,"Pierre-Yves",13,1625106863},
{297,"Guido",13,1625121272},
{298,"Salvatore",13,1625128477},
{299,"Charlotte",13,1625218536},
{300,"Francine",13,1625232946},
{301,"Mireille",13,1625240151},
{302,"Tommy",13,1625254560},
{303,"Viviane",13,1625254560},
{304,"Émilia",13,1625254560},
{305,"Marielle",13,1625254560},
{306,"Pierre",13,1625254560},
{307,"Rodolphe",13,1625254560},
{308,"Olga",13,1625254560},
{309,"Vittorio",13,1625254560},
{310,"Graham",13,1625254560},
{311,"François",13,1625265367},
{312,"Wilfried",13,1625265367},
{313,"Blaise",13,1625301391},
{314,"Louisa",13,1625341017},
{315,"Abdallah",13,1625341017},
{316,"Jean-André",13,1625362631},
{317,"Pascal",13,1625369836},
{318,"Johanne",13,1625409462},
{319,"Bernard-Eric",13,1625420269},
{320,"Aglaé",13,1625445485},
{321,"Pierre-Guy",14,1625495919},
{322,"Rolland",14,1625531942},
{323,"Régis",14,1625542749},
{324,"Edwin",14,1625567966},
{325,"Victoire",14,1625618399},
{326,"Maximilien",14,1625622001},
{327,"Dominoco",14,1625683242},
{328,"Adeline",14,1625791313},
{329,"Sylvain",14,1625852553},
{330,"Cécil",14,1625859758},
{331,"Erwann",14,1625866962},
{332,"Abdel",14,1626000250},
{333,"Anne-Catherine",14,1626032671},
{334,"Victor",14,1626111923},
{335,"Sylvia",14,1626133538},
{336,"Franco",14,1626241609},
{337,"Liliane",14,1626288439},
{338,"Charles",14,1626353282},
{339,"Gislain",14,1626392908},
{340,"Marie-Odile",14,1626443341},
{341,"Jean-Lou",14,1626464955},
{342,"Sigrid",14,1626486570},
{343,"Murielle",14,1626493774},
{344,"Cécilia",14,1626569424},
{345,"Marcello",15,1626619857},
{346,"Erwin",15,1626857613},
{347,"Alida",15,1627044936}};
}

View File

@ -0,0 +1,176 @@
package com.bernard.emorph.activities;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.bernard.emorph.EMorphApplication;
import com.bernard.emorph.R;
import com.bernard.emorph.model.Subject;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class EditSubjectListActivity extends AppCompatActivity {
public static final String GROUPID_EXTRA = "com.bernard.emorph.activities.EditSubjectListActivity.GroupID";
public static final String GROUP_SUBJECT_COUNT_EXTRA = "com.bernard.emorph.activities.EditSubjectListActivity.SubjectCount";
EMorphApplication theApp;
long groupID;
List<Subject> subjects;
RecyclerView rv;
Button newSubjectButton;
Button endButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_edit_subject_list);
theApp = (EMorphApplication) getApplication();
Intent theIntent = getIntent();
groupID = theIntent.getLongExtra(GROUPID_EXTRA,-1L);
if(theIntent.hasExtra(GROUP_SUBJECT_COUNT_EXTRA)) {
int subjectCount = theIntent.getIntExtra(GROUP_SUBJECT_COUNT_EXTRA, -1);
subjects = new ArrayList<>(subjectCount);
for(int i=0;i<subjectCount;i++)subjects.add(new Subject(-1L, "", -1));
} else
subjects = theApp.getSubjects(groupID);
rv = findViewById(R.id.namesList);
newSubjectButton = findViewById(R.id.newSubjectButton);
endButton = findViewById(R.id.okButton);
EditableSubjectsListAdapter esla = new EditableSubjectsListAdapter();
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(esla);
newSubjectButton.setOnClickListener((e) -> esla.newSubjectLine());
endButton.setOnClickListener((e)->applyModifications());
}
public void applyModifications(){
for(Subject s : subjects){
if(!s.name.trim().isEmpty() && s.birthDate==-1){
Toast.makeText(this,getResources().getString(R.string.subjectNoBirthDate,s.name),Toast.LENGTH_SHORT).show();
return;
}
}
for(Subject s : subjects)
if(!s.name.trim().isEmpty())
if(s.id==-1)
theApp.newSubject(s.name, s.birthDate);
else
theApp.renameSubject(s.id,s.name);
//TODO: Put regex on names (is it really a good idea ?)
Intent theIntent = new Intent(this, GroupListActivity.class);
theIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(theIntent);
}
public void askCalendar(int subjectPos){
Calendar mcurrentDate=Calendar.getInstance();
int year = mcurrentDate.get(Calendar.YEAR);
int month = mcurrentDate.get(Calendar.MONTH);
int day = mcurrentDate.get(Calendar.DAY_OF_MONTH);
DatePickerDialog mDatePicker=new DatePickerDialog(EditSubjectListActivity.this,
(datepicker, selectedYear, selectedMonth, selectedDay) -> {
Log.d("Date Selected", "Month: " + selectedMonth + " Day: " + selectedDay + " Year: " + selectedYear);
Calendar selected = Calendar.getInstance();
selected.set(selectedYear, selectedMonth, selectedDay);
subjects.get(subjectPos).birthDate = (int) (selected.getTimeInMillis()/1000);
},year, month, day);
mDatePicker.setTitle(getResources().getString(R.string.calendarForSubject, subjects.get(subjectPos).name));
mDatePicker.show();
}
class EditableSubjectsListAdapter extends RecyclerView.Adapter<EditableSubjectsListAdapter.ViewHolder> {
public EditableSubjectsListAdapter(){}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View theView = LayoutInflater.from(parent.getContext()).inflate(R.layout.subject_group_list_item, parent, false);
return new ViewHolder(theView);
}
public void newSubjectLine(){
subjects.add(new Subject(-1L, "", -1));
notifyItemInserted(subjects.size()-1);
}
public void deleteSubjectLine(int position){
new AlertDialog.Builder(EditSubjectListActivity.this)
.setTitle(R.string.deleteSubjectConfirmationTitle)
.setMessage(getResources().getString(R.string.deleteSubjectConfirmationText,subjects.get(position)))
.setPositiveButton(android.R.string.yes, (dialogInterface, i) -> {
long theID = subjects.get(position).id;
if(theID!=-1)theApp.removeSubject(theID);
subjects.remove(position);
notifyItemRemoved(position);
})
.setNegativeButton(android.R.string.no, null)
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.nameEditText.setText(subjects.get(position).name);
holder.nameEditText.setHint(getResources().getString(R.string.subjectNameHint, position+1));
holder.deleteSubjectButton.setOnClickListener((e) -> deleteSubjectLine(position));
holder.calendarSubjectButton.setOnClickListener((e)->askCalendar(position));
}
@Override
public int getItemCount() {
return subjects.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
EditText nameEditText;
ImageButton calendarSubjectButton;
ImageButton deleteSubjectButton;
View theView;
public ViewHolder(View theView) {
super(theView);
this.theView = theView;
this.nameEditText = theView.findViewById(R.id.subjectNameEdit);
this.calendarSubjectButton = theView.findViewById(R.id.subjectCalendarButton);
this.deleteSubjectButton = theView.findViewById(R.id.subjectDeleteButton);
}
}
}
}

View File

@ -0,0 +1,14 @@
package com.bernard.emorph.activities;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class GraphActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_graph);
}
}

View File

@ -0,0 +1,169 @@
package com.bernard.emorph.activities;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.widget.TextViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.bernard.emorph.EMorphApplication;
import com.bernard.emorph.R;
import com.bernard.emorph.model.Group;
import java.util.List;
public class GroupListActivity extends AppCompatActivity {
EMorphApplication theApp;
List<Group> groups;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group_list);
Toolbar theToolbar = findViewById(R.id.app_toolbar);
setSupportActionBar(theToolbar);
theApp = (EMorphApplication)getApplication();
groups = theApp.listGroups();
GroupListAdapter gla = new GroupListAdapter(findViewById(R.id.buttonsLayout));
RecyclerView lv = findViewById(R.id.groupes_list);
lv.setLayoutManager(new LinearLayoutManager(this));
lv.setAdapter(gla);
}
public void startModifyGroup(Group g){
Intent theIntent = new Intent(this, EditSubjectListActivity.class);
theIntent.putExtra(EditSubjectListActivity.GROUPID_EXTRA, g.id);
startActivity(theIntent);
}
public void startNewGroup(){
Intent theIntent = new Intent(this, NewGroupActivity.class);
startActivity(theIntent);
}
public void startNewMeasure(Group g){
Intent theIntent = new Intent(this, NewMeasureActivity.class);
theIntent.putExtra(NewMeasureActivity.GROUPID_TO_MEASURE_EXTRA, g.id);
startActivity(theIntent);
}
class GroupListAdapter extends RecyclerView.Adapter<GroupListAdapter.ViewHolder> {
Button dataViewButton;
Button newDataButton;
Button modifyGroupButton;
int selectedIndex;
ViewHolder selectedHolder;
public GroupListAdapter( LinearLayout buttonsLayout){
this.selectedIndex = -1;
this.dataViewButton = buttonsLayout.findViewById(R.id.data_view_button);
this.newDataButton = buttonsLayout.findViewById(R.id.new_data_button);
this.modifyGroupButton = buttonsLayout.findViewById(R.id.modify_group_button);
this.modifyGroupButton.setOnClickListener((e)->{
if(selectedIndex==groups.size())
startNewGroup();
else
startModifyGroup(groups.get(selectedIndex));
});
this.newDataButton.setOnClickListener((e)->{
if(selectedIndex!=groups.size())startNewMeasure(groups.get(selectedIndex));
});
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View theView = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_list_item, parent, false);
return new ViewHolder(theView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if(position==groups.size()) { // C'est la ligne «nouveau groupe»
holder.titleText.setText(R.string.newGroupItem);
TextViewCompat.setTextAppearance(holder.titleText,R.style.group_list_newgroup_item_text);
} else {
holder.titleText.setText(groups.get(position).name);
TextViewCompat.setTextAppearance(holder.titleText,R.style.group_list_item_text);
}
holder.theView.setOnClickListener((e) -> selectItem(holder, position));
}
public void selectItem(ViewHolder vh, int i){
if(this.selectedIndex!=-1){
if(selectedIndex==groups.size()) // C'est la ligne «nouveau groupe»
TextViewCompat.setTextAppearance(selectedHolder.titleText,R.style.group_list_newgroup_item_text);
else
TextViewCompat.setTextAppearance(selectedHolder.titleText,R.style.group_list_item_text);
}
if(i!=-1){
if(selectedIndex==groups.size()) // C'est la ligne «nouveau groupe»
TextViewCompat.setTextAppearance(vh.titleText,R.style.group_list_newgroup_item_text_selected);
else
TextViewCompat.setTextAppearance(vh.titleText,R.style.group_list_item_text_selected);
if(i<groups.size()){
dataViewButton.setEnabled(theApp.hasData(groups.get(i).id));
newDataButton.setEnabled(true);
modifyGroupButton.setEnabled(true);
modifyGroupButton.setText(R.string.modify_group_button_text);
}else{
dataViewButton.setEnabled(false);
newDataButton.setEnabled(false);
modifyGroupButton.setEnabled(true);
modifyGroupButton.setText(R.string.new_group_button_text);
}
}else{
dataViewButton.setEnabled(false);
newDataButton.setEnabled(false);
modifyGroupButton.setEnabled(false);
}
selectedIndex = i;
selectedHolder = vh;
}
@Override
public int getItemCount() {
return groups.size()+1;
}
class ViewHolder extends RecyclerView.ViewHolder{
TextView titleText;
View theView;
public ViewHolder(View theView) {
super(theView);
this.theView = theView;
this.titleText = theView.findViewById(R.id.itemTitle);
}
}
}
}

View File

@ -0,0 +1,82 @@
package com.bernard.emorph.activities;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.Toast;
import com.bernard.emorph.EMorphApplication;
import com.bernard.emorph.R;
import java.util.regex.Pattern;
public class NewGroupActivity extends AppCompatActivity {
public static final Pattern groupNamePattern = Pattern.compile("^[a-zA-Z0-9][a-zA-Z0-9+-_, ;:.]*$");
EMorphApplication theApp;
EditText groupNameText;
NumberPicker subjectsSelector;
Button okButton;
ActivityResultLauncher<String> mGetContent = registerForActivityResult(new ActivityResultContracts.GetContent(),
new ActivityResultCallback<Uri>() {
@Override
public void onActivityResult(Uri uri) {
// Handle the returned Uri
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_group);
theApp = (EMorphApplication) getApplication();
groupNameText = findViewById(R.id.nameAskField);
subjectsSelector = findViewById(R.id.subjectsSelectors);
subjectsSelector.setMinValue(1);
subjectsSelector.setMaxValue(Integer.MAX_VALUE);
subjectsSelector.setFormatter((i) -> this.getResources().getString(R.string.nth_subject,i));
subjectsSelector.setWrapSelectorWheel(false);
okButton = findViewById(R.id.okButton);
okButton.setOnClickListener((e)->okNextActivity());
}
private void okNextActivity(){
String theName = groupNameText.getText().toString().trim();
if(!groupNamePattern.matcher(theName).matches()){
Toast.makeText(this, R.string.invalidGroupName, Toast.LENGTH_SHORT).show();
return;
}
int subjectCount = subjectsSelector.getValue();
long groupID = theApp.newGroup(theName);
Intent theIntent = new Intent(this, EditSubjectListActivity.class);
theIntent.putExtra(EditSubjectListActivity.GROUPID_EXTRA,groupID);
theIntent.putExtra(EditSubjectListActivity.GROUP_SUBJECT_COUNT_EXTRA, subjectCount);
startActivity(theIntent);
}
}

View File

@ -0,0 +1,178 @@
package com.bernard.emorph.activities;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.widget.TextViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.bernard.emorph.EMorphApplication;
import com.bernard.emorph.R;
import com.bernard.emorph.model.MeasureOnSubject;
import com.bernard.emorph.model.Subject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class NewMeasureActivity extends AppCompatActivity {
public static final String GROUPID_TO_MEASURE_EXTRA = "com.bernard.emorph.activities.NewMeasure.GroupToMeasure";
EMorphApplication theApp;
long groupToMeasure;
long measureID;
List<Subject> subjects;
Map<Long, MeasureOnSubject> subjectsMoz;
Map<Long, SubjectListAdapter.ViewHolder> holderz;
ActivityResultLauncher<Long> arlNewMos = registerForActivityResult(new NewMeasureOnSubjectContract(),
measure -> {
if(measure!=null) {
subjectsMoz.put(measure.subjectID, measure);
TextViewCompat.setTextAppearance(Objects.requireNonNull(holderz.get(measure.subjectID)).titleText, R.style.newmeasure_subject_list_item_disable);
}
});
RecyclerView rv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_measure);
subjectsMoz = new HashMap<>();
holderz = new HashMap<>();
Intent theIntent = getIntent();
groupToMeasure = theIntent.getLongExtra(GROUPID_TO_MEASURE_EXTRA, 0L);
theApp = (EMorphApplication)getApplication();
measureID = theApp.newMeasure(groupToMeasure);
rv = findViewById(R.id.subjectsList);
Toolbar theBar = findViewById(R.id.app_toolbar);
theBar.setTitle(getResources().getString(R.string.newDataTitle, theApp.getGroupName(groupToMeasure)));
subjects = theApp.getSubjects(groupToMeasure);
SubjectListAdapter sla = new SubjectListAdapter();
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(sla);
Button okButton = findViewById(R.id.okButton);
okButton.setOnClickListener((e)->endMeasure());
}
public void measureSubject(Subject s){
if(!subjectsMoz.containsKey(s.id)) {
arlNewMos.launch(s.id);
} else {
Toast.makeText(this, R.string.mosAlreadyGiven, Toast.LENGTH_SHORT).show();
}
}
public void endMeasure(){
for(int i=0;i<subjects.size();i++)
if(!subjectsMoz.containsKey(subjects.get(i).id)){
new AlertDialog.Builder(this)
.setTitle(R.string.completeMeasureWithoutEveryoneTitle)
.setMessage(getResources().getString(R.string.completeMeasureWithoutEveryone,subjects.get(i).name))
.setPositiveButton(android.R.string.yes, (dialogInterface, j) -> finish())
.setNegativeButton(android.R.string.no, null)
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
return;
}
}
class SubjectListAdapter extends RecyclerView.Adapter<NewMeasureActivity.SubjectListAdapter.ViewHolder> {
public SubjectListAdapter(){}
@NonNull
@Override
public NewMeasureActivity.SubjectListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View theView = LayoutInflater.from(parent.getContext()).inflate(R.layout.newmeasure_subject_list_item, parent, false);
return new NewMeasureActivity.SubjectListAdapter.ViewHolder(theView);
}
@Override
public void onBindViewHolder(@NonNull NewMeasureActivity.SubjectListAdapter.ViewHolder holder, int position) {
holder.titleText.setText(subjects.get(position).name);
holder.theView.setOnClickListener((e) -> measureSubject(subjects.get(position)));
holderz.put(subjects.get(position).id, holder);
}
@Override
public int getItemCount() {
return subjects.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
TextView titleText;
View theView;
public ViewHolder(View theView) {
super(theView);
this.theView = theView;
this.titleText = theView.findViewById(R.id.itemTitle);
}
}
}
public class NewMeasureOnSubjectContract extends ActivityResultContract<Long, MeasureOnSubject> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Long input) {
Intent intent = new Intent(NewMeasureActivity.this, NewMeasureOnSubjectActivity.class);
intent.putExtra(NewMeasureOnSubjectActivity.TARGET_SUBJECT_EXTRA, input);
intent.putExtra(NewMeasureOnSubjectActivity.GROUPID_TO_MEASURE_EXTRA, groupToMeasure);
intent.putExtra(NewMeasureOnSubjectActivity.MEASUREID_EXTRA, NewMeasureActivity.this.measureID);
return intent;
}
@Override
public MeasureOnSubject parseResult(int resultCode, @Nullable Intent result) {
if (resultCode != Activity.RESULT_OK || result == null) {
return null;
}
return result.getParcelableExtra(NewMeasureOnSubjectActivity.MOS_RETURNED_EXTRA);
}
}
}

View File

@ -0,0 +1,139 @@
package com.bernard.emorph.activities;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.bernard.emorph.EMorphApplication;
import com.bernard.emorph.R;
import com.bernard.emorph.model.MeasureOnSubject;
public class NewMeasureOnSubjectActivity extends AppCompatActivity {
public static final String TARGET_SUBJECT_EXTRA = "com.bernard.emorph.activities.NewMeasureOnSubjectActivity.TargetSubject";
public static final String MEASUREID_EXTRA = "com.bernard.emorph.activities.NewMeasureOnSubjectActivity.MeasureId";
public static final String GROUPID_TO_MEASURE_EXTRA = "com.bernard.emorph.activities.NewMeasureOnSubjectActivity.GroupId";
public static final String MOS_RETURNED_EXTRA = "com.bernard.emorph.activities.NewMeasureOnSubjectActivity.MosId";
EMorphApplication theApp;
long subjectId;
long measureID;
long groupID;
public static final String maxiMinusFloatP = "maxiMinusFloatDelta",
miniMinusFloatP = "miniMinusFloatDelta",
maxiPlusFloatP = "maxiPlusFloatDelta",
miniPlusFloatP = "miniPlusFloatDelta";
public static final String abdomenDefaultValue = "abdomenDefaultValue",
brasDefaultValue = "brasDefaultValue",
epaulesDefaultValue = "epaulesDefaultValue",
tailleDefaultValue = "tailleDefaultValue",
cuisseDefaultValue = "cuisseDefaultValue",
chevilleDefaultValue = "chevilleDefaultValue",
avantBrasDefaultValue = "avantBrasDefaultValue";
EditText abdomenET, brasET, epaulesET, tailleET, cuisseET, chevilleET, avantBrasET;
Button okButton;
SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_measure_on_subject);
Intent theIntent = getIntent();
subjectId = theIntent.getLongExtra(TARGET_SUBJECT_EXTRA,0L);
measureID = theIntent.getLongExtra(MEASUREID_EXTRA,0L);
groupID = theIntent.getLongExtra(GROUPID_TO_MEASURE_EXTRA, 0L);
theApp = (EMorphApplication)getApplication();
Toolbar theBar = findViewById(R.id.app_toolbar);
theBar.setTitle(getResources().getString(R.string.newDataSubjectTitle, theApp.getSubjectName(subjectId)));
sp = getSharedPreferences(EMorphApplication.APP_PREFERENCES_FILE, Context.MODE_PRIVATE);
abdomenET = treatLayout(findViewById(R.id.abdomenLayout), R.string.abdomenCirc, sp.getFloat(abdomenDefaultValue,75.32f));
brasET = treatLayout(findViewById(R.id.brasLayout), R.string.brasCirc, sp.getFloat(brasDefaultValue,25.93f));
epaulesET = treatLayout(findViewById(R.id.epaulesLayout), R.string.epaulesCirc, sp.getFloat(epaulesDefaultValue,93.31f));
tailleET = treatLayout(findViewById(R.id.tailleLayout), R.string.tailleCirc, sp.getFloat(tailleDefaultValue,79.88f));
cuisseET = treatLayout(findViewById(R.id.cuisseLayout), R.string.cuisseCirc, sp.getFloat(cuisseDefaultValue,53.09f));
chevilleET = treatLayout(findViewById(R.id.chevilleLayout), R.string.chevilleCirc, sp.getFloat(chevilleDefaultValue,24.82f));
avantBrasET = treatLayout(findViewById(R.id.avantBrasLayout), R.string.avantBrasCirc, sp.getFloat(avantBrasDefaultValue,24.26f));
okButton = findViewById(R.id.okButton);
okButton.setOnClickListener((e)->commitData());
}
public void commitData(){
try {
MeasureOnSubject mos = theApp.newMOS(
measureID,
subjectId,
Float.parseFloat(abdomenET.getText().toString()),
Float.parseFloat(brasET.getText().toString()),
Float.parseFloat(epaulesET.getText().toString()),
Float.parseFloat(tailleET.getText().toString()),
Float.parseFloat(cuisseET.getText().toString()),
Float.parseFloat(chevilleET.getText().toString()),
Float.parseFloat(avantBrasET.getText().toString())
);
Intent theIntent = new Intent();
theIntent.putExtra(NewMeasureActivity.GROUPID_TO_MEASURE_EXTRA, groupID);
theIntent.putExtra(MOS_RETURNED_EXTRA, mos);
setResult(Activity.RESULT_OK, theIntent);
finish();
}catch(NumberFormatException nfe){
Toast.makeText(this,R.string.pleaseEnterFloat,Toast.LENGTH_SHORT).show();
}
}
public EditText treatLayout(ConstraintLayout theLayout, @StringRes int titleRes, float defaultValue){
EditText theET = theLayout.findViewById(R.id.editableField);
TextView theTV = theLayout.findViewById(R.id.fieldTitle);
ImageButton
miniPlusB = theLayout.findViewById(R.id.miniPlusButton),
miniMinusB = theLayout.findViewById(R.id.miniMinusButton),
maxiPlusB = theLayout.findViewById(R.id.maxiPlusButton),
maxiMinusB = theLayout.findViewById(R.id.maxiMinusButton);
theTV.setText(titleRes);
theET.setText(String.valueOf(defaultValue));
miniPlusB.setOnClickListener((e)->applyDeltaToContent(theET,sp.getFloat(miniPlusFloatP,+0.03f)));
miniMinusB.setOnClickListener((e)->applyDeltaToContent(theET,sp.getFloat(miniMinusFloatP,-0.03f)));
maxiPlusB.setOnClickListener((e)->applyDeltaToContent(theET,sp.getFloat(maxiPlusFloatP,+1f)));
maxiMinusB.setOnClickListener((e)->applyDeltaToContent(theET,sp.getFloat(maxiMinusFloatP,-1f)));
return theET;
}
public void applyDeltaToContent(EditText theET, float delta){
try {
theET.setText(String.valueOf(Float.parseFloat(theET.getText().toString()) + delta));
}catch(NumberFormatException nfe){
Toast.makeText(this,R.string.pleaseEnterFloat,Toast.LENGTH_SHORT).show();
}
}
}

View File

@ -0,0 +1,14 @@
package com.bernard.emorph.activities;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class PrepareMeasureActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prepare_measure);
}
}

View File

@ -0,0 +1,11 @@
package com.bernard.emorph.model;
public class Group {
public long id;
public String name;
public Group(long id, String name){
this.id = id;
this.name = name;
}
}

View File

@ -0,0 +1,67 @@
package com.bernard.emorph.model;
import android.os.Parcel;
import android.os.Parcelable;
public class MeasureOnSubject implements Parcelable {
public long mosId;
public long subjectID;
public float abdomen, bras, epaules, taille, cuisse, cheville, avantBras;
public MeasureOnSubject(long mosId, long subjectID, float abdomen, float bras, float epaules, float taille, float cuisse, float cheville, float avantBras) {
this.mosId = mosId;
this.subjectID = subjectID;
this.abdomen = abdomen;
this.bras = bras;
this.epaules = epaules;
this.taille = taille;
this.cuisse = cuisse;
this.cheville = cheville;
this.avantBras = avantBras;
}
private MeasureOnSubject(Parcel p){
this.mosId = p.readLong();
this.subjectID = p.readLong();
this.abdomen = p.readFloat();
this.bras = p.readFloat();
this.epaules = p.readFloat();
this.taille = p.readFloat();
this.cuisse = p.readFloat();
this.cheville = p.readFloat();
this.avantBras = p.readFloat();
}
public static final Creator<MeasureOnSubject> CREATOR = new Creator<MeasureOnSubject>() {
@Override
public MeasureOnSubject createFromParcel(Parcel parcel) {
return new MeasureOnSubject(parcel);
}
@Override
public MeasureOnSubject[] newArray(int i) {
return new MeasureOnSubject[i];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel p, int flags) {
p.writeLong(mosId);
p.writeLong(subjectID);
p.writeFloat(abdomen);
p.writeFloat(bras);
p.writeFloat(epaules);
p.writeFloat(taille);
p.writeFloat(cuisse);
p.writeFloat(cheville);
p.writeFloat(avantBras);
}
}

View File

@ -0,0 +1,13 @@
package com.bernard.emorph.model;
public final class Subject{
public long id;
public String name;
public int birthDate;
public Subject(long id, String name, int birthDate){
this.id = id;
this.name = name;
this.birthDate = birthDate;
}
}

View File

@ -0,0 +1,15 @@
package com.bernard.emorph.model;
public class ToGraph {
long[] measuresID;
long[] subjectsID;
Base base;
enum Base {
LABO, GROUPE;
}
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="42dp"
android:height="42dp"
android:viewportWidth="42"
android:viewportHeight="42">
<path
android:fillColor="#FF000000"
android:pathData="M37.059,16H26H16H4.941C2.224,16 0,18.282 0,21s2.224,5 4.941,5H16h10h11.059C39.776,26 42,23.718 42,21S39.776,16 37.059,16z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="45.402dp"
android:height="45.402dp"
android:viewportWidth="45.402"
android:viewportHeight="45.402">
<path
android:fillColor="#FF000000"
android:pathData="M41.267,18.557H26.832V4.134C26.832,1.851 24.99,0 22.707,0c-2.283,0 -4.124,1.851 -4.124,4.135v14.432H4.141c-2.283,0 -4.139,1.851 -4.138,4.135c-0.001,1.141 0.46,2.187 1.207,2.934c0.748,0.749 1.78,1.222 2.92,1.222h14.453V41.27c0,1.142 0.453,2.176 1.201,2.922c0.748,0.748 1.777,1.211 2.919,1.211c2.282,0 4.129,-1.851 4.129,-4.133V26.857h14.435c2.283,0 4.134,-1.867 4.133,-4.15C45.399,20.425 43.548,18.557 41.267,18.557z"/>
</vector>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.EditSubjectListActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/app_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent"
android:background="?attr/colorPrimary"
android:elevation="4dp"
app:title="@string/editSubjectList"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/namesList"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/app_toolbar"
app:layout_constraintBottom_toTopOf="@id/newSubjectButton"/>
<Button
android:id="@+id/newSubjectButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/namesList"
app:layout_constraintBottom_toTopOf="@id/okButton"
android:text="@string/newSubject"/>
<Button
android:id="@+id/okButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/newSubjectButton"
app:layout_constraintBottom_toBottomOf="parent"
android:text="@string/saveChanges"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.GraphActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.GroupListActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/app_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent"
android:background="?attr/colorPrimary"
android:elevation="4dp"
app:title="@string/groupList"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/app_toolbar"
app:layout_constraintBottom_toTopOf="@id/buttonsLayout"
app:layout_constraintVertical_bias="0.0"
android:id="@+id/groupes_list"/>
<LinearLayout
android:id="@+id/buttonsLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/groupes_list"
app:layout_constraintBottom_toBottomOf="parent"
android:orientation="vertical">
<Button
android:id="@+id/data_view_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/data_view_button_text"/>
<Button
android:id="@+id/new_data_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/new_data_button_text"/>
<Button
android:id="@+id/modify_group_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/modify_group_button_text"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.NewGroupActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/app_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent"
android:background="?attr/colorPrimary"
android:elevation="4dp"
app:title="@string/newGroup"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/nameAskLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/app_toolbar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<TextView
android:id="@+id/nameAskText"
android:labelFor="@id/nameAskField"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/nameAskField"
android:text="@string/askingName"/>
<EditText
android:id="@+id/nameAskField"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/nameAskText"
app:layout_constraintEnd_toEndOf="parent"
android:inputType="text"
android:importantForAutofill="no"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:labelFor="@id/nameAskLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/nameAskLayout"
android:text="@string/subjectsSelectorText" />
<NumberPicker
android:id="@+id/subjectsSelectors"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/nameAskLayout" />
<Button
android:id="@+id/okButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@android:string/ok"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/subjectsSelectors"
app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.NewMeasureActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/app_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/subjectsList"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/subjectsList"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/app_toolbar"
app:layout_constraintBottom_toTopOf="@id/okButton"/>
<Button
android:id="@+id/okButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/subjectsList"
app:layout_constraintBottom_toBottomOf="parent"
android:text="@string/terminerLaMesure"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.NewMeasureOnSubjectActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/app_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<ScrollView
android:id="@+id/editScroll"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/app_toolbar"
app:layout_constraintBottom_toTopOf="@id/okButton">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:id="@+id/abdomenLayout"
layout="@layout/circ_editor_layout" />
<include
android:id="@+id/brasLayout"
layout="@layout/circ_editor_layout" />
<include
android:id="@+id/epaulesLayout"
layout="@layout/circ_editor_layout" />
<include
android:id="@+id/tailleLayout"
layout="@layout/circ_editor_layout" />
<include
android:id="@+id/cuisseLayout"
layout="@layout/circ_editor_layout" />
<include
android:id="@+id/chevilleLayout"
layout="@layout/circ_editor_layout" />
<include
android:id="@+id/avantBrasLayout"
layout="@layout/circ_editor_layout" />
</LinearLayout>
</ScrollView>
<Button
android:id="@+id/okButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/editScroll"
app:layout_constraintBottom_toBottomOf="parent"
android:text="@android:string/ok" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.PrepareMeasureActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/fieldTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/editableField"
android:gravity="start"
android:labelFor="@id/editableField"
android:contentDescription="@string/measureFieldContentDescription"
android:text="@string/placeholder"/>
<ImageButton
android:id="@+id/miniMinusButton"
android:layout_width="40dp"
android:layout_height="40dp"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/ic_minus"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/maxiMinusButton"
app:layout_constraintTop_toBottomOf="@id/fieldTitle"
android:layout_marginStart="20dp"
android:contentDescription="@string/minus" />
<ImageButton
android:id="@+id/maxiMinusButton"
android:layout_width="60dp"
android:layout_height="60dp"
android:scaleType="fitCenter"
app:layout_constraintLeft_toRightOf="@id/miniMinusButton"
app:layout_constraintRight_toLeftOf="@id/editableField"
app:layout_constraintTop_toBottomOf="@id/fieldTitle"
app:layout_constraintBottom_toBottomOf="parent"
android:src="@drawable/ic_minus"
android:contentDescription="@string/minus" />
<EditText
android:id="@+id/editableField"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/maxiMinusButton"
app:layout_constraintRight_toLeftOf="@id/maxiPlusButton"
app:layout_constraintTop_toBottomOf="@id/fieldTitle"
app:layout_constraintBottom_toBottomOf="parent"
android:importantForAutofill="no"
android:inputType="numberDecimal|numberSigned"
android:maxLength="5"/>
<ImageButton
android:id="@+id/maxiPlusButton"
android:layout_width="60dp"
android:layout_height="60dp"
android:scaleType="fitCenter"
app:layout_constraintLeft_toRightOf="@id/editableField"
app:layout_constraintRight_toLeftOf="@id/miniPlusButton"
app:layout_constraintTop_toBottomOf="@id/fieldTitle"
app:layout_constraintBottom_toBottomOf="parent"
android:src="@drawable/ic_plus"
android:contentDescription="@string/plus" />
<ImageButton
android:id="@+id/miniPlusButton"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="fitCenter"
app:layout_constraintLeft_toRightOf="@id/maxiPlusButton"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/fieldTitle"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginEnd="20dp"
android:src="@drawable/ic_plus"
android:contentDescription="@string/plus" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<fragment
android:id="@+id/nav_host_fragment_content_edit_subject_list"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/itemTitle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/itemTitle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:textAppearance="@style/newmeasure_subject_list_item_clickable"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<EditText
android:id="@+id/subjectNameEdit"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/subjectDeleteButton"
android:autofillHints="name"
android:inputType="textPersonName"
tools:ignore="LabelFor" />
<ImageButton
android:id="@+id/subjectCalendarButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/subjectNameEdit"
app:layout_constraintEnd_toStartOf="@id/subjectDeleteButton"
android:src="@android:drawable/ic_menu_my_calendar"
android:contentDescription="@string/editSubjectBirthdate" />
<ImageButton
android:id="@+id/subjectDeleteButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/subjectCalendarButton"
app:layout_constraintEnd_toEndOf="parent"
android:src="@android:drawable/ic_delete"
android:contentDescription="@string/deleteSubjectDesc" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -7,7 +7,7 @@
<fragment
android:id="@+id/FirstFragment"
android:name="com.bernard.calchulator.FirstFragment"
android:name="com.bernard.emorph.activities.FirstFragment"
android:label="@string/first_fragment_label"
tools:layout="@layout/fragment_first">
@ -17,7 +17,7 @@
</fragment>
<fragment
android:id="@+id/SecondFragment"
android:name="com.bernard.calchulator.SecondFragment"
android:name="com.bernard.emorph.activities.SecondFragment"
android:label="@string/second_fragment_label"
tools:layout="@layout/fragment_second">

View File

@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.CalcHulator" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<style name="Theme.EMorphotype" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="defaultCircAbdomen">75.32</attr>
<attr name="defaultCircBras">25.93</attr>
<attr name="defaultCircEpaules">93.31</attr>
<attr name="defaultCircTaille">79.88</attr>
<attr name="defaultCircCuisse">53.09</attr>
<attr name="defaultCircCheville">24.82</attr>
<attr name="defaultCircAvantBras">24.26</attr>
<attr name="defaultMaxiMinusDelta">1.0</attr>
<attr name="defaultMiniMinusDelta">0.03</attr>
<attr name="defaultMiniPlusDelta">0.3</attr>
<attr name="defaultMaxiPlusDelta">1.0</attr>
</resources>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--item name="defaultCircAbdomen" format="float" type="attr">75.32</item>
<item name="defaultCircBras" format="float" type="attr">25.93</item>
<item name="defaultCircEpaules" format="float" type="attr">93.31</item>
<item name="defaultCircTaille" format="float" type="attr">79.88</item>
<item name="defaultCircCuisse" format="float" type="attr">53.09</item>
<item name="defaultCircCheville" format="float" type="attr">24.82</item>
<item name="defaultCircAvantBras" format="float" type="attr">24.26</item>
<item name="defaultMaxiMinusDelta" format="float" type="attr">1.0</item>
<item name="defaultMiniMinusDelta" format="float" type="attr">0.03</item>
<item name="defaultMiniPlusDelta" format="float" type="attr">0.3</item>
<item name="defaultMaxiPlusDelta" format="float" type="attr">1.0</item-->
<!--dimen name="defaultCircAbdomen">75.32</dimen>
<dimen name="defaultCircBras">25.93</dimen>
<dimen name="defaultCircEpaules">93.31</dimen>
<dimen name="defaultCircTaille">79.88</dimen>
<dimen name="defaultCircCuisse">53.09</dimen>
<dimen name="defaultCircCheville">24.82</dimen>
<dimen name="defaultCircAvantBras">24.26</dimen>
<dimen name="defaultMaxiMinusDelta">1.0</dimen>
<dimen name="defaultMiniMinusDelta">0.03</dimen>
<dimen name="defaultMiniPlusDelta">0.3</dimen>
<dimen name="defaultMaxiPlusDelta">1.0</dimen-->
</resources>

View File

@ -1,6 +1,17 @@
<resources>
<string name="app_name">CalcHulator</string>
<string name="action_settings">Settings</string>
<string name="app_name">E-Morphotype</string>
<string name="groupList">Liste des groupes</string>
<string name="askingName">Nom du groupe :</string>
<string name="newGroup">Nouveau Groupe</string>
<string name="newGroupItem">Nouveau Groupe</string>
<string name="data_view_button_text">Visualiser les données</string>
<string name="new_data_button_text">Nouvelles données</string>
<string name="modify_group_button_text">Modifier le groupe</string>
<string name="new_group_button_text">Nouveau groupe</string>
<string name="nth_subject">%d enfant(s)</string>
<string name="subjectsSelectorText">Nombre de sujets :</string>
<string name="invalidGroupName">Nom du groupe invalide</string>
<string name="title_activity_edit_subject_list">EditSubjectListActivity</string>
<!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">First Fragment</string>
<string name="second_fragment_label">Second Fragment</string>
@ -9,4 +20,33 @@
<string name="hello_first_fragment">Hello first fragment</string>
<string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
<string name="saveChanges">Enregistrer les modifications</string>
<string name="editSubjectList">Liste des Sujets</string>
<string name="newSubject">Nouveau Sujet</string>
<string name="subjectNameHint">Sujet n°%d</string>
<string name="deleteSubjectDesc">Supprimer le sujet</string>
<string name="deleteSubjectConfirmationTitle">Deleting subject</string>
<string name="deleteSubjectConfirmationText">Êtes-vous sûrs de vouloir supprimer le sujet %s ainsi que toutes les données lui étant ratachées ?</string>
<string name="newDataTitle">Données groupe %s</string>
<string name="measureFieldContentDescription">Nom de la mesure à effectuer</string>
<string name="plus">+</string>
<string name="minus">-</string>
<string name="newDataSubjectTitle">Mesures pour %s</string>
<string name="abdomenCirc">Circonférence de l\'abdomen :</string>
<string name="brasCirc">Circonférence du bras :</string>
<string name="epaulesCirc">Circonférence des épaules :</string>
<string name="tailleCirc">Circonférence de la taille :</string>
<string name="cuisseCirc">Circonférence de la cuisse :</string>
<string name="chevilleCirc">Circonférence de la cheville :</string>
<string name="avantBrasCirc">Circonférence de l\'avant bras :</string>
<string name="placeholder">Vous n\'êtes pas cencés voir ce texte.</string>
<string name="pleaseEnterFloat">Veuillez entrer des nombres à virgule valide.</string>
<string name="mosAlreadyGiven">Une mesure a déjà été donnée pour ce sujet.</string>
<string name="editSubjectBirthdate">Changer la date de naissance</string>
<string name="subjectNoBirthDate">%s n\'a pas de date de naissance !</string>
<string name="calendarForSubject">Date de naissance de %s</string>
<string name="terminerLaMesure">Terminer la mesure</string>
<string name="completeMeasureWithoutEveryoneTitle">Terminer la mesure ?</string>
<string name="completeMeasureWithoutEveryone">Voulez-vous vraiment terminer la mesure, bien que %s n\'ai pas de nouvelle entrée ?</string>
</resources>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="newGroupText" parent="TextAppearance.AppCompat">
<item name="android:fontFamily">italic</item>
</style>
<style name="group_list_item_text" parent="TextAppearance.AppCompat.Body1">
<item name="android:textStyle">normal</item>
</style>
<style name="group_list_newgroup_item_text" parent="TextAppearance.AppCompat.Body1">
<item name="android:textStyle">italic</item>
</style>
<style name="group_list_item_text_selected" parent="group_list_item_text">
<item name="android:textStyle">bold</item>
</style>
<style name="group_list_newgroup_item_text_selected" parent="group_list_newgroup_item_text">
<item name="android:textStyle">bold|italic</item>
</style>
<style name="newmeasure_subject_list_item_clickable" parent="group_list_newgroup_item_text">
<item name="android:textStyle">bold</item>
<item name="android:textSize">15sp</item>
</style>
<style name="newmeasure_subject_list_item_disable" parent="group_list_newgroup_item_text">
<item name="android:textStyle">italic</item>
<item name="android:textSize">12sp</item>
</style>
</resources>

View File

@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.CalcHulator" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<style name="Theme.EMorphotype" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
@ -14,12 +14,12 @@
<!-- Customize your theme here. -->
</style>
<style name="Theme.CalcHulator.NoActionBar">
<style name="NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="Theme.CalcHulator.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="Theme.CalcHulator.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
<style name="PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

View File

@ -1,17 +0,0 @@
package com.bernard.calchulator;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}