commit 7dca70e512b1a1b92605c30d7e617076f70f04f5 Author: Ramandeep Date: Mon Aug 2 18:14:45 2021 +0530 Sickle Cell App diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..cf7c99f --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +app android \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..5cd135a --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..0380d8d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..6199cc2 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..036b08e --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,49 @@ +plugins { + id 'com.android.application' + id 'com.google.firebase.crashlytics' + id 'com.google.gms.google-services' + +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + + defaultConfig { + applicationId "com.smi.SickleCell" + minSdkVersion 19 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + multiDexEnabled true + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'com.google.firebase:firebase-database:20.0.1' + testImplementation 'junit:junit:4.+' + implementation 'com.google.firebase:firebase-database:19.5.1' + + + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..bebb59b --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "93211969564", + "project_id": "sicklecell-app", + "storage_bucket": "sicklecell-app.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:93211969564:android:b83a52de2d54f94f21b7d9", + "android_client_info": { + "package_name": "com.smi.SickleCell" + } + }, + "oauth_client": [ + { + "client_id": "93211969564-kd1qj9bgi5ol338u3smjq2jgr9d0hav7.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDlTMjlvLcXPdbfCi2UWNKeyanaHaWEoZo" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "93211969564-kd1qj9bgi5ol338u3smjq2jgr9d0hav7.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/smi/SickleCell/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/smi/SickleCell/ExampleInstrumentedTest.java new file mode 100644 index 0000000..e84ae3e --- /dev/null +++ b/app/src/androidTest/java/com/smi/SickleCell/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.smi.SickleCell; + +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 Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.appandroid", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ed59fb1 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/smi/SickleCell/MainActivity.java b/app/src/main/java/com/smi/SickleCell/MainActivity.java new file mode 100644 index 0000000..1774380 --- /dev/null +++ b/app/src/main/java/com/smi/SickleCell/MainActivity.java @@ -0,0 +1,573 @@ +package com.smi.SickleCell; + +import androidx.annotation.MainThread; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import android.Manifest; +import android.content.ContentValues; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; + +public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{ + private Button confirmatory,screening; + + private static final int REQUEST_CODE_PICK_FILE = 300; + String FilePath; + private TextView result; + float number1; + float number2; + private String TestRandomKey,saveCurrentDate, saveCurrentTime; + private DatabaseReference TestRef; + private TextView result_confirmatory; + String device; + String result_test; + String result_test1; + String targetUri; + + String directory_path; + float value; + int flag=0; + + File file=null; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_main); + String directory_path = Environment.getExternalStorageDirectory().getPath() + "/SickleCell/"; + + screening=findViewById(R.id.screening); + confirmatory=findViewById(R.id.confirmatory); + TestRef = FirebaseDatabase.getInstance().getReference().child("Test_Data"); + + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + Spinner Spinner_gender = findViewById(R.id.spinner_device); + ArrayAdapter adapter = ArrayAdapter.createFromResource(this, + R.array.instrument, android.R.layout.simple_spinner_item); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + Spinner_gender.setAdapter(adapter); + Spinner_gender.setOnItemSelectedListener(this); + result=findViewById(R.id.result); + result_confirmatory=findViewById(R.id.result_confirmatory); + + if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) + { + + ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},23); + + + directory_path = Environment.getExternalStorageDirectory().getPath() + "/SickleCell/"; + File file = new File(directory_path); + if (!file.exists()) { + file.mkdirs(); + } + } + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + directory_path = Environment.getExternalStorageDirectory().getPath() + "/SickleCell/"; + File file = new File(directory_path); + if (!file.exists()) { + file.mkdirs(); + } + } else { + // Request permission from the user + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0); + } + + + directory_path = Environment.getExternalStorageDirectory().getPath() + "/SickleCell/"; + File file = new File(directory_path); + if (!file.exists()) { + file.mkdirs(); + } + + + + + + + + + directory_path = Environment.getExternalStorageDirectory().getPath() + "/SickleCell/"; + file = new File(directory_path); + if (!file.exists()) { + file.mkdirs(); + } + + screening.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + flag=1; + createfolder(); + + selectCSVFile(); + } + }); + + + confirmatory.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + flag=2; + createfolder(); + + selectCSVFile(); + + } + }); + + + + + + } + + private void selectCSVFile(){ + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + + ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 23); + } + Uri uri = Uri.parse((Environment.getExternalStorageDirectory().getPath() + "/SickleCell/")); + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.setDataAndType(uri, "*/*"); + + // intent.setType("*/*"); + startActivityForResult(intent,REQUEST_CODE_PICK_FILE); + + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + + + case REQUEST_CODE_PICK_FILE: { + if (resultCode == RESULT_OK) { + + + Log.e("file",data.getData().getPath()); + + FilePath = data.getData().getPath(); + Log.e("Filepath",FilePath); + + String filename1=FilePath.substring(FilePath.lastIndexOf("/")+1); + + Log.e("file",filename1); + + String s = FilePath; + + directory_path = Environment.getExternalStorageDirectory().getPath() + "/SickleCell/"; + targetUri = directory_path+filename1; + + if(flag==1) + { + ImportCSV(new File(targetUri)); + + } + else if(flag==2) + { + ImportCSV2(new File(targetUri)); + + } + + + + } + } + } + } + private void ImportCSV(File from) { + ContentValues cv = new ContentValues(); + result_confirmatory.setText(""); + result.setText(""); + try { + InputStream inputStream = new FileInputStream(from); + BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); + + + String line; + if(device.equals("TestRight")) + { + result_confirmatory.setText(""); + result.setText(""); + Log.e("device", "Test right"); + + while ((line = br.readLine()) != null) { + String[] values = line.split(","); + if (values[0].equals("427.084")) { + + number1 = Float.parseFloat(String.valueOf(values[1])); + + Log.e("number1", String.valueOf(number1)); + + + } + else if(values[0].equals("555.035")) + { + number2 = Float.parseFloat(String.valueOf(values[1])); + Log.e("number2", String.valueOf(number2)); + + + + + } + + + } + value= number2/number1; + + + Log.e("value",String.valueOf(value)); + if(value<0.16) + { + result_confirmatory.setText(""); + result.setText("Negative"); + result_test=result.getText().toString(); + result_test1=result_confirmatory.getText().toString(); + SaveProductInfoToDatabase(); + } + else + { + result.setText("Positive"); + result_confirmatory.setText(""); + result_test=result.getText().toString(); + result_test1=result_confirmatory.getText().toString(); + SaveProductInfoToDatabase(); + + + } + + } + + else if (device.equals("Denovix")) + { + result_confirmatory.setText(""); + result.setText(""); + Log.e("device", "denovix"); + + while ((line = br.readLine()) != null) { + String[] values = line.split(","); + if (values[2].equals("427.084")) { + + number1 = Float.parseFloat(String.valueOf(values[3])); + + Log.e("number1", String.valueOf(number1)); + + + } + else if(values[2].equals("555.035")) + { + number2 = Float.parseFloat(String.valueOf(values[3])); + Log.e("number2", String.valueOf(number2)); + + + + + } + + + } + value=number2/number1; + Log.e("value",String.valueOf(value)); + if(value<0.16) + { + result.setText("Negative"); + result_test=result.getText().toString(); + result_test1=result_confirmatory.getText().toString(); + SaveProductInfoToDatabase(); + + } + else + { + result.setText("Positive"); + result_test=result.getText().toString(); + result_test1=result_confirmatory.getText().toString(); + SaveProductInfoToDatabase(); + + + } + + } + } catch (IOException ex) { + throw new RuntimeException("Error in reading CSV file: " + ex); + } + + + + + + } + private void ImportCSV2(File from) { + result_confirmatory.setText(""); + result.setText(""); + + try { + InputStream inputStream = new FileInputStream(from); + BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); + + + String line; + if(device.equals("TestRight")) + { + result_confirmatory.setText(""); + result.setText(""); + Log.e("device", "Test right"); + + while ((line = br.readLine()) != null) { + String[] values = line.split(","); + + if (values[0].equals("427.084")) { + number1 = Float.parseFloat(String.valueOf(values[1])); + Log.e("number1", String.valueOf(number1)); + + + } + else if(values[0].equals("555.035")) + { + number2 = Float.parseFloat(String.valueOf(values[1])); + Log.e("number2", String.valueOf(number2)); + + + + + } + + + } + value=number2/number1; + Log.e("value",String.valueOf(value)); + if(value<0.16) + { + result.setText("Negative"); + result_test=result.getText().toString(); + result_test1=result_confirmatory.getText().toString(); + + } + else + { + result.setText("Positive"); + result_test=result.getText().toString(); + result_test1=result_confirmatory.getText().toString(); + + + } + if(value>=0.16 && value < 0.24) + { + result_confirmatory.setText("Sickle Cell Trait"); + result_test=result.getText().toString(); + result_test1=result_confirmatory.getText().toString(); + SaveProductInfoToDatabase(); + + } + else if( value >=0.24) + { + result_confirmatory.setText("Sickle-Cell Disease"); + result_test=result.getText().toString(); + result_test1=result_confirmatory.getText().toString(); + SaveProductInfoToDatabase(); + + + + } + } + +else if (device.equals("Denovix")) + { + result_confirmatory.setText(""); + result.setText(""); + Log.e("device", "denovix"); + + while ((line = br.readLine()) != null) { + String[] values = line.split(","); + if (values[2].equals("427.084")) { + number1 = Float.parseFloat(String.valueOf(values[3])); + Log.e("number1", String.valueOf(number1)); + + + } + else if(values[2].equals("555.035")) + { + number2 = Float.parseFloat(String.valueOf(values[3])); + Log.e("number2", String.valueOf(number2)); + + + + + } + + + } + value=number2/number1; + Log.e("value",String.valueOf(value)); + if(value<0.16) + { + result.setText("Negative"); + + } + else + { + result.setText("Positive"); + + + } + if(value>=0.16 && value < 0.24) + { + result_confirmatory.setText("Sickle Cell Trait "); + SaveProductInfoToDatabase(); + + } + else if( value >0.24) + { + result_confirmatory.setText("Sickle-Cell Disease"); + SaveProductInfoToDatabase(); + + + } + } + + } catch (IOException ex) { + throw new RuntimeException("Error in reading CSV file: " + ex); + } + + + + + + } + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if(parent.getId() == R.id.spinner_device) + { + device = parent.getItemAtPosition(position).toString(); + + } + + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + private void createfolder() + { + directory_path = Environment.getExternalStorageDirectory().getPath() + "/SickleCell/"; + file = new File(directory_path); + if (!file.exists()) { + file.mkdirs(); + } + + } + + + private void SaveProductInfoToDatabase() + { + HashMap productMap = new HashMap<>(); + productMap.put("Value", String.valueOf(value)); + productMap.put("number1", String.valueOf(number1)); + productMap.put("number2",String.valueOf(number2)); + productMap.put("Device",device); + productMap.put("Result",result_test); + productMap.put("Result Confirmatory",result_test1); + productMap.put("Directory Path",directory_path); + productMap.put("Full Path",targetUri); + + + // productMap("Result",String.valueOf(result.getText().toString())); + + + + Calendar calendar = Calendar.getInstance(); + + SimpleDateFormat currentDate = new SimpleDateFormat("MMM dd, yyyy"); + + saveCurrentDate = currentDate.format(calendar.getTime()); + saveCurrentDate = saveCurrentDate .replaceAll("[^A-Za-z0-9 ]",""); + + + SimpleDateFormat currentTime = new SimpleDateFormat("h:mm a"); + saveCurrentTime = currentTime.format(calendar.getTime()); + + TestRandomKey = saveCurrentDate + saveCurrentTime+String.valueOf( Math.random()); + TestRandomKey = TestRandomKey .replaceAll("[^A-Za-z0-9 ]",""); + + + + TestRef.child(TestRandomKey).updateChildren(productMap) + .addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) + { + if (task.isSuccessful()) { + + + Toast.makeText(MainActivity.this, "Test Result added in backend successfully ", Toast.LENGTH_SHORT).show(); + + + + } + else + { + + String message = task.getException().toString(); + Toast.makeText(MainActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show(); + } + } + }); + } + + + + + + + + + + + + + + + + + + + + + + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/shanmukha_logo_small.png b/app/src/main/res/drawable/shanmukha_logo_small.png new file mode 100644 index 0000000..ba5bdf7 Binary files /dev/null and b/app/src/main/res/drawable/shanmukha_logo_small.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..110d655 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +