Mise a jour de graphe.

This commit is contained in:
Samy Avrillon 2021-12-11 02:45:32 +01:00
parent dbb108dd73
commit 53f6876b5d
10 changed files with 62 additions and 260 deletions

View File

@ -34,12 +34,12 @@ android {
dependencies {
implementation 'com.jjoe64:graphview:4.2.2'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.appcompat:appcompat:1.4.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
implementation 'androidx.navigation:navigation-fragment:2.3.5'
implementation 'androidx.navigation:navigation-ui:2.3.5'
testImplementation 'junit:junit:4.+'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

View File

@ -1,47 +0,0 @@
package com.bernard.calchulator;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;
import com.bernard.calchulator.databinding.FragmentFirstBinding;
public class FirstFragment extends Fragment {
private FragmentFirstBinding binding;
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
binding = FragmentFirstBinding.inflate(inflater, container, false);
return binding.getRoot();
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.buttonFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavHostFragment.findNavController(FirstFragment.this)
.navigate(R.id.action_FirstFragment_to_SecondFragment);
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}

View File

@ -1,76 +0,0 @@
package com.bernard.calchulator;
import android.os.Bundle;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.bernard.calchulator.databinding.ActivityMainBinding;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration appBarConfiguration;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
binding.fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
return NavigationUI.navigateUp(navController, appBarConfiguration)
|| super.onSupportNavigateUp();
}
}

View File

@ -1,47 +0,0 @@
package com.bernard.calchulator;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;
import com.bernard.calchulator.databinding.FragmentSecondBinding;
public class SecondFragment extends Fragment {
private FragmentSecondBinding binding;
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
binding = FragmentSecondBinding.inflate(inflater, container, false);
return binding.getRoot();
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.buttonSecond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavHostFragment.findNavController(SecondFragment.this)
.navigate(R.id.action_SecondFragment_to_FirstFragment);
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}

View File

@ -16,6 +16,7 @@ import com.jjoe64.graphview.series.DataPoint;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
public class EMorphApplication extends Application {
@ -210,7 +211,7 @@ public class EMorphApplication extends Application {
}
public MeasureOnSubject getMos(long subjectID, long measureID){
Cursor dbResult = db.query("measuresOnSubjects",new String[]{"ID","subjectID","circAbdomen","circBras","circEpaules","circTaille","circCuisse","circCheville","circAvantBras"},
"subjectID = ?",new String[]{Long.toString(subjectID)/*,Long.toString(measureID)*/},
"subjectID = ? AND measureID = ?",new String[]{Long.toString(subjectID),Long.toString(measureID)},
null, null, null);
dbResult.moveToFirst();
MeasureOnSubject out;
@ -302,19 +303,28 @@ public class EMorphApplication extends Application {
}
public static void putInitialData(SQLiteDatabase db){
int measureCount = 1;
int deltaMeasure = 3600*160;
Random r = new Random();
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[8]);
cv.put("circBras", testDatum[6]);
cv.put("circEpaules", testDatum[7]);
cv.put("circTaille", testDatum[9]);
cv.put("circCuisse", testDatum[4]);
cv.put("circCheville", testDatum[3]);
cv.put("circAvantBras", testDatum[5]);
db.insert("measuresOnSubjects", null, cv);
double ab = testDatum[8], br = testDatum[6], ep = testDatum[7],
ta = testDatum[9], cu = testDatum[4], ch = testDatum[3], av = testDatum[5];
for(int i=0;i<measureCount;i++) {
ContentValues cv = new ContentValues();
cv.put("ID", testDatum[0]*measureCount+i);
cv.put("measureID", testDatum[1]*measureCount+i);
cv.put("subjectID", testDatum[2]);
cv.put("circAbdomen", ab*(1+Math.tanh(r.nextGaussian()/30+.1)));
cv.put("circBras", br*(1+Math.tanh(r.nextGaussian()/30+.1)));
cv.put("circEpaules", ep*(1+Math.tanh(r.nextGaussian()/30+.1)));
cv.put("circTaille", ta*(1+Math.tanh(r.nextGaussian()/30+.1)));
cv.put("circCuisse", cu*(1+Math.tanh(r.nextGaussian()/30+.1)));
cv.put("circCheville", ch*(1+Math.tanh(r.nextGaussian()/30+.1)));
cv.put("circAvantBras", av*(1+Math.tanh(r.nextGaussian()/30+.1)));
db.insert("measuresOnSubjects", null, cv);
}
}
for (Object[] testDatum : testData2) {
ContentValues cv = new ContentValues();
@ -332,11 +342,13 @@ public class EMorphApplication extends Application {
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);
for(int j=0;j<measureCount;j++) {
ContentValues cv = new ContentValues();
cv.put("ID", i*measureCount+j);
cv.put("groupID", i);
cv.put("time", (System.currentTimeMillis() / 1000)-(measureCount-j+1)*deltaMeasure);
db.insert("measures", null, cv);
}
}

View File

@ -3,6 +3,7 @@ package com.bernard.emorph.activities;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
@ -15,7 +16,6 @@ import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.Viewport;
import com.jjoe64.graphview.series.DataPoint;
import com.jjoe64.graphview.series.PointsGraphSeries;
import com.jjoe64.graphview.series.Series;
import java.util.Arrays;
import java.util.Iterator;
@ -42,7 +42,7 @@ public class GraphActivity extends AppCompatActivity {
gv = findViewById(R.id.theGraphView);
String[] cs = getResources().getStringArray(R.array.distinctGraphColors);
String[] cs = getResources().getStringArray(R.array. distinctGraphColors);
colors = new int[cs.length];
for (int i = 0; i < colors.length; i++)
colors[i] = Integer.parseInt(cs[i].substring(1),16);
@ -63,9 +63,9 @@ public class GraphActivity extends AppCompatActivity {
int subjectCount = toGraph.getSubjectsID().length;
DataPoint[] points0 = new DataPoint[subjectCount];
double minx=1e10f,maxx=0f,miny=1e10f,maxy=0f;
PointsGraphSeries[] pgs = new PointsGraphSeries[toGraph.getMeasuresID().length];
PointsGraphSeries<DataPoint>[] pgs = new PointsGraphSeries[toGraph.getMeasuresID().length];
for(int j=0; j<toGraph.getMeasuresID().length; j++) {
Log.d("GraphActivity","Doing measure with id "+toGraph.getMeasuresID()[j]);
int realSize = 0;
for (int i = 0; i < subjectCount; i++) {
points0[i] = theApp.point(toGraph.getSubjectsID()[i], toGraph.getMeasuresID()[j]);
@ -82,7 +82,9 @@ public class GraphActivity extends AppCompatActivity {
System.arraycopy(points0,0,points,0,realSize);
PointsGraphSeries<DataPoint> series = new PointsGraphSeries<>(points);
series.setShape(PointsGraphSeries.Shape.POINT);
series.setColor(colors[j]|0xFF000000);
int theColor = colors[j]|0xFF000000;
theColor = manipulateColor(theColor,.7f);
series.setColor(theColor);
series.setSize(10);
pgs[j] = series;
Log.d("NewSeries","Nouvelle serie de "+realSize+" points: couleur #"+Integer.toHexString(colors[j]));
@ -131,14 +133,19 @@ public class GraphActivity extends AppCompatActivity {
sdIMM = Math.sqrt((sdIMM/c)-moyIMM*moyIMM);
sdIMG = Math.sqrt((sdIMG/c)-moyIMG*moyIMG); // Je crois que les formules sont bonnes.
}
Log.d("Test","Test");
Viewport theVP = gv.getViewport();
theVP.setXAxisBoundsManual(true);
theVP.setMinX(Math.min(minx,moyIMM-sdIMM)-.4);
theVP.setMaxX(Math.max(maxx,moyIMM+sdIMM)+.4);
theVP.setMinX(10);
theVP.setMaxX(30);
//theVP.setMinX(Math.min(minx,moyIMM-sdIMM)-.4);
//theVP.setMaxX(Math.max(maxx,moyIMM+sdIMM)+.4);
theVP.setYAxisBoundsManual(true);
theVP.setMinY(Math.min(miny,moyIMG-sdIMG)-.4);
theVP.setMaxY(Math.max(maxy,moyIMG+sdIMG)+.4);
//theVP.setMinY(Math.min(miny,moyIMG-sdIMG)-.4);
//theVP.setMaxY(Math.max(maxy,moyIMG+sdIMG)+.4);
theVP.setMinY(0);
theVP.setMaxY(16);
int interColor = 0x53FFFF00;
int extremeColor = 0x53FF0000;
@ -160,6 +167,17 @@ public class GraphActivity extends AppCompatActivity {
}
public static int manipulateColor(int color, float factor) {
int a = Color.alpha(color);
int r = Math.round(Color.red(color) * factor);
int g = Math.round(Color.green(color) * factor);
int b = Math.round(Color.blue(color) * factor);
return Color.argb(a,
Math.min(r,255),
Math.min(g,255),
Math.min(b,255));
}
public final int randCol(){
Random r = new Random();
return Color.HSVToColor(255, new float[]{r.nextFloat()*360,1.0f,1.0f});

View File

@ -1,14 +0,0 @@
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

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Theme.CalcHulator.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/Theme.CalcHulator.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="@dimen/fab_margin"
android:layout_marginBottom="16dp"
app:srcCompat="@android:drawable/ic_dialog_email" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -1,10 +0,0 @@
<menu 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"
tools:context="com.bernard.calchulator.MainActivity">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never" />
</menu>

View File

@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.3"
classpath 'com.android.tools.build:gradle:7.0.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files