diff --git a/app/build.gradle b/app/build.gradle index f0efbfe7..e744bca9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,21 +6,31 @@ apply plugin: 'com.android.application' apply plugin: 'io.objectbox' android { + buildToolsVersion = '28.0.3' compileSdkVersion 28 defaultConfig { applicationId "br.edu.uepb.nutes.haniot" minSdkVersion 19 targetSdkVersion 28 - versionCode 2 - versionName "1.5.0" + versionCode 4 + versionName "1.7.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true + multiDexEnabled true } buildTypes { - release { + debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } + release { + lintOptions { + disable 'MissingTranslation' + } + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } } compileOptions { targetCompatibility JavaVersion.VERSION_1_8 @@ -37,8 +47,8 @@ dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:support-vector-drawable:28.0.0' - implementation 'com.squareup.okhttp3:okhttp:3.10.0' - // TODO REMOVER após migração com retrofit for finalizada! + + // Charts implementation 'com.mikhaellopez:circularprogressbar:2.0.0' implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3' @@ -46,20 +56,20 @@ dependencies { implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' - //Floating Action Button + // Floating Action Button implementation 'com.github.clans:fab:1.6.4' - //LIBRARY Simple BLE Connect + // LIBRARY Simple BLE Connect implementation 'com.github.nutes-uepb:simple-ble-scanner:v1.0.1' - //LIBRARY Pulsator4Droid + // LIBRARY Pulsator4Droid implementation 'pl.bclogic:pulsator4droid:1.0.3' // NUMBER PICKER implementation 'com.shawnlin:number-picker:2.4.6' // EVENT BUS - implementation 'org.greenrobot:eventbus:3.0.0' + implementation 'org.greenrobot:eventbus:3.1.1' //Android BLE Nordic implementation 'no.nordicsemi.android:ble:2.1.0' @@ -68,24 +78,31 @@ dependencies { implementation 'com.github.nutes-uepb:simple-survey:v1.2.1' // JavaRx - implementation 'io.reactivex.rxjava2:rxjava:2.2.7' + implementation 'io.reactivex.rxjava2:rxjava:2.2.12' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' // Retrofit - implementation 'com.squareup.retrofit2:retrofit:2.5.0' - implementation 'com.squareup.retrofit2:converter-gson:2.5.0' - implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' + implementation 'com.squareup.retrofit2:retrofit:2.6.1' + implementation 'com.squareup.retrofit2:converter-gson:2.6.1' + implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.1' + implementation 'com.squareup.okhttp3:logging-interceptor:4.1.1' // Encode/Decode implementation 'com.scottyab:secure-preferences-lib:0.1.7' implementation 'com.auth0.android:jwtdecode:1.2.0' + // Expandable Recyclerview + implementation 'com.thoughtbot:expandablerecyclerview:1.3' + implementation 'com.thoughtbot:expandablecheckrecyclerview:1.4' + + // Nordic Scanner + implementation 'no.nordicsemi.android.support.v18:scanner:1.4.1' + // TEST testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'io.jsonwebtoken:jjwt:0.2' - implementation 'com.thoughtbot:expandablerecyclerview:1.3' - implementation 'com.thoughtbot:expandablecheckrecyclerview:1.4' + implementation 'com.android.support:multidex:1.0.3' } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index f1b42451..f3448435 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -19,3 +19,11 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile +-dontwarn okhttp3.internal.platform.ConscryptPlatform +-ignorewarnings + +-keepattributes *Annotation* +-keepclassmembers class ** { + @org.greenrobot.eventbus.Subscribe ; +} +-keep enum org.greenrobot.eventbus.ThreadMode { *; } diff --git a/app/release/output.json b/app/release/output.json new file mode 100644 index 00000000..da55cbf5 --- /dev/null +++ b/app/release/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":2,"versionName":"1.5.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 46e4057b..94fa459c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -8,6 +9,7 @@ + - - + tools:ignore="GoogleAppIndexingWarning" + android:fullBackupContent="true"> + + @@ -57,6 +64,9 @@ + @@ -81,7 +91,7 @@ android:theme="@style/AppTheme" /> - + + prepareMeasurement()); } + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterReceiver(mReceiver); + } + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + int status = NetworkUtil.getConnectivityStatusString(context); + + if (CONNECTIVITY_CHANGE.equals(action)) { + if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) { + showMessageConnection(WIRELESS, true); + } else { + showMessageConnection(WIRELESS, false); + } + } + } + }; + + /** + * Displays message. + */ + public void showMessageConnection(String typeMessageError, boolean show) { + Log.w("MainActivity", "show message: " + typeMessageError); + + if (typeMessageError.equals(WIRELESS)) { + if (show) { + wifiRequest = true; + messageError.setOnClickListener(null); + messageError.setText(getString(R.string.wifi_disabled)); + runOnUiThread(() -> { + boxMessage.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); + boxMessage.setVisibility(View.VISIBLE); + }); + } else { + wifiRequest = false; + boxMessage.setVisibility(View.GONE); + } + } + } + /** * Set fragment. * @@ -175,7 +235,7 @@ public void replaceFragment(int measurementType) { case ItemGridType.BLOOD_PRESSURE: measurementText = getResources().getString(R.string.blood_pressure); - typeMeasurement = "blood_pressure"; + typeMeasurement = MeasurementType.BLOOD_PRESSURE; messageInfo.setText(String.format(getResources().getString(R.string.add_measurement_message), measurementText, patientName)); getSupportActionBar().setTitle("Inserir Pressão Arterial"); textUnit.setText(getString(R.string.unit_pressure)); @@ -208,7 +268,7 @@ private void errorHandler(Throwable e) { if (!checkConnectivity()) showMessage(R.string.no_internet_conection); else - showMessage(R.string.error_500); + ErrorHandler.showMessage(this, e); } /** diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/HistoricQuizActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/HistoricQuizActivity.java new file mode 100644 index 00000000..fbfca49e --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/HistoricQuizActivity.java @@ -0,0 +1,413 @@ +package br.edu.uepb.nutes.haniot.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.adapter.HistoricQuizAdapter; +import br.edu.uepb.nutes.haniot.data.model.GroupItemEvaluation; +import br.edu.uepb.nutes.haniot.data.model.ItemEvaluation; +import br.edu.uepb.nutes.haniot.data.model.NutritionalQuestionnaire; +import br.edu.uepb.nutes.haniot.data.model.OdontologicalQuestionnaire; +import br.edu.uepb.nutes.haniot.data.model.Patient; +import br.edu.uepb.nutes.haniot.data.model.TypeEvaluation; +import br.edu.uepb.nutes.haniot.data.model.User; +import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; +import br.edu.uepb.nutes.haniot.utils.DateUtils; +import butterknife.BindView; +import butterknife.ButterKnife; + +import static br.edu.uepb.nutes.haniot.data.model.ItemEvaluation.TYPE_ERROR; +import static br.edu.uepb.nutes.haniot.data.model.ItemEvaluation.TYPE_LOADING; +import static br.edu.uepb.nutes.haniot.data.model.ItemEvaluation.TYPE_QUIZ; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.ALL_QUIZ; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FAMILY_COHESION; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FEEDING_HABITS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.MEDICAL_RECORDS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.ORAL_HEALTH; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.PHYSICAL_ACTIVITY; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.SLEEP_HABITS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.SOCIODEMOGRAPHICS; +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.DENTISTRY; +import static br.edu.uepb.nutes.haniot.data.model.UserType.NUTRITION; + +public class HistoricQuizActivity extends AppCompatActivity implements HistoricQuizAdapter.OnClick { + + @BindView(R.id.list_quiz_nutrition) + RecyclerView listNutritional; + + @BindView(R.id.list_quiz_odonto) + RecyclerView listOdontological; + + @BindView(R.id.toolbar) + Toolbar toolbar; + + @BindView(R.id.box_not_nutrition) + LinearLayout boxNotNutrition; + + @BindView(R.id.box_not_odontological) + LinearLayout boxNotOdontological; + + @BindView(R.id.icon_error_nutrition) + ImageView iconErrorNutrition; + + @BindView(R.id.text_error_nutrition) + TextView textErrorNutrition; + + @BindView(R.id.icon_error_dentistry) + ImageView iconErrorDentistry; + + @BindView(R.id.text_error_dentistry) + TextView textErrorDentistry; + + private HaniotNetRepository haniotNetRepository; + private AppPreferencesHelper appPreferencesHelper; + private Patient patient; + private List groupItemNutritionEvaluations; + private List groupItemOdontologicalEvaluations; + private HistoricQuizAdapter historicNutritionalAdapter; + private HistoricQuizAdapter historicOdontologicalAdapter; + private User user; + @BindView(R.id.loading_nutrition) + ProgressBar loadingNutrition; + + @BindView(R.id.loading_odontological) + ProgressBar loadingOdontological; + + @BindView(R.id.category_1) + TextView nutritionTitle; + + @BindView(R.id.title_category2) + TextView dentistryTitle; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_historic_quiz); + ButterKnife.bind(this); + initResources(); + initToolbar(); + } + + private void initResources() { + groupItemNutritionEvaluations = new ArrayList<>(); + groupItemOdontologicalEvaluations = new ArrayList<>(); + haniotNetRepository = HaniotNetRepository.getInstance(this); + appPreferencesHelper = AppPreferencesHelper.getInstance(this); + patient = appPreferencesHelper.getLastPatient(); + user = appPreferencesHelper.getUserLogged(); + if (!user.getUserType().equals(ADMIN)) { + if (user.getHealthArea().equals(DENTISTRY)) { + nutritionTitle.setVisibility(View.GONE); + loadingNutrition.setVisibility(View.GONE); + } else if (user.getHealthArea().equals(NUTRITION)) { + dentistryTitle.setVisibility(View.GONE); + loadingOdontological.setVisibility(View.GONE); + } + } + } + + + /** + * Initialize toolbar. + */ + private void initToolbar() { + toolbar.setTitle("Histórico de Questionário"); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + + @Override + protected void onResume() { + super.onResume(); + prepareItems(); + } + + /** + * Download data listNutritional from the server. + */ + + private void downloadData() { + if (user.getUserType().equals(ADMIN) || !user.getHealthArea().equals(DENTISTRY)) { + DisposableManager.add(haniotNetRepository + .getAllNutritionalQuestionnaires(patient.get_id(), 1, 100, "created_at") + .subscribe(nutritional -> { + Log.w("AAA", "Size Nutrition: " + nutritional.size()); + showErrorDownloadData(false, NUTRITION); + setNutritionalGroups(nutritional); + loadingNutrition.setVisibility(View.GONE); + }, throwable -> { + loadingNutrition.setVisibility(View.GONE); + showErrorDownloadData(true, NUTRITION); + })); + } + + if (user.getUserType().equals(ADMIN) || !user.getHealthArea().equals(NUTRITION)) { + DisposableManager.add(haniotNetRepository + .getAllOdontologicalQuestionnaires(patient.get_id(), 1, 100, "created_at") + .subscribe(odontological -> { + Log.w("AAA", "Size Odonto: " + odontological.size()); + showErrorDownloadData(false, DENTISTRY); + setOdontologicalGroups(odontological); + loadingOdontological.setVisibility(View.GONE); + }, throwable -> { + loadingOdontological.setVisibility(View.GONE); + showErrorDownloadData(true, DENTISTRY); + })); + } + } + + /** + * Prepare listNutritional data from the server. + */ + private void setNutritionalItem(NutritionalQuestionnaire nutritionalQuestionnaire) { + Log.w("BBBB", "setItem"); + List itemEvaluations = new ArrayList<>(); + + ItemEvaluation itemEvaluation = new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, + "Hábitos do Sono", TypeEvaluation.SLEEP_HABITS); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setSleepHabit(nutritionalQuestionnaire.getSleepHabit()); + itemEvaluations.add(itemEvaluation); + + itemEvaluation = new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, + "Histórico de Saúde", TypeEvaluation.MEDICAL_RECORDS); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setMedicalRecord(nutritionalQuestionnaire.getMedicalRecord()); + itemEvaluations.add(itemEvaluation); + + itemEvaluation = new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, + "Hábitos Alimentares", TypeEvaluation.FEEDING_HABITS); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setFeedingHabitsRecord(nutritionalQuestionnaire.getFeedingHabitsRecord()); + itemEvaluations.add(itemEvaluation); + + itemEvaluation = new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, + "Hábitos Físicos", TypeEvaluation.PHYSICAL_ACTIVITY); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setPhysicalActivityHabit(nutritionalQuestionnaire.getPhysicalActivityHabit()); + itemEvaluations.add(itemEvaluation); + + GroupItemEvaluation groupItemEvaluation = new GroupItemEvaluation(DateUtils.convertDateTimeUTCToLocale(nutritionalQuestionnaire.getCreatedAt(), getString(R.string.datetime_format)), + itemEvaluations, 1000, nutritionalQuestionnaire.get_id()); + + groupItemNutritionEvaluations.add(groupItemEvaluation); + + } + + + /** + * Prepare listNutritional data from the server. + */ + private void setOdontologicalItem(OdontologicalQuestionnaire odontologicalQuestionnaire) { + Log.w("BBBB", "setItem"); + List itemEvaluations = new ArrayList<>(); + + ItemEvaluation itemEvaluation = new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, + "Sociodemográfico", SOCIODEMOGRAPHICS); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setSociodemographicRecord(odontologicalQuestionnaire.getSociodemographicRecord()); + itemEvaluations.add(itemEvaluation); + + itemEvaluation = new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, + "Coesão Familiar", FAMILY_COHESION); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setFamilyCohesionRecord(odontologicalQuestionnaire.getFamilyCohesionRecord()); + itemEvaluations.add(itemEvaluation); + + itemEvaluation = new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, + "Saúde Bucal", ORAL_HEALTH); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setOralHealthRecord(odontologicalQuestionnaire.getOralHealthRecord()); + itemEvaluations.add(itemEvaluation); + + + GroupItemEvaluation groupItemEvaluation = new GroupItemEvaluation("Respondido em " + DateUtils.convertDateTimeUTCToLocale(odontologicalQuestionnaire.getCreatedAt(), getString(R.string.datetime_format)), + itemEvaluations, 1000, odontologicalQuestionnaire.get_id()); + + groupItemOdontologicalEvaluations.add(groupItemEvaluation); + + } + + private void setNutritionalGroups(List nutritionalQuestionnaires) { + + groupItemNutritionEvaluations.clear(); + for (NutritionalQuestionnaire nutritionalQuestionnaire : nutritionalQuestionnaires) { + Log.w("AAA", nutritionalQuestionnaire.toString()); + setNutritionalItem(nutritionalQuestionnaire); + } + if (nutritionalQuestionnaires.isEmpty()) { + showEmpty(true, NUTRITION); + } + listNutritional.setAdapter(null); + initRecyclerView(); + } + + private void setOdontologicalGroups(List odontologicalQuestionnaires) { + + groupItemOdontologicalEvaluations.clear(); + for (OdontologicalQuestionnaire odontologicalQuestionnaire : odontologicalQuestionnaires) { + Log.w("AAA", odontologicalQuestionnaire.toString()); + setOdontologicalItem(odontologicalQuestionnaire); + } + if (odontologicalQuestionnaires.isEmpty()) { + showEmpty(true, DENTISTRY); + } + listOdontological.setAdapter(null); + initRecyclerView(); + } + + /** + * Show error. + * + * @param + */ + private void onDownloadError(int type) { + GroupItemEvaluation groupItemEvaluation = getEvaluationGroupByType(type); + if (groupItemEvaluation == null) return; + groupItemEvaluation.getItems().get(0).setTypeHeader(TYPE_ERROR); + } + + /** + * Get get listNutritional group object by type. + * + * @param type + * @return + */ + private GroupItemEvaluation getEvaluationGroupByType(int type) { + for (GroupItemEvaluation groupItemEvaluation : groupItemNutritionEvaluations) { + if (groupItemEvaluation.getType() == type) { + return groupItemEvaluation; + } + } + return null; + } + + /** + * Show recyclerview items in prepareItems mode. + */ + private void prepareItems() { + groupItemOdontologicalEvaluations.clear(); + groupItemNutritionEvaluations.clear(); + downloadData(); + } + + /** + * Show message empty list. + */ + private void showEmpty(boolean enabled, String type) { + if (type.equals(NUTRITION)) { + iconErrorNutrition.setImageResource(R.drawable.ic_not_form); + textErrorNutrition.setText(getString(R.string.nutrition_quiz_empty)); + if (enabled) boxNotNutrition.setVisibility(View.VISIBLE); + else boxNotNutrition.setVisibility(View.GONE); + } else if (type.equals(DENTISTRY)) { + iconErrorDentistry.setImageResource(R.drawable.ic_not_form); + textErrorDentistry.setText(getString(R.string.dentistry_quiz_empty)); + if (enabled) boxNotOdontological.setVisibility(View.VISIBLE); + else boxNotOdontological.setVisibility(View.GONE); + } + } + + /** + * Show message error download data. + */ + private void showErrorDownloadData(boolean enabled, String type) { + if (type.equals(NUTRITION)) { + iconErrorNutrition.setImageResource(R.drawable.ic_error_server); + textErrorNutrition.setText(getText(R.string.error_recover_data)); + if (enabled) boxNotNutrition.setVisibility(View.VISIBLE); + else boxNotNutrition.setVisibility(View.GONE); + } else if (type.equals(DENTISTRY)) { + iconErrorDentistry.setImageResource(R.drawable.ic_error_server); + textErrorDentistry.setText(getText(R.string.error_recover_data)); + if (enabled) boxNotOdontological.setVisibility(View.VISIBLE); + else boxNotOdontological.setVisibility(View.GONE); + } + } + + /** + * Initialize NutritionalEvaluation recyclerview. + */ + private void initRecyclerView() { + historicNutritionalAdapter = new HistoricQuizAdapter(groupItemNutritionEvaluations, this); + historicOdontologicalAdapter = new HistoricQuizAdapter(groupItemOdontologicalEvaluations, this); + listNutritional.setLayoutManager(new LinearLayoutManager(this)); + listOdontological.setLayoutManager(new LinearLayoutManager(this)); + listNutritional.setNestedScrollingEnabled(false); + listOdontological.setNestedScrollingEnabled(false); + historicNutritionalAdapter.setListener(this); + historicOdontologicalAdapter.setListener(this); + listNutritional.setAdapter(historicNutritionalAdapter); + listOdontological.setAdapter(historicOdontologicalAdapter); + } + + @Override + public void onAddItemClick(String name, int type) { + + } + + @Override + public void onAddItemClick(String name, int type, String idQuiz) { + Intent intent = null; + + switch (type) { + case MEDICAL_RECORDS: + intent = new Intent(this, QuizNutritionActivity.class); + intent.putExtra("checkpoint", MEDICAL_RECORDS); + break; + case SLEEP_HABITS: + intent = new Intent(this, QuizNutritionActivity.class); + intent.putExtra("checkpoint", SLEEP_HABITS); + break; + case FEEDING_HABITS: + intent = new Intent(this, QuizNutritionActivity.class); + intent.putExtra("checkpoint", FEEDING_HABITS); + break; + case PHYSICAL_ACTIVITY: + intent = new Intent(this, QuizNutritionActivity.class); + intent.putExtra("checkpoint", PHYSICAL_ACTIVITY); + break; + case FAMILY_COHESION: + intent = new Intent(this, QuizOdontologyActivity.class); + intent.putExtra("checkpoint", FAMILY_COHESION); + break; + case ORAL_HEALTH: + intent = new Intent(this, QuizOdontologyActivity.class); + intent.putExtra("checkpoint", ORAL_HEALTH); + break; + case SOCIODEMOGRAPHICS: + intent = new Intent(this, QuizOdontologyActivity.class); + intent.putExtra("checkpoint", SOCIODEMOGRAPHICS); + break; + } + if (intent != null) { + intent.putExtra("idUpdate", idQuiz); + startActivity(intent); + } + } + + @Override + public void onSelectClick(ItemEvaluation itemEvaluation, String idQuiz) { + + } + +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/MainActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/MainActivity.java index c677fe77..353c1fd1 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/MainActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/MainActivity.java @@ -12,6 +12,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; +import android.support.v4.widget.NestedScrollView; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; @@ -19,10 +20,13 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.Toast; import com.github.clans.fab.FloatingActionButton; +import com.github.clans.fab.FloatingActionMenu; import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.activity.settings.SettingsActivity; @@ -35,6 +39,11 @@ import butterknife.BindView; import butterknife.ButterKnife; +import static br.edu.uepb.nutes.haniot.data.model.UserType.DENTISTRY; +import static br.edu.uepb.nutes.haniot.data.model.UserType.HEALTH_PROFESSIONAL; +import static br.edu.uepb.nutes.haniot.data.model.UserType.NUTRITION; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; + /** * Main activity, application start. * @@ -44,13 +53,17 @@ public class MainActivity extends AppCompatActivity implements DashboardChartsFr private final String LOG_TAG = "MainActivity"; private final int REQUEST_ENABLE_BLUETOOTH = 1; private final int REQUEST_ENABLE_LOCATION = 2; - @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.frameCharts) FrameLayout frameChart; @BindView(R.id.frameMeasurements) FrameLayout frameMeasurements; + @BindView(R.id.nestedScrollView) + NestedScrollView nestedScrollView; + + @BindView(R.id.patient_actions) + public FloatingActionMenu patientActionsMenu; @BindView(R.id.evaluation_nutrition) FloatingActionButton nutritioEvaluation; @@ -66,6 +79,7 @@ public class MainActivity extends AppCompatActivity implements DashboardChartsFr private AppPreferencesHelper appPreferences; private Patient patient; private long backPressed; + private User userLogged; @Override @@ -76,16 +90,20 @@ protected void onCreate(Bundle savedInstanceState) { toolbar.setTitle(getResources().getString(R.string.app_name)); setSupportActionBar(toolbar); + toolbar.requestFocus(); appPreferences = AppPreferencesHelper.getInstance(this); - dashboardChartsFragment = DashboardChartsFragment.newInstance(); measurementsGridFragment = MeasurementsGridFragment.newInstance(); - + userLogged = appPreferences.getUserLogged(); IntentFilter filterBluetooth = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(mReceiver, filterBluetooth); IntentFilter filterInternet = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); registerReceiver(mReceiver, filterInternet); setupPatientActions(); + Log.w("AAA", "User type: " + appPreferences.getUserAccessHaniot()); + Log.w("AAA", "User: " + appPreferences.getUserLogged()); + + } private void loadDashboard() { @@ -109,7 +127,9 @@ protected void onStart() { protected void onResume() { super.onResume(); // Verify the pilot is selected - if (appPreferences.getLastPilotStudy() == null) { + Log.w("AAA", "" + userLogged.getPilotStudyIDSelected()); + if ((userLogged.getPilotStudyIDSelected() == null || userLogged.getPilotStudyIDSelected().isEmpty()) + && !appPreferences.getUserLogged().getUserType().equals(PATIENT)) { startActivity(new Intent(this, WelcomeActivity.class)); } else { checkPatient(); @@ -127,26 +147,43 @@ protected void onDestroy() { */ private void setupPatientActions() { - if (appPreferences.getUserLogged().getHealthArea().equals("dentistry")) { - quizNutrition.setVisibility(View.GONE); - nutritioEvaluation.setVisibility(View.GONE); + nestedScrollView.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> { + if (scrollY > oldScrollY) { + patientActionsMenu.hideMenu(true); + } else { + patientActionsMenu.showMenu(true); + } + }); + quizOdonto.setOnClickListener(v -> { + startActivity(new Intent(this, QuizOdontologyActivity.class)); + finish(); + }); + quizNutrition.setOnClickListener(v -> { + startActivity(new Intent(this, QuizNutritionActivity.class)); + finish(); + }); + nutritioEvaluation.setOnClickListener(v -> { + Intent intent = new Intent(this, NutritionalEvaluationActivity.class); + intent.putExtra("type", "nutrition"); + startActivity(intent); + }); - quizOdonto.setOnClickListener(v -> { - startActivity(new Intent(this, QuizOdontologyActivity.class)); - finish(); - }); + if (appPreferences.getUserLogged().getUserType().equals(HEALTH_PROFESSIONAL)) { - } else { - quizOdonto.setVisibility(View.GONE); - quizNutrition.setOnClickListener(v -> { - startActivity(new Intent(this, QuizNutritionActivity.class)); - finish(); - }); - nutritioEvaluation.setOnClickListener(v -> { - measurementsGridFragment.saveHeartRateCollection(); - }); + String healthArea = appPreferences.getUserLogged().getHealthArea(); + if (healthArea.equals(DENTISTRY)) { + quizNutrition.setVisibility(View.GONE); + nutritioEvaluation.setVisibility(View.GONE); + } else if (healthArea.equals(NUTRITION)) { + quizOdonto.setVisibility(View.GONE); + + } else if (healthArea.equals(PATIENT)) { + patientActionsMenu.setVisibility(View.INVISIBLE); + } + } else if (appPreferences.getUserLogged().getUserType().equals(PATIENT)) { + patientActionsMenu.setVisibility(View.INVISIBLE); } } @@ -158,10 +195,11 @@ public void checkPatient() { if (patient != null) { loadDashboard(); - checkPermissions(); } else { - startActivity(new Intent(this, ManagerPatientsActivity.class)); + if (!appPreferences.getUserLogged().getUserType().equals(PATIENT)) { + startActivity(new Intent(this, ManagerPatientsActivity.class)); + } } } @@ -172,7 +210,9 @@ public void checkPatient() { public void checkPermissions() { if (BluetoothAdapter.getDefaultAdapter() != null && !BluetoothAdapter.getDefaultAdapter().isEnabled()) { - requestBluetoothEnable(); + Log.w(LOG_TAG, "checkPermissions(): Bluetooth desligado"); + dashboardChartsFragment.showMessageConnection("bluetooth", true); + if (appPreferences.getBluetoothMode()) requestBluetoothEnable(); } else if (!hasLocationPermissions()) { requestLocationPermission(); } @@ -182,6 +222,7 @@ public void checkPermissions() { * Request Bluetooth permission */ private void requestBluetoothEnable() { + Log.w(LOG_TAG, "requestBluetoothEnable(): Criando intent"); startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), REQUEST_ENABLE_BLUETOOTH); } @@ -224,8 +265,12 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_ENABLE_BLUETOOTH) { if (resultCode != Activity.RESULT_OK) { - requestBluetoothEnable(); + Log.w(LOG_TAG, "onActivityResult(): Bluetooth negado"); + appPreferences.saveBluetoothMode(false); + dashboardChartsFragment.showMessageConnection("bluetooth", true); } else { + Log.w(LOG_TAG, "onActivityResult(): Bluetooth aceito"); + appPreferences.saveBluetoothMode(true); requestLocationPermission(); } } @@ -235,6 +280,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); + if (appPreferences.getUserLogged().getUserType().equals(PATIENT)) + menu.getItem(0).setVisible(false); return super.onCreateOptionsMenu(menu); } @@ -285,7 +332,7 @@ public void notifyNewMeasurement(String valueMeasurement) { @Override public void showMessage(int message) { - dashboardChartsFragment.showMessage(message); +// dashboardChartsFragment.showMessageConnection(message); } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @@ -295,19 +342,23 @@ public void onReceive(Context context, Intent intent) { int status = NetworkUtil.getConnectivityStatusString(context); if ("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) { if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) { - dashboardChartsFragment.showMessage(R.string.wifi_disabled); + Log.w(LOG_TAG, "mReceiver: wifi desligado"); + dashboardChartsFragment.showMessageConnection("wifi", true); } else { - dashboardChartsFragment.showMessage(-1); + Log.w(LOG_TAG, "mReceiver: wifi ligado"); + dashboardChartsFragment.showMessageConnection("wifi", false); } } if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); if (state == BluetoothAdapter.STATE_OFF) { - dashboardChartsFragment.showMessage(R.string.bluetooth_disabled); - + Log.w(LOG_TAG, "mReceiver: Bluetooth desligado"); + dashboardChartsFragment.showMessageConnection("bluetooth", true); } else if (state == BluetoothAdapter.STATE_ON) { - dashboardChartsFragment.showMessage(-1); + Log.w(LOG_TAG, "mReceiver: Bluetooth ligado"); + appPreferences.saveBluetoothMode(true); + dashboardChartsFragment.showMessageConnection("bluetooth", false); } } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/ManagerPatientsActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/ManagerPatientsActivity.java index 4f339f53..6e902857 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/ManagerPatientsActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/ManagerPatientsActivity.java @@ -2,7 +2,6 @@ import android.app.AlertDialog; import android.content.Intent; -import android.graphics.Color; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v4.widget.SwipeRefreshLayout; @@ -13,11 +12,8 @@ import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -28,11 +24,11 @@ import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.activity.settings.SettingsActivity; import br.edu.uepb.nutes.haniot.adapter.ManagerPatientAdapter; -import br.edu.uepb.nutes.haniot.adapter.base.OnRecyclerViewListener; import br.edu.uepb.nutes.haniot.data.model.Patient; -import br.edu.uepb.nutes.haniot.data.model.PilotStudy; +import br.edu.uepb.nutes.haniot.data.model.User; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.ErrorHandler; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; import butterknife.BindView; import butterknife.ButterKnife; @@ -67,7 +63,7 @@ public class ManagerPatientsActivity extends AppCompatActivity { private SearchView searchView; private AppPreferencesHelper appPreferencesHelper; private HaniotNetRepository haniotNetRepository; - private PilotStudy pilotStudy; + private User user; @Override protected void onCreate(Bundle savedInstanceState) { @@ -79,9 +75,9 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); initResources(); - loadData(); } + /** * Initialize SwipeRefresh */ @@ -93,21 +89,36 @@ private void initDataSwipeRefresh() { * Init resources. */ private void initResources() { + recyclerViewPatient.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if (dy > 0 || dy < 0 && addPatient.isShown()) { + addPatient.hide(); + } + } + + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + if (!recyclerView.canScrollVertically(1) && newState == RecyclerView.SCROLL_STATE_IDLE) { + addPatient.hide(); + } else if (newState == RecyclerView.SCROLL_STATE_IDLE) { + addPatient.show(); + } + super.onScrollStateChanged(recyclerView, newState); + } + }); message.setVisibility(View.INVISIBLE); appPreferencesHelper = AppPreferencesHelper.getInstance(this); haniotNetRepository = HaniotNetRepository.getInstance(this); - pilotStudy = appPreferencesHelper.getLastPilotStudy(); patientList = new ArrayList<>(); + user = appPreferencesHelper.getUserLogged(); disableBack(); - addPatient.setOnClickListener(v -> { - startActivity(new Intent(getApplicationContext(), PatientRegisterActivity.class)); - finish(); - }); - addPatientShortCut.setOnClickListener(v -> { - startActivity(new Intent(getApplicationContext(), PatientRegisterActivity.class)); - finish(); - }); + View.OnClickListener onClickListener = v -> { + startActivity(new Intent(this, UserRegisterActivity.class)); + }; + addPatient.setOnClickListener(onClickListener); + addPatientShortCut.setOnClickListener(onClickListener); initDataSwipeRefresh(); } @@ -115,12 +126,14 @@ private void initResources() { * Load patients in server. */ private void loadData() { + if (!addPatient.isShown()) addPatient.show(); mDataSwipeRefresh.setRefreshing(true); DisposableManager.add(haniotNetRepository - .getAllPatients(pilotStudy.get_id(), "created_at", 1, 100) + .getAllPatients(user.getPilotStudyIDSelected(), "created_at", 1, 100) .doAfterTerminate(() -> mDataSwipeRefresh.setRefreshing(false)) .subscribe(patients -> { patientList = patients; + initRecyclerView(); }, this::errorHandler)); disableBack(); @@ -139,12 +152,7 @@ public void onBackPressed() { * @param e {@link Throwable} */ private void errorHandler(Throwable e) { - if (e instanceof HttpException) { - HttpException httpEx = ((HttpException) e); - Log.i(LOG_TAG, httpEx.getMessage()); - showMessage(getResources().getString(R.string.error_500)); - } - // message 500 + ErrorHandler.showMessage(this, e); } @Override @@ -157,19 +165,18 @@ private void initRecyclerView() { adapter.setPatientActionListener(new ManagerPatientAdapter.ActionsPatientListener() { @Override public void onMenuClick(String action, Patient patient) { - switch (action) { - case "quiz_dentistry": - appPreferencesHelper.saveLastPatient(patient); - startActivity(new Intent(ManagerPatientsActivity.this, QuizOdontologyActivity.class)); - break; - case "quiz_nutrition": - appPreferencesHelper.saveLastPatient(patient); - startActivity(new Intent(ManagerPatientsActivity.this, QuizNutritionActivity.class)); - break; - case "nutrition_evaluation": - appPreferencesHelper.saveLastPatient(patient); - startActivity(new Intent(ManagerPatientsActivity.this, NutritionalEvaluationActivity.class)); - break; + if ("quiz_dentistry".equals(action)) { + appPreferencesHelper.saveLastPatient(patient); + startActivity(new Intent(ManagerPatientsActivity.this, QuizOdontologyActivity.class)); + } else if ("quiz_nutrition".equals(action)) { + appPreferencesHelper.saveLastPatient(patient); + startActivity(new Intent(ManagerPatientsActivity.this, QuizNutritionActivity.class)); + } else if ("nutrition_evaluation".equals(action)) { + appPreferencesHelper.saveLastPatient(patient); + startActivity(new Intent(ManagerPatientsActivity.this, NutritionalEvaluationActivity.class)); + } else if ("historic_quiz".equals(action)) { + appPreferencesHelper.saveLastPatient(patient); + startActivity(new Intent(ManagerPatientsActivity.this, HistoricQuizActivity.class)); } } @@ -195,12 +202,17 @@ public void onMenuContextClick(View v, Patient item) { .show(); } else if (v.getId() == R.id.btnEditChildren) { - Intent intent = new Intent(ManagerPatientsActivity.this, PatientRegisterActivity.class); + Intent intent = new Intent(ManagerPatientsActivity.this, UserRegisterActivity.class); intent.putExtra("action", "edit"); appPreferencesHelper.saveLastPatient(item); startActivity(intent); } } + + @Override + public void onItemSwiped(Patient item, int position) { + + } }); recyclerViewPatient.setHasFixedSize(true); @@ -222,8 +234,8 @@ private void removePatient(Patient patient) { adapter.removeItem(patient); adapter.notifyDataSetChanged(); showMessage(getResources().getString(R.string.patient_removed)); - if (patient.get_id().equals(appPreferencesHelper.getLastPatient().get_id())) { - Log.i("AAA", "Removendo atual paciente"); + Patient lastPatient = appPreferencesHelper.getLastPatient(); + if (lastPatient != null && patient.get_id().equals(lastPatient.get_id())) { appPreferencesHelper.removeLastPatient(); } }, @@ -247,26 +259,6 @@ protected void onResume() { loadData(); } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - - //Adiciona o menu a activity - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.menu_manage_patient, menu); - - //Botão search na toolbar - MenuItem searchBtn = menu.findItem(R.id.btnSearchPatient); - this.searchView = (SearchView) searchBtn.getActionView(); - searchView.setIconifiedByDefault(true); - searchView.setMaxWidth(Integer.MAX_VALUE); - searchView.setIconified(false); - searchView.setBackgroundColor(getResources().getColor(android.R.color.transparent)); - EditText searchEditText = searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); - searchEditText.setTextColor(Color.WHITE); - - return super.onCreateOptionsMenu(menu); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/NutritionalEvaluationActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/NutritionalEvaluationActivity.java index 61fb233f..44d7434d 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/NutritionalEvaluationActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/NutritionalEvaluationActivity.java @@ -18,32 +18,30 @@ import android.widget.Toast; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.adapter.EvaluationAdapter; -import br.edu.uepb.nutes.haniot.data.model.FeedingHabitsRecord; import br.edu.uepb.nutes.haniot.data.model.GroupItemEvaluation; import br.edu.uepb.nutes.haniot.data.model.ItemEvaluation; import br.edu.uepb.nutes.haniot.data.model.ItemGridType; import br.edu.uepb.nutes.haniot.data.model.Measurement; -import br.edu.uepb.nutes.haniot.data.model.MedicalRecord; +import br.edu.uepb.nutes.haniot.data.model.MeasurementLastResponse; import br.edu.uepb.nutes.haniot.data.model.NutritionalEvaluation; +import br.edu.uepb.nutes.haniot.data.model.NutritionalQuestionnaire; import br.edu.uepb.nutes.haniot.data.model.Patient; -import br.edu.uepb.nutes.haniot.data.model.PhysicalActivityHabit; import br.edu.uepb.nutes.haniot.data.model.PilotStudy; -import br.edu.uepb.nutes.haniot.data.model.SleepHabit; import br.edu.uepb.nutes.haniot.data.model.TypeEvaluation; +import br.edu.uepb.nutes.haniot.data.model.User; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; import br.edu.uepb.nutes.haniot.devices.GlucoseActivity; -import br.edu.uepb.nutes.haniot.devices.HeartRateActivity; import br.edu.uepb.nutes.haniot.devices.ScaleActivity; import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import butterknife.BindView; import butterknife.ButterKnife; -import retrofit2.HttpException; import static br.edu.uepb.nutes.haniot.data.model.ItemEvaluation.TYPE_EMPTY_REQUIRED; import static br.edu.uepb.nutes.haniot.data.model.ItemEvaluation.TYPE_ERROR; @@ -51,6 +49,7 @@ import static br.edu.uepb.nutes.haniot.data.model.ItemEvaluation.TYPE_MEASUREMENT; import static br.edu.uepb.nutes.haniot.data.model.ItemEvaluation.TYPE_QUIZ; import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.ALL_MEASUREMENT; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.ALL_QUIZ; import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.BLOOD_PRESSURE; import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FEEDING_HABITS; import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.GLUCOSE; @@ -87,6 +86,12 @@ public class NutritionalEvaluationActivity extends AppCompatActivity implements private AppPreferencesHelper appPreferencesHelper; private NutritionalEvaluation nutritionalEvaluation; private PilotStudy pilotStudy; + private NutritionalQuestionnaire lastNutritionalQuestionnaire; + private List measurementList; + private boolean leftFields; + private MeasurementLastResponse measurementLastResponse; + private HashMap validated; + private User user; @Override protected void onCreate(Bundle savedInstanceState) { @@ -138,12 +143,13 @@ private void initToolbar() { * Initialize resources. */ private void initResources() { + validated = new HashMap<>(); groupItemEvaluations = new ArrayList<>(); helper = AppPreferencesHelper.getInstance(this); haniotNetRepository = HaniotNetRepository.getInstance(this); appPreferencesHelper = AppPreferencesHelper.getInstance(this); patient = helper.getLastPatient(); - pilotStudy = helper.getLastPilotStudy(); + user = helper.getUserLogged(); } private void showToast(final String menssage) { @@ -173,7 +179,7 @@ public void showMessage(@StringRes int str) { } /** - * Get get evaluation group object by type. + * Get get listNutritional group object by type. * * @param type * @return @@ -215,12 +221,6 @@ private void prepareItems() { groupItemEvaluations.add(new GroupItemEvaluation(getString(R.string.waits_circumference), itemsLoading, WAIST_CIRCUMFERENCE)); - itemsLoading = new ArrayList<>(); - itemsLoading.add(new ItemEvaluation(R.drawable.xcardiogram, TYPE_LOADING, - getString(R.string.heart_rate), HEARTRATE)); - groupItemEvaluations.add(new GroupItemEvaluation(getString(R.string.heart_rate), - itemsLoading, HEARTRATE)); - itemsLoading = new ArrayList<>(); itemsLoading.add(new ItemEvaluation(R.drawable.xblood_pressure, TYPE_LOADING, getString(R.string.blood_pressure), BLOOD_PRESSURE)); @@ -230,25 +230,25 @@ private void prepareItems() { itemsLoading = new ArrayList<>(); itemsLoading.add(new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, "Histórico de Saúde", TypeEvaluation.MEDICAL_RECORDS)); - groupItemEvaluations.add(new GroupItemEvaluation("Questionário Nutricional - Histórico de Saúde", + groupItemEvaluations.add(new GroupItemEvaluation("Histórico de Saúde", itemsLoading, MEDICAL_RECORDS)); itemsLoading = new ArrayList<>(); itemsLoading.add(new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, "Hábitos Físicos", TypeEvaluation.PHYSICAL_ACTIVITY)); - groupItemEvaluations.add(new GroupItemEvaluation("Questionário Nutricional - Hábitos Físicos", + groupItemEvaluations.add(new GroupItemEvaluation("Hábitos Físicos", itemsLoading, PHYSICAL_ACTIVITY)); itemsLoading = new ArrayList<>(); itemsLoading.add(new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, "Hábitos Alimentares", TypeEvaluation.FEEDING_HABITS)); - groupItemEvaluations.add(new GroupItemEvaluation("Questionário Nutricional - Hábitos Alimentares", + groupItemEvaluations.add(new GroupItemEvaluation("Hábitos Alimentares", itemsLoading, FEEDING_HABITS)); itemsLoading = new ArrayList<>(); itemsLoading.add(new ItemEvaluation(R.drawable.action_quiz, TYPE_LOADING, "Hábitos do Sono", TypeEvaluation.SLEEP_HABITS)); - groupItemEvaluations.add(new GroupItemEvaluation("Questionário Nutricional - Hábitos do Sono", + groupItemEvaluations.add(new GroupItemEvaluation("Hábitos do Sono", itemsLoading, SLEEP_HABITS)); initRecyclerView(); @@ -257,78 +257,86 @@ private void prepareItems() { } /** - * Prepare evaluation data from the server. + * Prepare listNutritional data from the server. + */ + private void prepareQuiz(NutritionalQuestionnaire nutritionalQuestionnaire) { + + GroupItemEvaluation groupItemEvaluation; + ItemEvaluation itemEvaluation; + + //Sleep Habits + groupItemEvaluation = getEvaluationGroupByType(SLEEP_HABITS); + if (groupItemEvaluation != null) { + itemEvaluation = groupItemEvaluation.getItems().get(0); + if (nutritionalQuestionnaire.getSleepHabit() == null) { + itemEvaluation.setTypeHeader(TYPE_EMPTY_REQUIRED); + } else { + nutritionalQuestionnaire.getSleepHabit().setCreatedAt(nutritionalQuestionnaire.getCreatedAt()); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setSleepHabit(lastNutritionalQuestionnaire.getSleepHabit()); + } + } + + //Medical Records + groupItemEvaluation = getEvaluationGroupByType(MEDICAL_RECORDS); + if (groupItemEvaluation != null) { + itemEvaluation = groupItemEvaluation.getItems().get(0); + if (nutritionalQuestionnaire.getMedicalRecord() == null) { + itemEvaluation.setTypeHeader(TYPE_EMPTY_REQUIRED); + } else { + nutritionalQuestionnaire.getMedicalRecord().setCreatedAt(nutritionalQuestionnaire.getCreatedAt()); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setMedicalRecord(lastNutritionalQuestionnaire.getMedicalRecord()); + } + } + + //Feeding habits + groupItemEvaluation = getEvaluationGroupByType(FEEDING_HABITS); + if (groupItemEvaluation != null) { + itemEvaluation = groupItemEvaluation.getItems().get(0); + if (nutritionalQuestionnaire.getFeedingHabitsRecord() == null) { + itemEvaluation.setTypeHeader(TYPE_EMPTY_REQUIRED); + } else { + nutritionalQuestionnaire.getFeedingHabitsRecord().setCreatedAt(nutritionalQuestionnaire.getCreatedAt()); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setFeedingHabitsRecord(lastNutritionalQuestionnaire.getFeedingHabitsRecord()); + } + } + + //Physical Activity + groupItemEvaluation = getEvaluationGroupByType(PHYSICAL_ACTIVITY); + if (groupItemEvaluation != null) { + itemEvaluation = groupItemEvaluation.getItems().get(0); + if (nutritionalQuestionnaire.getPhysicalActivityHabit() == null) { + itemEvaluation.setTypeHeader(TYPE_EMPTY_REQUIRED); + } else { + nutritionalQuestionnaire.getPhysicalActivityHabit().setCreatedAt(nutritionalQuestionnaire.getCreatedAt()); + itemEvaluation.setTypeHeader(TYPE_QUIZ); + itemEvaluation.setPhysicalActivityHabit(lastNutritionalQuestionnaire.getPhysicalActivityHabit()); + } + } + evaluationAdapter.notifyDataSetChanged(); + } + + /** + * Prepare item measurement from the server. * - * @param data * @param type */ - private void prepareData(List data, int type) { + private void prepareMeasurement(Measurement measurement, int type) { GroupItemEvaluation groupItemEvaluation = getEvaluationGroupByType(type); - int reminderFirst5 = 0; - int reminderFirst1 = 0; - int reminderFirst2 = 0; - int reminderFirst3 = 0; - int reminderFirst4 = 0; if (groupItemEvaluation == null) return; - if (data.isEmpty() && !groupItemEvaluation.getItems().isEmpty()) + if (measurement == null && !groupItemEvaluation.getItems().isEmpty()) groupItemEvaluation.getItems().get(0).setTypeHeader(TYPE_EMPTY_REQUIRED); else { + validated.put(type, true); ItemEvaluation itemEvaluation = (ItemEvaluation) groupItemEvaluation.getItems().get(0).clone(); groupItemEvaluation.getItems().clear(); - switch (type) { - case SLEEP_HABITS: - for (SleepHabit sleepHabit : (List) data) { - if (reminderFirst1 == 0) itemEvaluation.setChecked(true); - itemEvaluation.setTypeHeader(TYPE_QUIZ); - itemEvaluation.setSleepHabit(sleepHabit); - groupItemEvaluation.getItems().add(itemEvaluation); - itemEvaluation = (ItemEvaluation) groupItemEvaluation.getItems().get(0).clone(); - reminderFirst1++; - } - break; - case MEDICAL_RECORDS: - for (MedicalRecord medicalRecord : (List) data) { - if (reminderFirst2 == 0) itemEvaluation.setChecked(true); - itemEvaluation.setTypeHeader(TYPE_QUIZ); - itemEvaluation.setMedicalRecord(medicalRecord); - groupItemEvaluation.getItems().add(itemEvaluation); - itemEvaluation = (ItemEvaluation) groupItemEvaluation.getItems().get(0).clone(); - reminderFirst2++; - } - break; - case FEEDING_HABITS: - for (FeedingHabitsRecord feedingHabitsRecord : (List) data) { - if (reminderFirst3 == 0) itemEvaluation.setChecked(true); - itemEvaluation.setTypeHeader(TYPE_QUIZ); - itemEvaluation.setFeedingHabitsRecord(feedingHabitsRecord); - groupItemEvaluation.getItems().add(itemEvaluation); - itemEvaluation = (ItemEvaluation) groupItemEvaluation.getItems().get(0).clone(); - reminderFirst3++; - } - break; - case PHYSICAL_ACTIVITY: - for (PhysicalActivityHabit physicalActivityHabit : (List) data) { - if (reminderFirst4 == 0) itemEvaluation.setChecked(true); - itemEvaluation.setChecked(true); - itemEvaluation.setTypeHeader(TYPE_QUIZ); - itemEvaluation.setPhysicalActivityHabit(physicalActivityHabit); - groupItemEvaluation.getItems().add(itemEvaluation); - itemEvaluation = (ItemEvaluation) groupItemEvaluation.getItems().get(0).clone(); - reminderFirst4++; - } - break; - default: - for (Measurement measurement : (List) data) { - if (reminderFirst5 == 0) itemEvaluation.setChecked(true); - itemEvaluation.setTypeHeader(TYPE_MEASUREMENT); - itemEvaluation.setMeasurement(measurement); - groupItemEvaluation.getItems().add(itemEvaluation); - itemEvaluation = (ItemEvaluation) groupItemEvaluation.getItems().get(0).clone(); - reminderFirst5++; - } - } + itemEvaluation.setTypeHeader(TYPE_MEASUREMENT); + itemEvaluation.setMeasurement(measurement); + groupItemEvaluation.getItems().add(itemEvaluation); } evaluationAdapter.notifyDataSetChanged(); } @@ -346,6 +354,11 @@ private void onDownloadError(int type) { getEvaluationGroupByType(HEIGHT).getItems().get(0).setTypeHeader(TYPE_ERROR); getEvaluationGroupByType(HEARTRATE).getItems().get(0).setTypeHeader(TYPE_ERROR); getEvaluationGroupByType(BLOOD_PRESSURE).getItems().get(0).setTypeHeader(TYPE_ERROR); + } else if (type == ALL_QUIZ) { + getEvaluationGroupByType(MEDICAL_RECORDS).getItems().get(0).setTypeHeader(TYPE_ERROR); + getEvaluationGroupByType(PHYSICAL_ACTIVITY).getItems().get(0).setTypeHeader(TYPE_ERROR); + getEvaluationGroupByType(SLEEP_HABITS).getItems().get(0).setTypeHeader(TYPE_ERROR); + getEvaluationGroupByType(FEEDING_HABITS).getItems().get(0).setTypeHeader(TYPE_ERROR); } else { GroupItemEvaluation groupItemEvaluation = getEvaluationGroupByType(type); if (groupItemEvaluation == null) return; @@ -354,124 +367,91 @@ private void onDownloadError(int type) { } /** - * Download data evaluation from the server. + * Download data listNutritional from the server. */ private void downloadData() { DisposableManager.add(haniotNetRepository - .getAllMedicalRecord(helper.getLastPatient().get_id() - , 1, 20, "created_at") - .subscribe(medicalRecords -> - prepareData(medicalRecords, MEDICAL_RECORDS), - error -> { - Log.i("AAA", error.getMessage()); - onDownloadError(MEDICAL_RECORDS); - })); - - DisposableManager.add(haniotNetRepository - .getAllPhysicalActivity(helper.getLastPatient().get_id() - , 1, 20, "created_at") - .subscribe(physicalActivityHabits -> - prepareData(physicalActivityHabits, PHYSICAL_ACTIVITY), - type -> onDownloadError(PHYSICAL_ACTIVITY))); - - DisposableManager.add(haniotNetRepository - .getAllFeedingHabits(helper.getLastPatient().get_id() - , 1, 20, "created_at") - .subscribe(feedingHabitsRecords -> - prepareData(feedingHabitsRecords, FEEDING_HABITS), - type -> onDownloadError(FEEDING_HABITS))); + .getLastNutritionalQuestionnaire(patient.get_id()) + .subscribe(nutritionalQuestionnaires -> { + Log.w("AAA", nutritionalQuestionnaires.toJson()); + lastNutritionalQuestionnaire = nutritionalQuestionnaires; + prepareQuiz(nutritionalQuestionnaires); + }, throwable -> { + Log.i("AAA", throwable.getMessage()); + onDownloadError(ALL_QUIZ); + })); DisposableManager.add(haniotNetRepository - .getAllSleepHabits(helper.getLastPatient().get_id() - , 1, 20, "created_at") - .subscribe(sleepHabits -> - prepareData(sleepHabits, SLEEP_HABITS), - type -> onDownloadError(SLEEP_HABITS))); + .getLastMeasurements(patient.get_id()) + .subscribe(measurents -> { + Log.w("AAA", measurents.toJson()); + measurementLastResponse = measurents; + // measurementList = measurents; + prepareMeasurements(measurents); + }, throwable -> { + Log.i("AAA", throwable.getMessage()); + onDownloadError(ALL_MEASUREMENT); + })); - DisposableManager.add(haniotNetRepository - .getAllMeasurements(helper.getLastPatient().get_id() - , 1, 100000, "-timestamp") - .subscribe(this::prepareMeasurements, - type -> onDownloadError(ALL_MEASUREMENT))); -// DisposableManager.add(haniotNetRepository -// .getAllMeasurements(helper.getLastPatient().get_id() -// , "created_at", pilotStudy.getStart(), pilotStudy.getEnd(), 1, 1000) -// .subscribe(this::prepareMeasurements, -// type -> onDownloadError(ALL_MEASUREMENT))); } /** - * Prepare measurements list from server. + * Prepare measurements from Measurement Last Response from server. * - * @param measurements + * @param measurementLastResponse */ - private void prepareMeasurements(List measurements) { - List glucose = new ArrayList<>(); - List bloodPressure = new ArrayList<>(); - List heartRate = new ArrayList<>(); - List height = new ArrayList<>(); - List waistCircumference = new ArrayList<>(); - List weight = new ArrayList<>(); - - int countHeartRate = 0; - for (Measurement measurement : measurements) { - Log.i("AAA", measurement.getValue() + " - " + measurement.getType()); - switch (measurement.getType()) { - case "blood_glucose": - glucose.add(measurement); - break; - case "blood_pressure": - bloodPressure.add(measurement); - break; - case "heart_rate": - if (countHeartRate >= 5) break; - heartRate.add(measurement); - countHeartRate++; - break; - case "height": - height.add(measurement); - break; - case "waist_circumference": - waistCircumference.add(measurement); - break; - case "weight": - weight.add(measurement); - break; - } - } - - prepareData(heartRate, HEARTRATE); - prepareData(bloodPressure, BLOOD_PRESSURE); - prepareData(weight, WEIGHT); - prepareData(glucose, GLUCOSE); - prepareData(waistCircumference, WAIST_CIRCUMFERENCE); - prepareData(height, HEIGHT); + private void prepareMeasurements(MeasurementLastResponse measurementLastResponse) { + Log.w("AAA", "A " + measurementLastResponse); + if (measurementLastResponse.getBloodPressure() != null && measurementLastResponse.getBloodPressure().get_id() != null) + prepareMeasurement(measurementLastResponse.getBloodPressure(), BLOOD_PRESSURE); + else prepareMeasurement(null, BLOOD_PRESSURE); + if (measurementLastResponse.getWeight() != null && measurementLastResponse.getWeight().get_id() != null) + prepareMeasurement(measurementLastResponse.getWeight(), WEIGHT); + else prepareMeasurement(null, WEIGHT); + if (measurementLastResponse.getBloodGlucose() != null && measurementLastResponse.getBloodGlucose().get_id() != null) + prepareMeasurement(measurementLastResponse.getBloodGlucose(), GLUCOSE); + else prepareMeasurement(null, GLUCOSE); + if (measurementLastResponse.getWaistCircumference() != null && measurementLastResponse.getWaistCircumference().get_id() != null) + prepareMeasurement(measurementLastResponse.getWaistCircumference(), WAIST_CIRCUMFERENCE); + else prepareMeasurement(null, WAIST_CIRCUMFERENCE); + if (measurementLastResponse.getHeight() != null && measurementLastResponse.getHeight().get_id() != null) + prepareMeasurement(measurementLastResponse.getHeight(), HEIGHT); + else prepareMeasurement(null, HEIGHT); } /** * Send nutritionalEvaluation for server. */ private void sendEvaluation() { - - Log.i("AAA", "Preparing evaluation..."); + Log.i("AAA", "Preparing listNutritional..."); nutritionalEvaluation.setPatient(patient); nutritionalEvaluation.setHealthProfessionalId(appPreferencesHelper.getUserLogged().get_id()); - nutritionalEvaluation.setPilotStudy(appPreferencesHelper.getLastPilotStudy().get_id()); - if (nutritionalEvaluation.getMeasurements() != null) - nutritionalEvaluation.getMeasurements().clear(); - - if (getCheckedMeasurement(HEARTRATE) - && getCheckedMeasurement(GLUCOSE) - && getCheckedMeasurement(BLOOD_PRESSURE) - && getCheckedMeasurement(WEIGHT) - && getCheckedMeasurement(WAIST_CIRCUMFERENCE) - && getCheckedMeasurement(HEIGHT) - && getCheckedQuiz(PHYSICAL_ACTIVITY) - && getCheckedQuiz(MEDICAL_RECORDS) - && getCheckedQuiz(SLEEP_HABITS) - && getCheckedQuiz(FEEDING_HABITS)) { - + nutritionalEvaluation.setPilotStudy(user.getPilotStudyIDSelected()); + + leftFields = validated.get(GLUCOSE) != null + && validated.get(BLOOD_PRESSURE) != null + && validated.get(WAIST_CIRCUMFERENCE) != null + && validated.get(WEIGHT) != null + && validated.get(SLEEP_HABITS) != null + && validated.get(PHYSICAL_ACTIVITY) == null + && validated.get(MEDICAL_RECORDS) != null + && validated.get(FEEDING_HABITS) != null; + + if (!leftFields) { + nutritionalEvaluation.setFeedingHabits(lastNutritionalQuestionnaire.getFeedingHabitsRecord()); + nutritionalEvaluation.setPhysicalActivityHabits(lastNutritionalQuestionnaire.getPhysicalActivityHabit()); + nutritionalEvaluation.setMedicalRecord(lastNutritionalQuestionnaire.getMedicalRecord()); + nutritionalEvaluation.setSleepHabits(lastNutritionalQuestionnaire.getSleepHabit()); + + List measurements = new ArrayList<>(); + measurements.add(measurementLastResponse.getBloodPressure()); + measurements.add(measurementLastResponse.getWaistCircumference()); + measurements.add(measurementLastResponse.getWeight()); + measurements.add(measurementLastResponse.getBloodGlucose()); + measurements.add(measurementLastResponse.getHeight()); + + nutritionalEvaluation.setMeasurements(measurements); Log.i("AAA", "Saida: " + nutritionalEvaluation.toJson()); new AlertDialog.Builder(this) @@ -492,33 +472,6 @@ && getCheckedQuiz(FEEDING_HABITS)) { } } - private boolean getCheckedQuiz(int type) { - boolean contains = false; - if (getEvaluationGroupByType(type) == null) return false; - for (ItemEvaluation itemEvaluation : getEvaluationGroupByType(type).getItems()) - if (itemEvaluation.isChecked()) { - switch (itemEvaluation.getTypeEvaluation()) { - case PHYSICAL_ACTIVITY: - nutritionalEvaluation.setPhysicalActivityHabits(itemEvaluation.getPhysicalActivityHabit()); - contains = true; - break; - case SLEEP_HABITS: - nutritionalEvaluation.setSleepHabits(itemEvaluation.getSleepHabit()); - contains = true; - break; - case MEDICAL_RECORDS: - nutritionalEvaluation.setMedicalRecord(itemEvaluation.getMedicalRecord()); - contains = true; - break; - case FEEDING_HABITS: - nutritionalEvaluation.setFeedingHabits(itemEvaluation.getFeedingHabitsRecord()); - contains = true; - break; - } - } - return contains; - } - /** * Manipulates the error and displays message * according to the type of error. @@ -526,6 +479,7 @@ private boolean getCheckedQuiz(int type) { * @param e {@link Throwable} */ private void errorHandler(Throwable e) { + Log.w("AAA", e.getMessage()); if (!checkConnectivity()) showMessage(R.string.no_internet_conection); else @@ -545,27 +499,6 @@ private boolean checkConnectivity() { return true; } - /** - * Verify if exists measurement by type selected. - * - * @param type - * @return - */ - private boolean getCheckedMeasurement(int type) { - int count = 0; - GroupItemEvaluation groupItemEvaluation = getEvaluationGroupByType(type); - if (groupItemEvaluation == null) return false; - - for (ItemEvaluation itemEvaluation1 : groupItemEvaluation.getItems()) { - if (itemEvaluation1.isChecked()) { - nutritionalEvaluation.addMeasuerement(itemEvaluation1.getMeasurement()); - count++; - } - } - - return count > 0; - } - @Override public void onAddItemClick(String name, int type) { Intent intent; @@ -573,9 +506,6 @@ public void onAddItemClick(String name, int type) { case GLUCOSE: intent = new Intent(this, GlucoseActivity.class); break; - case HEARTRATE: - intent = new Intent(this, HeartRateActivity.class); - break; case WEIGHT: intent = new Intent(this, ScaleActivity.class); break; @@ -586,57 +516,20 @@ public void onAddItemClick(String name, int type) { .saveInt(getResources().getString(R.string.measurementType), ItemGridType.ANTHROPOMETRIC); break; case MEDICAL_RECORDS: - intent = new Intent(this, QuizNutritionActivity.class); - intent.putExtra("checkpoint", MEDICAL_RECORDS); + intent = new Intent(this, HistoricQuizActivity.class); break; case PHYSICAL_ACTIVITY: - intent = new Intent(this, QuizNutritionActivity.class); - intent.putExtra("checkpoint", PHYSICAL_ACTIVITY); + intent = new Intent(this, HistoricQuizActivity.class); break; case FEEDING_HABITS: - intent = new Intent(this, QuizNutritionActivity.class); - intent.putExtra("checkpoint", FEEDING_HABITS); + intent = new Intent(this, HistoricQuizActivity.class); break; case SLEEP_HABITS: - intent = new Intent(this, QuizNutritionActivity.class); - intent.putExtra("checkpoint", SLEEP_HABITS); + intent = new Intent(this, HistoricQuizActivity.class); break; default: return; } startActivity(intent); } - - @Override - public void onSelectClick(ItemEvaluation itemEvaluation, boolean selected) { - Log.i("AAA", "Antes:" + nutritionalEvaluation.toString()); - if (itemEvaluation.getTypeHeader() == TYPE_MEASUREMENT) { - if (selected) nutritionalEvaluation.addMeasuerement(itemEvaluation.getMeasurement()); - else nutritionalEvaluation.removeMeasuerement(itemEvaluation.getMeasurement()); - } - switch (itemEvaluation.getTypeEvaluation()) { - case SLEEP_HABITS: - if (selected) nutritionalEvaluation.setSleepHabits(itemEvaluation.getSleepHabit()); - else nutritionalEvaluation.setSleepHabits(null); - break; - case MEDICAL_RECORDS: - if (selected) - nutritionalEvaluation.setMedicalRecord(itemEvaluation.getMedicalRecord()); - else nutritionalEvaluation.setMedicalRecord(null); - break; - case PHYSICAL_ACTIVITY: - if (selected) - nutritionalEvaluation.setPhysicalActivityHabits(itemEvaluation.getPhysicalActivityHabit()); - else nutritionalEvaluation.setPhysicalActivityHabits(null); - break; - case FEEDING_HABITS: - if (selected) - nutritionalEvaluation.setFeedingHabits(itemEvaluation.getFeedingHabitsRecord()); - else nutritionalEvaluation.setFeedingHabits(null); - break; - default: - break; - } - Log.i("AAA", "Depois:" + nutritionalEvaluation.toString()); - } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/PatientRegisterActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/PatientRegisterActivity.java deleted file mode 100644 index 74c179aa..00000000 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/PatientRegisterActivity.java +++ /dev/null @@ -1,377 +0,0 @@ -package br.edu.uepb.nutes.haniot.activity; - -import android.app.Activity; -import android.app.DatePickerDialog; -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.StringRes; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.util.Log; -import android.view.MenuItem; -import android.view.View; -import android.view.animation.AnimationUtils; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.RadioGroup; -import android.widget.TextView; - -import java.util.Calendar; - -import br.edu.uepb.nutes.haniot.R; -import br.edu.uepb.nutes.haniot.data.model.Patient; -import br.edu.uepb.nutes.haniot.data.model.PatientsType; -import br.edu.uepb.nutes.haniot.data.model.dao.PatientDAO; -import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; -import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; -import br.edu.uepb.nutes.haniot.utils.DateUtils; -import butterknife.BindView; -import butterknife.ButterKnife; -import retrofit2.HttpException; - -/** - * PatientRegisterActivity implementation. - * - * @author Fábio Júnior - * @version 1.0 - * @copyright Copyright (c) 2019, NUTES UEPB - */ -public class PatientRegisterActivity extends AppCompatActivity { - - final private String TAG = "PatientRegisterActivity"; - @BindView(R.id.toolbar) - Toolbar toolbar; - - @BindView(R.id.fab) - FloatingActionButton fab; - - @BindView(R.id.name_edittext) - EditText nameEditTExt; - - @BindView(R.id.email_edittext) - EditText emailEditTExt; - - @BindView(R.id.gender_icon) - ImageView genderIcon; - - @BindView(R.id.radio_group) - RadioGroup genderGroup; - - @BindView(R.id.birth_edittext) - EditText birthEdittext; - - @BindView(R.id.phone_edittext) - EditText phoneEdittext; - - @BindView(R.id.box_message_error) - LinearLayout boxMessage; - - @BindView(R.id.message_error) - TextView messageError; - - @BindView(R.id.loading) - ProgressBar progressBar; - - private Calendar myCalendar; - private Patient patient; - private AppPreferencesHelper appPreferencesHelper; - private HaniotNetRepository haniotNetRepository; - private PatientDAO patientDAO; - private boolean isEdit = false; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_patient_info); - ButterKnife.bind(this); - - toolbar.setTitle(getResources().getString(R.string.patient_profile)); - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - if (getIntent().hasExtra("action")) isEdit = true; - initComponents(); - } - - @Override - protected void onResume() { - super.onResume(); - boxMessage.setVisibility(View.GONE); - } - - /** - * Validate fields. - * - * @return - */ - private boolean validate() { - boolean validated = true; - if (nameEditTExt.getText().toString().isEmpty()) { - nameEditTExt.setError(getResources().getString(R.string.required_field)); - validated = false; - } - - if (birthEdittext.getText().toString().isEmpty()) { - birthEdittext.setError(getResources().getString(R.string.required_field)); - validated = false; - } - return validated; - } - - @Override - protected void onDestroy() { - super.onDestroy(); - DisposableManager.dispose(); - } - - /** - * Save patient in App Preferences. - */ - private void savePatient() { - if (!isEdit) patient = new Patient(); - patient.setName(nameEditTExt.getText().toString()); - patient.setEmail(emailEditTExt.getText().toString()); - patient.setPhoneNumber(phoneEdittext.getText().toString()); - patient.setBirthDate(DateUtils.formatDate(myCalendar.getTimeInMillis(), "yyyy-MM-dd")); - if (genderGroup.getCheckedRadioButtonId() == R.id.male) - patient.setGender(PatientsType.GenderType.MALE); - else patient.setGender(PatientsType.GenderType.FEMALE); - patient.setPilotId(appPreferencesHelper.getLastPilotStudy().get_id()); - Log.i(TAG, patient.toJson()); - if (isEdit) - DisposableManager.add(haniotNetRepository - .updatePatient(patient) - .doOnSubscribe(disposable -> showLoading(true)) - .doAfterTerminate(() -> showLoading(false)) - .subscribe(patient1 -> { - patientDAO.save(patient); - showMessage(R.string.update_success); - startActivity(new Intent(PatientRegisterActivity.this, ManagerPatientsActivity.class)); - finish(); - }, this::errorHandler)); - else - DisposableManager.add(haniotNetRepository - .savePatient(patient) - .doOnSubscribe(disposable -> { - Log.i(TAG, "Salvando paciente no servidor!"); - showLoading(true); - }) - .doAfterTerminate(() -> { - showLoading(false); - Log.i(TAG, "Salvando paciente no servidor!"); - }) - .subscribe(patient -> { - if (patient.get_id() == null) { - showMessage(R.string.error_recover_data); - return; - } - patientDAO.save(patient); - appPreferencesHelper.saveLastPatient(patient); - if (appPreferencesHelper.getUserLogged().getHealthArea().equals(getString(R.string.type_nutrition))) - startActivity(new Intent(PatientRegisterActivity.this, QuizNutritionActivity.class)); - else if (appPreferencesHelper.getUserLogged().getHealthArea().equals(getString(R.string.type_dentistry))) - startActivity(new Intent(PatientRegisterActivity.this, QuizOdontologyActivity.class)); - finish(); - }, this::errorHandler)); - } - - /** - * Manipulates the error and displays message - * according to the type of error. - * - * @param e {@link Throwable} - */ - private void errorHandler(Throwable e) { - Log.i(TAG, e.getMessage()); - if (e instanceof HttpException) { - HttpException httpEx = ((HttpException) e); - switch (httpEx.code()) { - case 409: - showMessage(R.string.error_409_patient); - break; - default: - showMessage(R.string.error_500); - break; - } - } else showMessage(R.string.error_500); - } - - @Override - protected void onStart() { - super.onStart(); - checkConnectivity(); - } - - /** - * On back pressed. - */ - @Override - public void onBackPressed() { - super.onBackPressed(); - finish(); - } - - /** - * Loading message, - * - * @param enabled boolean - */ - private void showLoading(final boolean enabled) { - runOnUiThread(() -> { - fab.setEnabled(!enabled); - if (enabled) progressBar.setVisibility(View.VISIBLE); - else progressBar.setVisibility(View.GONE); - }); - } - - /** - * Validate patient. - */ - View.OnClickListener fabClick = v -> { - if (validate()) { - savePatient(); - } - }; - - /** - * Prepare the view for editing the data - */ - private void prepareEditing() { - DisposableManager.add(haniotNetRepository - .getPatient(appPreferencesHelper.getLastPatient().get_id()) - .doOnSubscribe(disposable -> { - prepareView(); // Populate view with local data - enabledView(false); - showLoading(true); - }) - .doAfterTerminate(() -> showLoading(false)) - .subscribe(patient1 -> { - if (patient1.getEmail() != null) patient.setEmail(patient1.getEmail()); - if (patient1.getName() != null) patient.setName(patient1.getName()); - - prepareView(); - enabledView(true); - }, this::errorHandler) - - ); - } - - /** - * Check if you have connectivity. - * If it does not, the elements in the view mounted to notify the user - * - * @return boolean - */ - private boolean checkConnectivity() { - if (!ConnectionUtils.internetIsEnabled(this)) { - boxMessage.setVisibility(View.VISIBLE); - messageError.setText(getString(R.string.error_connectivity)); - return false; - } - boxMessage.setVisibility(View.GONE); - - return true; - } - - /** - * Enable or disable view - * - * @param enabled boolean - */ - private void enabledView(final boolean enabled) { - runOnUiThread(() -> { - nameEditTExt.setEnabled(enabled); - emailEditTExt.setEnabled(enabled); - phoneEdittext.setEnabled(enabled); - birthEdittext.setEnabled(enabled); - genderGroup.setEnabled(enabled); - }); - } - - private void prepareView() { - patient = appPreferencesHelper.getLastPatient(); - if (patient == null) return; - nameEditTExt.setText(patient.getName()); - emailEditTExt.setText(patient.getEmail()); - phoneEdittext.setText(patient.getPhoneNumber()); - birthEdittext.setText(DateUtils.formatDate(patient.getBirthDate(), getString(R.string.date_format))); - myCalendar = DateUtils.convertStringDateToCalendar(patient.getBirthDate(), getResources().getString(R.string.date_format)); - if (patient.getGender().equals(PatientsType.GenderType.MALE)) - genderGroup.check(R.id.male); - else genderGroup.check(R.id.female); - } - - /** - * Displays message. - * - * @param str @StringRes message. - */ - private void showMessage(@StringRes int str) { - String message = getString(str); - if (message.isEmpty()) message = getString(R.string.error_500); - - messageError.setText(message); - runOnUiThread(() -> { - boxMessage.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); - boxMessage.setVisibility(View.VISIBLE); - }); - } - - /** - * Init components. - */ - private void initComponents() { - appPreferencesHelper = AppPreferencesHelper.getInstance(this); - Log.i(TAG, appPreferencesHelper.getUserAccessHaniot().getAccessToken()); - haniotNetRepository = HaniotNetRepository.getInstance(this); - patientDAO = PatientDAO.getInstance(this); - myCalendar = Calendar.getInstance(); - fab.setOnClickListener(fabClick); - - if (isEdit) { - prepareEditing(); - } - genderGroup.setOnCheckedChangeListener((group, checkedId) -> { - if (checkedId == R.id.male) - genderIcon.setImageResource(R.drawable.x_boy); - else - genderIcon.setImageResource(R.drawable.x_girl); - }); - - birthEdittext.setOnClickListener(v -> { - InputMethodManager inputManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); - inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0); - DatePickerDialog dialog = new DatePickerDialog(PatientRegisterActivity.this, - (view, year, month, dayOfMonth) -> { - myCalendar.set(Calendar.YEAR, year); - myCalendar.set(Calendar.MONTH, month); - myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); - birthEdittext.setText(DateUtils.formatDate(myCalendar.getTimeInMillis(), - getResources().getString(R.string.date_format))); - }, 2010, 1, 1); - dialog.show(); - }); - } - - /** - * On options item selected. - * - * @param item - * @return - */ - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - finish(); - break; - } - return super.onOptionsItemSelected(item); - } -} \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/PilotStudyActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/PilotStudyActivity.java index 9e144e8e..088706da 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/PilotStudyActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/PilotStudyActivity.java @@ -1,6 +1,7 @@ package br.edu.uepb.nutes.haniot.activity; import android.app.Activity; +import android.content.Intent; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AlertDialog; @@ -9,9 +10,12 @@ import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.animation.AnimationUtils; +import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -21,15 +25,24 @@ import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.adapter.PilotStudyAdapter; import br.edu.uepb.nutes.haniot.adapter.base.OnRecyclerViewListener; +import br.edu.uepb.nutes.haniot.data.model.Admin; +import br.edu.uepb.nutes.haniot.data.model.HealthProfessional; +import br.edu.uepb.nutes.haniot.data.model.Patient; import br.edu.uepb.nutes.haniot.data.model.PilotStudy; import br.edu.uepb.nutes.haniot.data.model.User; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.ErrorHandler; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import butterknife.BindView; import butterknife.ButterKnife; +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.HEALTH_PROFESSIONAL; +import static br.edu.uepb.nutes.haniot.data.model.UserType.NUTRITION; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; + /** * Implementation of the pilot study selection list. * @@ -57,6 +70,21 @@ public class PilotStudyActivity extends AppCompatActivity { @BindView(R.id.info_inactive_selected) TextView infoInactiveSelectedMessage; + @BindView(R.id.content_error) + LinearLayout errorPilotStudy; + + @BindView(R.id.content) + FrameLayout content; + + @BindView(R.id.icon_error) + ImageView iconError; + + @BindView(R.id.message_error_server) + TextView messageError; + + @BindView(R.id.message_error_server_title) + TextView titleError; + /** * We need this variable to lock and unlock loading more. * We should not charge more when a request has already been made. @@ -85,12 +113,8 @@ protected void onCreate(Bundle savedInstanceState) { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - super.onBackPressed(); - break; - default: - break; + if (item.getItemId() == android.R.id.home) { + super.onBackPressed(); } return super.onOptionsItemSelected(item); } @@ -117,6 +141,36 @@ private void initToolBar() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } + /** + * @param enabled + */ + private void showErrorPilot(boolean enabled) { + if (enabled) { + errorPilotStudy.setVisibility(View.VISIBLE); + content.setVisibility(View.GONE); + } else { + errorPilotStudy.setVisibility(View.GONE); + content.setVisibility(View.VISIBLE); + } + } + + /** + * @param enabled + */ + private void showErrorConnection(boolean enabled) { + if (enabled) { + showErrorPilot(true); + iconError.setImageResource(R.drawable.ic_error_server); + titleError.setText("Opss! Houve algum erro."); + messageError.setText(getText(R.string.error_500)); + } else { + showErrorPilot(false); + iconError.setImageResource(R.drawable.ic_no_pilot_study); + titleError.setText("Opss! Você ainda não possui Piloto Estudo."); + messageError.setText(getText(R.string.piloty_study_no_allocated)); + } + } + /** * Init RecyclerView */ @@ -145,6 +199,11 @@ public void onLongItemClick(View v, PilotStudy pilot) { public void onMenuContextClick(View v, PilotStudy pilot) { } + + @Override + public void onItemSwiped(PilotStudy item, int position) { + + } }); mRecyclerView.setAdapter(mPilotStudyAdapter); @@ -191,12 +250,49 @@ private void dialogPilotIsSelected(PilotStudy pilot) { private void savePilotSelected(PilotStudy pilot) { pilot.setSelected(true); pilot.setUserId(user.get_id()); + user.setPilotStudyIDSelected(pilot.get_id()); + appPreferences.removeLastPilotStudy(); appPreferences.saveLastPilotStudy(pilot); - appPreferences.removeLastPatient(); + appPreferences.saveUserLogged(user); + if (user.getUserType().equals(PATIENT)) { + Patient patient = new Patient(); + patient.set_id(user.get_id()); + patient.setPilotStudyIDSelected(pilot.get_id()); + DisposableManager.add(haniotNetRepository.updatePatient(patient).subscribe(patient1 -> { + openDashboard(); + }, throwable -> { + Log.w("AAA", throwable.getMessage()); + ErrorHandler.showMessage(this, throwable); + })); + } else if (user.getUserType().equals(ADMIN)) { + Admin admin = new Admin(); + admin.set_id(user.get_id()); + admin.setPilotStudyIDSelected(pilot.get_id()); + + DisposableManager.add(haniotNetRepository.updateAdmin(admin).subscribe(admin1 -> { + openDashboard(); + }, throwable -> { + Log.w("AAA", throwable.getMessage()); + ErrorHandler.showMessage(this, throwable); + })); + } else if (user.getUserType().equals(HEALTH_PROFESSIONAL)) { + HealthProfessional healthProfessional = new HealthProfessional(); + healthProfessional.set_id(user.get_id()); + healthProfessional.setPilotStudyIDSelected(pilot.get_id()); + DisposableManager.add(haniotNetRepository.updateHealthProfissional(healthProfessional).subscribe(healthProfessional1 -> { + openDashboard(); + }, throwable -> { + Log.w("AAA", throwable.getMessage()); + ErrorHandler.showMessage(this, throwable); + })); + } + + } - // Back activity - setResult(Activity.RESULT_OK); - finish(); + private void openDashboard() { + Intent intent = new Intent(this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); } /** @@ -217,24 +313,39 @@ private void loadData() { return; } - DisposableManager.add(haniotNetRepository - .getAllPilotStudies(appPreferences.getUserLogged().get_id()) - .doOnSubscribe(disposable -> showLoading(true)) - .doAfterTerminate(() -> showLoading(false)) - .subscribe(pilotStudies -> { - if (pilotStudies.isEmpty()) return; - - PilotStudy pilotLast = appPreferences.getLastPilotStudy(); - for (PilotStudy pilot : pilotStudies) { - if (pilotLast != null && pilot.get_id().equals(pilotLast.get_id())) { - pilot.setSelected(true); + if (appPreferences.getUserLogged().getUserType().equals(ADMIN)) { + DisposableManager.add(haniotNetRepository + .getAllPilotStudies() + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(pilotStudies -> { + for (PilotStudy pilot : pilotStudies) { + if (user.getPilotStudyIDSelected() != null && pilot.get_id().equals(user.getPilotStudyIDSelected())) { + pilot.setSelected(true); + } } - } - populatePilotStudiesView(pilotStudies); - }, error -> { - populatePilotStudiesView(null); - }) - ); + populatePilotStudiesView(pilotStudies); + }, error -> { + populatePilotStudiesView(null); + }) + ); + } else { + DisposableManager.add(haniotNetRepository + .getAllUserPilotStudies(appPreferences.getUserLogged().get_id()) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(pilotStudies -> { + for (PilotStudy pilot : pilotStudies) { + if (user.getPilotStudyIDSelected() != null && pilot.get_id().equals(user.getPilotStudyIDSelected())) { + pilot.setSelected(true); + } + } + populatePilotStudiesView(pilotStudies); + }, error -> { + populatePilotStudiesView(null); + }) + ); + } } /** @@ -246,12 +357,18 @@ private void populatePilotStudiesView(List pilotStudies) { mPilotStudyAdapter.clearItems(); mPilotStudyAdapter.addItems(pilotStudies); - if (mPilotStudyAdapter.itemsIsEmpty()) { - showNoDataMessage(true); + if (pilotStudies == null) { + showErrorConnection(true); + } else if (pilotStudies.isEmpty()) { +// showNoDataMessage(true); + showErrorConnection(false); + showErrorPilot(true); showInstructionsMessage(false); } else { - showNoDataMessage(false); - if (appPreferences.getLastPilotStudy() != null) { // Pilot is selected +// showNoDataMessage(false); + showErrorConnection(false); + showErrorPilot(false); + if (user.getPilotStudyIDSelected() != null) { // Pilot is selected showInstructionsMessage(false); } else { showInstructionsMessage(true); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/QuizNutritionActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/QuizNutritionActivity.java index eb796ec0..31d16385 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/QuizNutritionActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/QuizNutritionActivity.java @@ -1,6 +1,7 @@ package br.edu.uepb.nutes.haniot.activity; import android.app.AlertDialog; +import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -18,6 +19,8 @@ import br.edu.uepb.nutes.haniot.data.model.FeendingHabitsRecordType; import br.edu.uepb.nutes.haniot.data.model.FoodType; import br.edu.uepb.nutes.haniot.data.model.MedicalRecord; +import br.edu.uepb.nutes.haniot.data.model.NutritionalQuestionnaire; +import br.edu.uepb.nutes.haniot.data.model.NutritionalQuestionnaireType; import br.edu.uepb.nutes.haniot.data.model.Patient; import br.edu.uepb.nutes.haniot.data.model.PhysicalActivityHabit; import br.edu.uepb.nutes.haniot.data.model.SchoolActivityFrequencyType; @@ -80,6 +83,10 @@ public class QuizNutritionActivity extends SimpleSurvey implements Infor.OnInfoL private AppPreferencesHelper appPreferencesHelper; private HaniotNetRepository haniotNetRepository; int checkpoint; + private NutritionalQuestionnaire nutritionalQuestionnaire; + private String updateType; + private String idUpdate; + private Object resourceToUpdate; /** * Init view. @@ -89,25 +96,30 @@ protected void initView() { initResources(); checkpoint = getIntent().getIntExtra("checkpoint", -1); + idUpdate = getIntent().getStringExtra("idUpdate"); setMessageBlocked(getResources().getString(R.string.not_answered)); // Animation setFadeAnimation(); - addStartPage(); switch (checkpoint) { case MEDICAL_RECORDS: addMedicalRocordsPages(); + updateType = NutritionalQuestionnaireType.MEDICAL_RECORDS; break; case PHYSICAL_ACTIVITY: addPhysicalHabitsPages(); + updateType = NutritionalQuestionnaireType.PHYSICAL_ACTIVITY_HABITS; break; case FEEDING_HABITS: addFeedingHabitsPages(); + updateType = NutritionalQuestionnaireType.FEEDING_HABITS_RECORD; break; case SLEEP_HABITS: addSleepHabitsPages(); + updateType = NutritionalQuestionnaireType.SLEEP_HABIT; break; default: + addStartPage(); addPhysicalHabitsPages(); addFeedingHabitsPages(); addMedicalRocordsPages(); @@ -133,6 +145,7 @@ private void initResources() { physicalActivityHabitsDAO = PhysicalActivityHabitsDAO.getInstance(this); sleepHabitsDAO = SleepHabitsDAO.getInstance(this); medicalRecordDAO = MedicalRecordDAO.getInstance(this); + nutritionalQuestionnaire = new NutritionalQuestionnaire(); } /** @@ -144,13 +157,8 @@ private void saveMedicalRecords() { medicalRecord.setPatientId(patient.get_id()); Log.i(LOG_TAG, medicalRecord.toJson()); medicalRecordDAO.save(medicalRecord); - DisposableManager.add(haniotNetRepository - .saveMedicalRecord(medicalRecord) - .doOnSubscribe(disposable -> Log.i(LOG_TAG, "Salvando Feending Habits no servidor!")) - .doAfterTerminate(() -> Log.i(LOG_TAG, "Feending Habits")) - .subscribe(medicalRecord -> { - Log.i(LOG_TAG, "Salvo Feending Habits no servidor!"); - }, this::errorHandler)); + nutritionalQuestionnaire.setMedicalRecord(medicalRecord); + resourceToUpdate = medicalRecord; } /** @@ -162,13 +170,8 @@ private void saveFeedingHabits() { feedingHabitsRecord.setWeeklyFeedingHabits(weeklyFoodRecords); Log.i(LOG_TAG, feedingHabitsRecord.toJson()); feedingHabitsDAO.save(feedingHabitsRecord); - DisposableManager.add(haniotNetRepository - .saveFeedingHabitsRecord(feedingHabitsRecord) - .doOnSubscribe(disposable -> Log.i(LOG_TAG, "Salvando Feending Habits no servidor!")) - .doAfterTerminate(() -> Log.i(LOG_TAG, "Feending Habits")) - .subscribe(feedingHabitsRecord -> { - Log.i(LOG_TAG, "Salvo Feending Habits no servidor!"); - }, this::errorHandler)); + nutritionalQuestionnaire.setFeedingHabitsRecord(feedingHabitsRecord); + resourceToUpdate = feedingHabitsRecord; } /** @@ -178,13 +181,8 @@ private void saveSleepHabits() { sleepHabit.setPatientId(patient.get_id()); Log.i(LOG_TAG, sleepHabit.toJson()); sleepHabitsDAO.save(sleepHabit); - DisposableManager.add(haniotNetRepository - .saveSleepHabit(sleepHabit) - .doOnSubscribe(disposable -> Log.i(LOG_TAG, "Salvando Sleep Habits no servidor!")) - .doAfterTerminate(() -> Log.i(LOG_TAG, "Sleep Habits")) - .subscribe(sleepHabit -> { - Log.i(LOG_TAG, "Salvo Sleep Habits no servidor!"); - }, this::errorHandler)); + nutritionalQuestionnaire.setSleepHabit(sleepHabit); + resourceToUpdate = sleepHabit; } /** @@ -194,13 +192,8 @@ private void saveActivityHabits() { physicalActivityHabits.setPatientId(patient.get_id()); Log.i(LOG_TAG, physicalActivityHabits.toJson()); physicalActivityHabitsDAO.save(physicalActivityHabits); - DisposableManager.add(haniotNetRepository - .savePhysicalActivityHabit(physicalActivityHabits) - .doOnSubscribe(disposable -> Log.i(LOG_TAG, "Salvando Activity Habits no servidor!")) - .doAfterTerminate(() -> Log.i(LOG_TAG, "Activity Habits")) - .subscribe(physicalActivityHabits -> { - Log.i(LOG_TAG, "Salvo Activity Habits no servidor!"); - }, this::errorHandler)); + nutritionalQuestionnaire.setPhysicalActivityHabit(physicalActivityHabits); + resourceToUpdate = physicalActivityHabits; } /** @@ -653,7 +646,6 @@ public void onClosePage() { .Builder(this) .setMessage(getResources().getString(R.string.cancel)) .setPositiveButton(getResources().getText(R.string.yes_text), (dialog, which) -> { - startActivity(new Intent(this, ManagerPatientsActivity.class)); finish(); }) .setNegativeButton(getResources().getText(R.string.no_text), null) @@ -690,11 +682,92 @@ public void onAnswerInfo(int page) { break; default: saveSleepHabits(); - startActivity(new Intent(this, MainActivity.class)); } - finish(); + sendQuestionnaireToServer(); + } + } + + private void sendQuestionnaireToServer() { + Log.w("AAA", "sendQuestionnaireToServer"); + ProgressDialog dialog = ProgressDialog.show(this, "Sincronização", + "Aguarde alguns instantes...", true); + dialog.show(); + + if (updateType == null) { + Log.w("AAA", "updateType == null"); + Log.w("AAA", "Saving: " + nutritionalQuestionnaire.toJson()); + DisposableManager.add(haniotNetRepository + .saveNutritionalQuestionnaire(patient.get_id(), nutritionalQuestionnaire) + .doAfterTerminate(() -> { + }) + .subscribe(nutritionalQuestionnaire -> { + dialog.cancel(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage("Salvo com sucesso!"); + builder.setCancelable(true); + builder.setNeutralButton("Ok", (dialog1, which) -> { + startActivity(new Intent(this, MainActivity.class)); + finish(); + }); + builder.show(); + }, throwable -> { + Log.w("AAA", throwable.getMessage()); + dialog.cancel(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Não foi possível concluir a operação..."); + builder.setMessage("Tente novamente mais tarde!"); + builder.setCancelable(false); + builder.setPositiveButton("Ok", (dialog12, which) -> { + startActivity(new Intent(this, MainActivity.class)); + finish(); + dialog12.cancel(); + }); + builder.show(); + })); } else { + Log.w("AAA", "updateType != null: " + updateType); + Log.w("AAA", "updateType: " + updateType + " idUpdate: " + idUpdate); + printJson(); + Log.w("AAA", "id: " + idUpdate); + if (idUpdate != null) { + DisposableManager.add(haniotNetRepository + .updateNutritionalQuestionnaire(patient.get_id(), idUpdate, updateType, resourceToUpdate) + .subscribe(o -> { + dialog.cancel(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage("Atualizado com sucesso!"); + builder.setCancelable(true); + builder.setNeutralButton("Ok", (dialog1, which) -> { + finish(); + }); + builder.show(); + }, throwable -> { + Log.w("AAA", throwable.getMessage()); + dialog.cancel(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Não foi possível concluir a operação..."); + builder.setMessage("Tente novamente mais tarde!"); + builder.setCancelable(false); + builder.setPositiveButton("Ok", (dialog12, which) -> { + startActivity(new Intent(this, MainActivity.class)); + finish(); + dialog12.cancel(); + }); + builder.show(); + })); + } + } + } + private void printJson() { + if (resourceToUpdate instanceof SleepHabit) { + Log.w("AAA", ((SleepHabit) resourceToUpdate).toJson()); + } else if (resourceToUpdate instanceof MedicalRecord) { + Log.w("AAA", ((MedicalRecord) resourceToUpdate).toJson()); + } else if (resourceToUpdate instanceof PhysicalActivityHabit) { + Log.w("AAA", ((PhysicalActivityHabit) resourceToUpdate).toJson()); + } else if (resourceToUpdate instanceof FeedingHabitsRecord) { + Log.w("AAA", ((FeedingHabitsRecord) resourceToUpdate).toJson()); } } @@ -845,23 +918,20 @@ public void onAnswerMultiple(int page, List values, List indexV + " | ANSWER (values): " + Arrays.toString(values.toArray()) + " | ANSWER (indexes): " + Arrays.toString(indexValues.toArray())); - switch (page) { - case 4: - List strings = new ArrayList<>(); + if (page == 4) { + List answers = new ArrayList<>(); - for (Integer integer : indexValues) { - strings.add(SportsType.getString(integer)); - } - physicalActivityHabits.setWeeklyActivities(strings); - break; - case 18: - List strings2 = new ArrayList<>(); + for (Integer integer : indexValues) { + answers.add(SportsType.getString(integer)); + } + physicalActivityHabits.setWeeklyActivities(answers); + } else if (page == 18) { + List answers2 = new ArrayList<>(); - for (Integer integer : indexValues) { - strings2.add(FeendingHabitsRecordType.FoodAllergyStringolerance.getString(integer)); - } - feedingHabitsRecord.setFoodAllergyIntolerance(strings2); - break; + for (Integer integer : indexValues) { + answers2.add(FeendingHabitsRecordType.FoodAllergyStringolerance.getString(integer)); + } + feedingHabitsRecord.setFoodAllergyIntolerance(answers2); } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/QuizOdontologyActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/QuizOdontologyActivity.java index 2b7aceff..d96f0838 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/QuizOdontologyActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/QuizOdontologyActivity.java @@ -1,11 +1,14 @@ package br.edu.uepb.nutes.haniot.activity; import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.support.v4.content.ContextCompat; import android.text.InputType; import android.util.Log; +import android.widget.Toast; import java.util.ArrayList; import java.util.Arrays; @@ -15,6 +18,8 @@ import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.data.model.FamilyCohesionRecord; import br.edu.uepb.nutes.haniot.data.model.FrequencyAnswersType; +import br.edu.uepb.nutes.haniot.data.model.OdontologicalQuestionnaire; +import br.edu.uepb.nutes.haniot.data.model.OdontologicalQuestionnaireType; import br.edu.uepb.nutes.haniot.data.model.OralHealthRecord; import br.edu.uepb.nutes.haniot.data.model.Patient; import br.edu.uepb.nutes.haniot.data.model.SociodemographicRecord; @@ -32,6 +37,12 @@ import br.edu.uepb.nutes.simplesurvey.question.Single; import retrofit2.HttpException; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FAMILY_COHESION; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FEEDING_HABITS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.ORAL_HEALTH; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.SLEEP_HABITS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.SOCIODEMOGRAPHICS; + /** * QuizOdontologyActivity implementation. * @@ -60,6 +71,11 @@ public class QuizOdontologyActivity extends SimpleSurvey implements Infor.OnInfo private SociodemographicRecord sociodemographicRecord; private List toothLesions; private List points; + private OdontologicalQuestionnaire odontologicalQuestionnaire; + int checkpoint; + private String updateType; + private String idUpdate; + private Object resourceToUpdate; /** * Init view. @@ -67,7 +83,63 @@ public class QuizOdontologyActivity extends SimpleSurvey implements Infor.OnInfo @Override protected void initView() { initResources(); - addPages(); + + checkpoint = getIntent().getIntExtra("checkpoint", -1); + idUpdate = getIntent().getStringExtra("idUpdate"); + setMessageBlocked(getResources().getString(R.string.not_answered)); + + // Animation + setFadeAnimation(); + switch (checkpoint) { + case FAMILY_COHESION: + setFamilyCohesion(); + updateType = OdontologicalQuestionnaireType.FAMILY_COHESION_RECORD; + break; + case ORAL_HEALTH: + setOralRecord(); + updateType = OdontologicalQuestionnaireType.ORAL_HEALTH_RECORD; + break; + case SOCIODEMOGRAPHICS: + setSociodemographicRecord(); + updateType = OdontologicalQuestionnaireType.SOCIODEMOGRAPHIC_RECORD; + break; + default: + addStartPage(); + setFamilyCohesion(); + setOralRecord(); + setSociodemographicRecord(); + } + addEndPage(); + } + + private void addStartPage() { + + //INTRO PAGE + addQuestion(new Infor.Config() + .layout(R.layout.welcome_odontology_quiz) + .buttonClose(R.drawable.ic_action_close_dark) + .colorBackground(getResources().getColor(R.color.colorPrimaryDark)) + .nextQuestionAuto() + .pageNumber(FIRST_PAGE) + .build()); + } + + private void addEndPage() { + + //END PAGE + addQuestion(new Infor.Config() + .title(R.string.thank_you, Color.WHITE) + .titleTextSize(28) + .description(R.string.odontology_final_instructions) + .descriptionTextSize(14) + .descriptionColor(Color.WHITE) + .colorBackground(getResources().getColor(R.color.colorPrimaryDark)) + .image(R.drawable.x_like) + .buttonClose(R.drawable.ic_action_close_dark) + .buttonColorText(getResources().getColor(R.color.colorPrimaryDark)) + .buttonBackground(R.drawable.button_stylezed) + .pageNumber(END_PAGE) + .build()); } /** @@ -82,6 +154,7 @@ private void initResources() { sociodemographicRecord = new SociodemographicRecord(); toothLesions = new ArrayList<>(); points = new ArrayList<>(); + odontologicalQuestionnaire = new OdontologicalQuestionnaire(); } /** @@ -101,395 +174,357 @@ private void errorHandler(Throwable e) { private void saveFamilyCohesion() { familyCohesionRecord.setPatientId(patient.get_id()); int totalPoints = 0; + Log.w("AAA", "Size points: " + points.size()); for (Integer integer : points) { totalPoints += integer; + Log.w("AAA", "point: " + integer + " - " + totalPoints); } familyCohesionRecord.setFamilyCohesionResult(totalPoints); familyCohesionRecord.toJson(); - - DisposableManager.add(haniotNetRepository - .saveFamilyCohesionRecord(familyCohesionRecord) - .doOnSubscribe(disposable -> Log.i(LOG_TAG, "Salvando familyCohesionRecord no servidor!")) - .doAfterTerminate(() -> Log.i(LOG_TAG, "familyCohesionRecord")) - .subscribe(familyCohesionRecord1 -> { - Log.i(LOG_TAG, "FamilyCohesionRecord saved in server!"); - }, this::errorHandler)); + odontologicalQuestionnaire.setFamilyCohesionRecord(familyCohesionRecord); + resourceToUpdate = familyCohesionRecord; } private void saveOralHealth() { oralHealthRecord.setPatientId(patient.get_id()); oralHealthRecord.setToothLesions(toothLesions); oralHealthRecord.toJson(); - - DisposableManager.add(haniotNetRepository - .saveOralHealthRecord(oralHealthRecord) - .doOnSubscribe(disposable -> Log.i(LOG_TAG, "Saving oralHealthRecord in server!")) - .doAfterTerminate(() -> Log.i(LOG_TAG, "oralHealthRecord")) - .subscribe(oralHealthRecord1 -> { - Log.i(LOG_TAG, "OralHealthRecord saved in server!"); - }, this::errorHandler)); + odontologicalQuestionnaire.setOralHealthRecord(oralHealthRecord); + resourceToUpdate = oralHealthRecord; } private void saveSociodemographic() { sociodemographicRecord.setPatientId(patient.get_id()); sociodemographicRecord.toJson(); - - DisposableManager.add(haniotNetRepository - .saveSociodemographicRecord(sociodemographicRecord) - .doOnSubscribe(disposable -> Log.i(LOG_TAG, "Salvando sociodemographicRecord no servidor!")) - .doAfterTerminate(() -> Log.i(LOG_TAG, "sociodemographicRecord")) - .subscribe(sociodemographicRecord1 -> { - Log.i(LOG_TAG, "Salvo sociodemographicRecord no servidor!"); - }, this::errorHandler)); + odontologicalQuestionnaire.setSociodemographicRecord(sociodemographicRecord); + resourceToUpdate = sociodemographicRecord; } - /** - * Construct quiz. - */ - private void addPages() { - setMessageBlocked(getResources().getString(R.string.not_answered)); - - // Animation - setFadeAnimation(); - - //INTRO PAGE - addQuestion(new Infor.Config() - .layout(R.layout.welcome_odontology_quiz) - .buttonClose(R.drawable.ic_action_close_dark) - .colorBackground(getResources().getColor(R.color.colorPrimaryDark)) - .nextQuestionAuto() - .pageNumber(FIRST_PAGE) - .build()); + private void setOralRecord() { - //CATEGORY FAMILY_COHESION + //CATEGORY OralHealthRecord addQuestion(new Infor.Config() - .title(R.string.category_family_cohesion, Color.WHITE) + .title(R.string.category_oralhealth, Color.WHITE) .titleTextSize(28) - .description(R.string.category_family_cohesion_desc, Color.WHITE) + .description(R.string.category_oralhealth_desc, Color.WHITE) .descriptionTextSize(20) - .image(R.drawable.category_family) - .buttonClose(R.drawable.ic_action_close_dark) + .image(R.drawable.category_tooth) .colorBackground(getResources().getColor(R.color.colorAccent)) .inputText(R.string.bt_next) + .buttonClose(R.drawable.ic_action_close_dark) .buttonBackground(R.drawable.button_stylezed) .nextQuestionAuto() - .pageNumber(GATEGORY_FAMILY_COHESION) + .pageNumber(CATEGORY_ORAL_HEALTH) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_1), Color.WHITE) + .title(getString(R.string.question_15), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorCyan)) + .colorBackground(ContextCompat.getColor(this, R.color.colorPink)) .description("") - .image(R.drawable.z_help) + .image(R.drawable.z_toothbrush) .buttonClose(R.drawable.ic_action_close_dark) - .inputItems(parseAnswers(R.array.default_answers)) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .nextQuestionAuto() + .inputItems(parseAnswers(R.array.number3_answers)) .inputDisableAddNewItem() - .pageNumber(1) + .nextQuestionAuto() + .pageNumber(14) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_2), Color.WHITE) + .title(getString(R.string.question_16), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorRed)) + .colorBackground(ContextCompat.getColor(this, R.color.colorTeal)) .description("") - .image(R.drawable.z_friend) + .image(R.drawable.z_caries_mil) .buttonClose(R.drawable.ic_action_close_dark) + .inputItems(parseAnswers(R.array.yes_not_answers)) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) - .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(2) + .inputDisableAddNewItem() + .pageNumber(15) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_3), Color.WHITE) + .title(getString(R.string.question_17), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorAmber)) + .colorBackground(ContextCompat.getColor(this, R.color.colorRed)) .description("") - .image(R.drawable.z_only_family) + .image(R.drawable.z_caries_mil) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) + .inputItems(parseAnswers(R.array.yes_not_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(3) + .pageNumber(16) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_4), Color.WHITE) + .title(getString(R.string.question_18), Color.WHITE) .titleTextSize(28) .colorBackground(ContextCompat.getColor(this, R.color.colorOrange)) .description("") - .image(R.drawable.z_new_friend) + .image(R.drawable.z_caries_white) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) + .inputItems(parseAnswers(R.array.yes_not_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(4) + .pageNumber(17) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_5), Color.WHITE) + .title(getString(R.string.question_19), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorCyan)) + .colorBackground(ContextCompat.getColor(this, R.color.colorDeepPurple)) .description("") - .image(R.drawable.z_time) + .image(R.drawable.z_caries_white) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) + .inputItems(parseAnswers(R.array.yes_not_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(5) + .pageNumber(18) .build()); - addQuestion(new Single.Config() - .title(getString(R.string.question_6), Color.WHITE) - .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorBlueGrey)) - .description("") - .image(R.drawable.z_proximity_family) - .buttonClose(R.drawable.ic_action_close_dark) - .inputColorBackgroundTint(Color.WHITE) - .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) - .inputDisableAddNewItem() - .nextQuestionAuto() - .pageNumber(6) - .build()); + } - addQuestion(new Single.Config() - .title(getString(R.string.question_7), Color.WHITE) + private void setSociodemographicRecord() { + + //CATEGORY SociodemographicRecord + addQuestion(new Infor.Config() + .title(R.string.category_sociodemographic, Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorRed)) - .description("") - .image(R.drawable.z_activity) + .description(R.string.category_sociodemographic_desc, Color.WHITE) + .descriptionTextSize(20) + .image(R.drawable.category_socio) .buttonClose(R.drawable.ic_action_close_dark) - .inputColorBackgroundTint(Color.WHITE) - .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) - .inputDisableAddNewItem() + .colorBackground(getResources().getColor(R.color.colorAccent)) + .inputText(R.string.bt_next) + .buttonClose(R.drawable.ic_action_close_dark) + .buttonBackground(R.drawable.button_stylezed) .nextQuestionAuto() - .pageNumber(7) + .pageNumber(CATEGORY_SOCIODEMOGRAPHIC) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_8), Color.WHITE) + .title(getString(R.string.question_12), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorOrange)) + .colorBackground(ContextCompat.getColor(this, R.color.colorCyan)) .description("") - .image(R.drawable.z_familiy_activity_easy) + .image(R.drawable.z_color) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) + .inputItems(parseAnswers(R.array.race_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(8) + .pageNumber(11) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_9), Color.WHITE) + .title(getString(R.string.question_13), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorTeal)) + .colorBackground(ContextCompat.getColor(this, R.color.colorDeepPurple)) .description("") - .image(R.drawable.z_conselho) + .image(R.drawable.z_scholarity) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) + .inputItems(parseAnswers(R.array.scholarity_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(9) + .pageNumber(12) .build()); - addQuestion(new Single.Config() - .title(getString(R.string.question_10), Color.WHITE) + addQuestion(new Open.Config() + .title(getString(R.string.question_14), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorRed)) + .inputColorText(Color.WHITE) + .colorBackground(ContextCompat.getColor(this, R.color.colorBlue)) .description("") - .image(R.drawable.z_union_family) + .image(R.drawable.z_house) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) - .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.default_answers)) - .inputDisableAddNewItem() + .inputType(InputType.TYPE_CLASS_NUMBER) .nextQuestionAuto() - .pageNumber(10) + .pageNumber(13) .build()); - //CATEGORY SociodemographicRecord + } + + private void setFamilyCohesion() { + + //CATEGORY FAMILY_COHESION addQuestion(new Infor.Config() - .title(R.string.category_sociodemographic, Color.WHITE) + .title(R.string.category_family_cohesion, Color.WHITE) .titleTextSize(28) - .description(R.string.category_sociodemographic_desc, Color.WHITE) + .description(R.string.category_family_cohesion_desc, Color.WHITE) .descriptionTextSize(20) - .image(R.drawable.category_socio) + .image(R.drawable.category_family) .buttonClose(R.drawable.ic_action_close_dark) .colorBackground(getResources().getColor(R.color.colorAccent)) .inputText(R.string.bt_next) - .buttonClose(R.drawable.ic_action_close_dark) .buttonBackground(R.drawable.button_stylezed) .nextQuestionAuto() - .pageNumber(CATEGORY_SOCIODEMOGRAPHIC) + .pageNumber(GATEGORY_FAMILY_COHESION) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_12), Color.WHITE) + .title(getString(R.string.question_1), Color.WHITE) .titleTextSize(28) .colorBackground(ContextCompat.getColor(this, R.color.colorCyan)) .description("") - .image(R.drawable.z_color) + .image(R.drawable.z_help) .buttonClose(R.drawable.ic_action_close_dark) + .inputItems(parseAnswers(R.array.default_answers)) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.race_answers)) - .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(11) + .inputDisableAddNewItem() + .pageNumber(1) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_13), Color.WHITE) + .title(getString(R.string.question_2), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorDeepPurple)) + .colorBackground(ContextCompat.getColor(this, R.color.colorRed)) .description("") - .image(R.drawable.z_scholarity) + .image(R.drawable.z_friend) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.scholarity_answers)) + .inputItems(parseAnswers(R.array.default_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(12) + .pageNumber(2) .build()); - addQuestion(new Open.Config() - .title(getString(R.string.question_14), Color.WHITE) + addQuestion(new Single.Config() + .title(getString(R.string.question_3), Color.WHITE) .titleTextSize(28) - .inputColorText(Color.WHITE) - .colorBackground(ContextCompat.getColor(this, R.color.colorBlue)) + .colorBackground(ContextCompat.getColor(this, R.color.colorAmber)) .description("") - .image(R.drawable.z_house) + .image(R.drawable.z_only_family) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) - .inputType(InputType.TYPE_CLASS_NUMBER) + .inputColorSelectedText(Color.WHITE) + .inputItems(parseAnswers(R.array.default_answers)) + .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(13) + .pageNumber(3) .build()); - //CATEGORY OralHealthRecord - addQuestion(new Infor.Config() - .title(R.string.category_oralhealth, Color.WHITE) + addQuestion(new Single.Config() + .title(getString(R.string.question_4), Color.WHITE) .titleTextSize(28) - .description(R.string.category_oralhealth_desc, Color.WHITE) - .descriptionTextSize(20) - .image(R.drawable.category_tooth) - .colorBackground(getResources().getColor(R.color.colorAccent)) - .inputText(R.string.bt_next) + .colorBackground(ContextCompat.getColor(this, R.color.colorOrange)) + .description("") + .image(R.drawable.z_new_friend) .buttonClose(R.drawable.ic_action_close_dark) - .buttonBackground(R.drawable.button_stylezed) + .inputColorBackgroundTint(Color.WHITE) + .inputColorSelectedText(Color.WHITE) + .inputItems(parseAnswers(R.array.default_answers)) + .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(CATEGORY_ORAL_HEALTH) + .pageNumber(4) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_15), Color.WHITE) + .title(getString(R.string.question_5), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorPink)) + .colorBackground(ContextCompat.getColor(this, R.color.colorCyan)) .description("") - .image(R.drawable.z_toothbrush) + .image(R.drawable.z_time) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.number3_answers)) + .inputItems(parseAnswers(R.array.default_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(14) + .pageNumber(5) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_16), Color.WHITE) + .title(getString(R.string.question_6), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorTeal)) + .colorBackground(ContextCompat.getColor(this, R.color.colorBlueGrey)) .description("") - .image(R.drawable.z_caries_mil) + .image(R.drawable.z_proximity_family) .buttonClose(R.drawable.ic_action_close_dark) - .inputItems(parseAnswers(R.array.yes_not_answers)) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .nextQuestionAuto() + .inputItems(parseAnswers(R.array.default_answers)) .inputDisableAddNewItem() - .pageNumber(15) + .nextQuestionAuto() + .pageNumber(6) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_17), Color.WHITE) + .title(getString(R.string.question_7), Color.WHITE) .titleTextSize(28) .colorBackground(ContextCompat.getColor(this, R.color.colorRed)) .description("") - .image(R.drawable.z_caries_mil) + .image(R.drawable.z_activity) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.yes_not_answers)) + .inputItems(parseAnswers(R.array.default_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(16) + .pageNumber(7) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_18), Color.WHITE) + .title(getString(R.string.question_8), Color.WHITE) .titleTextSize(28) .colorBackground(ContextCompat.getColor(this, R.color.colorOrange)) .description("") - .image(R.drawable.z_caries_white) + .image(R.drawable.z_familiy_activity_easy) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.yes_not_answers)) + .inputItems(parseAnswers(R.array.default_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(17) + .pageNumber(8) .build()); addQuestion(new Single.Config() - .title(getString(R.string.question_19), Color.WHITE) + .title(getString(R.string.question_9), Color.WHITE) .titleTextSize(28) - .colorBackground(ContextCompat.getColor(this, R.color.colorDeepPurple)) + .colorBackground(ContextCompat.getColor(this, R.color.colorTeal)) .description("") - .image(R.drawable.z_caries_white) + .image(R.drawable.z_conselho) .buttonClose(R.drawable.ic_action_close_dark) .inputColorBackgroundTint(Color.WHITE) .inputColorSelectedText(Color.WHITE) - .inputItems(parseAnswers(R.array.yes_not_answers)) + .inputItems(parseAnswers(R.array.default_answers)) .inputDisableAddNewItem() .nextQuestionAuto() - .pageNumber(18) + .pageNumber(9) .build()); - //END PAGE - addQuestion(new Infor.Config() - .title(R.string.thank_you, Color.WHITE) + addQuestion(new Single.Config() + .title(getString(R.string.question_10), Color.WHITE) .titleTextSize(28) - .description(R.string.odontology_final_instructions) - .descriptionTextSize(14) - .descriptionColor(Color.WHITE) - .colorBackground(getResources().getColor(R.color.colorPrimaryDark)) - .image(R.drawable.x_like) + .colorBackground(ContextCompat.getColor(this, R.color.colorRed)) + .description("") + .image(R.drawable.z_union_family) .buttonClose(R.drawable.ic_action_close_dark) - .buttonColorText(getResources().getColor(R.color.colorPrimaryDark)) - .buttonBackground(R.drawable.button_stylezed) - .pageNumber(END_PAGE) + .inputColorBackgroundTint(Color.WHITE) + .inputColorSelectedText(Color.WHITE) + .inputItems(parseAnswers(R.array.default_answers)) + .inputDisableAddNewItem() + .nextQuestionAuto() + .pageNumber(10) .build()); + } /** @@ -522,7 +557,10 @@ public void onClosePage() { } private void setPoint(int index, int value) { + Log.w("AAA", "Salvando " + value + " in index " + (index - 1)); points.add(index - 1, value + 1); + for (Integer integer : points) + Log.w("AAA", "Salvo " + integer); } /** @@ -532,22 +570,111 @@ private void setPoint(int index, int value) { */ @Override public void onAnswerInfo(int page) { + Log.d(LOG_TAG, "onAnswerInfo() | PAGE: " + page); - switch (page) { - case GATEGORY_FAMILY_COHESION: + if (page == GATEGORY_FAMILY_COHESION && checkpoint == -1) { + } else if (page == CATEGORY_SOCIODEMOGRAPHIC && checkpoint == -1) { + saveOralHealth(); + } else if (page == CATEGORY_ORAL_HEALTH && checkpoint == -1) { + saveFamilyCohesion(); + } else if (page == END_PAGE) { + if (checkpoint == -1) saveSociodemographic(); + else + switch (checkpoint) { + case FAMILY_COHESION: + saveFamilyCohesion(); + break; + case SOCIODEMOGRAPHICS: + saveSociodemographic(); + break; + case ORAL_HEALTH: + saveOralHealth(); + break; + default: + saveOralHealth(); + } + sendQuestionnaireToServer(); + } + } - break; - case CATEGORY_SOCIODEMOGRAPHIC: - saveFamilyCohesion(); - break; - case CATEGORY_ORAL_HEALTH: - saveSociodemographic(); - break; - case END_PAGE: - saveOralHealth(); - startActivity(new Intent(this, MainActivity.class)); - finish(); - break; + private void sendQuestionnaireToServer() { + Log.w("AAA", "sendQuestionnaireToServer"); + ProgressDialog dialog = ProgressDialog.show(this, "Sincronização", + "Aguarde alguns instantes...", true); + dialog.show(); + Log.w("AAA", odontologicalQuestionnaire.toJson()); + if (updateType == null) { + DisposableManager.add(haniotNetRepository + .saveOdontologicalQuestionnaire(patient.get_id(), odontologicalQuestionnaire) + .doAfterTerminate(() -> { + }) + .subscribe(odontologicalQuestionnaire1 -> { + dialog.cancel(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage("Salvo com sucesso!"); + builder.setCancelable(true); + builder.setNeutralButton("Ok", (dialog1, which) -> { + startActivity(new Intent(this, MainActivity.class)); + finish(); + }); + builder.show(); + }, throwable -> { + Log.w(LOG_TAG, "Error: " + throwable.getMessage()); + dialog.cancel(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Não foi possível concluir a operação..."); + builder.setMessage("Tente novamente mais tarde!"); + builder.setCancelable(false); + builder.setPositiveButton("Ok", (dialog12, which) -> { + startActivity(new Intent(this, MainActivity.class)); + finish(); + dialog12.cancel(); + }); + builder.show(); + })); + } else { + Log.w("AAA", "updateType != null: " + updateType); + Log.w("AAA", "updateType: " + updateType + " idUpdate: " + idUpdate); + printJson(); + + Log.w("AAA", "id: " + idUpdate); + if (idUpdate != null) { + DisposableManager.add(haniotNetRepository + .updateOdontologicalQuestionnaire(patient.get_id(), idUpdate, updateType, resourceToUpdate) + .subscribe(o -> { + dialog.cancel(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage("Atualizado com sucesso!"); + builder.setCancelable(true); + builder.setNeutralButton("Ok", (dialog1, which) -> { + finish(); + }); + builder.show(); + }, throwable -> { + Log.w("AAA", throwable.getMessage()); + dialog.cancel(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Não foi possível concluir a operação..."); + builder.setMessage("Tente novamente mais tarde!"); + builder.setCancelable(false); + builder.setPositiveButton("Ok", (dialog12, which) -> { + startActivity(new Intent(this, MainActivity.class)); + finish(); + dialog12.cancel(); + }); + builder.show(); + })); + } + } + } + + private void printJson() { + if (resourceToUpdate instanceof FamilyCohesionRecord) { + Log.w("AAA", "FamilyCohesionRecord " + ((FamilyCohesionRecord) resourceToUpdate).toJson()); + } else if (resourceToUpdate instanceof OralHealthRecord) { + Log.w("AAA", "OralHealthRecord " + ((OralHealthRecord) resourceToUpdate).toJson()); + } else if (resourceToUpdate instanceof SociodemographicRecord) { + Log.w("AAA", "SociodemographicRecord " + ((SociodemographicRecord) resourceToUpdate).toJson()); } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/SplashScreenActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/SplashScreenActivity.java index 56fe08f6..fb901fb7 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/SplashScreenActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/SplashScreenActivity.java @@ -17,6 +17,10 @@ import butterknife.BindView; import butterknife.ButterKnife; +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.NUTRITION; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; + /** * Activity SplashScreenActivity. * @@ -39,6 +43,10 @@ protected void onCreate(Bundle savedInstanceState) { appPreference = AppPreferencesHelper.getInstance(this); + // TODO for test +// appPreference.removeLastPilotStudy(); +// appPreference.getUserLogged().setUserType(PATIENT); + // startService(new Intent(this, TokenExpirationService.class)); Animation animation = AnimationUtils.loadAnimation(this, R.anim.slide_up); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/UserRegisterActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/UserRegisterActivity.java new file mode 100644 index 00000000..72b22bd7 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/UserRegisterActivity.java @@ -0,0 +1,555 @@ +package br.edu.uepb.nutes.haniot.activity; + +import android.app.Activity; +import android.app.DatePickerDialog; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.StringRes; +import android.support.design.widget.FloatingActionButton; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.view.animation.AnimationUtils; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RadioGroup; +import android.widget.TextView; + +import java.util.Calendar; +import java.util.Objects; + +import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.activity.account.ChangePasswordActivity; +import br.edu.uepb.nutes.haniot.data.model.Admin; +import br.edu.uepb.nutes.haniot.data.model.HealthProfessional; +import br.edu.uepb.nutes.haniot.data.model.Patient; +import br.edu.uepb.nutes.haniot.data.model.PatientsType; +import br.edu.uepb.nutes.haniot.data.model.User; +import br.edu.uepb.nutes.haniot.data.model.dao.PatientDAO; +import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; +import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; +import br.edu.uepb.nutes.haniot.utils.DateUtils; +import butterknife.BindView; +import butterknife.ButterKnife; +import retrofit2.HttpException; + +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.HEALTH_PROFESSIONAL; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; + +/** + * UserRegisterActivity implementation. + * + * @author Fábio Júnior + * @version 1.0 + * @copyright Copyright (c) 2019, NUTES UEPB + */ +public class UserRegisterActivity extends AppCompatActivity { + + final private String TAG = "UserRegisterActivity"; + @BindView(R.id.toolbar) + Toolbar toolbar; + + @BindView(R.id.fab) + FloatingActionButton fab; + + @BindView(R.id.name_edittext) + EditText nameEditTExt; + + @BindView(R.id.email_edittext) + EditText emailEditTExt; + + @BindView(R.id.gender_icon) + ImageView genderIcon; + + @BindView(R.id.radio_group) + RadioGroup genderGroup; + + @BindView(R.id.birth_edittext) + EditText birthEdittext; + + @BindView(R.id.phone_edittext) + EditText phoneEdittext; + + @BindView(R.id.box_message_error) + LinearLayout boxMessage; + + @BindView(R.id.message_error) + TextView messageError; + + @BindView(R.id.loading) + ProgressBar progressBar; + + private Calendar myCalendar; + private Patient patient; + private AppPreferencesHelper appPreferencesHelper; + private HaniotNetRepository haniotNetRepository; + private PatientDAO patientDAO; + private boolean isEdit = false; + private String oldEmail; + private boolean editUserLogged; + private HealthProfessional healthProfessional; + private Admin admin; + private User userLogged; + private String name; + private String phoneNumber; + private String birthday; + private String gender; + private String id; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_user_info); + ButterKnife.bind(this); + + toolbar.setTitle(getResources().getString(R.string.patient_profile)); + setSupportActionBar(toolbar); + Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); + if (getIntent().hasExtra("action")) isEdit = true; + if (getIntent().hasExtra("editUser")) editUserLogged = true; + + initComponents(); + } + + @Override + protected void onResume() { + super.onResume(); + boxMessage.setVisibility(View.GONE); + } + + /** + * Validate fields. + */ + private boolean validate() { + boolean validated = true; + if (nameEditTExt.getText().toString().isEmpty()) { + nameEditTExt.setError(getResources().getString(R.string.required_field)); + validated = false; + } + + if (birthEdittext.getText().toString().isEmpty()) { + birthEdittext.setError(getResources().getString(R.string.required_field)); + validated = false; + } + + if (emailEditTExt.getText().length() > 0 && !android.util.Patterns.EMAIL_ADDRESS.matcher(emailEditTExt.getText()).matches()) { + emailEditTExt.setError(getResources().getString(R.string.validate_email)); + validated = false; + } + return validated; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + DisposableManager.dispose(); + } + + private void editAdmin() { + Log.w("AAA", "editAdmin()"); + admin.set_id(id); + admin.setName(nameEditTExt.getText().toString()); + if (isEdit) { + if ((emailEditTExt.getText().toString().equals(userLogged.getEmail())) + || emailEditTExt.getText().toString().isEmpty()) { + admin.setEmail(null); + } else admin.setEmail(emailEditTExt.getText().toString()); + } else { + if (emailEditTExt.getText().toString().isEmpty()) admin.setEmail(null); + else admin.setEmail(emailEditTExt.getText().toString()); + } + + admin.setPhoneNumber(phoneEdittext.getText().toString()); + admin.setBirthDate(DateUtils.formatDate(myCalendar.getTimeInMillis(), "yyyy-MM-dd")); + Log.w("AAA", "editing Admin: " + admin.toJson()); + DisposableManager.add(haniotNetRepository.updateAdmin(admin).subscribe(admin1 -> { + showMessage(R.string.update_success); + finish(); + }, this::errorHandler)); + + } + + private void edithealthProfessional() { + Log.w("AAA", "edithealthProfessional()"); + healthProfessional.set_id(id); + healthProfessional.setName(nameEditTExt.getText().toString()); + + if (isEdit) { + if ((emailEditTExt.getText().toString().equals(userLogged.getEmail())) + || emailEditTExt.getText().toString().isEmpty()) { + healthProfessional.setEmail(null); + } else healthProfessional.setEmail(emailEditTExt.getText().toString()); + } else { + if (emailEditTExt.getText().toString().isEmpty()) healthProfessional.setEmail(null); + else healthProfessional.setEmail(emailEditTExt.getText().toString()); + } + + healthProfessional.setPhoneNumber(phoneEdittext.getText().toString()); + healthProfessional.setBirthDate(DateUtils.formatDate(myCalendar.getTimeInMillis(), "yyyy-MM-dd")); + Log.w("AAA", "editing Health Professional: " + healthProfessional.toJson()); + DisposableManager.add(haniotNetRepository.updateHealthProfissional(healthProfessional).subscribe(healthProfessional1 -> { + showMessage(R.string.update_success); + finish(); + }, this::errorHandler)); + } + + /** + * Save patient in App Preferences. + */ + private void savePatient() { + Log.w("AAA", "savePatient()"); + if (!isEdit) patient = new Patient(); + + patient.setName(nameEditTExt.getText().toString()); + + if (isEdit) { + patient.set_id(id); + if ((emailEditTExt.getText().toString().equals(patient.getEmail())) + || emailEditTExt.getText().toString().isEmpty()) { + patient.setEmail(null); + } else patient.setEmail(emailEditTExt.getText().toString()); + } else { + if (emailEditTExt.getText().toString().isEmpty()) patient.setEmail(null); + else patient.setEmail(emailEditTExt.getText().toString()); + } + + patient.setPhoneNumber(phoneEdittext.getText().toString()); + patient.setBirthDate(DateUtils.formatDate(myCalendar.getTimeInMillis(), "yyyy-MM-dd")); + Log.w("AAA", "patient BirthDate: " + patient.getBirthDate()); + if (genderGroup.getCheckedRadioButtonId() == R.id.male) { + patient.setGender(PatientsType.GenderType.MALE); + } else { + patient.setGender(PatientsType.GenderType.FEMALE); + } + + patient.setPilotId(userLogged.getPilotStudyIDSelected()); + Log.i(TAG, patient.toJson()); + + if (isEdit) { + Log.w("AAA", "patient to edit: " + patient.toJson()); + DisposableManager.add(haniotNetRepository + .updatePatient(patient) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(patient1 -> { + patientDAO.save(patient); + showMessage(R.string.update_success); + startActivity(new Intent(UserRegisterActivity.this, ManagerPatientsActivity.class)); + finish(); + }, this::errorHandler)); + } else { + DisposableManager.add(haniotNetRepository + .savePatient(patient) + .doAfterTerminate(() -> { + showLoading(false); + Log.i(TAG, "Salvando paciente no servidor!"); + }) + .doOnSubscribe(disposable -> { + Log.i(TAG, "Salvando paciente no servidor!"); + showLoading(true); + }) + .subscribe(patient -> { + if (patient.get_id() == null) { + showMessage(R.string.error_recover_data); + return; + } + this.patient.set_id(patient.get_id()); + associatePatientToPilotStudy(); + }, this::errorHandler)); + } + } + + /** + * Associate patient to selected pilot study in server. + */ + private void associatePatientToPilotStudy() { + DisposableManager.add(haniotNetRepository + .associatePatientToPilotStudy(userLogged.getPilotStudyIDSelected(), patient.get_id()) + .subscribe(o -> { + Log.w(TAG, "Patient associated to pilotstudy"); + patientDAO.save(patient); + appPreferencesHelper.saveLastPatient(patient); + if (appPreferencesHelper.getUserLogged().getUserType().equals(HEALTH_PROFESSIONAL)) { + User user = appPreferencesHelper.getUserLogged(); + if (user.getHealthArea().equals(getString(R.string.type_nutrition))) + startActivity(new Intent(UserRegisterActivity.this, QuizNutritionActivity.class)); + else if (user.getHealthArea().equals(getString(R.string.type_dentistry))) + startActivity(new Intent(UserRegisterActivity.this, QuizOdontologyActivity.class)); + } + finish(); + }, this::errorHandler)); + } + + /** + * Manipulates the error and displays message + * according to the type of error. + * + * @param e {@link Throwable} + */ + private void errorHandler(Throwable e) { + Log.i(TAG, "errorHandler " + e.toString()); + if (e instanceof HttpException) { + HttpException httpEx = ((HttpException) e); + if (httpEx.code() == 409) { + showMessage(R.string.error_409_patient); + } else { + showMessage(R.string.error_500); + } + } else showMessage(R.string.error_500); + } + + @Override + protected void onStart() { + super.onStart(); + checkConnectivity(); + } + + /** + * On back pressed. + */ + @Override + public void onBackPressed() { + super.onBackPressed(); + finish(); + } + + /** + * Loading message, + * + * @param enabled boolean + */ + private void showLoading(final boolean enabled) { + runOnUiThread(() -> { + fab.setEnabled(!enabled); + if (enabled) progressBar.setVisibility(View.VISIBLE); + else progressBar.setVisibility(View.GONE); + }); + } + + /** + * Validate patient. + */ + View.OnClickListener fabClick = v -> { + if (validate()) { + Log.w("AAA", "Validated: " + validate()); + if (editUserLogged && userLogged.getUserType().equals(ADMIN)) editAdmin(); + else if (editUserLogged && userLogged.getUserType().equals(HEALTH_PROFESSIONAL)) + edithealthProfessional(); + else savePatient(); + } + }; + + /** + * Prepare the view for editing the data + */ + private void prepareEditing() { + if (userLogged.getUserType().equals(PATIENT) || !editUserLogged) { + DisposableManager.add(haniotNetRepository + .getPatient(appPreferencesHelper.getLastPatient().get_id()) + .doOnSubscribe(disposable -> { + enabledView(false); + showLoading(true); + }) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(patient1 -> { + id = patient1.get_id(); + if (patient1.getEmail() != null) { + patient.setEmail(patient1.getEmail()); + oldEmail = patient1.getEmail(); + } + if (patient1.getName() != null) { + patient.setName(patient1.getName()); + name = patient1.getName(); + } + phoneNumber = patient1.getPhoneNumber(); + birthday = patient1.getBirthDate(); + gender = patient1.getGender(); + prepareView(); + enabledView(true); + }, this::errorHandler)); + } else if (userLogged.getUserType().equals(HEALTH_PROFESSIONAL)) { + genderIcon.setImageResource(R.drawable.ic_health_professional); + DisposableManager.add(haniotNetRepository + .getHealthProfissional(userLogged.get_id()) + .doOnSubscribe(disposable -> { + enabledView(false); + showLoading(true); + }) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(healthProfessional1 -> { + id = healthProfessional1.get_id(); + + if (healthProfessional1.getEmail() != null) { + healthProfessional.setEmail(healthProfessional1.getEmail()); + oldEmail = healthProfessional1.getEmail(); + } + if (healthProfessional1.getName() != null) { + healthProfessional.setName(healthProfessional1.getName()); + name = healthProfessional1.getName(); + } + phoneNumber = healthProfessional1.getPhoneNumber(); + birthday = healthProfessional1.getBirthDate(); + prepareView(); + enabledView(true); + }, this::errorHandler)); + } else if (userLogged.getUserType().equals(ADMIN)) { + genderIcon.setImageResource(R.drawable.ic_admin); + DisposableManager.add(haniotNetRepository + .getAdmin(userLogged.get_id()) + .doOnSubscribe(disposable -> { + enabledView(false); + showLoading(true); + }) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(admin1 -> { + id = admin1.get_id(); + + if (admin1.getEmail() != null) { + admin.setEmail(admin1.getEmail()); + oldEmail = admin1.getEmail(); + } + if (admin1.getName() != null) { + admin.setName(admin1.getName()); + name = admin1.getName(); + } + phoneNumber = admin1.getPhoneNumber(); + birthday = admin1.getBirthDate(); + prepareView(); + enabledView(true); + }, this::errorHandler)); + } + } + + /** + * Check if you have connectivity. + * If it does not, the elements in the view mounted to notify the user + * + * @return boolean + */ + private boolean checkConnectivity() { + if (!ConnectionUtils.internetIsEnabled(this)) { + boxMessage.setVisibility(View.VISIBLE); + messageError.setText(getString(R.string.error_connectivity)); + return false; + } + boxMessage.setVisibility(View.GONE); + + return true; + } + + /** + * Enable or disable view + * + * @param enabled boolean + */ + private void enabledView(final boolean enabled) { + runOnUiThread(() -> { + nameEditTExt.setEnabled(enabled); + emailEditTExt.setEnabled(enabled); + phoneEdittext.setEnabled(enabled); + birthEdittext.setEnabled(enabled); + genderGroup.setEnabled(enabled); + }); + } + + private void prepareView() { + nameEditTExt.setText(name); + emailEditTExt.setText(oldEmail); + phoneEdittext.setText(phoneNumber); + birthEdittext.setText(DateUtils.formatDate(birthday, getString(R.string.date_format))); + if (editUserLogged) { + genderGroup.setVisibility(View.GONE); + } + + Log.w("AAA", birthday); + Log.w("AAA", DateUtils.convertStringDateToCalendar(birthday, null).getTime().toString()); + + myCalendar = DateUtils.convertStringDateToCalendar(birthday, null); + + if (!editUserLogged) + if (gender.equals(PatientsType.GenderType.MALE)) + genderGroup.check(R.id.male); + else genderGroup.check(R.id.female); + } + + /** + * Displays message. + * + * @param str @StringRes message. + */ + private void showMessage(@StringRes int str) { + String message = getString(str); + if (message.isEmpty()) message = getString(R.string.error_500); + + messageError.setText(message); + runOnUiThread(() -> { + boxMessage.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); + boxMessage.setVisibility(View.VISIBLE); + }); + } + + /** + * Init components. + */ + private void initComponents() { + appPreferencesHelper = AppPreferencesHelper.getInstance(this); + Log.i(TAG, appPreferencesHelper.getUserAccessHaniot().getAccessToken()); + haniotNetRepository = HaniotNetRepository.getInstance(this); + patientDAO = PatientDAO.getInstance(this); + myCalendar = Calendar.getInstance(); + userLogged = appPreferencesHelper.getUserLogged(); + fab.setOnClickListener(fabClick); + admin = new Admin(); + healthProfessional = new HealthProfessional(); + patient = new Patient(); + + if (isEdit || editUserLogged) { + prepareEditing(); + } + + + genderGroup.setOnCheckedChangeListener((group, checkedId) -> { + if (checkedId == R.id.male) genderIcon.setImageResource(R.drawable.x_boy); + else genderIcon.setImageResource(R.drawable.x_girl); + }); + + birthEdittext.setOnClickListener(v -> { + InputMethodManager inputManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); + inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0); + DatePickerDialog dialog = new DatePickerDialog(UserRegisterActivity.this, + (view, year, month, dayOfMonth) -> { + myCalendar.set(Calendar.YEAR, year); + myCalendar.set(Calendar.MONTH, month); + myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); + birthEdittext.setText(DateUtils.formatDate(myCalendar.getTimeInMillis(), + getResources().getString(R.string.date_format))); + }, 2010, 1, 1); + dialog.show(); + }); + } + + /** + * On options item selected. + * + * @param item + * @return + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + } + return super.onOptionsItemSelected(item); + } +} \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/ChangePasswordActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/ChangePasswordActivity.java index 384b777b..7696845c 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/ChangePasswordActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/ChangePasswordActivity.java @@ -17,9 +17,11 @@ import java.util.regex.Pattern; import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.activity.MainActivity; import br.edu.uepb.nutes.haniot.data.model.User; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.ErrorHandler; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import butterknife.BindView; @@ -69,10 +71,10 @@ protected void onCreate(Bundle savedInstanceState) { haniotNetRepository = HaniotNetRepository.getInstance(this); appPreferences = AppPreferencesHelper.getInstance(this); - Intent intent = getIntent(); - if (intent.hasExtra("user_id")) { // From redirect link + String changePasswordId = appPreferences.getString("user_id"); + if (changePasswordId != null) { // From redirect link user = new User(); - user.set_id(intent.getStringExtra("user_id")); + user.set_id(changePasswordId); } else { user = appPreferences.getUserLogged(); } @@ -190,7 +192,11 @@ private void changePassword() { .doAfterTerminate(() -> loadingSend(false)) .subscribe(() -> { printMessage(204); - signOut(); +// signOut(); + + //TODO + startActivity(new Intent(this, MainActivity.class)); + finish(); }, this::errorHandler) ); } @@ -202,12 +208,7 @@ private void changePassword() { * @param e {@link Throwable} */ private void errorHandler(Throwable e) { - if (e instanceof HttpException) { - HttpException httpEx = ((HttpException) e); - printMessage(httpEx.code()); - return; - } - printMessage(500); + ErrorHandler.showMessage(this, e); } /** diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/ForgotPasswordActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/ForgotPasswordActivity.java new file mode 100644 index 00000000..7d97b96f --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/ForgotPasswordActivity.java @@ -0,0 +1,426 @@ +package br.edu.uepb.nutes.haniot.activity.account; + +import android.content.ComponentName; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Build; +import android.os.Bundle; +import android.os.IBinder; +import android.support.annotation.StringRes; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.view.animation.AnimationUtils; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import java.io.IOException; +import java.util.Objects; + +import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.activity.MainActivity; +import br.edu.uepb.nutes.haniot.data.model.Device; +import br.edu.uepb.nutes.haniot.data.model.User; +import br.edu.uepb.nutes.haniot.data.model.UserAccess; +import br.edu.uepb.nutes.haniot.data.model.dao.DeviceDAO; +import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.ErrorHandler; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; +import br.edu.uepb.nutes.haniot.service.TokenExpirationService; +import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; +import butterknife.BindView; +import butterknife.ButterKnife; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.HttpException; + +import static android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS; +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.HEALTH_PROFESSIONAL; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; + +/** + * LoginActivity implementation. + * + * @author Copyright (c) 2018, NUTES/UEPB + */ +public class ForgotPasswordActivity extends AppCompatActivity implements View.OnClickListener { + private final String LOG_TAG = "LoginActivity"; + + @BindView(R.id.progressBarLogin) + ProgressBar mProgressBar; + + @BindView(R.id.alert_error_connectivity) + FrameLayout mAlertConnectivity; + + @BindView(R.id.edit_text_email) + EditText emailEditText; + + @BindView(R.id.btn_forgot) + Button buttonForgot; + + @BindView(R.id.btn_ok) + Button buttonOk; + + @BindView(R.id.box_message_error) + LinearLayout boxMessage; + + @BindView(R.id.box_response) + LinearLayout boxResponse; + + @BindView(R.id.box_forgout) + LinearLayout boxForgout; + + @BindView(R.id.message_error) + TextView messageError; + + private TokenExpirationService tokenExpirationService; + private boolean mIsBound; + private DeviceDAO mDeviceDAO; + private HaniotNetRepository haniotNetRepository; + private AppPreferencesHelper appPreferencesHelper; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_forgot_password); + ButterKnife.bind(this); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getWindow().setStatusBarColor(getColor(R.color.colorAccent)); + } + mDeviceDAO = DeviceDAO.getInstance(this); + haniotNetRepository = HaniotNetRepository.getInstance(this); + appPreferencesHelper = AppPreferencesHelper.getInstance(this); + + doBindService(); + + buttonForgot.setOnClickListener(this); + buttonOk.setOnClickListener(this); + } + + @Override + protected void onStart() { + super.onStart(); + } + + @Override + protected void onResume() { + super.onResume(); + checkConnectivity(); + boxMessage.setVisibility(View.GONE); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + doUnbindService(); + DisposableManager.dispose(); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.btn_forgot: + login(); + break; + case R.id.btn_ok: + finish(); + break; + default: + break; + } + } + + /** + * Authenticate user + */ + private void login() { + boxMessage.setVisibility(View.GONE); + + // close keyboard + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(Objects.requireNonNull( + getCurrentFocus()).getWindowToken(), HIDE_NOT_ALWAYS); + + // Check if you have an internet connection. + // If yes, it does authentication with the remote server + if (!checkConnectivity() || !validate()) return; + + forgoutPassword(); + } + + private void showSucess() { + boxResponse.setVisibility(View.VISIBLE); + boxForgout.setVisibility(View.GONE); + } + + /** + * Authenticates the user on the remote server + */ + private void forgoutPassword() { +// user.set + JsonObject email = new JsonObject(); + email.addProperty("email", emailEditText.getText().toString()); + DisposableManager.add(haniotNetRepository + .forgotPassword(email) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(o -> { + showSucess(); + }, this::errorHandler) + ); + } + + /** + * Get data user from server. + * + * @param userAccess {@link UserAccess} + */ + private void getUserProfile(UserAccess userAccess) { + switch (userAccess.getTokenType()) { + case HEALTH_PROFESSIONAL: + DisposableManager.add(haniotNetRepository + .getHealthProfissional(userAccess.getSubject()) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(user -> { + if (user.get_id() == null) { + showMessage(R.string.error_recover_data); + showLoading(false); + return; + } + user.setUserType(HEALTH_PROFESSIONAL); + saveUserInfo(user); + }, this::errorHandler) + ); + break; + case ADMIN: + DisposableManager.add(haniotNetRepository + .getAdmin(userAccess.getSubject()) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(user -> { + if (user.get_id() == null) { + showMessage(R.string.error_recover_data); + showLoading(false); + return; + } + user.setUserType(ADMIN); + saveUserInfo(user); + }, this::errorHandler) + ); + break; + case PATIENT: + DisposableManager.add(haniotNetRepository + .getPatient(userAccess.getSubject()) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(user -> { + if (user.get_id() == null) { + showMessage(R.string.error_recover_data); + showLoading(false); + return; + } + user.setUserType(PATIENT); + saveUserInfo(user); + appPreferencesHelper.saveLastPatient(user); + }, this::errorHandler) + ); + break; + } + } + + /** + * Save user info in AppPreferences. + * + * @param user + */ + private void saveUserInfo(User user) { + appPreferencesHelper.saveUserLogged(user); + tokenExpirationService.initTokenMonitor(); + syncDevices(user.get_id()); + } + + /** + * Get devices saved on the server and sync local. + */ + public void syncDevices(String userId) { + if (userId == null) return; + + DisposableManager.add(haniotNetRepository + .getAllDevices(userId) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> { + startActivity(new Intent(this, MainActivity.class)); + finish(); + }) + .subscribe(devices -> { + mDeviceDAO.removeAll(userId); + for (Device d : devices) { + d.setUserId(userId); + mDeviceDAO.save(d); + } + }, error -> Log.w(LOG_TAG, "syncDevices() error: " + error.getMessage())) + ); + } + + /** + * Open screen to change password. + * + * @param body {@link ResponseBody} + */ + private void openScreenChangePassword(ResponseBody body) { + try { + JsonObject json = new JsonParser() + .parse(body.string()) + .getAsJsonObject(); + String redirectLink = json.get("redirect_link").getAsString(); + Intent intent = new Intent( + ForgotPasswordActivity.this, + ChangePasswordActivity.class + ); + Log.i("AAA", redirectLink); + appPreferencesHelper.saveString("user_id", redirectLink.split("/")[2]); + startActivity(intent); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + + /** + * Manipulates the error and displays message + * according to the type of error. + * + * @param e {@link Throwable} + */ + private void errorHandler(Throwable e) { + if (e instanceof HttpException) { + HttpException httpEx = ((HttpException) e); + Log.i(LOG_TAG, httpEx.message()); + switch (httpEx.code()) { + case 401: + showMessage(R.string.validate_invalid_email_or_password); + break; + case 429: + showMessage(R.string.error_limit_rate); + break; + default: + ErrorHandler.showMessage(this, e); + break; + } + return; + } + Log.i(LOG_TAG, e.getMessage()); + } + + /** + * Displays message. + * + * @param str @StringRes message. + */ + private void showMessage(@StringRes int str) { + String message = getString(str); + if (message.isEmpty()) message = getString(R.string.error_500); + + messageError.setText(message); + runOnUiThread(() -> { + boxMessage.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); + boxMessage.setVisibility(View.VISIBLE); + }); + } + + /** + * Validate form. + * + * @return boolean + */ + public boolean validate() { + boolean valid = true; + + String email = emailEditText.getText().toString(); + + if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { + emailEditText.setError(getString(R.string.validate_email)); + valid = false; + } else { + emailEditText.setError(null); + } + + return true; + } + + /** + * Loading message, + * + * @param enabled boolean + */ + private void showLoading(final boolean enabled) { + runOnUiThread(() -> { + buttonForgot.setEnabled(!enabled); + + if (enabled) mProgressBar.setVisibility(View.VISIBLE); + else mProgressBar.setVisibility(View.GONE); + }); + } + + /** + * Check if you have connectivity. + * If it does not, the elements in the view mounted to notify the user. + * + * @return boolean + */ + private boolean checkConnectivity() { + if (!ConnectionUtils.internetIsEnabled(this)) { + mAlertConnectivity.setVisibility(View.VISIBLE); + return false; + } + mAlertConnectivity.setVisibility(View.GONE); + + return true; + } + + /** + * Bind Account Service. + */ + public void doBindService() { + bindService(new Intent(this, TokenExpirationService.class), + mServiceConnection, BIND_AUTO_CREATE); + mIsBound = true; + } + + /** + * Unbind Account Service. + */ + public void doUnbindService() { + if (mIsBound) { + unbindService(mServiceConnection); + mIsBound = false; + } + } + + /** + * Code to manage Service lifecycle. + */ + private final ServiceConnection mServiceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName componentName, IBinder service) { + tokenExpirationService = ((TokenExpirationService.LocalBinder) service).getService(); + } + + @Override + public void onServiceDisconnected(ComponentName componentName) { + tokenExpirationService = null; + } + }; +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/LoginActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/LoginActivity.java index 90e2091e..4bdb340c 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/LoginActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/LoginActivity.java @@ -3,6 +3,8 @@ import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; +import android.graphics.Color; +import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.support.annotation.StringRes; @@ -28,9 +30,13 @@ import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.activity.MainActivity; import br.edu.uepb.nutes.haniot.data.model.Device; +import br.edu.uepb.nutes.haniot.data.model.User; +import br.edu.uepb.nutes.haniot.data.model.UserAccess; +import br.edu.uepb.nutes.haniot.data.model.UserType; import br.edu.uepb.nutes.haniot.data.model.dao.DeviceDAO; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.ErrorHandler; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; import br.edu.uepb.nutes.haniot.service.TokenExpirationService; import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; @@ -40,6 +46,9 @@ import retrofit2.HttpException; import static android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS; +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.HEALTH_PROFESSIONAL; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; /** * LoginActivity implementation. @@ -70,6 +79,9 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList @BindView(R.id.message_error) TextView messageError; + @BindView(R.id.forgot_password) + TextView forgotPassword; + private TokenExpirationService tokenExpirationService; private boolean mIsBound; private DeviceDAO mDeviceDAO; @@ -80,9 +92,14 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); - ButterKnife.bind(this); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + int flags = getWindow().getDecorView().getSystemUiVisibility(); + flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + getWindow().getDecorView().setSystemUiVisibility(flags); + getWindow().setStatusBarColor(getColor(android.R.color.background_light)); + } mDeviceDAO = DeviceDAO.getInstance(this); haniotNetRepository = HaniotNetRepository.getInstance(this); appPreferencesHelper = AppPreferencesHelper.getInstance(this); @@ -90,6 +107,7 @@ protected void onCreate(Bundle savedInstanceState) { doBindService(); buttonLogin.setOnClickListener(this); + forgotPassword.setOnClickListener(this); passwordEditText.setOnEditorActionListener((textView, actionId, keyEvent) -> { if (actionId == EditorInfo.IME_ACTION_SEND) login(); @@ -122,6 +140,9 @@ public void onClick(View view) { case R.id.btn_login: login(); break; + case R.id.forgot_password: + startActivity(new Intent(this, ForgotPasswordActivity.class)); + break; default: break; } @@ -134,9 +155,11 @@ private void login() { boxMessage.setVisibility(View.GONE); // close keyboard - InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(Objects.requireNonNull( - getCurrentFocus()).getWindowToken(), HIDE_NOT_ALWAYS); + if (getCurrentFocus() != null) { + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(Objects.requireNonNull(getCurrentFocus()) + .getWindowToken(), HIDE_NOT_ALWAYS); + } // Check if you have an internet connection. // If yes, it does authentication with the remote server @@ -155,7 +178,9 @@ private void authenticationInServer() { .doAfterTerminate(() -> showLoading(false)) .subscribe(userAccess -> { if (appPreferencesHelper.saveUserAccessHaniot(userAccess)) { - getUserProfile(userAccess.getSubject()); + getUserProfile(userAccess); + //TODO Temp + Log.w("AAA", "Token: " + userAccess.getAccessToken()); } }, this::errorHandler) ); @@ -164,25 +189,71 @@ private void authenticationInServer() { /** * Get data user from server. * - * @param userId {@link String} + * @param userAccess {@link UserAccess} */ - private void getUserProfile(String userId) { - DisposableManager.add(haniotNetRepository - .getHealthProfissional(userId) - .doOnSubscribe(disposable -> showLoading(true)) - .doAfterTerminate(() -> showLoading(false)) - .subscribe(user -> { - if (user.get_id() == null) { - showMessage(R.string.error_recover_data); - showLoading(false); - return; - } + private void getUserProfile(UserAccess userAccess) { + switch (userAccess.getTokenType()) { + case HEALTH_PROFESSIONAL: + DisposableManager.add(haniotNetRepository + .getHealthProfissional(userAccess.getSubject()) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(user -> { + if (user.get_id() == null) { + showMessage(R.string.error_recover_data); + showLoading(false); + return; + } + user.setUserType(HEALTH_PROFESSIONAL); + saveUserInfo(user); + }, this::errorHandler) + ); + break; + case ADMIN: + DisposableManager.add(haniotNetRepository + .getAdmin(userAccess.getSubject()) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(user -> { + if (user.get_id() == null) { + showMessage(R.string.error_recover_data); + showLoading(false); + return; + } + user.setUserType(ADMIN); + saveUserInfo(user); + }, this::errorHandler) + ); + break; + case PATIENT: + DisposableManager.add(haniotNetRepository + .getPatient(userAccess.getSubject()) + .doOnSubscribe(disposable -> showLoading(true)) + .doAfterTerminate(() -> showLoading(false)) + .subscribe(user -> { + if (user.get_id() == null) { + showMessage(R.string.error_recover_data); + showLoading(false); + return; + } + user.setUserType(PATIENT); + saveUserInfo(user); + appPreferencesHelper.saveLastPatient(user); + }, this::errorHandler) + ); + break; + } + } - appPreferencesHelper.saveUserLogged(user); - tokenExpirationService.initTokenMonitor(); - syncDevices(userId); - }, this::errorHandler) - ); + /** + * Save user info in AppPreferences. + * + * @param user + */ + private void saveUserInfo(User user) { + appPreferencesHelper.saveUserLogged(user); + tokenExpirationService.initTokenMonitor(); + syncDevices(user.get_id()); } /** @@ -224,7 +295,7 @@ private void openScreenChangePassword(ResponseBody body) { ChangePasswordActivity.class ); Log.i("AAA", redirectLink); - intent.putExtra("user_id", redirectLink.split("/")[2]); + appPreferencesHelper.saveString("user_id", redirectLink.split("/")[2]); startActivity(intent); } catch (IOException e1) { e1.printStackTrace(); @@ -245,26 +316,17 @@ private void errorHandler(Throwable e) { case 401: showMessage(R.string.validate_invalid_email_or_password); break; - case 403: { - if (httpEx.response().errorBody() == null) { - showMessage(R.string.error_500); - return; - } - Log.i("AAA", "" + httpEx.response().errorBody()); - openScreenChangePassword(Objects.requireNonNull(httpEx.response().errorBody())); - break; - } - case 404: - showMessage(R.string.error_recover_data); + case 429: + showMessage(R.string.error_limit_rate); break; default: - showMessage(R.string.error_500); + ErrorHandler.showMessage(this, e); break; } return; } - Log.i(LOG_TAG, e.getMessage()); showMessage(R.string.error_500); + Log.i(LOG_TAG, e.getMessage()); } /** diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/UpdateDataActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/UpdateDataActivity.java index 8aced016..9437a76c 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/UpdateDataActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/account/UpdateDataActivity.java @@ -14,15 +14,23 @@ import android.widget.Toast; import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.data.model.Admin; +import br.edu.uepb.nutes.haniot.data.model.HealthProfessional; +import br.edu.uepb.nutes.haniot.data.model.Patient; import br.edu.uepb.nutes.haniot.data.model.User; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.ErrorHandler; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import butterknife.BindView; import butterknife.ButterKnife; import retrofit2.HttpException; +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.HEALTH_PROFESSIONAL; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; + /** * UpdateDataActivity implementation. * @@ -128,23 +136,59 @@ public void onClick(View view) { * Prepare the view for editing the data */ private void prepareEditing() { - DisposableManager.add(haniotNetRepository - .getHealthProfissional(user.get_id()) - .doOnSubscribe(disposable -> { - populateView(); // Populate view with local data - enabledView(false); - loading(true); - }) - .doAfterTerminate(() -> loading(false)) - .subscribe(healthP -> { - if (healthP.getEmail() != null) user.setEmail(healthP.getEmail()); - if (healthP.getName() != null) user.setName(healthP.getName()); - - populateView(); - enabledView(true); - }, this::errorHandler) - - ); + switch (appPreferences.getUserLogged().getUserType()) { + case ADMIN: + DisposableManager.add(haniotNetRepository + .getAdmin(user.get_id()) + .doOnSubscribe(disposable -> { + populateView(); // Populate view with local data + enabledView(false); + loading(true); + }) + .doAfterTerminate(() -> loading(false)) + .subscribe(admin -> { + if (admin.getEmail() != null) user.setEmail(admin.getEmail()); + if (admin.getName() != null) user.setName(admin.getName()); + + populateView(); + enabledView(true); + }, this::errorHandler)); + break; + case HEALTH_PROFESSIONAL: + DisposableManager.add(haniotNetRepository + .getHealthProfissional(user.get_id()) + .doOnSubscribe(disposable -> { + populateView(); // Populate view with local data + enabledView(false); + loading(true); + }) + .doAfterTerminate(() -> loading(false)) + .subscribe(healthP -> { + if (healthP.getEmail() != null) user.setEmail(healthP.getEmail()); + if (healthP.getName() != null) user.setName(healthP.getName()); + + populateView(); + enabledView(true); + }, this::errorHandler)); + break; + case PATIENT: + DisposableManager.add(haniotNetRepository + .getPatient(user.get_id()) + .doOnSubscribe(disposable -> { + populateView(); // Populate view with local data + enabledView(false); + loading(true); + }) + .doAfterTerminate(() -> loading(false)) + .subscribe(patient -> { + if (patient.getEmail() != null) user.setEmail(patient.getEmail()); + if (patient.getName() != null) user.setName(patient.getName()); + + populateView(); + enabledView(true); + }, this::errorHandler)); + break; + } } /** @@ -163,19 +207,53 @@ private void update() { private void updateInServer() { if (user == null) return; - DisposableManager.add(haniotNetRepository - .updateHealthProfissional(getUserView()) - .doOnSubscribe(disposable -> loading(true)) - .doAfterTerminate(() -> loading(false)) - .subscribe(healthP -> { - if (healthP.getEmail() != null) user.setEmail(healthP.getEmail()); - if (healthP.getName() != null) user.setName(healthP.getName()); - - appPreferences.saveUserLogged(user); - enabledView(true); - showMessage(200); - }, this::errorHandler) - ); + switch (appPreferences.getUserLogged().getUserType()) { + case ADMIN: + DisposableManager.add(haniotNetRepository + .updateAdmin((Admin) getUserView()) + .doOnSubscribe(disposable -> loading(true)) + .doAfterTerminate(() -> loading(false)) + .subscribe(healthP -> { + if (healthP.getEmail() != null) user.setEmail(healthP.getEmail()); + if (healthP.getName() != null) user.setName(healthP.getName()); + + appPreferences.saveUserLogged(user); + enabledView(true); + showMessage(200); + }, this::errorHandler) + ); + break; + case HEALTH_PROFESSIONAL: + DisposableManager.add(haniotNetRepository + .updateHealthProfissional((HealthProfessional) getUserView()) + .doOnSubscribe(disposable -> loading(true)) + .doAfterTerminate(() -> loading(false)) + .subscribe(admin -> { + if (admin.getEmail() != null) user.setEmail(admin.getEmail()); + if (admin.getName() != null) user.setName(admin.getName()); + + appPreferences.saveUserLogged(user); + enabledView(true); + showMessage(200); + }, this::errorHandler) + ); + break; + case PATIENT: + DisposableManager.add(haniotNetRepository + .updatePatient((Patient) getUserView()) + .doOnSubscribe(disposable -> loading(true)) + .doAfterTerminate(() -> loading(false)) + .subscribe(patient -> { + if (patient.getEmail() != null) user.setEmail(patient.getEmail()); + if (patient.getName() != null) user.setName(patient.getName()); + + appPreferences.saveUserLogged(user); + enabledView(true); + showMessage(200); + }, this::errorHandler) + ); + break; + } } /** @@ -185,12 +263,7 @@ private void updateInServer() { * @param e {@link Throwable} */ private void errorHandler(Throwable e) { - if (e instanceof HttpException) { - HttpException httpEx = ((HttpException) e); - showMessage(httpEx.code()); - return; - } - showMessage(500); + ErrorHandler.showMessage(this, e); } /** diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/BloodPresssureChartActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/BloodPresssureChartActivity.java index eda473d7..212efb21 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/BloodPresssureChartActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/BloodPresssureChartActivity.java @@ -1,7 +1,6 @@ package br.edu.uepb.nutes.haniot.activity.charts; import android.graphics.Color; -import android.support.v4.content.ContextCompat; import android.view.MenuItem; import android.view.View; @@ -17,8 +16,6 @@ import br.edu.uepb.nutes.haniot.data.model.Measurement; import br.edu.uepb.nutes.haniot.data.model.MeasurementType; -import static br.edu.uepb.nutes.haniot.server.SynchronizationServer.context; - /** * BloodPresssureChartActivity implementation. * @@ -41,9 +38,11 @@ public void initView() { .xAxisStyle(Color.WHITE, XAxis.XAxisPosition.BOTTOM) .yAxisStyle(Color.WHITE) .setTextValuesColor(Color.WHITE) - .drawCircleStyle(ContextCompat.getColor(context, R.color.colorIndigo), ContextCompat.getColor(context, R.color.colorPrimary)) - .lineStyle(2.5f, ContextCompat.getColor(context, R.color.colorIndigo)) + .drawCircleStyle(getResources().getColor(R.color.colorIndigo), getResources().getColor(R.color.colorPrimary)) + .lineStyle(2.5f, getResources().getColor(R.color.colorIndigo)) .highlightStyle(Color.TRANSPARENT, 0.7f) + .createLimit(getString(R.string.limit_high_systolic), 140, getResources().getColor(R.color.colorRed)) + .createLimit(getString(R.string.limit_high_diastolic), 90, getResources().getColor(R.color.colorRed)) .addLegend(getString(R.string.systolic), getString(R.string.diastolic)) .build(); @@ -55,12 +54,6 @@ public int getLayout() { return R.layout.activity_line_chart; } -// @Override -// public int getTypeMeasurement() { -// return 0; -//// return MeasurementType.BLOOD_PRESSURE_SYSTOLIC; -// } - @Override public String getTypeMeasurement() { return MeasurementType.BLOOD_PRESSURE; @@ -71,12 +64,6 @@ public Chart getChart() { return lineChart; } - - @Override - protected void onResume() { - super.onResume(); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/BodyCompositionChartActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/BodyCompositionChartActivity.java index 14cd20e8..fab469fc 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/BodyCompositionChartActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/BodyCompositionChartActivity.java @@ -1,6 +1,7 @@ package br.edu.uepb.nutes.haniot.activity.charts; import android.graphics.Color; +import android.util.Log; import android.view.MenuItem; import android.view.View; @@ -15,6 +16,7 @@ import br.edu.uepb.nutes.haniot.activity.charts.base.CreateChart; import br.edu.uepb.nutes.haniot.data.model.Measurement; import br.edu.uepb.nutes.haniot.data.model.MeasurementType; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; /** * BodyCompositionChartActivity implementation. @@ -43,8 +45,8 @@ public void initView() { .setTextValuesColor(Color.WHITE) .colorFontDescription(Color.WHITE) .highlightStyle(Color.TRANSPARENT, 0.7f) - //.createLimit("Obesity", getLimitObesity(OBESITY_OVERWEIGHT), Color.RED) .build(); + setLimitObesity(); requestData(CHART_TYPE_MONTH); } @@ -64,11 +66,6 @@ public String getTypeMeasurement() { return MeasurementType.BODY_MASS; } - @Override - protected void onResume() { - super.onResume(); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -86,7 +83,27 @@ public void onUpdateData(List data, int currentChartType) { lineChart.setVisibility(View.VISIBLE); } -// public float getLimitObesity(float IMC){ -// return (float) (IMC*Math.pow(session.getUserLogged().getHeight(), 2)); -// } + /** + * Configure the obesity limit in the chart + */ + public void setLimitObesity() { + runOnUiThread(() -> { + DisposableManager.add(haniotNetRepository. + getAllMeasurementsByType(patient.get_id(), MeasurementType.HEIGHT, + "-timestamp", null, null, 1, 1) + .doAfterSuccess(measurements -> { + if (measurements != null && measurements.size() > 0) { + double height = measurements.get(0).getValue(); + + if (measurements.get(0).getUnit().equals("cm")) height /= 100; + float limit = (float) (OBESITY_OVERWEIGHT * Math.pow(height, 2)); + mChart.getParams().createLimit(getString(R.string.limit_obesity), limit, Color.RED); + mChart.getmChart().invalidate(); + } + }) + .subscribe(measurements -> { + }, error -> Log.w("ChartBodyComposition", "onError()"))); + }); + + } } \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/GlucoseChartActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/GlucoseChartActivity.java index fdc5a110..efee9f47 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/GlucoseChartActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/GlucoseChartActivity.java @@ -25,7 +25,7 @@ */ public class GlucoseChartActivity extends BaseChartActivity { - private final float PRE_DIABETES = 100; + private final float PRE_DIABETES = 200; private CreateChart mChart; Chart lineChart; @@ -54,13 +54,6 @@ public int getLayout() { return R.layout.activity_line_chart; } -// @Override -// public int getTypeMeasurement() { -// return 0; -//// return MeasurementType.BLOOD_GLUCOSE; -// } - - @Override public String getTypeMeasurement() { return MeasurementType.BLOOD_GLUCOSE; @@ -71,11 +64,6 @@ public Chart getChart() { return lineChart; } - @Override - protected void onResume() { - super.onResume(); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -92,4 +80,4 @@ public void onUpdateData(List data, int currentChartType) { mProgressBar.setVisibility(View.INVISIBLE); lineChart.setVisibility(View.VISIBLE); } -} +} \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/HeartRateChartActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/HeartRateChartActivity.java index 2bc5f6c7..bef4e353 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/HeartRateChartActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/HeartRateChartActivity.java @@ -43,7 +43,6 @@ public void initView() { .setTextValuesColor(Color.WHITE) .colorFontDescription(Color.WHITE) .highlightStyle(Color.TRANSPARENT, 0.7f) - .createLimit(getString(R.string.limit_heart_rate), TACHYCARDIA, Color.RED) .build(); requestData(CHART_TYPE_MONTH); @@ -54,13 +53,6 @@ public int getLayout() { return R.layout.activity_line_chart; } -// @Override -// public int getTypeMeasurement() { -// return 0; -//// return MeasurementType.HEART_RATE; -// } - - @Override public String getTypeMeasurement() { return MeasurementType.HEART_RATE; @@ -71,13 +63,6 @@ public Chart getChart() { return lineChart; } - - @Override - protected void onResume() { - super.onResume(); - requestData(CHART_TYPE_DAY); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/SmartBandChartActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/SmartBandChartActivity.java index a3cbb906..d3277f38 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/SmartBandChartActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/SmartBandChartActivity.java @@ -97,11 +97,6 @@ public Chart getChart() { return barChart; } - @Override - protected void onResume() { - super.onResume(); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -178,12 +173,12 @@ public List agroup(List data, int type) { // if (type == Calendar.YEAR) { // for (int i = 0; i <= data.size() - 1; i++) { // total += data.get(i).getValue(); -// if (data.get(i).getMeasurementList().get(0).getTypeId() == MeasurementType.DISTANCE) { -// totalCal += data.get(i).getMeasurementList().get(0).getValue(); -// totalDist += data.get(i).getMeasurementList().get(1).getValue(); +// if (data.get(i).getMeasurements().get(0).getTypeId() == MeasurementType.DISTANCE) { +// totalCal += data.get(i).getMeasurements().get(0).getValue(); +// totalDist += data.get(i).getMeasurements().get(1).getValue(); // } else { -// totalCal += data.get(i).getMeasurementList().get(1).getValue(); -// totalDist += data.get(i).getMeasurementList().get(0).getValue(); +// totalCal += data.get(i).getMeasurements().get(1).getValue(); +// totalDist += data.get(i).getMeasurements().get(0).getValue(); // } // } // @@ -207,12 +202,12 @@ public List agroup(List data, int type) { // int compare = c.get(type); // // total += data.get(i).getValue(); -// if (data.get(i).getMeasurementList().get(0).getTypeId() == MeasurementType.DISTANCE) { -// totalCal += data.get(i).getMeasurementList().get(0).getValue(); -// totalDist += data.get(i).getMeasurementList().get(1).getValue(); +// if (data.get(i).getMeasurements().get(0).getTypeId() == MeasurementType.DISTANCE) { +// totalCal += data.get(i).getMeasurements().get(0).getValue(); +// totalDist += data.get(i).getMeasurements().get(1).getValue(); // } else { -// totalCal += data.get(i).getMeasurementList().get(1).getValue(); -// totalDist += data.get(i).getMeasurementList().get(0).getValue(); +// totalCal += data.get(i).getMeasurements().get(1).getValue(); +// totalDist += data.get(i).getMeasurements().get(0).getValue(); // } // // if (current != compare) { @@ -234,19 +229,20 @@ public List agroup(List data, int type) { return points; } - @Override - protected void requestData(int type) { - if (type == CHART_TYPE_DAY) { - currentChartType = CHART_TYPE_DAY; - } else if (type == CHART_TYPE_SEVEN) { - currentChartType = CHART_TYPE_SEVEN; - } else if (type == CHART_TYPE_MONTH) { - currentChartType = CHART_TYPE_MONTH; - } else if (type == CHART_TYPE_YEAR) { - currentChartType = CHART_TYPE_YEAR; - } - requestDataInServer(""); - } +// @Override +// protected void requestData(int type) { +// if (type == CHART_TYPE_DAY) { +// currentChartType = CHART_TYPE_DAY; +// } else if (type == CHART_TYPE_SEVEN) { +// currentChartType = CHART_TYPE_SEVEN; +// } else if (type == CHART_TYPE_MONTH) { +// currentChartType = CHART_TYPE_MONTH; +// } else if (type == CHART_TYPE_YEAR) { +// +// } +// currentChartType = type; +// requestDataInServer(type); +// } @Override public void createMoreInfo(List measurements) { @@ -270,8 +266,8 @@ protected ArrayList getInfosBase(List measurements infos.add(new InfoMeasurement(getString(R.string.info_period), " - ")); } else { infos.add(new InfoMeasurement(getString(R.string.info_steps), String.valueOf((int) measurements.get(0).getValue()))); -// infos.add(new InfoMeasurement(getString(R.string.info_distance), String.valueOf((int) (measurements.get(0).getMeasurementList().get(0).getValue())) + " m")); -// infos.add(new InfoMeasurement(getString(R.string.info_calories), String.valueOf((int) (measurements.get(0).getMeasurementList().get(1).getValue())) + " kcal")); +// infos.add(new InfoMeasurement(getString(R.string.info_distance), String.valueOf((int) (measurements.get(0).getMeasurements().get(0).getValue())) + " m")); +// infos.add(new InfoMeasurement(getString(R.string.info_calories), String.valueOf((int) (measurements.get(0).getMeasurements().get(1).getValue())) + " kcal")); // infos.add(new InfoMeasurement(getString(R.string.info_period), DateUtils.formatDate(measurements.get(0).getRegistrationDate(), getString(R.string.date_format)))); } return infos; diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/TemperatureChartActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/TemperatureChartActivity.java index 742976ea..bd674a6a 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/TemperatureChartActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/TemperatureChartActivity.java @@ -65,11 +65,6 @@ public String getTypeMeasurement() { return MeasurementType.BODY_TEMPERATURE; } - @Override - protected void onResume() { - super.onResume(); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/base/BaseChartActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/base/BaseChartActivity.java index 579c53d5..805cafec 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/base/BaseChartActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/base/BaseChartActivity.java @@ -19,25 +19,19 @@ import com.github.clans.fab.FloatingActionMenu; import com.github.mikephil.charting.charts.Chart; -import org.json.JSONObject; - import java.util.ArrayList; +import java.util.Calendar; import java.util.List; import br.edu.uepb.nutes.haniot.R; -import br.edu.uepb.nutes.haniot.activity.settings.Session; import br.edu.uepb.nutes.haniot.data.model.Measurement; import br.edu.uepb.nutes.haniot.data.model.MeasurementType; import br.edu.uepb.nutes.haniot.data.model.Patient; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; -import br.edu.uepb.nutes.haniot.server.historical.CallbackHistorical; -import br.edu.uepb.nutes.haniot.server.historical.Historical; -import br.edu.uepb.nutes.haniot.server.historical.HistoricalType; -import br.edu.uepb.nutes.haniot.server.historical.Params; +import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import br.edu.uepb.nutes.haniot.utils.DateUtils; -import br.edu.uepb.nutes.haniot.utils.NameColumnsDB; import butterknife.BindView; import butterknife.ButterKnife; @@ -57,11 +51,9 @@ abstract public class BaseChartActivity extends AppCompatActivity implements Vie public final int CHART_TYPE_YEAR = 4; protected int currentChartType; - // public Params params; - public int typeId; private AppPreferencesHelper appPreferencesHelper; - private HaniotNetRepository haniotNetRepository; - private Patient patient; + protected HaniotNetRepository haniotNetRepository; + protected Patient patient; @BindView(R.id.toolbar) public Toolbar mToolbar; @@ -115,17 +107,23 @@ public void onCreate(@Nullable Bundle savedInstanceState) { boxMeasurement.requestLayout(); boxToolbar.requestLayout(); } - fabDay.setOnClickListener(this); fabWeek.setOnClickListener(this); fabMonth.setOnClickListener(this); fabYear.setOnClickListener(this); + fabActionMenu.getMenuIconView().setImageDrawable(getResources().getDrawable(R.drawable.ic_month)); } @Override protected void onDestroy() { - super.onDestroy(); DisposableManager.dispose(); + super.onDestroy(); + } + + @Override + protected void onResume() { + super.onResume(); + requestData(currentChartType); } public abstract void initView(); @@ -136,6 +134,8 @@ protected void onDestroy() { public abstract Chart getChart(); + abstract public void onUpdateData(List data, int currentChartType); + /** * Check if is tablet. * @@ -152,146 +152,94 @@ public static boolean isTablet(Context context) { public void onClick(View v) { switch (v.getId()) { case R.id.fab_day: - requestData(CHART_TYPE_DAY); + currentChartType = CHART_TYPE_DAY; fabActionMenu.getMenuIconView().setImageDrawable(getResources().getDrawable(R.drawable.ic_day)); - fabActionMenu.close(true); break; - case R.id.fab_month: - requestData(CHART_TYPE_MONTH); + currentChartType = CHART_TYPE_MONTH; fabActionMenu.getMenuIconView().setImageDrawable(getResources().getDrawable(R.drawable.ic_month)); - fabActionMenu.close(true); break; - case R.id.fab_week: - requestData(CHART_TYPE_SEVEN); + currentChartType = CHART_TYPE_SEVEN; fabActionMenu.getMenuIconView().setImageDrawable(getResources().getDrawable(R.drawable.ic_week)); - fabActionMenu.close(true); break; case R.id.fab_year: + currentChartType = CHART_TYPE_YEAR; fabActionMenu.getMenuIconView().setImageDrawable(getResources().getDrawable(R.drawable.ic_year)); - requestData(CHART_TYPE_YEAR); - fabActionMenu.close(true); break; } + requestData(currentChartType); + fabActionMenu.close(true); } - protected void requestDataInServer(String period) { - String dateStart = null; - String dateEnd = null; - - DisposableManager.add(haniotNetRepository. - getAllMeasurementsByType(patient.get_id(), getTypeMeasurement(), "timestamp", - dateStart, dateEnd, 0, 0) - .doOnSubscribe(disposable -> { - Log.w(TAG, "onBeforeSend()"); - mProgressBar.setVisibility(View.VISIBLE); - getChart().setVisibility(View.INVISIBLE); - }) - .doAfterTerminate(() -> { - Log.w(TAG, "onAfterSend()"); - }) - .subscribe(measurements -> { - Log.w(TAG, "onSuccess()"); - if (measurements != null && measurements.isEmpty()) { - runOnUiThread(new Runnable() { - @Override - public void run() { - onUpdateData(new ArrayList<>(), currentChartType); - createMoreInfo(new ArrayList<>()); - } - }); - } - if (measurements != null && measurements.size() > 0) { - Log.w(TAG, "Size = " + measurements.size()); - runOnUiThread(new Runnable() { - @Override - public void run() { - onUpdateData(measurements, currentChartType); - createMoreInfo(measurements); - } - }); - } - }, error -> { - Log.w(TAG, "onError()"); - printMessage(getString(R.string.error_500)); - })); - - -// Historical.Query query = new Historical.Query() -// .type(HistoricalType.MEASUREMENTS_TYPE_USER) -// .params(params) -// .ordination(NameColumnsDB.MEASUREMENT_REGISTRATION_DATE, "asc"); -//// -// if (!period.isEmpty()) query.filterDate(period); -//// -//// -// Historical hist = query.build(); -// -// hist.request(this, new CallbackHistorical() { -// @Override -// public void onBeforeSend() { -// Log.w(TAG, "onBeforeSend()"); -// mProgressBar.setVisibility(View.VISIBLE); -// getChart().setVisibility(View.INVISIBLE); -// -// } -// -// @Override -// public void onError(JSONObject result) { -// Log.w(TAG, "onError()"); -// printMessage(getString(R.string.error_500)); -// -// } -// -// @Override -// public void onResult(List result) { -// Log.w(TAG, "onSuccess()"); -// if (result.isEmpty() && result != null) { -// runOnUiThread(new Runnable() { -// @Override -// public void run() { -// onUpdateData(new ArrayList<>(), currentChartType); -// createMoreInfo(new ArrayList<>()); -// } -// }); -// } -// if (result != null && result.size() > 0) { -// runOnUiThread(new Runnable() { -// @Override -// public void run() { -// onUpdateData(result, currentChartType); -// createMoreInfo(result); -// } -// }); -// } -// } -// -// @Override -// public void onAfterSend() { -// Log.w(TAG, "onAfterSend()"); -// } -// }); + protected void requestData(int type) { + requestDataInServer(type); } /** - * Request data in server. + * Calculates the end date of according initial date and a period of time * - * @param type + * @param date Initial date + * @param period Period of time + * @return */ - protected void requestData(int type) { - if (type == CHART_TYPE_DAY) { - currentChartType = CHART_TYPE_DAY; - requestDataInServer("1d"); - } else if (type == CHART_TYPE_SEVEN) { - currentChartType = CHART_TYPE_SEVEN; - requestDataInServer("1w"); - } else if (type == CHART_TYPE_MONTH) { - currentChartType = CHART_TYPE_MONTH; - requestDataInServer("1m"); - } else if (type == CHART_TYPE_YEAR) { - currentChartType = CHART_TYPE_YEAR; - requestDataInServer("1y"); + private String calcStartDate(String date, int period) { + Calendar c = DateUtils.convertStringDateToCalendar(date, DateUtils.DATE_FORMAT_DATE_TIME); + switch (period) { + case CHART_TYPE_DAY: + c.add(Calendar.DAY_OF_YEAR, -1); + break; + case CHART_TYPE_SEVEN: + c.add(Calendar.DAY_OF_YEAR, -7); + break; + case CHART_TYPE_YEAR: + c.add(Calendar.DAY_OF_YEAR, -365); + break; + default: + c.add(Calendar.DAY_OF_YEAR, -30); + break; + } + return DateUtils.formatDate(c.getTimeInMillis(), DateUtils.DATE_FORMAT_DATE_TIME); + } + + /** + * Request data in server of according with a period of time + * + * @param period The period of time: 1d, 1w, 1m or 1y + */ + protected void requestDataInServer(int period) { + String dateEnd = DateUtils.getCurrentDateTimeUTC(); // data atual + String dateStart = calcStartDate(dateEnd, period); + Log.w(TAG, "Data inicio: " + dateStart); + Log.w(TAG, "Data fim: " + dateEnd); + + if (ConnectionUtils.internetIsEnabled(this)) { + DisposableManager.add(haniotNetRepository. + getAllMeasurementsByType(patient.get_id(), getTypeMeasurement(), "timestamp", + dateStart, dateEnd, 1, 100) + .doOnSubscribe(disposable -> { + Log.w(TAG, "onBeforeSend()"); + mProgressBar.setVisibility(View.VISIBLE); + getChart().setVisibility(View.INVISIBLE); + }) + .subscribe(measurements -> { + Log.w(TAG, "onSuccess()"); + if (measurements != null) { + runOnUiThread(() -> { + onUpdateData(measurements, currentChartType); + createMoreInfo(measurements); + }); + } + }, error -> { + Log.w(TAG, "onError()"); + printMessage(getString(R.string.error_500)); + })); + } else { + runOnUiThread(() -> { + onUpdateData(new ArrayList<>(), currentChartType); + createMoreInfo(new ArrayList<>()); +// printMessage(getString(R.string.connect_network_try_again)); + }); } } @@ -301,72 +249,117 @@ protected void requestData(int type) { * @param message */ private void printMessage(String message) { - runOnUiThread(() -> { - Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); - }); + runOnUiThread(() -> Toast.makeText(this, message, Toast.LENGTH_LONG).show()); } public void createMoreInfo(List measurements) { - Log.d(TAG, "createMoreInfoOriginal"); ArrayList infoMeasurements = new ArrayList<>(); infoMeasurements.addAll(getInfosBase(measurements)); - GridView gridView = (GridView) findViewById(R.id.moreinfo_grid); + GridView gridView = findViewById(R.id.moreinfo_grid); InfoAdapter infoAdapter = new InfoAdapter(this, infoMeasurements); gridView.setAdapter(infoAdapter); } protected ArrayList getInfosBase(List measurements) { + InfoMeasurement max = new InfoMeasurement(getString(R.string.info_max), "-"); + InfoMeasurement min = new InfoMeasurement(getString(R.string.info_min), "-"); + InfoMeasurement avg = new InfoMeasurement(getString(R.string.info_avarage), "-"); + InfoMeasurement per = new InfoMeasurement(getString(R.string.info_period), " - "); - ArrayList infos = new ArrayList<>(); + if (measurements != null && !measurements.isEmpty()) { + String firstMeasurementDate, lastMeasurementDate, unit = " "; + double mMax = 0, mMin = 0, mAvg = 0.0; - if (measurements.isEmpty()) { - infos.add(new InfoMeasurement(getString(R.string.info_max), "-")); - infos.add(new InfoMeasurement(getString(R.string.info_min), "-")); - infos.add(new InfoMeasurement(getString(R.string.info_avarage), "-")); - infos.add(new InfoMeasurement(getString(R.string.info_period), " - ")); - } else { - double measurementValueMax = measurements.get(0).getValue(); - double measurementValueMin = measurements.get(0).getValue(); - double measurementValueAverage = 0.0; - - for (Measurement measurement : measurements) { - measurementValueAverage += measurement.getValue(); - if (measurementValueMax < measurement.getValue()) { - measurementValueMax = measurement.getValue(); + int systolicMax = 0, systolicMin = 0, diastolicMax = 0, diastolicMin = 0; + + String type = getTypeMeasurement(); + + if (MeasurementType.HEART_RATE.equals(type)) { + mMax = measurements.get(0).getDataset().get(0).getValue(); + mMin = measurements.get(0).getDataset().get(0).getValue(); + + for (Measurement measurement : measurements) { + double value = measurement.getDataset().get(0).getValue(); + mAvg += value; + + if (mMax < value) mMax = value; + if (mMin > value) mMin = value; } - if (measurementValueMin > measurement.getValue()) { - measurementValueMin = measurement.getValue(); + firstMeasurementDate = DateUtils.formatDate(measurements.get(0).getDataset().get(0).getTimestamp(), getString(R.string.date_format)); + lastMeasurementDate = DateUtils.formatDate(measurements.get(measurements.size() - 1).getDataset().get(0).getTimestamp(), getString(R.string.date_format)); + } else if (MeasurementType.BLOOD_PRESSURE.equals(type)) { + int mediaMax, mediaMin; + + systolicMax = measurements.get(0).getSystolic(); + systolicMin = measurements.get(0).getSystolic(); + diastolicMax = measurements.get(0).getDiastolic(); + diastolicMin = measurements.get(0).getDiastolic(); + + mediaMax = calcPressureAverage(measurements.get(0).getSystolic(), measurements.get(0).getDiastolic()); + mediaMin = calcPressureAverage(measurements.get(0).getSystolic(), measurements.get(0).getDiastolic()); + + for (Measurement m : measurements) { + int valor = calcPressureAverage(m.getSystolic(), m.getDiastolic()); + mAvg += valor; + + if (mediaMax < valor) { + mediaMax = valor; + systolicMax = m.getSystolic(); + diastolicMax = m.getDiastolic(); + } + if (mediaMin > valor) { + mediaMin = valor; + systolicMin = m.getSystolic(); + diastolicMin = m.getDiastolic(); + } } + firstMeasurementDate = DateUtils.formatDate(measurements.get(0).getTimestamp(), getString(R.string.date_format)); + lastMeasurementDate = DateUtils.formatDate(measurements.get(measurements.size() - 1).getTimestamp(), getString(R.string.date_format)); + } else { + mMax = measurements.get(0).getValue(); + mMin = measurements.get(0).getValue(); + + for (Measurement measurement : measurements) { + double value = measurement.getValue(); + mAvg += value; + if (mMax < value) mMax = value; + if (mMin > value) mMin = value; + } + firstMeasurementDate = DateUtils.formatDate(measurements.get(0).getTimestamp(), getString(R.string.date_format)); + lastMeasurementDate = DateUtils.formatDate(measurements.get(measurements.size() - 1).getTimestamp(), getString(R.string.date_format)); } - measurementValueAverage /= measurements.size(); - String unit = " " + measurements.get(0).getUnit(); - String firstMeasurement = DateUtils.formatDate(measurements.get(0).getTimestamp(), getString(R.string.date_format)); - String lastMeasurement = DateUtils.formatDate(measurements.get(measurements.size() - 1).getTimestamp(), getString(R.string.date_format)); -// - if (getTypeMeasurement() == MeasurementType.HEART_RATE -// || getTypeMeasurement() == MeasurementType.BLOOD_PRESSURE_DIASTOLIC -// || getTypeMeasurement() == MeasurementType.BLOOD_PRESSURE_SYSTOLIC - || getTypeMeasurement() == MeasurementType.BLOOD_GLUCOSE) { - infos.add(new InfoMeasurement(getString(R.string.info_max), (int) measurementValueMax + unit)); - infos.add(new InfoMeasurement(getString(R.string.info_min), (int) measurementValueMin + unit)); - infos.add(new InfoMeasurement(getString(R.string.info_avarage), (int) measurementValueAverage + unit)); + mAvg /= measurements.size(); + unit += measurements.get(0).getUnit(); + + if (type.equals(MeasurementType.HEART_RATE) || type.equals(MeasurementType.BLOOD_GLUCOSE)) { + max.setValue(((int) mMax) + unit); + min.setValue(((int) mMin) + unit); + avg.setValue(String.format("%.1f", mAvg) + unit); + } else if (type.equals(MeasurementType.BLOOD_PRESSURE)) { + max.setValue(systolicMax + "/" + diastolicMax + "\n" + unit); + min.setValue(systolicMin + "/" + diastolicMin + "\n" + unit); + avg.setValue(String.format("%.1f", mAvg)); } else { - infos.add(new InfoMeasurement(getString(R.string.info_max), (String.format("%.1f", measurementValueMax)) + unit)); - infos.add(new InfoMeasurement(getString(R.string.info_min), (String.format("%.1f", measurementValueMin)) + unit)); - infos.add(new InfoMeasurement(getString(R.string.info_avarage), (String.format("%.1f", measurementValueAverage)) + unit)); + max.setValue(String.format("%.1f", mMax) + unit); + min.setValue(String.format("%.1f", mMin) + unit); + avg.setValue(String.format("%.1f", mAvg) + unit); } - if (firstMeasurement.equals(lastMeasurement)) - infos.add(new InfoMeasurement(getString(R.string.info_period), firstMeasurement)); - else - infos.add(new InfoMeasurement(getString(R.string.info_period), firstMeasurement + "\n-\n" + lastMeasurement)); + per.setValue(firstMeasurementDate.equals(lastMeasurementDate) ? + firstMeasurementDate : firstMeasurementDate + "\n-\n" + lastMeasurementDate); } + ArrayList infos = new ArrayList<>(); + infos.add(max); + infos.add(min); + infos.add(avg); + infos.add(per); return infos; } - - abstract public void onUpdateData(List data, int currentChartType); + private int calcPressureAverage(int sis, int dia) { + return (sis + (dia * 2)) / 3; + } public class SpacesItemDecoration extends RecyclerView.ItemDecoration { private int space; @@ -390,6 +383,4 @@ public void getItemOffsets(Rect outRect, View view, } } } -} - - +} \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/base/CreateChart.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/base/CreateChart.java index bc4b9138..7c98c34d 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/base/CreateChart.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/charts/base/CreateChart.java @@ -70,6 +70,14 @@ public CreateChart(Params params, Chart mChart) { this.mChart = mChart; } + public Params getParams() { + return params; + } + + public Chart getmChart() { + return mChart; + } + /** * Configure and draw chart with List. * @@ -169,37 +177,38 @@ public IAxisValueFormatter prepareVariablesLineData() { final String[] quarters = new String[dataList.size()]; List measurements = (List) dataList; + String timestamp = null; - for (int i = 0; i < measurements.size(); i++) { - String date = DateUtils.formatDate( - measurements.get(i).getTimestamp(), params.formatDate); - entries.add(new Entry((float) i, (int) measurements.get(i).getValue())); + if (MeasurementType.HEART_RATE.equals(measurements.get(0).getType())) { -// if (!measurements.get(i).getDataset().isEmpty()) -// if (measurements.get(i).getDataset().get(0).getTypeId() == MeasurementType.BLOOD_PRESSURE_DIASTOLIC) -// entries2.add(new Entry(i, (float) measurements.get(i).getMeasurementList().get(0).getValue())); + for (int i = 0; i < measurements.size(); i++) { + timestamp = measurements.get(i).getDataset().get(0).getTimestamp(); + String date = DateUtils.formatDate(timestamp, params.formatDate); + entries.add(new Entry(i, measurements.get(i).getDataset().get(0).getValue())); + quarters[i] = date; + } + } else if (MeasurementType.BLOOD_PRESSURE.equals(measurements.get(0).getType())) { + + for (int i = 0; i < measurements.size(); i++) { + timestamp = measurements.get(i).getTimestamp(); + String date = DateUtils.formatDate(timestamp, params.formatDate); + entries.add(new Entry(i, measurements.get(i).getSystolic())); + entries2.add(new Entry(i, measurements.get(i).getDiastolic())); + quarters[i] = date; + } + } else { - quarters[i] = date; + for (int i = 0; i < measurements.size(); i++) { + timestamp = measurements.get(i).getTimestamp(); + String date = DateUtils.formatDate(timestamp, params.formatDate); + entries.add(new Entry(i, (int) measurements.get(i).getValue())); + quarters[i] = date; + } } -// for (int i = 0; i < data.size(); i++) { -// -// String date = DateUtils.formatDate( -// data.get(i).getRegistrationDate(), -// params.formatDate); -// -// entries.add(new Entry((float) i, (int) data.get(i).getValue())); -// -// if (!data.get(i).getMeasurementList().isEmpty()) -// if (data.get(i).getMeasurementList().get(0).getTypeId() == MeasurementType.BLOOD_PRESSURE_DIASTOLIC) -// entries2.add(new Entry(i, (float) data.get(i).getMeasurementList().get(0).getValue())); -// quarters[i] = date; -// } - //Format date IAxisValueFormatter formatter = ((value, axis) -> { if (value >= quarters.length || value < 0) return ""; return quarters[(int) value]; - }); return formatter; } @@ -315,7 +324,6 @@ public void configureDesignChart() { barChart.getAxisRight().setEnabled(false); barChart.getAxisLeft().setEnabled(false); barChart.setDrawValueAboveBar(false); - } //LineChart @@ -330,8 +338,8 @@ public void configureDesignChart() { set2.setDrawCircleHole(params.drawCirclesHoleEnabled); set2.setHighlightEnabled(params.highlightEnabled); set2.setHighLightColor(params.colorHighLight); - set2.setCircleColor(ContextCompat.getColor(context, R.color.colorOrange)); - set2.setCircleColorHole(ContextCompat.getColor(context, R.color.colorPrimary)); + set2.setCircleColor(ContextCompat.getColor(params.context, R.color.colorOrange)); + set2.setCircleColorHole(ContextCompat.getColor(params.context, R.color.colorPrimary)); set2.setValueTextColor(params.colorValuesText); set2.setCircleRadius(params.circleValueRadius); set2.setCircleHoleRadius(params.circleHoleValueRadius); @@ -340,7 +348,7 @@ public void configureDesignChart() { set2.setMode(params.typeLine); set2.setDrawFilled(params.filledLine); set2.setFillColor(params.lineFilledColor); - set2.setColor(ContextCompat.getColor(context, R.color.colorOrange)); + set2.setColor(ContextCompat.getColor(params.context, R.color.colorOrange)); } LineChart mLineChart = (LineChart) mChart; @@ -367,7 +375,6 @@ public void configureDesignChart() { mLineChart.getAxisRight().setAxisMinimum(4f); mLineChart.getAxisRight().setAxisMaximum(3f); - //Set Proprietes set.setColor(params.lineColor); set.setValueTextColor(params.colorValuesText); @@ -394,8 +401,8 @@ public void configureDesignChart() { leftAxis.removeAllLimitLines(); for (Limit limit : params.limits) { LimitLine ll1 = new LimitLine(limit.getValue(), limit.getName()); - ll1.setLineWidth(1.4f); - ll1.enableDashedLine(3f, 10f, 1f); + ll1.setLineWidth(1.5f); + ll1.enableDashedLine(15f, 5f, 0f); ll1.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_TOP); ll1.setTextSize(10f); ll1.setTextColor(Color.WHITE); @@ -403,15 +410,12 @@ public void configureDesignChart() { leftAxis.addLimitLine(ll1); } - //RangeY if (params.YMin > -1 && params.YMax > params.YMin) { leftAxis.setAxisMinValue(params.YMin); leftAxis.setAxisMaxValue(params.YMax); } } - - //General mChart.setNoDataTextColor(Color.WHITE); mChart.setBackgroundColor(params.colorBackground); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/settings/MainPreferenceFragment.java b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/settings/MainPreferenceFragment.java index ac1daa3e..887c5c29 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/activity/settings/MainPreferenceFragment.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/activity/settings/MainPreferenceFragment.java @@ -11,11 +11,13 @@ import android.widget.Toast; import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.activity.UserRegisterActivity; import br.edu.uepb.nutes.haniot.activity.PilotStudyActivity; +import br.edu.uepb.nutes.haniot.activity.account.ChangePasswordActivity; import br.edu.uepb.nutes.haniot.activity.account.LoginActivity; -import br.edu.uepb.nutes.haniot.activity.account.UpdateDataActivity; -import br.edu.uepb.nutes.haniot.data.model.dao.PilotStudyDAO; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; import br.edu.uepb.nutes.haniot.devices.register.DeviceManagerActivity; /** @@ -27,6 +29,7 @@ public class MainPreferenceFragment extends PreferenceFragment { public static final String FORM_UPDATE = "form_update"; private AppPreferencesHelper appPreferences; + private HaniotNetRepository haniotNetRepository; @Override public void onCreate(final Bundle savedInstanceState) { @@ -35,7 +38,7 @@ public void onCreate(final Bundle savedInstanceState) { addPreferencesFromResource(R.xml.preferences); appPreferences = AppPreferencesHelper.getInstance(getActivity().getApplicationContext()); - + haniotNetRepository = HaniotNetRepository.getInstance(getActivity().getApplicationContext()); // Send feedback Preference prefSendFeedback = findPreference(getString(R.string.key_send_bug)); prefSendFeedback.setOnPreferenceClickListener(preference -> { @@ -70,8 +73,18 @@ public void onCreate(final Bundle savedInstanceState) { // Your data Preference prefYourData = findPreference(getString(R.string.key_your_data)); prefYourData.setOnPreferenceClickListener(preference -> { - Intent intent = new Intent(getActivity(), UpdateDataActivity.class); - intent.putExtra(FORM_UPDATE, true); + Intent intent = new Intent(getActivity(), UserRegisterActivity.class); + intent.putExtra("editUser", true); + intent.putExtra("action", true); + + getActivity().startActivity(intent); + return true; + }); + + // Your password + Preference prefYourPassword = findPreference(getString(R.string.key_your_password)); + prefYourPassword.setOnPreferenceClickListener(preference -> { + Intent intent = new Intent(getActivity(), ChangePasswordActivity.class); getActivity().startActivity(intent); return true; @@ -91,9 +104,38 @@ public void onCreate(final Bundle savedInstanceState) { return true; }); + // Manager Pilot Study + Preference prefDeleteAccount = findPreference(getString(R.string.key_delete_account)); + prefDeleteAccount.setOnPreferenceClickListener(preference -> { + // Dialog - confirm delete account. + new AlertDialog + .Builder(getActivity()) + .setMessage(R.string.confirm_delete_account) + .setPositiveButton(R.string.bt_ok, (dialog, which) -> { + // Remove user from server and redirect to login screen + DisposableManager.add(haniotNetRepository + .deleteUserById(appPreferences.getUserLogged().get_id()).subscribe(() -> { + if (appPreferences.removeUserLogged()) { + Intent intent = new Intent(getActivity(), LoginActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + getActivity().startActivity(intent); + getActivity().finish(); + } + }, throwable -> { + Toast.makeText(getActivity(), R.string.error_sign_out, Toast.LENGTH_SHORT).show(); + })); + } + ) + .setNegativeButton(R.string.bt_cancel, null) + .show(); + return true; + }); + // Manager Pilot Study Preference prefMeasurements = findPreference(getString(R.string.key_monitor_measurements)); - prefMeasurements.setOnPreferenceClickListener(preference -> { + prefMeasurements.setOnPreferenceClickListener(preference -> + + { Intent intent = new Intent(getActivity(), SettingsActivity.class); intent.putExtra(SettingsActivity.SETTINGS_TYPE, SettingsActivity.SETTINGS_MEASUREMENTS); getActivity().startActivity(intent); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/BloodPressureAdapter.java b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/BloodPressureAdapter.java index 9226ed6a..49cb535f 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/BloodPressureAdapter.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/BloodPressureAdapter.java @@ -51,7 +51,7 @@ public void showData(RecyclerView.ViewHolder holder, int position, List extends ExpandableRecyclerViewAdapter { + + public CustomExpandableRecyclerViewAdapter(List groups) { + super(groups); + } + + public void notifyGroupDataChanged() { + expandableList.expandedGroupIndexes = new boolean[getGroups().size()]; + for (int i = 0; i < getGroups().size(); i++) { + expandableList.expandedGroupIndexes[i] = false; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/DeviceAdapter.java b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/DeviceAdapter.java index 9098cb21..191f4ab0 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/DeviceAdapter.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/DeviceAdapter.java @@ -3,6 +3,7 @@ import android.content.Context; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -67,6 +68,7 @@ public void showData(RecyclerView.ViewHolder holder, int position, List public void onClick(View v) { if (DeviceAdapter.super.mListener != null) DeviceAdapter.super.mListener.onItemClick(device); + Log.w("AAA", "Cliquei"); } }); } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/EvaluationAdapter.java b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/EvaluationAdapter.java index ee869650..f6720b1b 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/EvaluationAdapter.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/EvaluationAdapter.java @@ -2,12 +2,13 @@ import android.app.Activity; import android.content.Context; +import android.text.Html; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.ScaleAnimation; -import android.widget.CheckBox; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; @@ -26,6 +27,7 @@ import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.data.model.ChronicDisease; import br.edu.uepb.nutes.haniot.data.model.ChronicDiseaseType; +import br.edu.uepb.nutes.haniot.data.model.FamilyCohesionRecord; import br.edu.uepb.nutes.haniot.data.model.FeedingHabitsRecord; import br.edu.uepb.nutes.haniot.data.model.FeendingHabitsRecordType; import br.edu.uepb.nutes.haniot.data.model.FoodType; @@ -34,9 +36,15 @@ import br.edu.uepb.nutes.haniot.data.model.ItemEvaluation; import br.edu.uepb.nutes.haniot.data.model.Measurement; import br.edu.uepb.nutes.haniot.data.model.MedicalRecord; +import br.edu.uepb.nutes.haniot.data.model.OralHealthRecord; import br.edu.uepb.nutes.haniot.data.model.PhysicalActivityHabit; import br.edu.uepb.nutes.haniot.data.model.SchoolActivityFrequencyType; import br.edu.uepb.nutes.haniot.data.model.SleepHabit; +import br.edu.uepb.nutes.haniot.data.model.SociodemographicRecord; +import br.edu.uepb.nutes.haniot.data.model.SociodemographicType; +import br.edu.uepb.nutes.haniot.data.model.SportsType; +import br.edu.uepb.nutes.haniot.data.model.ToothLesion; +import br.edu.uepb.nutes.haniot.data.model.ToothLesionType; import br.edu.uepb.nutes.haniot.data.model.TypeEvaluation; import br.edu.uepb.nutes.haniot.data.model.WeeklyFoodRecord; import br.edu.uepb.nutes.haniot.utils.DateUtils; @@ -44,10 +52,13 @@ import butterknife.ButterKnife; import static android.view.View.GONE; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FAMILY_COHESION; import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FEEDING_HABITS; import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.MEDICAL_RECORDS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.ORAL_HEALTH; import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.PHYSICAL_ACTIVITY; import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.SLEEP_HABITS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.SOCIODEMOGRAPHICS; public class EvaluationAdapter extends ExpandableRecyclerViewAdapter { @@ -142,7 +153,6 @@ public void onBindChildViewHolder(ViewHolder h, int flatPosition, ExpandableGrou * @param ig */ private void resetView(ViewHolder h, ItemEvaluation ig) { - h.checkItem.setChecked(ig.isChecked()); h.texTime.setVisibility(View.VISIBLE); h.timeIcon.setVisibility(View.VISIBLE); h.itemQuizView.setVisibility(GONE); @@ -150,7 +160,6 @@ private void resetView(ViewHolder h, ItemEvaluation ig) { h.boxMeasurement.setVisibility(View.VISIBLE); h.textMeasurement.setVisibility(View.VISIBLE); h.textMeasurementType.setVisibility(View.VISIBLE); - h.checkItem.setVisibility(View.VISIBLE); h.messageText.setVisibility(View.VISIBLE); h.warning.setVisibility(View.INVISIBLE); h.loading.setVisibility(View.GONE); @@ -177,12 +186,6 @@ private void createErrorView(ViewHolder h, ItemEvaluation ig) { h.messageText.setText(context.getResources().getString(R.string.evaluation_error_message)); h.boxOthersInfo.setVisibility(GONE); h.boxMeasurement.setVisibility(GONE); - h.checkItem.setVisibility(View.INVISIBLE); -// h.mView.setOnClickListener(v -> { -// if (mListener != null) { -// mListener.onRefreshClick(ig.getTitle(), ig.getTypeEvaluation()); -// } -// }); } private void createEmptyView(ViewHolder h, ItemEvaluation ig) { @@ -195,7 +198,6 @@ private void createEmptyView(ViewHolder h, ItemEvaluation ig) { h.messageText.setText(context.getResources().getString(R.string.evaluation_empty_message)); h.boxOthersInfo.setVisibility(GONE); h.boxMeasurement.setVisibility(GONE); - h.checkItem.setVisibility(View.INVISIBLE); } /** @@ -205,11 +207,10 @@ private void createEmptyView(ViewHolder h, ItemEvaluation ig) { * @param ig */ private void createMeasurementView(ViewHolder h, ItemEvaluation ig) { - h.checkItem.setChecked(ig.isChecked()); h.mView.setOnClickListener(v -> { - ig.setChecked(!ig.isChecked()); - h.checkItem.setChecked(!h.checkItem.isChecked()); - mListener.onSelectClick(ig, ig.isChecked()); + if (mListener != null) { + mListener.onAddItemClick(ig.getTitle(), ig.getTypeEvaluation()); + } }); h.textMeasurement.setVisibility(View.VISIBLE); @@ -253,6 +254,7 @@ private void createMeasurementView(ViewHolder h, ItemEvaluation ig) { .convertDateTimeUTCToLocale(min.getTimestamp(), context.getString(R.string.date_format))); } else { + Log.w("AAA", "Errorrrrr " + measurement); h.textDate.setText(DateUtils .convertDateTimeUTCToLocale(measurement.getTimestamp(), context.getString(R.string.date_format))); @@ -274,6 +276,11 @@ private void createMeasurementView(ViewHolder h, ItemEvaluation ig) { h.messageText.setVisibility(View.GONE); } + private String getString(int id) { + String string = context.getResources().getString(id); + return string; + } + /** * View responsible for displaying questionnaire data. * @@ -288,18 +295,6 @@ private void createQuizView(ViewHolder h, ItemEvaluation ig, ExpandableGroup gro h.messageText.setVisibility(View.VISIBLE); h.boxOthersInfo.setVisibility(GONE); h.boxMeasurement.setVisibility(GONE); - h.checkItem.setChecked(ig.isChecked()); - - h.mView.setOnClickListener(v -> { - for (ItemEvaluation itemEvaluation : (List) group.getItems()) { - itemEvaluation.setChecked(false); - } - notifyDataSetChanged(); - - ig.setChecked(!ig.isChecked()); - h.checkItem.setChecked(!h.checkItem.isChecked()); - mListener.onSelectClick(ig, ig.isChecked()); - }); StringBuilder stringBuilder = new StringBuilder(); String date = ""; @@ -308,67 +303,122 @@ private void createQuizView(ViewHolder h, ItemEvaluation ig, ExpandableGroup gro switch (ig.getTypeEvaluation()) { case SLEEP_HABITS: SleepHabit sleepHabit = ig.getSleepHabit(); - date = DateUtils.convertDateTimeUTCToLocale(sleepHabit.getCreatedAt(), - context.getString(R.string.date_format)); - time = DateUtils.convertDateTimeUTCToLocale(sleepHabit.getCreatedAt(), - context.getString(R.string.time_format_simple)); - stringBuilder.append("\nDorme às ").append(sleepHabit.getWeekDaySleep()) - .append(" horas"); - stringBuilder.append("\nAcorda às ").append(sleepHabit.getWeekDayWakeUp()) - .append(" horas"); + stringBuilder.append("

" + getString(R.string.sleep_at) + "

").append(sleepHabit.getWeekDaySleep()) + .append(getString(R.string.hours)); + stringBuilder.append("

" + getString(R.string.wakeup_at) + "

").append(sleepHabit.getWeekDayWakeUp()) + .append(getString(R.string.hours)); break; case MEDICAL_RECORDS: MedicalRecord medicalRecord = ig.getMedicalRecord(); if (medicalRecord == null) return; - date = DateUtils.convertDateTimeUTCToLocale(medicalRecord.getCreatedAt(), - context.getString(R.string.date_format)); - time = DateUtils.convertDateTimeUTCToLocale(medicalRecord.getCreatedAt(), - context.getString(R.string.time_format_simple)); if (medicalRecord.getChronicDiseases() != null) { for (ChronicDisease chronicDisease : medicalRecord.getChronicDiseases()) stringBuilder - .append(ChronicDiseaseType.ChronicDisease + .append("

" + ChronicDiseaseType.ChronicDisease .getString_PTBR(chronicDisease.getType())) - .append(": ") + .append("

") .append(ChronicDiseaseType.DisieaseHistory - .getStringPTBR(chronicDisease.getDiseaseHistory())) - .append("\n"); + .getStringPTBR(chronicDisease.getDiseaseHistory())); } break; case FEEDING_HABITS: FeedingHabitsRecord feedingHabitsRecord = ig.getFeedingHabitsRecord(); - date = DateUtils.convertDateTimeUTCToLocale(feedingHabitsRecord.getCreatedAt(), - context.getString(R.string.date_format)); - time = DateUtils.convertDateTimeUTCToLocale(feedingHabitsRecord.getCreatedAt(), - context.getString(R.string.time_format_simple)); - stringBuilder.append("\nCopos de água por dia: ").append(FrequencyAnswersType.Frequency + stringBuilder.append("

" + getString(R.string.water_cup) + "

").append(FeendingHabitsRecordType.OneDayFeedingAmount .getStringPTBR(feedingHabitsRecord.getDailyWaterGlasses())); - stringBuilder.append("\nCafé da manhã: ").append(FrequencyAnswersType.Frequency + stringBuilder.append("

" + getString(R.string.breakfast) + "

").append(FeendingHabitsRecordType.OneDayFeedingAmount .getStringPTBR(feedingHabitsRecord.getBreakfastDailyFrequency())); for (WeeklyFoodRecord weeklyFoodRecord : feedingHabitsRecord.getWeeklyFeedingHabits()) stringBuilder - .append("\n") - .append(FoodType.getStringPTBR(weeklyFoodRecord.getFood())) - .append(": ") + .append("

" + FoodType.getStringPTBR(weeklyFoodRecord.getFood())) + .append("

") .append(FeendingHabitsRecordType.SevenDaysFeedingFrequency .getStringPTBR(weeklyFoodRecord.getSevenDaysFreq())); break; case PHYSICAL_ACTIVITY: PhysicalActivityHabit physicalActivityHabit = ig.getPhysicalActivityHabit(); - date = DateUtils.convertDateTimeUTCToLocale(physicalActivityHabit.getCreatedAt(), - context.getString(R.string.date_format)); - time = DateUtils.convertDateTimeUTCToLocale(physicalActivityHabit.getCreatedAt(), - context.getString(R.string.time_format_simple)); - stringBuilder.append("\nEsportes praticados durante a semana: \n"); + stringBuilder.append("

" + getString(R.string.sports_in_week) + "

"); for (String sport : physicalActivityHabit.getWeeklyActivities()) { - stringBuilder.append(sport).append("\n"); + stringBuilder.append("

" + SportsType.getStringPtBr(context, sport) + "

"); } - stringBuilder.append("\nFrequência de atividades físicas na escola: \n") + stringBuilder.append("

" + getString(R.string.physical_school) + "

") .append(SchoolActivityFrequencyType .getStringPTBR(physicalActivityHabit.getSchoolActivityFreq())); break; + case FAMILY_COHESION: + FamilyCohesionRecord familyCohesionRecord = ig.getFamilyCohesionRecord(); + stringBuilder.append("

" + getString(R.string.help_family) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFamilyDecisionSupportFreq())) + .append("

" + getString(R.string.approval_friends) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFriendshipApprovalFreq())) + .append("

" + getString(R.string.only_family) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFamilyOnlyPreferenceFreq())) + .append("

" + getString(R.string.not_strangers) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFamilyMutualAidFreq())) + .append("

" + getString(R.string.family_freetime) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFreeTimeTogetherFreq())) + .append("

" + getString(R.string.family_union) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFamilyProximityPerceptionFreq())) + .append("

" + getString(R.string.family_share) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getAllFamilyTasksFreq())) + .append("

" + getString(R.string.easy_family) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFamilyTasksOpportunityFreq())) + .append("

" + getString(R.string.family_decision) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFamilyDecisionSupportFreq())) + .append("

" + getString(R.string.familiy_union_important) + "

") + .append(FrequencyAnswersType.Frequency.getStringPTBR(familyCohesionRecord.getFamilyUnionRelevanceFreq())); + break; + case ORAL_HEALTH: + OralHealthRecord oralHealthRecord = ig.getOralHealthRecord(); + stringBuilder.append("

" + getString(R.string.tooth_higien) + "

") + .append(ToothLesionType.TeethBrushingFreq.getStringPtBr(oralHealthRecord.getTeethBrushingFreq())); + if (ig.getOralHealthRecord() == null) break; + + List toothLesions = oralHealthRecord.getToothLesions(); + ToothLesion whiteSpotLesionDeciduousTooth = new ToothLesion("deciduous_tooth", "white_spot_lesion"); + ToothLesion whiteSpotLesionPermanentTooth = new ToothLesion("permanent_tooth", "white_spot_lesion"); + ToothLesion cavitatedLesionDeciduousTooth = new ToothLesion("deciduous_tooth", "cavitated_lesion"); + ToothLesion cavitatedLesionPermanentTooth = new ToothLesion("permanent_tooth", "cavitated_lesion"); + + stringBuilder.append("

" + getString(R.string.white_spot_lesion_deciduous_tooth) + "

"); + if (toothLesions.contains(whiteSpotLesionDeciduousTooth)) + stringBuilder.append(getString(R.string.yes_text) + "

"); + else stringBuilder.append(getString(R.string.no_text) + "

"); + + stringBuilder.append("

" + getString(R.string.white_spot_lesion_permanent_tooth) + "

"); + if (toothLesions.contains(whiteSpotLesionPermanentTooth)) + stringBuilder.append(getString(R.string.yes_text) + "

"); + else stringBuilder.append(getString(R.string.no_text) + "

"); + + stringBuilder.append("

" + getString(R.string.cavitated_lesion_deciduous_tooth) + "

"); + if (toothLesions.contains(cavitatedLesionDeciduousTooth)) + stringBuilder.append(getString(R.string.yes_text) + "

"); + else stringBuilder.append(getString(R.string.no_text) + "

"); + + stringBuilder.append("

" + getString(R.string.cavitated_lesion_permanent_tooth) + "

"); + if (toothLesions.contains(cavitatedLesionPermanentTooth)) + stringBuilder.append(getString(R.string.yes_text) + "

"); + else stringBuilder.append(getString(R.string.no_text) + "

"); +// +// if (oralHealthRecord.getToothLesions().isEmpty()) { +// stringBuilder.append("

" + "Não possui algum tipo de cárie dentária" + "

"); +// } else +// for (ToothLesion toothLesion : oralHealthRecord.getToothLesions()) { +// stringBuilder.append("

" + ToothLesionType.LesionType.getStringPtBr(toothLesion.getLesionType())) +// .append(" em ") +// .append(ToothLesionType.ToothType.getStringPtbr(toothLesion.getToothType()) + "

"); +// } + break; + case SOCIODEMOGRAPHICS: + SociodemographicRecord sociodemographicRecord = ig.getSociodemographicRecord(); + stringBuilder.append("

" + getString(R.string.color_race) + "

") + .append(SociodemographicType.ColorRace.getStringPtBr(sociodemographicRecord.getColorRace())) + .append("

" + getString(R.string.schoolarity_mother) + "

") + .append(SociodemographicType.MotherScholarity.getStringPtBr(sociodemographicRecord.getMotherScholarity())) + .append("

" + getString(R.string.people_in_home) + "

") + .append(sociodemographicRecord.getPeopleInHome()); + break; } - h.messageText.setText(stringBuilder.append(String.format("\n\nRespondido em %s às %s", date, time))); + h.messageText.setText(Html.fromHtml(stringBuilder.toString())); } /** @@ -382,7 +432,6 @@ private void createLoadingView(ViewHolder h, ItemEvaluation ig) { h.boxOthersInfo.setVisibility(GONE); h.boxMeasurement.setVisibility(GONE); h.messageText.setVisibility(GONE); - h.checkItem.setVisibility(GONE); } @Override @@ -416,8 +465,6 @@ public class ViewHolder extends ChildViewHolder { TextView messageText; @BindView(R.id.text_date_measurement) TextView textDate; - @BindView(R.id.check_item) - CheckBox checkItem; @BindView(R.id.box_other_info) LinearLayout boxOthersInfo; @BindView(R.id.box_measurement) @@ -479,10 +526,6 @@ public void clearAnimation() { } public interface OnClick { - void onAddItemClick(String name, int type); - - void onSelectClick(ItemEvaluation itemEvaluation, boolean selected); - } } \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/HistoricQuizAdapter.java b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/HistoricQuizAdapter.java new file mode 100644 index 00000000..5f02af44 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/HistoricQuizAdapter.java @@ -0,0 +1,416 @@ +package br.edu.uepb.nutes.haniot.adapter; + +import android.app.Activity; +import android.content.Context; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.ScaleAnimation; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.thoughtbot.expandablerecyclerview.models.ExpandableGroup; +import com.thoughtbot.expandablerecyclerview.viewholders.ChildViewHolder; +import com.thoughtbot.expandablerecyclerview.viewholders.GroupViewHolder; + +import java.util.Collection; +import java.util.List; + +import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.data.model.ChronicDisease; +import br.edu.uepb.nutes.haniot.data.model.ChronicDiseaseType; +import br.edu.uepb.nutes.haniot.data.model.FamilyCohesionRecord; +import br.edu.uepb.nutes.haniot.data.model.FeedingHabitsRecord; +import br.edu.uepb.nutes.haniot.data.model.FeendingHabitsRecordType; +import br.edu.uepb.nutes.haniot.data.model.FoodType; +import br.edu.uepb.nutes.haniot.data.model.FrequencyAnswersType; +import br.edu.uepb.nutes.haniot.data.model.GroupItemEvaluation; +import br.edu.uepb.nutes.haniot.data.model.ItemEvaluation; +import br.edu.uepb.nutes.haniot.data.model.MedicalRecord; +import br.edu.uepb.nutes.haniot.data.model.OralHealthRecord; +import br.edu.uepb.nutes.haniot.data.model.PhysicalActivityHabit; +import br.edu.uepb.nutes.haniot.data.model.SchoolActivityFrequencyType; +import br.edu.uepb.nutes.haniot.data.model.SleepHabit; +import br.edu.uepb.nutes.haniot.data.model.SociodemographicRecord; +import br.edu.uepb.nutes.haniot.data.model.SociodemographicType; +import br.edu.uepb.nutes.haniot.data.model.SportsType; +import br.edu.uepb.nutes.haniot.data.model.ToothLesion; +import br.edu.uepb.nutes.haniot.data.model.ToothLesionType; +import br.edu.uepb.nutes.haniot.data.model.WeeklyFoodRecord; +import butterknife.BindView; +import butterknife.ButterKnife; + +import static android.view.View.GONE; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FAMILY_COHESION; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.FEEDING_HABITS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.MEDICAL_RECORDS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.ORAL_HEALTH; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.PHYSICAL_ACTIVITY; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.SLEEP_HABITS; +import static br.edu.uepb.nutes.haniot.data.model.TypeEvaluation.SOCIODEMOGRAPHICS; + +public class HistoricQuizAdapter extends CustomExpandableRecyclerViewAdapter { + private Context context; + private int lastPosition = -1; + public OnClick mListener; + + public HistoricQuizAdapter(List groups, Context context) { + super(groups); + this.context = context; + } + + public void addAll(List groups) { + getGroups().addAll((Collection) groups); + notifyGroupDataChanged(); + notifyDataSetChanged(); + } + + public void setListener(OnClick mListener) { + this.mListener = mListener; + } + + /** + * Expand all groups. + */ + public void expandAll() { + for (int i = 0; i < getItemCount(); i++) { + if (!isGroupExpanded(i)) { + toggleGroup(i); + } + } + } + + /** + * Apply animation to list itemsList. + * + * @param view {@link View} + * @param position int + */ + public void setAnimation(View view, int position) { + // If the bound view wasn't previously displayed on screen, it's animated + if (position > lastPosition) { + ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f); + + anim.setDuration(400); + view.startAnimation(anim); + lastPosition = position; + } + } + + @Override + public HeaderViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) { + LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); + View itemView = mInflater.inflate(R.layout.item_evaluation_section, parent, false); + + return new HeaderViewHolder(itemView); + } + + @Override + public ViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) { + LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); + View itemView = mInflater.inflate(R.layout.item_quiz, parent, false); + return new ViewHolder(itemView); + } + + @Override + public void onBindChildViewHolder(ViewHolder h, int flatPosition, ExpandableGroup group, int childIndex) { + ItemEvaluation ig = (ItemEvaluation) group.getItems().get(childIndex); + resetView(h, ig); + + if (ig.getTypeHeader() == ItemEvaluation.TYPE_LOADING) { + createLoadingView(h, ig); + } else if (ig.getTypeHeader() == ItemEvaluation.TYPE_QUIZ) { + createQuizView(h, ig, group); + } else if (ig.getTypeHeader() == ItemEvaluation.TYPE_EMPTY) { + createEmptyView(h, ig); + } else if (ig.getTypeHeader() == ItemEvaluation.TYPE_ERROR) { + createErrorView(h, ig); + } + + setAnimation(h.mView, childIndex); + } + + /** + * Restore view to default. + * + * @param h {@link ViewHolder} + * @param ig {@link ItemEvaluation} + */ + private void resetView(ViewHolder h, ItemEvaluation ig) { + h.checkItem.setVisibility(View.VISIBLE); + h.messageText.setVisibility(View.VISIBLE); + h.loading.setVisibility(View.GONE); + h.imageItem.setImageResource(ig.getIcon()); + h.textDescription.setText(ig.getTitle()); + } + + /** + * View displayed when there is no data. + * + * @param h {@link ViewHolder} + * @param ig {@link ItemEvaluation} + */ + private void createErrorView(ViewHolder h, ItemEvaluation ig) { + h.messageText.setVisibility(View.VISIBLE); + h.messageText.setText(context.getResources().getString(R.string.evaluation_error_message)); + h.checkItem.setVisibility(View.INVISIBLE); + } + + private void createEmptyView(ViewHolder h, ItemEvaluation ig) { + h.messageText.setVisibility(View.VISIBLE); + h.messageText.setText(context.getResources().getString(R.string.evaluation_empty_message)); + h.checkItem.setVisibility(View.INVISIBLE); + } + + private String getString(int id) { + String string = context.getResources().getString(id); + return string; + } + + /** + * View responsible for displaying questionnaire data. + * + * @param h {@link ViewHolder} + * @param ig {@link ItemEvaluation} + * @param group {@link ExpandableGroup} + */ + private void createQuizView(ViewHolder h, ItemEvaluation ig, ExpandableGroup group) { + h.messageText.setVisibility(View.VISIBLE); + + h.checkItem.setOnClickListener(v -> { + mListener.onAddItemClick(ig.getTitle(), ig.getTypeEvaluation(), ((GroupItemEvaluation) group).getIdGroup()); + }); + StringBuilder stringBuilder = new StringBuilder(); + + switch (ig.getTypeEvaluation()) { + case SLEEP_HABITS: { + SleepHabit sleepHabit = ig.getSleepHabit(); + stringBuilder.append("

") + .append(getString(R.string.sleep_at)).append("

") + .append(sleepHabit.getWeekDaySleep()) + .append(getString(R.string.hours)); + stringBuilder.append("

") + .append(getString(R.string.wakeup_at)) + .append("

") + .append(sleepHabit.getWeekDayWakeUp()) + .append(getString(R.string.hours)); + break; + } + case MEDICAL_RECORDS: { + MedicalRecord medicalRecord = ig.getMedicalRecord(); + if (medicalRecord == null) return; + if (medicalRecord.getChronicDiseases() != null) { + for (ChronicDisease chronicDisease : medicalRecord.getChronicDiseases()) + stringBuilder.append("

").append(ChronicDiseaseType.ChronicDisease + .getString_PTBR(chronicDisease.getType())) + .append("

") + .append(ChronicDiseaseType.DisieaseHistory + .getStringPTBR(chronicDisease.getDiseaseHistory())); + } + break; + } + case FEEDING_HABITS: { + FeedingHabitsRecord feedingHabitsRecord = ig.getFeedingHabitsRecord(); + stringBuilder.append("

").append(getString(R.string.water_cup)).append("

") + .append(FeendingHabitsRecordType.OneDayFeedingAmount + .getStringPTBR(feedingHabitsRecord.getDailyWaterGlasses())); + stringBuilder.append("

").append(getString(R.string.breakfast)).append("

") + .append(FeendingHabitsRecordType.OneDayFeedingAmount + .getStringPTBR(feedingHabitsRecord.getBreakfastDailyFrequency())); + for (WeeklyFoodRecord weeklyFoodRecord : feedingHabitsRecord.getWeeklyFeedingHabits()) + stringBuilder.append("

").append(FoodType.getStringPTBR(weeklyFoodRecord.getFood())) + .append("

") + .append(FeendingHabitsRecordType.SevenDaysFeedingFrequency + .getStringPTBR(weeklyFoodRecord.getSevenDaysFreq())); + break; + } + case PHYSICAL_ACTIVITY: { + PhysicalActivityHabit physicalActivityHabit = ig.getPhysicalActivityHabit(); + stringBuilder.append("

").append(getString(R.string.sports_in_week)).append("

"); + for (String sport : physicalActivityHabit.getWeeklyActivities()) { + stringBuilder.append("

").append(SportsType.getStringPtBr(context, sport)).append("

"); + } + stringBuilder.append("

").append(getString(R.string.physical_school)).append("

") + .append(SchoolActivityFrequencyType + .getStringPTBR(physicalActivityHabit.getSchoolActivityFreq())); + break; + } + case FAMILY_COHESION: { + FamilyCohesionRecord familyCohesionRecord = ig.getFamilyCohesionRecord(); + stringBuilder.append("

").append(getString(R.string.help_family)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFamilyDecisionSupportFreq())) + .append("

").append(getString(R.string.approval_friends)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFriendshipApprovalFreq())) + .append("

").append(getString(R.string.only_family)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFamilyOnlyPreferenceFreq())) + .append("

").append(getString(R.string.not_strangers)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFamilyMutualAidFreq())) + .append("

").append(getString(R.string.family_freetime)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFreeTimeTogetherFreq())) + .append("

").append(getString(R.string.family_union)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFamilyProximityPerceptionFreq())) + .append("

").append(getString(R.string.family_share)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getAllFamilyTasksFreq())) + .append("

").append(getString(R.string.easy_family)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFamilyTasksOpportunityFreq())) + .append("

").append(getString(R.string.family_decision)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFamilyDecisionSupportFreq())).append("

") + .append(getString(R.string.familiy_union_important)).append("

") + .append(FrequencyAnswersType.Frequency + .getStringPTBR(familyCohesionRecord.getFamilyUnionRelevanceFreq())); + break; + } + case ORAL_HEALTH: { + OralHealthRecord oralHealthRecord = ig.getOralHealthRecord(); + if (ig.getOralHealthRecord() == null) break; + stringBuilder.append("

").append(getString(R.string.tooth_higien)).append("

") + .append(ToothLesionType.TeethBrushingFreq + .getStringPtBr(oralHealthRecord.getTeethBrushingFreq())); + + List toothLesions = oralHealthRecord.getToothLesions(); + ToothLesion whiteSpotLesionDeciduousTooth = new ToothLesion("deciduous_tooth", "white_spot_lesion"); + ToothLesion whiteSpotLesionPermanentTooth = new ToothLesion("permanent_tooth", "white_spot_lesion"); + ToothLesion cavitatedLesionDeciduousTooth = new ToothLesion("deciduous_tooth", "cavitated_lesion"); + ToothLesion cavitatedLesionPermanentTooth = new ToothLesion("permanent_tooth", "cavitated_lesion"); + + stringBuilder.append("

").append(getString(R.string.white_spot_lesion_deciduous_tooth)).append("

"); + if (toothLesions != null && toothLesions.contains(whiteSpotLesionDeciduousTooth)) + stringBuilder.append(getString(R.string.yes_text)).append("

"); + else stringBuilder.append(getString(R.string.no_text)).append("

"); + + stringBuilder.append("

").append(getString(R.string.white_spot_lesion_permanent_tooth)).append("

"); + if (toothLesions != null && toothLesions.contains(whiteSpotLesionPermanentTooth)) + stringBuilder.append(getString(R.string.yes_text)).append("

"); + else stringBuilder.append(getString(R.string.no_text)).append("

"); + + stringBuilder.append("

").append(getString(R.string.cavitated_lesion_deciduous_tooth)).append("

"); + if (toothLesions != null && toothLesions.contains(cavitatedLesionDeciduousTooth)) + stringBuilder.append(getString(R.string.yes_text)).append("

"); + else stringBuilder.append(getString(R.string.no_text)).append("

"); + + stringBuilder.append("

").append(getString(R.string.cavitated_lesion_permanent_tooth)).append("

"); + if (toothLesions != null && toothLesions.contains(cavitatedLesionPermanentTooth)) + stringBuilder.append(getString(R.string.yes_text)).append("

"); + else stringBuilder.append(getString(R.string.no_text)).append("

"); + break; + } + case SOCIODEMOGRAPHICS: { + SociodemographicRecord sociodemographicRecord = ig.getSociodemographicRecord(); + stringBuilder.append("

").append(getString(R.string.color_race)).append("

") + .append(SociodemographicType.ColorRace + .getStringPtBr(sociodemographicRecord.getColorRace())) + .append("

").append(getString(R.string.schoolarity_mother)).append("

") + .append(SociodemographicType.MotherScholarity + .getStringPtBr(sociodemographicRecord.getMotherScholarity())) + .append("

").append(getString(R.string.people_in_home)).append("

") + .append(sociodemographicRecord.getPeopleInHome()); + break; + } + default: + break; + } + h.messageText.setText(Html.fromHtml(stringBuilder.toString())); + } + + /** + * View displayed while downloading the data. + * + * @param h {@link ViewHolder} + * @param ig {@link ItemEvaluation} + */ + private void createLoadingView(ViewHolder h, ItemEvaluation ig) { + h.loading.setVisibility(View.VISIBLE); + h.messageText.setVisibility(GONE); + h.checkItem.setVisibility(GONE); + } + + @Override + public void onBindGroupViewHolder(HeaderViewHolder holder, int flatPosition, ExpandableGroup + group) { + holder.categoryTitle.setText(group.getTitle()); + } + + public class ViewHolder extends ChildViewHolder { + final View mView; + + @BindView(R.id.imageItem) + ImageView imageItem; + @BindView(R.id.textDescription) + TextView textDescription; + @BindView(R.id.quiz_text) + TextView messageText; + @BindView(R.id.check_item) + ImageView checkItem; + @BindView(R.id.loading) + ProgressBar loading; + @BindView(R.id.box_quiz) + LinearLayout boxQuiz; + + public ViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + + this.mView = itemView.getRootView(); + } + + public void clearAnimation() { + mView.clearAnimation(); + } + } + + public class HeaderViewHolder extends GroupViewHolder { + final View mView; + + @BindView(R.id.category_title) + TextView categoryTitle; + + @BindView(R.id.expand) + ImageView expand; + + HeaderViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + + this.mView = itemView.getRootView(); + } + + @Override + public void expand() { + super.expand(); + expand.setRotation(180); + } + + @Override + public void collapse() { + expand.setRotation(0); + } + + public void clearAnimation() { + mView.clearAnimation(); + } + } + + public interface OnClick { + void onAddItemClick(String name, int type); + + void onAddItemClick(String name, int type, String idQuiz); + + void onSelectClick(ItemEvaluation itemEvaluation, String idQuiz); + } +} \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/ManagerPatientAdapter.java b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/ManagerPatientAdapter.java index 5be2f3f6..8c242195 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/ManagerPatientAdapter.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/ManagerPatientAdapter.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -20,12 +21,19 @@ import br.edu.uepb.nutes.haniot.activity.QuizOdontologyActivity; import br.edu.uepb.nutes.haniot.adapter.base.BaseAdapter; import br.edu.uepb.nutes.haniot.adapter.base.OnRecyclerViewListener; +import br.edu.uepb.nutes.haniot.data.model.HealthProfessional; import br.edu.uepb.nutes.haniot.data.model.Patient; import br.edu.uepb.nutes.haniot.data.model.PatientsType; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import butterknife.BindView; import butterknife.ButterKnife; +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.DENTISTRY; +import static br.edu.uepb.nutes.haniot.data.model.UserType.HEALTH_PROFESSIONAL; +import static br.edu.uepb.nutes.haniot.data.model.UserType.NUTRITION; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; + public class ManagerPatientAdapter extends BaseAdapter { private final String LOG = "ManagerPatientAdapter"; @@ -91,23 +99,28 @@ public void showData(RecyclerView.ViewHolder holder, int position, List ManagerPatientViewHolder h = (ManagerPatientViewHolder) holder; h.textName.setText(patient.getName()); + h.textName.setEllipsize(TextUtils.TruncateAt.END); h.textAge.setText(calculateAge(patient.getBirthDate())); if (patient.getGender().equals(PatientsType.GenderType.FEMALE)) h.profile.setImageResource(R.drawable.x_girl); else h.profile.setImageResource(R.drawable.x_boy); - h.mView.setOnClickListener(v -> { - actionsPatientListener.onItemClick(patient); - }); + h.mView.setOnClickListener(v -> actionsPatientListener.onItemClick(patient)); h.btnMore.setOnClickListener(v -> { PopupMenu popup = new PopupMenu(context, ((ManagerPatientViewHolder) holder).btnMore); popup.inflate(R.menu.menu_patient_actions); - if (appPreferencesHelper.getUserLogged().getHealthArea().equals("nutrition")) - popup.getMenu().getItem(2).setVisible(false); - else if (appPreferencesHelper.getUserLogged().getHealthArea().equals("dentistry")) { - popup.getMenu().getItem(1).setVisible(false); - popup.getMenu().getItem(3).setVisible(false); + + if (appPreferencesHelper.getUserLogged().getUserType().equals(HEALTH_PROFESSIONAL)) { + String userType = (appPreferencesHelper.getUserLogged()).getHealthArea(); + if (!userType.equals(ADMIN)) { + if (userType.equals(NUTRITION)) { + popup.getMenu().getItem(2).setVisible(false); + } else if (userType.equals(DENTISTRY)) { + popup.getMenu().getItem(1).setVisible(false); + popup.getMenu().getItem(3).setVisible(false); + } + } } popup.setOnMenuItemClickListener(item -> { switch (item.getItemId()) { @@ -123,6 +136,9 @@ else if (appPreferencesHelper.getUserLogged().getHealthArea().equals("dentistry" case R.id.nutrition_evaluation: actionsPatientListener.onMenuClick("nutrition_evaluation", patient); break; + case R.id.historic_quiz: + actionsPatientListener.onMenuClick("historic_quiz", patient); + break; default: break; } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/BaseAdapter.java b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/BaseAdapter.java index f9e39eb2..54d9a419 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/BaseAdapter.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/BaseAdapter.java @@ -1,8 +1,11 @@ package br.edu.uepb.nutes.haniot.adapter.base; +import android.content.Context; import android.os.Handler; import android.os.Looper; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.helper.ItemTouchHelper; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -24,11 +27,31 @@ public abstract class BaseAdapter extends RecyclerView.Adapter itemsList; protected int lastPosition = -1; public OnRecyclerViewListener mListener; + public SwipeItemRecyclerViewCallback swipeItemRecyclerViewCallback; + public ItemTouchHelper itemTouchhelper; + public RecyclerView recyclerView; protected BaseAdapter() { this.itemsList = new ArrayList<>(); } + /** + * Enable swipe item recyclerview. + * @param context + */ + public void enableSwipe(Context context) { + swipeItemRecyclerViewCallback = new SwipeItemRecyclerViewCallback(context, this) { + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) { + int position = viewHolder.getAdapterPosition(); + mListener.onItemSwiped(itemsList.get(position), position); + } + }; + itemTouchhelper = new ItemTouchHelper(swipeItemRecyclerViewCallback); + if (recyclerView != null) + itemTouchhelper.attachToRecyclerView(recyclerView); + } + /** * Get list items. * @@ -66,12 +89,7 @@ public void addItem(T item) { if (item != null) { itemsList.add(item); - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - notifyItemInserted(itemsList.size() - 1); - } - }); + new Handler(Looper.getMainLooper()).post(() -> notifyItemInserted(itemsList.size() - 1)); } } @@ -84,12 +102,7 @@ public void addItems(List items) { if (items != null) { this.itemsList.addAll(items); - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - notifyDataSetChanged(); - } - }); + new Handler(Looper.getMainLooper()).post(this::notifyDataSetChanged); } } @@ -102,27 +115,22 @@ public void removeItem(T item) { if (item != null) { itemsList.remove(item); - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - notifyDataSetChanged(); - } - }); + new Handler(Looper.getMainLooper()).post(this::notifyDataSetChanged); } } + public void restoreItem(T item, int position) { + itemsList.add(position, item); + notifyItemInserted(position); + } + /** * Clear the list of itemsList and notifies you that the data set has changed. */ public void clearItems() { itemsList.clear(); - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - notifyDataSetChanged(); - } - }); + new Handler(Looper.getMainLooper()).post(this::notifyDataSetChanged); } /** @@ -178,6 +186,12 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { showData(holder, position, itemsList); } + @Override + public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + this.recyclerView = recyclerView; + } + @Override public int getItemCount() { return itemsList != null ? itemsList.size() : 0; diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/OnRecyclerViewListener.java b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/OnRecyclerViewListener.java index 2aa1977f..6cb9084e 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/OnRecyclerViewListener.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/OnRecyclerViewListener.java @@ -16,4 +16,6 @@ public interface OnRecyclerViewListener { void onLongItemClick(View v, T item); void onMenuContextClick(View v, T item); + + void onItemSwiped(T item, int position); } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/SwipeItemRecyclerViewCallback.java b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/SwipeItemRecyclerViewCallback.java new file mode 100644 index 00000000..870fd600 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/adapter/base/SwipeItemRecyclerViewCallback.java @@ -0,0 +1,73 @@ +package br.edu.uepb.nutes.haniot.adapter.base; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.helper.ItemTouchHelper; +import android.view.View; + +import br.edu.uepb.nutes.haniot.R; + +abstract public class SwipeItemRecyclerViewCallback extends ItemTouchHelper.SimpleCallback { + + Context mContext; + RecyclerView.Adapter mAdapter; + private Drawable icon; + private final ColorDrawable background; + + public SwipeItemRecyclerViewCallback(Context context, RecyclerView.Adapter adapter) { + super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT); + mContext = context; + mAdapter = adapter; + icon = ContextCompat.getDrawable(mContext, R.drawable.ic_delete); + background = new ColorDrawable(mContext.getResources().getColor(R.color.colorButtonDanger)); + } + + @Override + public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { + // used for up and down movements + return false; + } + + @Override + public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); + + View itemView = viewHolder.itemView; + int backgroundCornerOffset = 20; //so background is behind the rounded corners of itemView + + int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + int iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + int iconBottom = iconTop + icon.getIntrinsicHeight(); + + if (dX > 0) { // Swiping to the right + int iconLeft = itemView.getLeft() + iconMargin; + int iconRight = iconLeft + icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + + background.setBounds(itemView.getLeft(), itemView.getTop(), + itemView.getLeft() + ((int) dX) + backgroundCornerOffset, + itemView.getBottom()); + } else if (dX < 0) { // Swiping to the left + int iconLeft = itemView.getRight() - iconMargin - icon.getIntrinsicWidth(); + int iconRight = itemView.getRight() - iconMargin; + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + + background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset, + itemView.getTop(), itemView.getRight(), itemView.getBottom()); + } else { // view is unSwiped + background.setBounds(0, 0, 0, 0); + } + + background.draw(c); + icon.draw(c); + } +} \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Admin.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Admin.java new file mode 100644 index 00000000..6808efd3 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Admin.java @@ -0,0 +1,107 @@ +package br.edu.uepb.nutes.haniot.data.model; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; + +import io.objectbox.annotation.Entity; +import io.objectbox.annotation.Id; +import io.objectbox.annotation.Index; + +/** + * Represents User object. + * + * @author Copyright (c) 2019, NUTES/UEPB + */ +@Entity +public class Admin extends User { + + @SerializedName("total_pilot_studies") + @Expose() + private String totalPilotStudies; + + @SerializedName("total_patients") + @Expose() + private String totalPatients; + + @SerializedName("total_health_professionals") + @Expose() + private String totalHealthProfessionals; + + @SerializedName("total_admins") + @Expose() + private String totalAdmins; + + public Admin() { + } + + public Admin(String totalPilotStudies, String totalPatients, String totalHealthProfessionals, String totalAdmins) { + this.totalPilotStudies = totalPilotStudies; + this.totalPatients = totalPatients; + this.totalHealthProfessionals = totalHealthProfessionals; + this.totalAdmins = totalAdmins; + } + + public Admin(String email, String password, String totalPilotStudies, String totalPatients, String totalHealthProfessionals, String totalAdmins) { + super(email, password); + this.totalPilotStudies = totalPilotStudies; + this.totalPatients = totalPatients; + this.totalHealthProfessionals = totalHealthProfessionals; + this.totalAdmins = totalAdmins; + } + + public Admin(String _id, String oldPassword, String newPassword, String totalPilotStudies, String totalPatients, String totalHealthProfessionals, String totalAdmins) { + super(_id, oldPassword, newPassword); + this.totalPilotStudies = totalPilotStudies; + this.totalPatients = totalPatients; + this.totalHealthProfessionals = totalHealthProfessionals; + this.totalAdmins = totalAdmins; + } + + public String getTotalPilotStudies() { + return totalPilotStudies; + } + + public void setTotalPilotStudies(String totalPilotStudies) { + this.totalPilotStudies = totalPilotStudies; + } + + public String getTotalPatients() { + return totalPatients; + } + + public void setTotalPatients(String totalPatients) { + this.totalPatients = totalPatients; + } + + public String getTotalHealthProfessionals() { + return totalHealthProfessionals; + } + + public void setTotalHealthProfessionals(String totalHealthProfessionals) { + this.totalHealthProfessionals = totalHealthProfessionals; + } + + public String getTotalAdmins() { + return totalAdmins; + } + + public void setTotalAdmins(String totalAdmins) { + this.totalAdmins = totalAdmins; + } + + @Override + public String toString() { + return "Admin{" + + "totalPilotStudies='" + totalPilotStudies + '\'' + + ", totalPatients='" + totalPatients + '\'' + + ", totalHealthProfessionals='" + totalHealthProfessionals + '\'' + + ", totalAdmins='" + totalAdmins + '\'' + + '}'; + } + +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Device.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Device.java index 9e6d8278..43d1ba9c 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Device.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Device.java @@ -14,6 +14,7 @@ import io.objectbox.annotation.Entity; import io.objectbox.annotation.Id; import io.objectbox.annotation.Index; +import io.objectbox.annotation.Transient; /** * Represents Device object. @@ -56,17 +57,23 @@ public class Device implements Parcelable { private String userId; @Expose(serialize = false, deserialize = false) + @Transient // not persisted + private String uuid; + + @Expose(serialize = false, deserialize = false) + @Transient // not persisted private int img; public Device() { } - public Device(String name, String manufacturer, String modelNumber, int img, String type) { + public Device(String name, String manufacturer, String modelNumber, int img, String type, String uuid) { this.name = name; this.manufacturer = manufacturer; this.modelNumber = modelNumber; this.img = img; this.type = type; + this.uuid = uuid; } protected Device(Parcel in) { @@ -79,6 +86,7 @@ protected Device(Parcel in) { manufacturer = in.readString(); userId = in.readString(); img = in.readInt(); + uuid = in.readString(); } @Override @@ -92,6 +100,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(manufacturer); dest.writeString(userId); dest.writeInt(img); + dest.writeString(uuid); } @Override @@ -183,6 +192,14 @@ public void setImg(int img) { this.img = img; } + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + @Override public int hashCode() { return Objects.hash(address); @@ -193,7 +210,7 @@ public boolean equals(Object o) { if (!(o instanceof Device)) return false; Device other = (Device) o; - return this.address.equals(other.address) || this.name.equals(other.name); + return this.type.equals(other.type); } /** @@ -219,6 +236,7 @@ public String toString() { ", manufacturer='" + manufacturer + '\'' + ", userId='" + userId + '\'' + ", img=" + img + + ", uuid=" + uuid + '}'; } } \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/FamilyCohesionRecord.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/FamilyCohesionRecord.java index b3d058f2..b31e85bd 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/FamilyCohesionRecord.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/FamilyCohesionRecord.java @@ -204,4 +204,25 @@ public String toJson() { Log.i("AAAAAAAAAA", a); return a; } + + @Override + public String toString() { + return "FamilyCohesionRecord{" + + "id=" + id + + ", _id='" + _id + '\'' + + ", patientId='" + patientId + '\'' + + ", createdAt='" + createdAt + '\'' + + ", familyMutualAidFreq='" + familyMutualAidFreq + '\'' + + ", friendshipApprovalFreq='" + friendshipApprovalFreq + '\'' + + ", familyOnlyTaskFreq='" + familyOnlyTaskFreq + '\'' + + ", familyOnlyPreferenceFreq='" + familyOnlyPreferenceFreq + '\'' + + ", freeTimeTogetherFreq='" + freeTimeTogetherFreq + '\'' + + ", familyProximityPerceptionFreq='" + familyProximityPerceptionFreq + '\'' + + ", allFamilyTasksFreq='" + allFamilyTasksFreq + '\'' + + ", familyTasksOpportunityFreq='" + familyTasksOpportunityFreq + '\'' + + ", familyDecisionSupportFreq='" + familyDecisionSupportFreq + '\'' + + ", familyUnionRelevanceFreq='" + familyUnionRelevanceFreq + '\'' + + ", familyCohesionResult=" + familyCohesionResult + + '}'; + } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/FrequencyAnswersType.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/FrequencyAnswersType.java index a7edfeb6..4b204fed 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/FrequencyAnswersType.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/FrequencyAnswersType.java @@ -14,7 +14,7 @@ public static class Frequency { public static final String RARELY_PTBR = "Raramente"; public static final String SOMETIMES_PTBR = "As vezes"; public static final String OFTEN_PTBR = "Frequentemente"; - public static final String ALMOST_EVERYDAY_PTBR = "Quase todos os dias"; + public static final String ALMOST_ALWAYS_PTBR = "Quase sempre"; public static String getString(int type) { switch (type) { @@ -44,10 +44,41 @@ public static String getStringPTBR(String type) { case OFTEN: return OFTEN_PTBR; case ALMOST_ALWAYS: - return ALMOST_EVERYDAY_PTBR; + return ALMOST_ALWAYS_PTBR; default: return ""; } } } -} + + public static class Afirmation { + + public static final String YES = "yes"; + public static final String NOT = "not"; + + public static final String YES_PTBR = "Sim"; + public static final String NOT_PTBR = "Não"; + + public static String getString(int type) { + switch (type) { + case 0: + return YES; + case 1: + return NOT; + default: + return ""; + } + } + + public static String getStringPTBR(String type) { + switch (type) { + case YES: + return YES_PTBR; + case NOT: + return NOT_PTBR; + default: + return ""; + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/GroupItemEvaluation.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/GroupItemEvaluation.java index 4aa69bb2..2415496e 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/GroupItemEvaluation.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/GroupItemEvaluation.java @@ -8,12 +8,19 @@ public class GroupItemEvaluation extends ExpandableGroup { private int type; + private String idGroup; public GroupItemEvaluation(String title, List items, int type) { super(title, items); this.type = type; } + public GroupItemEvaluation(String title, List items, int type, String idGroup) { + super(title, items); + this.type = type; + this.idGroup = idGroup; + } + public int getType() { return type; } @@ -21,4 +28,12 @@ public int getType() { public void setType(int type) { this.type = type; } + + public String getIdGroup() { + return idGroup; + } + + public void setIdGroup(String idGroup) { + this.idGroup = idGroup; + } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/HealthProfessional.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/HealthProfessional.java new file mode 100644 index 00000000..67cedaf8 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/HealthProfessional.java @@ -0,0 +1,42 @@ +package br.edu.uepb.nutes.haniot.data.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import io.objectbox.annotation.Entity; + +/** + * Represents User object. + * + * @author Copyright (c) 2019, NUTES/UEPB + */ +@Entity +public class HealthProfessional extends User { + + @SerializedName("total_pilot_studies") + @Expose() + private String totalPilotStudies; + + @SerializedName("total_patients") + @Expose() + private String totalPatients; + + public HealthProfessional() { + } + + public String getTotalPilotStudies() { + return totalPilotStudies; + } + + public void setTotalPilotStudies(String totalPilotStudies) { + this.totalPilotStudies = totalPilotStudies; + } + + public String getTotalPatients() { + return totalPatients; + } + + public void setTotalPatients(String totalPatients) { + this.totalPatients = totalPatients; + } +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/MeasurementLastResponse.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/MeasurementLastResponse.java new file mode 100644 index 00000000..86cee952 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/MeasurementLastResponse.java @@ -0,0 +1,120 @@ +package br.edu.uepb.nutes.haniot.data.model; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; + +public class MeasurementLastResponse { + + @SerializedName("weight") + @Expose() + Measurement weight; + + @SerializedName("hearte_rate") + @Expose() + Measurement heartRate; + + @SerializedName("height") + @Expose() + Measurement height; + + @SerializedName("blood_glucose") + @Expose() + Measurement bloodGlucose; + + @SerializedName("blood_pressure") + @Expose() + Measurement bloodPressure; + + @SerializedName("waist_circumference") + @Expose() + Measurement waistCircumference; + + public Measurement getWeight() { + return weight; + } + + public void setWeight(Measurement weight) { + this.weight = weight; + } + + public Measurement getHeartRate() { + return heartRate; + } + + public void setHeartRate(Measurement heartRate) { + this.heartRate = heartRate; + } + + public Measurement getHeight() { + return height; + } + + public void setHeight(Measurement height) { + this.height = height; + } + + public Measurement getBloodGlucose() { + return bloodGlucose; + } + + public void setBloodGlucose(Measurement bloodGlucose) { + this.bloodGlucose = bloodGlucose; + } + + public Measurement getBloodPressure() { + return bloodPressure; + } + + public void setBloodPressure(Measurement bloodPressure) { + this.bloodPressure = bloodPressure; + } + + public Measurement getWaistCircumference() { + return waistCircumference; + } + + public void setWaistCircumference(Measurement waistCircumference) { + this.waistCircumference = waistCircumference; + } + + /** + * Convert object to json format. + * + * @return String + */ + public String toJson() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + String a = gson.toJson(this); + return a; + } + + /** + * Convert json to Object. + * + * @param json String + * @return Patient + */ + public static Patient jsonDeserialize(String json) { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + Type typeLastMeasurement = new TypeToken() { + }.getType(); + return gson.fromJson(json, typeLastMeasurement); + } + + @Override + public String toString() { + return "MeasurementLastResponse{" + + ", weight=" + weight + + ", heartRate=" + heartRate + + ", height=" + height + + ", bloodGlucose=" + bloodGlucose + + ", bloodPressure=" + bloodPressure + + ", waistCircumference=" + waistCircumference + + '}'; + } +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/NutritionalQuestionnaire.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/NutritionalQuestionnaire.java new file mode 100644 index 00000000..44006ee4 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/NutritionalQuestionnaire.java @@ -0,0 +1,132 @@ +package br.edu.uepb.nutes.haniot.data.model; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.util.Objects; + +import io.objectbox.annotation.Id; + +public class NutritionalQuestionnaire { + + @Id + @Expose(deserialize = false, serialize = false) + private long id; + + @SerializedName("id") + @Expose() + private String _id; + + @SerializedName("created_at") + @Expose() + String createdAt; + + @SerializedName("sleep_habit") + @Expose() + SleepHabit sleepHabit; + + @SerializedName("physical_activity_habits") + @Expose() + PhysicalActivityHabit physicalActivityHabit; + + @SerializedName("feeding_habits_record") + @Expose() + FeedingHabitsRecord feedingHabitsRecord; + + @SerializedName("medical_record") + @Expose() + MedicalRecord medicalRecord; + + public NutritionalQuestionnaire() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public SleepHabit getSleepHabit() { + return sleepHabit; + } + + public void setSleepHabit(SleepHabit sleepHabit) { + this.sleepHabit = sleepHabit; + } + + public PhysicalActivityHabit getPhysicalActivityHabit() { + return physicalActivityHabit; + } + + public void setPhysicalActivityHabit(PhysicalActivityHabit physicalActivityHabit) { + this.physicalActivityHabit = physicalActivityHabit; + } + + public FeedingHabitsRecord getFeedingHabitsRecord() { + return feedingHabitsRecord; + } + + public void setFeedingHabitsRecord(FeedingHabitsRecord feedingHabitsRecord) { + this.feedingHabitsRecord = feedingHabitsRecord; + } + + public MedicalRecord getMedicalRecord() { + return medicalRecord; + } + + public void setMedicalRecord(MedicalRecord medicalRecord) { + this.medicalRecord = medicalRecord; + } + + /** + * Convert object to json format. + * + * @return String + */ + public String toJson() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + return gson.toJson(this); + } + + @Override + public String toString() { + return "NutritionalQuestionnaire{" + + "id=" + id + + ", _id='" + _id + '\'' + + ", createdAt='" + createdAt + '\'' + + ", sleepHabit=" + sleepHabit + + ", physicalActivityHabit=" + physicalActivityHabit + + ", feedingHabitsRecord=" + feedingHabitsRecord + + ", medicalRecord=" + medicalRecord + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NutritionalQuestionnaire that = (NutritionalQuestionnaire) o; + return Objects.equals(_id, that._id) && + Objects.equals(createdAt, that.createdAt); + } +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/NutritionalQuestionnaireType.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/NutritionalQuestionnaireType.java new file mode 100644 index 00000000..8fd60ac5 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/NutritionalQuestionnaireType.java @@ -0,0 +1,9 @@ +package br.edu.uepb.nutes.haniot.data.model; + +public class NutritionalQuestionnaireType { + + public final static String SLEEP_HABIT = "sleep_habit"; + public final static String PHYSICAL_ACTIVITY_HABITS = "physical_activity_habits"; + public final static String FEEDING_HABITS_RECORD = "feeding_habits_record"; + public final static String MEDICAL_RECORDS = "medical_record"; +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OdontologicalQuestionnaire.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OdontologicalQuestionnaire.java new file mode 100644 index 00000000..7adf3602 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OdontologicalQuestionnaire.java @@ -0,0 +1,119 @@ +package br.edu.uepb.nutes.haniot.data.model; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.util.Objects; + +import io.objectbox.annotation.Id; + +public class OdontologicalQuestionnaire { + + @Id + @Expose(deserialize = false, serialize = false) + private long id; + + @SerializedName("id") + @Expose() + private String _id; + + @SerializedName("created_at") + @Expose() + String createdAt; + + @SerializedName("sociodemographic_record") + @Expose() + SociodemographicRecord sociodemographicRecord; + + @SerializedName("family_cohesion_record") + @Expose() + FamilyCohesionRecord familyCohesionRecord; + + @SerializedName("oral_health_record") + @Expose() + OralHealthRecord oralHealthRecord; + + public OdontologicalQuestionnaire() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public SociodemographicRecord getSociodemographicRecord() { + return sociodemographicRecord; + } + + public void setSociodemographicRecord(SociodemographicRecord sociodemographicRecord) { + this.sociodemographicRecord = sociodemographicRecord; + } + + public FamilyCohesionRecord getFamilyCohesionRecord() { + return familyCohesionRecord; + } + + public void setFamilyCohesionRecord(FamilyCohesionRecord familyCohesionRecord) { + this.familyCohesionRecord = familyCohesionRecord; + } + + public OralHealthRecord getOralHealthRecord() { + return oralHealthRecord; + } + + public void setOralHealthRecord(OralHealthRecord oralHealthRecord) { + this.oralHealthRecord = oralHealthRecord; + } + + /** + * Convert object to json format. + * + * @return String + */ + public String toJson() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + return gson.toJson(this); + } + + @Override + public String toString() { + return "OdontologicalQuestionnaire{" + + "id=" + id + + ", _id='" + _id + '\'' + + ", createdAt='" + createdAt + '\'' + + ", sociodemographicRecord=" + sociodemographicRecord + + ", familyCohesionRecord=" + familyCohesionRecord + + ", oralHealthRecord=" + oralHealthRecord + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OdontologicalQuestionnaire that = (OdontologicalQuestionnaire) o; + return Objects.equals(_id, that._id) && + Objects.equals(createdAt, that.createdAt); + } +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OdontologicalQuestionnaireType.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OdontologicalQuestionnaireType.java new file mode 100644 index 00000000..d6b1961e --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OdontologicalQuestionnaireType.java @@ -0,0 +1,8 @@ +package br.edu.uepb.nutes.haniot.data.model; + +public class OdontologicalQuestionnaireType { + + public final static String SOCIODEMOGRAPHIC_RECORD = "sociodemographic_record"; + public final static String FAMILY_COHESION_RECORD = "family_cohesion_record"; + public final static String ORAL_HEALTH_RECORD = "oral_health_record"; +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OralHealthRecord.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OralHealthRecord.java index f0896412..d482e127 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OralHealthRecord.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/OralHealthRecord.java @@ -111,4 +111,17 @@ public String toJson() { Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); return gson.toJson(this); } + + @Override + public String toString() { + return "OralHealthRecord{" + + "id=" + id + + ", _id='" + _id + '\'' + + ", patientId='" + patientId + '\'' + + ", createdAt='" + createdAt + '\'' + + ", teethBrushingFreq='" + teethBrushingFreq + '\'' + + ", toothLesions=" + toothLesions + + ", toothLesionsDB=" + toothLesionsDB + + '}'; + } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Patient.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Patient.java index c99a72bb..c958a87d 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Patient.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/Patient.java @@ -14,40 +14,16 @@ import io.objectbox.annotation.Index; @Entity -public class Patient { - @Id - @Expose(serialize = false, deserialize = false) - private long id; - - @Index - @SerializedName("id") - @Expose() - private String _id; // _id in server remote (UUID) +public class Patient extends User{ @SerializedName("pilotstudy_id") @Expose() private String pilotId; - @SerializedName("name") - @Expose() - private String name; - - @SerializedName("email") - @Expose() - private String email; - @SerializedName("gender") @Expose() private String gender; - @SerializedName("birth_date") - @Expose() - private String birthDate; - - @SerializedName("phone_number") - @Expose() - private String phoneNumber; - @Expose(serialize = false, deserialize = false) private String healthProfessionalId; @@ -55,22 +31,6 @@ public Patient() { } - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - public String getPilotId() { return pilotId; } @@ -79,14 +39,6 @@ public void setPilotId(String pilotId) { this.pilotId = pilotId; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - public String getGender() { return gender; } @@ -95,22 +47,6 @@ public void setGender(String gender) { this.gender = gender; } - public String getBirthDate() { - return birthDate; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public void setBirthDate(String birthDate) { - this.birthDate = birthDate; - } - public String getHealthProfessionalId() { return healthProfessionalId; } @@ -119,14 +55,6 @@ public void setHealthProfessionalId(String healthProfessionalId) { this.healthProfessionalId = healthProfessionalId; } - public String getPhoneNumber() { - return phoneNumber; - } - - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - /** * Convert object to json format. * @@ -154,28 +82,9 @@ public static Patient jsonDeserialize(String json) { @Override public String toString() { return "Patient{" + - "id=" + id + - ", _id='" + _id + '\'' + ", pilotId='" + pilotId + '\'' + - ", name='" + name + '\'' + - ", email='" + email + '\'' + ", gender='" + gender + '\'' + - ", birthDate='" + birthDate + '\'' + ", healthProfessionalId='" + healthProfessionalId + '\'' + - ", phoneNumber='" + phoneNumber + '\'' + '}'; } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Patient patient = (Patient) o; - return Objects.equals(_id, patient._id); - } - - @Override - public int hashCode() { - return Objects.hash(_id); - } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SociodemographicRecord.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SociodemographicRecord.java index ecb73687..abd59bfb 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SociodemographicRecord.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SociodemographicRecord.java @@ -108,4 +108,17 @@ public String toJson() { Log.i("AAAAAAAAAA", a); return a; } + + @Override + public String toString() { + return "SociodemographicRecord{" + + "id=" + id + + ", _id='" + _id + '\'' + + ", patientId='" + patientId + '\'' + + ", createdAt='" + createdAt + '\'' + + ", colorRace='" + colorRace + '\'' + + ", motherScholarity='" + motherScholarity + '\'' + + ", peopleInHome=" + peopleInHome + + '}'; + } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SociodemographicType.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SociodemographicType.java index e2043bd0..7919092b 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SociodemographicType.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SociodemographicType.java @@ -5,9 +5,13 @@ public class SociodemographicType { public static class ColorRace { public static final String WHITE = "white"; + public static final String WHITE_PTBR = "Branca"; public static final String BLACK = "black"; + public static final String BLACK_PTBR = "Preta/Negra"; public static final String PARDA = "parda"; + public static final String PARDA_PTBR = "Parda"; public static final String YELLOW = "yellow"; + public static final String YELLOW_PTBR = "Amarela"; public static String getString(int type) { @@ -24,15 +28,35 @@ public static String getString(int type) { return ""; } } + + public static String getStringPtBr(String type) { + switch (type) { + case WHITE: + return WHITE_PTBR; + case BLACK: + return BLACK_PTBR; + case PARDA: + return PARDA_PTBR; + case YELLOW: + return YELLOW_PTBR; + default: + return ""; + } + } } public static class MotherScholarity { public static final String UNLETTERED_ELEMENTARY_ONE_INCOMPLETE = "unlettered_elementary_one_incomplete"; + public static final String UNLETTERED_ELEMENTARY_ONE_INCOMPLETE_PTBR = "Analfabeto/Fundamental I Incompleto"; public static final String ELEMENTARY_ONE_ELEMENTARY_TWO_INCOMPLETE = "elementary_one_elementary_two_incomplete"; + public static final String ELEMENTARY_ONE_ELEMENTARY_TWO_INCOMPLETE_PTBR = "Fundamental I Completo/Fundamental II Incompleto"; public static final String ELEMENTARY_TWO_HIGH_SCHOOL_INCOMPLETE = "elementary_two_high_school_incomplete"; + public static final String ELEMENTARY_TWO_HIGH_SCHOOL_INCOMPLETE_PTBR = "Fundamental Completo/Médio Incompleto"; public static final String MEDIUM_GRADUATION_INCOMPLETE = "medium_graduation_incomplete"; + public static final String MEDIUM_GRADUATION_INCOMPLETE_PTBR = "Superior Incompleto"; public static final String GRADUATION_COMPLETE = "graduation_complete"; + public static final String GRADUATION_COMPLETE_PTBR = "Superio Completo"; public static String getString(int type) { @@ -51,5 +75,22 @@ public static String getString(int type) { return ""; } } + + public static String getStringPtBr(String type) { + switch (type) { + case UNLETTERED_ELEMENTARY_ONE_INCOMPLETE: + return UNLETTERED_ELEMENTARY_ONE_INCOMPLETE_PTBR; + case ELEMENTARY_ONE_ELEMENTARY_TWO_INCOMPLETE: + return ELEMENTARY_ONE_ELEMENTARY_TWO_INCOMPLETE_PTBR; + case ELEMENTARY_TWO_HIGH_SCHOOL_INCOMPLETE: + return ELEMENTARY_TWO_HIGH_SCHOOL_INCOMPLETE_PTBR; + case MEDIUM_GRADUATION_INCOMPLETE: + return MEDIUM_GRADUATION_INCOMPLETE_PTBR; + case GRADUATION_COMPLETE: + return GRADUATION_COMPLETE_PTBR; + default: + return ""; + } + } } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SportsType.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SportsType.java index c34e805a..b95c4b5e 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SportsType.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/SportsType.java @@ -1,28 +1,33 @@ package br.edu.uepb.nutes.haniot.data.model; +import android.content.Context; +import android.support.v4.content.ContextCompat; + +import br.edu.uepb.nutes.haniot.R; + public class SportsType { - public static final String SOCCER = "soccer"; + public static final String SOCCER = "football"; public static final String FUTSAL = "futsal"; public static final String HANDBALL = "handball"; public static final String BASKETBALL = "basketball"; - public static final String SKATES = "skates"; + public static final String SKATES = "roller_skate"; public static final String ATHLETICS = "athletics"; - public static final String SWIM = "swim"; - public static final String GYMNASTICS = "gymnastics"; + public static final String SWIM = "swimming"; + public static final String GYMNASTICS = "olympic_rhythmic_gymnastics"; public static final String FIGHT = "fight"; public static final String DANCE = "dance"; public static final String RUN = "run"; - public static final String RIDE_A_BIKE = "ride a bike"; - public static final String WALKING_AS_A_PHYSICAL_EXERCISE = "walking as a physical exercise"; - public static final String WALKING_AS_A_MEANS_OF_TRANSPORT = "walking as a means of transport"; + public static final String RIDE_A_BIKE = "bike"; + public static final String WALKING_AS_A_PHYSICAL_EXERCISE = "exercise_walking"; + public static final String WALKING_AS_A_MEANS_OF_TRANSPORT = "locomotion_walking"; public static final String VOLLEYBALL = "volleyball"; - public static final String MUSCULATION = "musculation"; - public static final String ABDOMINAL_EXERCISE = "abdominal exercise"; + public static final String MUSCULATION = "bodybuilding"; + public static final String ABDOMINAL_EXERCISE = "abdominal"; public static final String TENNIS = "tennis"; - public static final String WALK_WITH_DOG = "walk with dog"; - public static final String GYMNASTICS_GYM = "gymnastics gym"; - public static final String NO_ACTIVITY = "no activity"; + public static final String WALK_WITH_DOG = "dog_walk"; + public static final String GYMNASTICS_GYM = "gym_exercise"; + public static final String NO_ACTIVITY = "none_activity"; public static String getString(int type) { switch (type) { @@ -72,4 +77,54 @@ public static String getString(int type) { return ""; } } + + public static String getStringPtBr(Context context, String type) { + String[] answers = context.getResources().getStringArray(R.array.sports_answers); + switch (type) { + case SOCCER: + return answers[0]; + case FUTSAL: + return answers[1]; + case HANDBALL: + return answers[2]; + case BASKETBALL: + return answers[3]; + case SKATES: + return answers[4]; + case ATHLETICS: + return answers[5]; + case SWIM: + return answers[6]; + case GYMNASTICS: + return answers[7]; + case FIGHT: + return answers[8]; + case DANCE: + return answers[9]; + case RUN: + return answers[10]; + case RIDE_A_BIKE: + return answers[11]; + case WALKING_AS_A_PHYSICAL_EXERCISE: + return answers[12]; + case WALKING_AS_A_MEANS_OF_TRANSPORT: + return answers[13]; + case VOLLEYBALL: + return answers[14]; + case MUSCULATION: + return answers[15]; + case ABDOMINAL_EXERCISE: + return answers[16]; + case TENNIS: + return answers[17]; + case WALK_WITH_DOG: + return answers[18]; + case GYMNASTICS_GYM: + return answers[19]; + case NO_ACTIVITY: + return answers[20]; + default: + return ""; + } + } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/ToothLesion.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/ToothLesion.java index 90a97541..ae943c1e 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/ToothLesion.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/ToothLesion.java @@ -7,6 +7,8 @@ import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; +import java.util.Objects; + import io.objectbox.relation.ToOne; public class ToothLesion { @@ -25,6 +27,11 @@ public class ToothLesion { public ToothLesion() { } + public ToothLesion(String toothType, String lesionType) { + this.toothType = toothType; + this.lesionType = lesionType; + } + public String getToothType() { return toothType; } @@ -60,4 +67,27 @@ public String toJson() { Log.i("AAAAAAAAAA", a); return a; } + + @Override + public String toString() { + return "ToothLesion{" + + "toothType='" + toothType + '\'' + + ", lesionType='" + lesionType + '\'' + + ", oralHealthRecord=" + oralHealthRecord + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ToothLesion that = (ToothLesion) o; + return toothType.equals(that.toothType) && + lesionType.equals(that.lesionType); + } + + @Override + public int hashCode() { + return Objects.hash(toothType, lesionType); + } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/ToothLesionType.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/ToothLesionType.java index 0a068478..a3ac172c 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/ToothLesionType.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/ToothLesionType.java @@ -5,7 +5,9 @@ public class ToothLesionType { public static class ToothType { public static final String DECIDUOUS_TOOTH = "deciduous_tooth"; + public static final String DECIDUOUS_TOOTH_PTBR = "dentes decíduos"; public static final String PERMANENT_TOOTH = "permanent_tooth"; + public static final String PERMANENT_TOOTH_PTBR = "dentes permanentes"; public static String getString(int type) { switch (type) { @@ -17,12 +19,25 @@ public static String getString(int type) { return ""; } } + + public static String getStringPtbr(String type) { + switch (type) { + case DECIDUOUS_TOOTH: + return DECIDUOUS_TOOTH_PTBR; + case PERMANENT_TOOTH: + return PERMANENT_TOOTH_PTBR; + default: + return ""; + } + } } public static class LesionType { public static final String WHITE_SPOT_LESION = "white_spot_lesion"; + public static final String WHITE_SPOT_LESION_PTBR = "Cárie do tipo mancha branca"; public static final String CAVITATED_LESION = "cavitated_lesion"; + public static final String CAVITATED_LESION_PTBR = "Cárie cavitada"; public static String getString(int type) { switch (type) { @@ -34,14 +49,29 @@ public static String getString(int type) { return ""; } } + + public static String getStringPtBr(String type) { + switch (type) { + case WHITE_SPOT_LESION: + return WHITE_SPOT_LESION_PTBR; + case CAVITATED_LESION: + return CAVITATED_LESION_PTBR; + default: + return ""; + } + } } public static class TeethBrushingFreq { public static final String NONE = "none"; + public static final String NONE_PTBR = "Nenhuma vez"; public static final String ONCE = "once"; + public static final String ONCE_PTBR = "Uma vez"; public static final String TWICE = "twice"; + public static final String TWICE_PTBR = "Duas vezes"; public static final String THREE_MORE = "three_more"; + public static final String THREE_MORE_PTBR = "Três vezes"; public static String getString(int type) { switch (type) { @@ -57,5 +87,20 @@ public static String getString(int type) { return ""; } } + + public static String getStringPtBr(String type) { + switch (type) { + case NONE: + return NONE_PTBR; + case ONCE: + return ONCE_PTBR; + case TWICE: + return TWICE_PTBR; + case THREE_MORE: + return THREE_MORE_PTBR; + default: + return ""; + } + } } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/TypeEvaluation.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/TypeEvaluation.java index 1de10e59..8c85eb82 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/TypeEvaluation.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/TypeEvaluation.java @@ -19,5 +19,6 @@ public class TypeEvaluation { public final static int FAMILY_COHESION = 14; public final static int FEEDING_HABITS = 15; public final static int ALL_MEASUREMENT = 16; + public final static int ALL_QUIZ = 17; } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/User.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/User.java index f8e923ea..dbd36ed5 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/User.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/User.java @@ -37,6 +37,14 @@ public class User { @Expose() private String name; + @SerializedName("birth_date") + @Expose() + private String birthDate; + + @SerializedName("health_area") + @Expose() + private String healthArea; + @Expose(deserialize = false) private String password; @@ -48,20 +56,30 @@ public class User { @Expose(deserialize = false) private String newPassword; - @SerializedName("health_area") - @Expose() - private String healthArea; // provide by the server - @SerializedName("phone_number") @Expose() private String phoneNumber; // provide by the server + @SerializedName("last_login") + @Expose() + private String lastLogin; + + @SerializedName("last_sync") + @Expose() + private String lastSync; + + @SerializedName("language") + @Expose() + private String language; + + @SerializedName("selected_pilot_study") @Expose() private String pilotStudyIDSelected; /** * {@link UserType ()} */ - private int userType; // 1 admin, 2 health_profissional + @Expose() + private String userType; // 1 admin, 2 health_profissional public User() { } @@ -71,12 +89,6 @@ public User(String email, String password) { this.password = password; } - public User(String name, String email, int userType) { - this.name = name; - this.email = email; - this.userType = userType; - } - public User(String _id, String oldPassword, String newPassword) { this._id = _id; this.oldPassword = oldPassword; @@ -115,11 +127,11 @@ public void setEmail(String email) { this.email = email; } - public int getUserType() { + public String getUserType() { return userType; } - public void setUserType(int userType) { + public void setUserType(String userType) { this.userType = userType; } @@ -147,14 +159,6 @@ public void setNewPassword(String newPassword) { this.newPassword = newPassword; } - public String getHealthArea() { - return healthArea; - } - - public void setHealthArea(String healthArea) { - this.healthArea = healthArea; - } - public String getPilotStudyIDSelected() { return pilotStudyIDSelected; } @@ -181,6 +185,46 @@ public String toJson() { return gson.toJson(this); } + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getLastLogin() { + return lastLogin; + } + + public void setLastLogin(String lastLogin) { + this.lastLogin = lastLogin; + } + + public String getLastSync() { + return lastSync; + } + + public void setLastSync(String lastSync) { + this.lastSync = lastSync; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getHealthArea() { + return healthArea; + } + + public void setHealthArea(String healthArea) { + this.healthArea = healthArea; + } + /** * Convert json to Object. * @@ -201,7 +245,10 @@ public boolean equals(Object o) { User other = (User) o; - return other.get_id().equals(this.get_id()) && other.getEmail().equals(this.getEmail()); + return other.get_id().equals(this.get_id()) + && (other.email == null + || this.email == null + || other.getEmail().equals(this.getEmail())); } @Override @@ -211,12 +258,17 @@ public String toString() { ", _id='" + _id + '\'' + ", email='" + email + '\'' + ", name='" + name + '\'' + + ", birthDate='" + birthDate + '\'' + + ", healthArea='" + healthArea + '\'' + ", password='" + password + '\'' + ", oldPassword='" + oldPassword + '\'' + ", newPassword='" + newPassword + '\'' + - ", healthArea='" + healthArea + '\'' + + ", phoneNumber='" + phoneNumber + '\'' + + ", lastLogin='" + lastLogin + '\'' + + ", lastSync='" + lastSync + '\'' + + ", language='" + language + '\'' + ", pilotStudyIDSelected='" + pilotStudyIDSelected + '\'' + - ", userType=" + userType + + ", userType='" + userType + '\'' + '}'; } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/UserAccess.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/UserAccess.java index 2c468f01..aa3f9dcd 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/UserAccess.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/UserAccess.java @@ -18,6 +18,7 @@ */ public class UserAccess implements Parcelable { public static final String KEY_SCOPES = "scope"; + public static final String SUB_TYPE = "sub_type"; @Expose() private String subject; @@ -38,6 +39,7 @@ public class UserAccess implements Parcelable { @Expose(serialize = false, deserialize = false) private String scopes; + public UserAccess() { } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/UserType.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/UserType.java index 82f2065c..443a1c97 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/UserType.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/UserType.java @@ -12,8 +12,16 @@ * @copyright Copyright (c) 2017, NUTES UEPB */ public class UserType { - public static final int ADMIN = 1; - public static final int HEALTH_PROFISSIONAL = 2; +// public static final int ADMIN = 1; +// public static final int HEALTH_PROFESSEIONAL = 2; +// public static final int NUTRITION = 3; +// public static final int DENTISTRY = 4; +// public static final int PATIENT = 4; + public static final String ADMIN = "admin"; + public static final String HEALTH_PROFESSIONAL = "health_professional"; + public static final String PATIENT = "patient"; + public static final String DENTISTRY = "dentistry"; + public static final String NUTRITION = "nutrition"; /** * Retrieve the mapped group name in resources. diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/dao/DeviceDAO.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/dao/DeviceDAO.java index 3082231a..0150c365 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/dao/DeviceDAO.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/model/dao/DeviceDAO.java @@ -136,14 +136,14 @@ public boolean remove(@NonNull Device device) { } /** - * Removes device passed as parameter. + * Removes device passed as parameter. * - * @param address String + * @param _id String * @return boolean */ - public boolean remove(@NonNull String address) { + public boolean remove(@NonNull String _id) { return (deviceBox.query() - .equal(Device_.address, address) + .equal(Device_._id, _id) .build() .remove()) > 0; } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/local/pref/AppPreferencesHelper.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/local/pref/AppPreferencesHelper.java index b5de18a6..2a4161a6 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/local/pref/AppPreferencesHelper.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/local/pref/AppPreferencesHelper.java @@ -23,6 +23,7 @@ public class AppPreferencesHelper implements PreferencesHelper { private final String PREF_KEY_USER_PROFILE = "pref_key_user_profile"; private final String PREF_KEY_PATIENT = "pref_key_patient"; private final String PREF_KEY_PILOT_STUDY = "pref_key_pilot_study"; + private final String PREF_KEY_BLUETOOTH_MODE = "pref_key_bluetooth_mode"; private static AppPreferencesHelper instance; private SharedPreferences mPrefs; @@ -108,6 +109,13 @@ public boolean saveFloat(String key, float value) { return mPrefs.edit().putFloat(key, value).commit(); } + @Override + public boolean saveBluetoothMode(boolean activated) { + return mPrefs.edit() + .putBoolean(PREF_KEY_BLUETOOTH_MODE, activated) + .commit(); + } + @Override public UserAccess getUserAccessHaniot() { String userAccess = mPrefs.getString(PREF_KEY_AUTH_STATE_HANIOT, null); @@ -132,7 +140,7 @@ public PilotStudy getLastPilotStudy() { PilotStudy pilotStudy = PilotStudy.jsonDeserialize(pilot); Log.i("AAAA", getUserLogged().toJson()); Log.i("AAAA", "" + pilotStudy); - if ( (pilotStudy != null && pilotStudy.getUserId() != null) && pilotStudy.getUserId() + if ((pilotStudy != null && pilotStudy.getUserId() != null) && pilotStudy.getUserId() .equals(getUserLogged().get_id())) { Log.i("AAAA", pilotStudy.toJson()); return pilotStudy; @@ -140,6 +148,11 @@ public PilotStudy getLastPilotStudy() { return null; } + @Override + public boolean getBluetoothMode() { + return mPrefs.getBoolean(PREF_KEY_BLUETOOTH_MODE, true); + } + @Override public String getString(String key) { checkKey(key); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/local/pref/PreferencesHelper.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/local/pref/PreferencesHelper.java index ddcd175c..3b666bb0 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/local/pref/PreferencesHelper.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/local/pref/PreferencesHelper.java @@ -29,6 +29,8 @@ public interface PreferencesHelper { boolean saveFloat(String key, float value); + boolean saveBluetoothMode(boolean activated); + UserAccess getUserAccessHaniot(); User getUserLogged(); @@ -37,6 +39,8 @@ public interface PreferencesHelper { PilotStudy getLastPilotStudy(); + boolean getBluetoothMode(); + String getString(String key); boolean getBoolean(String key); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/ErrorHandler.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/ErrorHandler.java new file mode 100644 index 00000000..1e0a11c5 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/ErrorHandler.java @@ -0,0 +1,42 @@ +package br.edu.uepb.nutes.haniot.data.repository.remote.haniot; + +import android.content.Context; +import android.widget.Toast; + +import br.edu.uepb.nutes.haniot.R; +import retrofit2.HttpException; + +public class ErrorHandler { + private static final int INVALID_AUTH = 401; + private static final int NOT_PERMISSION = 403; + private static final int NOT_FOUND = 404; + private static final int REQUESTS_EXCEEDED = 429; + private static final int INTERNAL_ERROR = 500; + + public static void showMessage(Context context, Throwable e) { + if (e instanceof HttpException) { + int message; + HttpException httpEx = ((HttpException) e); + switch (httpEx.code()) { + case INVALID_AUTH: + message = R.string.invalid_auth; + break; + case NOT_PERMISSION: + message = R.string.not_permission; + break; + case NOT_FOUND: + message = R.string.error_recover_data; + break; + case REQUESTS_EXCEEDED: + message = R.string.request_exceeded; + break; + case INTERNAL_ERROR: + message = R.string.error_500; + break; + default: + message = R.string.error_500; + } + Toast.makeText(context, context.getString(message), Toast.LENGTH_SHORT).show(); + } + } +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/HaniotNetRepository.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/HaniotNetRepository.java index 13117c34..035c3b2c 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/HaniotNetRepository.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/HaniotNetRepository.java @@ -4,18 +4,25 @@ import android.util.Log; import com.auth0.android.jwt.JWT; +import com.google.gson.JsonObject; import org.greenrobot.eventbus.EventBus; import java.util.List; +import java.util.Objects; +import br.edu.uepb.nutes.haniot.data.model.Admin; import br.edu.uepb.nutes.haniot.data.model.Device; import br.edu.uepb.nutes.haniot.data.model.FamilyCohesionRecord; import br.edu.uepb.nutes.haniot.data.model.FeedingHabitsRecord; +import br.edu.uepb.nutes.haniot.data.model.HealthProfessional; import br.edu.uepb.nutes.haniot.data.model.Measurement; +import br.edu.uepb.nutes.haniot.data.model.MeasurementLastResponse; import br.edu.uepb.nutes.haniot.data.model.MedicalRecord; import br.edu.uepb.nutes.haniot.data.model.NutritionalEvaluation; import br.edu.uepb.nutes.haniot.data.model.NutritionalEvaluationResult; +import br.edu.uepb.nutes.haniot.data.model.NutritionalQuestionnaire; +import br.edu.uepb.nutes.haniot.data.model.OdontologicalQuestionnaire; import br.edu.uepb.nutes.haniot.data.model.OralHealthRecord; import br.edu.uepb.nutes.haniot.data.model.Patient; import br.edu.uepb.nutes.haniot.data.model.PhysicalActivityHabit; @@ -32,6 +39,7 @@ import io.reactivex.schedulers.Schedulers; import okhttp3.Interceptor; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; /** @@ -99,10 +107,6 @@ private Interceptor responseInterceptor() { .getInstance(mContext).getUserLogged() != null) { EventBus.getDefault().post("unauthorized"); } -// Log.i("AAA", ":"+chain.proceed(chain.request()).body().string()); - -// Log.w("RESPONSEBODY", response.code() + " | " + -// Objects.requireNonNull(response.body()).string()); return response; }; } @@ -116,6 +120,7 @@ public Single auth(String username, String password) { userAccess.setSubject(jwt.getSubject()); userAccess.setExpirationDate(jwt.getExpiresAt().getTime()); userAccess.setScopes(jwt.getClaim(UserAccess.KEY_SCOPES).asString()); + userAccess.setTokenType(jwt.getClaim(UserAccess.SUB_TYPE).asString()); } return userAccess; }) @@ -123,6 +128,13 @@ public Single auth(String username, String password) { .observeOn(AndroidSchedulers.mainThread()); } + // forgot password + public Single forgotPassword(JsonObject email) { + return haniotService.forgotPassword(email) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + // user public Completable deleteUserById(String userId) { return haniotService.deleteUser(userId) @@ -131,27 +143,52 @@ public Completable deleteUserById(String userId) { } public Completable changePassword(User user) { - return haniotService.changePassword(user.get_id(), user) + return haniotService.changePassword(user) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } // users.healthprofessionals - public Single getHealthProfissional(String healthProfessionalId) { + public Single getHealthProfissional(String healthProfessionalId) { return haniotService.getHealthProfessional(healthProfessionalId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } - public Single updateHealthProfissional(User healthProfissional) { + // users.healthprofessionals + public Single getAdmin(String adminId) { + return haniotService.getAdmin(adminId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single updateHealthProfissional(HealthProfessional healthProfissional) { return haniotService.updateHealthProfissional(healthProfissional.get_id(), healthProfissional) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } + public Single updateAdmin(Admin admin) { + return haniotService.updateAdmin(admin.get_id(), admin) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + // pilotstudies - public Single> getAllPilotStudies(String healthProfessionalId) { - return haniotService.getAllPilotStudies(healthProfessionalId) + public Single> getAllUserPilotStudies(String healthProfessionalId) { + return haniotService.getAllUserPilotStudies(healthProfessionalId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single> getAllPilotStudies() { + return haniotService.getAllPilotStudies() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single> associatePatientToPilotStudy(String pilotStudyId, String patientId) { + return haniotService.associatePatientToPilotStudy(pilotStudyId, patientId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -428,6 +465,64 @@ public Single> getAllOralHealth(String patientId, int pag .observeOn(AndroidSchedulers.mainThread()); } + public Single> getAllNutritionalQuestionnaires(String patientId, int page, int limit, String sort) { + return haniotService.getAllNutritionalQuestionnaires(patientId, page, limit, sort) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single> getAllOdontologicalQuestionnaires(String patientId, int page, int limit, String sort) { + return haniotService.getAllOdontologicalQuestionnaires(patientId, page, limit, sort) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single getLastNutritionalQuestionnaire(String patientId) { + return haniotService.getLastNutritionalQuestionnaire(patientId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single getLastOdontologicalQuestionnaires(String patientId) { + return haniotService.getLastOdontologicalQuestionnaires(patientId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single getLastMeasurements(String patientId) { + return haniotService.getLastMeasurements(patientId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single updateNutritionalQuestionnaire(String patientId, String questionnaireId, String resourceName, Object object) { + return haniotService.updateNutritionalQuestionnaire(patientId, questionnaireId, resourceName, object) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single updateOdontologicalQuestionnaire(String patientId, String questionnaireId, String resourceName, Object object) { + return haniotService.updateOdontologicalQuestionnaire(patientId, questionnaireId, resourceName, object) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single saveNutritionalQuestionnaire(String patientId, NutritionalQuestionnaire nutritionalQuestionnaire) { + return haniotService.saveNutritionalQuestionnaire( + patientId, + nutritionalQuestionnaire) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single saveOdontologicalQuestionnaire(String patientId, OdontologicalQuestionnaire odontologicalQuestionnaire) { + return haniotService.saveOdontologicalQuestionnaire( + patientId, + odontologicalQuestionnaire) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + // patients.nutritionalevaluation public Single saveNutritionalEvaluation( NutritionalEvaluation nutritionalEvaluation) { diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/HaniotService.java b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/HaniotService.java index 63d33ec7..918a7d51 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/HaniotService.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/data/repository/remote/haniot/HaniotService.java @@ -1,14 +1,21 @@ package br.edu.uepb.nutes.haniot.data.repository.remote.haniot; +import com.google.gson.JsonObject; + import java.util.List; +import br.edu.uepb.nutes.haniot.data.model.Admin; import br.edu.uepb.nutes.haniot.data.model.Device; import br.edu.uepb.nutes.haniot.data.model.FamilyCohesionRecord; import br.edu.uepb.nutes.haniot.data.model.FeedingHabitsRecord; +import br.edu.uepb.nutes.haniot.data.model.HealthProfessional; import br.edu.uepb.nutes.haniot.data.model.Measurement; +import br.edu.uepb.nutes.haniot.data.model.MeasurementLastResponse; import br.edu.uepb.nutes.haniot.data.model.MedicalRecord; import br.edu.uepb.nutes.haniot.data.model.NutritionalEvaluation; import br.edu.uepb.nutes.haniot.data.model.NutritionalEvaluationResult; +import br.edu.uepb.nutes.haniot.data.model.NutritionalQuestionnaire; +import br.edu.uepb.nutes.haniot.data.model.OdontologicalQuestionnaire; import br.edu.uepb.nutes.haniot.data.model.OralHealthRecord; import br.edu.uepb.nutes.haniot.data.model.Patient; import br.edu.uepb.nutes.haniot.data.model.PhysicalActivityHabit; @@ -19,11 +26,16 @@ import br.edu.uepb.nutes.haniot.data.model.UserAccess; import io.reactivex.Completable; import io.reactivex.Single; +import okhttp3.RequestBody; +import retrofit2.Response; import retrofit2.http.Body; import retrofit2.http.DELETE; +import retrofit2.http.Field; import retrofit2.http.GET; +import retrofit2.http.Multipart; import retrofit2.http.PATCH; import retrofit2.http.POST; +import retrofit2.http.PUT; import retrofit2.http.Path; import retrofit2.http.Query; @@ -34,59 +46,82 @@ */ public interface HaniotService { // String BASE_URL_HANIOT = "http://192.168.0.119:8080/"; // API GATEWAY LOCAL - String BASE_URL_HANIOT = "https://200.129.82.8:8081"; +// String BASE_URL_HANIOT = "https://haniot.nutes.uepb.edu.br:8081/v1/"; // API GATEWAY PRODUCTION + String BASE_URL_HANIOT = "https://dev.haniot.ml:8081/v1/"; // API GATEWAY DEV // auth @POST("auth") Single auth(@Body User user); + // auth + @POST("auth/forgot") + Single forgotPassword(@Body JsonObject email); + // user @DELETE("users/{user_id}") Completable deleteUser(@Path("user_id") String userId); - @PATCH("users/{user_id}/password") - Completable changePassword(@Path("user_id") String userId, @Body User user); + @PATCH("auth/password") + Completable changePassword(@Body User user); // users.healthprofessionals - @GET("users/healthprofessionals/{healthprofessional_id}") - Single getHealthProfessional( + @GET("healthprofessionals/{healthprofessional_id}") + Single getHealthProfessional( @Path("healthprofessional_id") String healthProfessionalId ); - @PATCH("users/healthprofessionals/{healthprofessional_id}") - Single updateHealthProfissional( + // users.admin + @GET("admins/{admin_id}") + Single getAdmin( + @Path("admin_id") String adminId + ); + + @PATCH("healthprofessionals/{healthprofessional_id}") + Single updateHealthProfissional( @Path("healthprofessional_id") String healthProfessionalId, @Body User healthProfissional ); + @PATCH("admins/{admin_id}") + Single updateAdmin( + @Path("admin_id") String healthProfessionalId, + @Body User healthProfissional + ); + // pilotstudies - @GET("users/healthprofessionals/{healthprofessional_id}/pilotstudies") - Single> getAllPilotStudies( + @GET("healthprofessionals/{healthprofessional_id}/pilotstudies") + Single> getAllUserPilotStudies( @Path("healthprofessional_id") String healthProfessionalId ); + @GET("pilotstudies") + Single> getAllPilotStudies(); + + @POST("pilotstudies/{pilotstudy_id}/patients/{patient_id}") + Single> associatePatientToPilotStudy(@Path("pilotstudy_id") String pilotStudyId, @Path("patient_id") String patientId); + @GET("pilotstudies/{pilotstudy_id}") Single getPilotStudy(@Path("pilotstudy_id") String pilotId); // users.measurements - @POST("users/{user_id}/measurements") - Single addMeasurement(@Path("user_id") String userId, + @POST("patients/{patient_id}/measurements") + Single addMeasurement(@Path("patient_id") String patientId, @Body Measurement measurement); - @POST("users/{user_id}/measurements") - Single addMeasurement(@Path("user_id") String userId, + @POST("patients/{patient_id}/measurements") + Single addMeasurement(@Path("patient_id") String patientId, @Body List measurement); - @GET("users/{user_id}/measurements") - Single> getAllMeasurements(@Path("user_id") String userId, + @GET("patients/{patient_id}/measurements") + Single> getAllMeasurements(@Path("patient_id") String userId, @Query("sort") String sort, @Query("start_at") String dateStart, @Query("end_at") String dateEnd, @Query("page") int page, @Query("limit") int limit); - @GET("users/{user_id}/measurements") - Single> getAllMeasurements(@Path("user_id") String userId, + @GET("patients/{patient_id}/measurements") + Single> getAllMeasurements(@Path("patient_id") String userId, @Query("type") String type, @Query("sort") String sort, @Query("start_at") String dateStart, @@ -94,44 +129,44 @@ Single> getAllMeasurements(@Path("user_id") String userId, @Query("page") int page, @Query("limit") int limit); - @GET("users/{user_id}/measurements") - Single> getAllMeasurements(@Path("user_id") String userId, + @GET("patients/{patient_id}/measurements") + Single> getAllMeasurements(@Path("patient_id") String userId, @Query("type") String type, @Query("sort") String sort, @Query("page") int page, @Query("limit") int limit); - @GET("users/{user_id}/measurements") - Single> getAllMeasurements(@Path("user_id") String userId, + @GET("patients/{patient_id}/measurements") + Single> getAllMeasurements(@Path("patient_id") String userId, @Query("page") int page, @Query("limit") int limit, @Query("sort") String sort); - @GET("users/{user_id}/measurements/{measurement_id}") - Single getMeasurement(@Path("user_id") String userId, + @GET("patients/{patient_id}/measurements/{measurement_id}") + Single getMeasurement(@Path("patient_id") String userId, @Path("measurement_id") String measurementId); - @DELETE("users/{user_id}/measurements/{measurement_id}") - Completable deleteMeasurement(@Path("user_id") String userId, + @DELETE("patients/{patient_id}/measurements/{measurement_id}") + Completable deleteMeasurement(@Path("patient_id") String userId, @Path("measurement_id") String measurementId); // user.devices - @POST("users/{user_id}/devices") - Single addDevice(@Path("user_id") String userId, @Body Device device); + @POST("patients/{patient_id}/devices") + Single addDevice(@Path("patient_id") String userId, @Body Device device); - @GET("users/{user_id}/devices") - Single> getAllDevices(@Path("user_id") String userId); + @GET("patients/{patient_id}/devices") + Single> getAllDevices(@Path("patient_id") String userId); - @GET("users/{user_id}/devices/{device_id}") - Single getDevice(@Path("user_id") String userId, + @GET("patients/{patient_id}/devices/{device_id}") + Single getDevice(@Path("patient_id") String userId, @Path("device_id") String deviceId); - @DELETE("users/{user_id}/devices/{device_id}") - Completable deleteDevice(@Path("user_id") String userId, + @DELETE("patients/{patient_id}/devices/{device_id}") + Completable deleteDevice(@Path("patient_id") String userId, @Path("device_id") String deviceId); // pilotstudies.patients - @POST("users/patients") + @POST("patients") Single addPatient(@Body Patient patient); @GET("pilotstudies/{pilotstudy_id}/patients") @@ -140,10 +175,10 @@ Single> getAllPilotStudiesPatients(@Path("pilotstudy_id") String p @Query("page") int page, @Query("limit") int limit); - @GET("users/patients/{patient_id}") + @GET("patients/{patient_id}") Single getPatient(@Path("patient_id") String patientId); - @PATCH("users/patients/{patient_id}") + @PATCH("patients/{patient_id}") Single updatePatient(@Path("patient_id") String patientId, @Body Patient patient); @@ -284,4 +319,55 @@ Single> getAllOralHealth(@Path("patient_id") String patie Single saveNutritionalEvaluation(@Path("patient_id") String patientId, @Body NutritionalEvaluation nutritionalEvaluation); + + @GET("patients/{patient_id}/nutritional/questionnaires") + Single> getAllNutritionalQuestionnaires(@Path("patient_id") String patientId, + @Query("page") int page, + @Query("limit") int limit, + @Query("sort") String sort); + + @GET("patients/{patient_id}/odontological/questionnaires") + Single> getAllOdontologicalQuestionnaires(@Path("patient_id") String patientId, + @Query("page") int page, + @Query("limit") int limit, + @Query("sort") String sort); + + @GET("patients/{patient_id}/odontological/questionnaires/last") + Single getLastOdontologicalQuestionnaires(@Path("patient_id") String patientId); + + @GET("patients/{patient_id}/nutritional/questionnaires/last") + Single getLastNutritionalQuestionnaire(@Path("patient_id") String patientId); + + @GET("patients/{patient_id}/measurements/last") + Single getLastMeasurements(@Path("patient_id") String patientId); + + + @PUT("patients/{patient_id}/nutritional/questionnaires/{questionnaire_id}/{resource_name}") + Single updateNutritionalQuestionnaire( + @Path("patient_id") String patientId, + @Path("questionnaire_id") String questionnaireId, + @Path("resource_name") String resourceName, + @Body Object object + ); + + @PUT("patients/{patient_id}/odontological/questionnaires/{questionnaire_id}/{resource_name}") + Single updateOdontologicalQuestionnaire( + @Path("patient_id") String patientId, + @Path("questionnaire_id") String questionnaireId, + @Path("resource_name") String resourceName, + @Body Object object + ); + + @POST("patients/{patient_id}/odontological/questionnaires") + Single saveOdontologicalQuestionnaire( + @Path("patient_id") String patientId, + @Body OdontologicalQuestionnaire odontologicalQuestionnaire + ); + + @POST("patients/{patient_id}/nutritional/questionnaires") + Single saveNutritionalQuestionnaire( + @Path("patient_id") String patientId, + @Body NutritionalQuestionnaire nutritionalQuestionnaire + ); + } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/BloodPressureActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/BloodPressureActivity.java new file mode 100644 index 00000000..3131389b --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/BloodPressureActivity.java @@ -0,0 +1,192 @@ +package br.edu.uepb.nutes.haniot.devices; + +import android.content.Intent; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.TextView; + +import com.mikhaellopez.circularprogressbar.CircularProgressBar; + +import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.activity.AddMeasurementActivity; +import br.edu.uepb.nutes.haniot.activity.charts.BloodPresssureChartActivity; +import br.edu.uepb.nutes.haniot.adapter.BloodPressureAdapter; +import br.edu.uepb.nutes.haniot.adapter.base.BaseAdapter; +import br.edu.uepb.nutes.haniot.data.model.ItemGridType; +import br.edu.uepb.nutes.haniot.data.model.Measurement; +import br.edu.uepb.nutes.haniot.data.model.MeasurementType; +import br.edu.uepb.nutes.haniot.devices.base.BaseDeviceActivity; +import br.edu.uepb.nutes.haniot.utils.DateUtils; +import butterknife.BindView; + +public class BloodPressureActivity extends BaseDeviceActivity { + private final String TAG = "PressureActivity"; + + @BindView(R.id.unit_blood_pressure_textviewt) + TextView mUnitBloodPressureTextView; + + @BindView(R.id.blood_pressure_dia_textviewt) + TextView mBloodPressureDiaTextView; + + @BindView(R.id.blood_pressure_sys_textviewt) + TextView mBloodPressureSysTextView; + + @BindView(R.id.blood_pressure_pulse_textviewt) + TextView mBloodPressurePulseTextView; + + @BindView(R.id.unit_pulse_textviewt) + TextView mUnitPulseTextView; + + @BindView(R.id.blood_pressure_recyclerviewt) + RecyclerView mRecyclerView; + + @BindView(R.id.view_pulse) + CircularProgressBar mCircularPulseProgressBar; + + /** + * Enable/Disable display messgae no data. + * + * @param visible boolean + */ + protected void toggleNoDataMessage(boolean visible) { + super.toggleNoDataMessage(visible); + if (visible) { + mUnitBloodPressureTextView.setText(""); + mBloodPressureDiaTextView.setText(""); + mBloodPressureSysTextView.setText(""); + mBloodPressurePulseTextView.setText(""); + mUnitPulseTextView.setText(""); + } else { + mUnitPulseTextView.setText(getString(R.string.unit_per_minutes)); + } + } + + @Override + protected String getMeasurementType() { + return MeasurementType.BLOOD_PRESSURE; + } + + @Override + protected int getLayout() { + return R.layout.activity_blood_pressure; + } + + @Override + protected RecyclerView getRecyclerView() { + return mRecyclerView; + } + + @Override + protected BaseAdapter getAdapter() { + return new BloodPressureAdapter(this); + } + + @Override + protected String getTitleActivity() { + return getString(R.string.blood_pressure); + } + + @Override + protected String getTag() { + return TAG; + } + +// +// @Override +// protected void toggleNoDataMessage(boolean visible) { +// super.toggleNoDataMessage(visible); +// if (visible) { +// +// } +// } + + protected void updateConnectionState() { + super.updateConnectionState(); + + runOnUiThread(() -> { + mCircularPulseProgressBar.setProgress(0); + mCircularPulseProgressBar.setProgressWithAnimation(100); // Default animate duration = 1500ms + + if (mConnected) { + mCircularPulseProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); + mCircularPulseProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorButtonDanger)); + } else { + mCircularPulseProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorButtonDanger)); + mCircularPulseProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); + } + }); + } + + /** + * Convert value glucose for String. + * + * @param measurement + * @return String + */ + public String valueToString(Measurement measurement) { + String value_formated = ""; + double value = measurement.getValue(); + + if (measurement.getUnit().equals("kg/L")) { + measurement.setUnit(getString(R.string.unit_glucose_mg_dL)); + value = value * 100000; + } + + if (value > 600) { + value_formated = "HI"; // The blood glucose value may be above the reading range of the system. + } else if (value < 0) { + value_formated = "LO"; // The blood glucose value may be below the reading range of the system. + } else { + value_formated = String.format("%02d", (int) value); + } + return value_formated; + } + + /** + * updateOrSave the UI with the last measurement. + * + * @param measurement {@link Measurement} + */ + protected void updateUILastMeasurement(Measurement measurement, boolean applyAnimation) { + if (measurement == null) return; + + runOnUiThread(() -> { + mUnitBloodPressureTextView.setText(measurement.getUnit()); + mBloodPressureDiaTextView.setText(String.valueOf(measurement.getDiastolic())); + mBloodPressureSysTextView.setText(String.valueOf(measurement.getSystolic()).concat("/")); + + mBloodPressurePulseTextView.setText(String.valueOf(measurement.getPulse())); + + String timeStamp = measurement.getTimestamp(); + + if (DateUtils.isToday(DateUtils.convertDateTime(timeStamp).getTime())) { + mDateLastMeasurement.setText(R.string.today_text); + } else { + mDateLastMeasurement.setText(DateUtils.convertDateTimeUTCToLocale( + timeStamp, "MMMM dd, EEE" + )); + } + + if (applyAnimation) { + mBloodPressureDiaTextView.startAnimation(animation); + mBloodPressureSysTextView.startAnimation(animation); + mBloodPressurePulseTextView.startAnimation(animation); + } + }); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.chart_floating_button: + startActivity(new Intent(getApplicationContext(), BloodPresssureChartActivity.class)); + break; + case R.id.add_floating_button: + Intent it = new Intent(getApplicationContext(), AddMeasurementActivity.class); + appPreferencesHelper.saveInt(getResources().getString(R.string.measurementType), ItemGridType.BLOOD_PRESSURE); + startActivity(it); + break; + } + } +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/GlucoseActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/GlucoseActivity.java index 559c1830..b32b15d8 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/GlucoseActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/GlucoseActivity.java @@ -1,64 +1,29 @@ package br.edu.uepb.nutes.haniot.devices; -import android.Manifest; -import android.app.Activity; import android.app.ProgressDialog; -import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothProfile; -import android.content.BroadcastReceiver; -import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.util.Log; import android.view.Menu; -import android.view.MenuItem; import android.view.View; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; - -import com.github.clans.fab.FloatingActionButton; -import com.mikhaellopez.circularprogressbar.CircularProgressBar; import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.activity.AddMeasurementActivity; +import br.edu.uepb.nutes.haniot.activity.charts.GlucoseChartActivity; import br.edu.uepb.nutes.haniot.adapter.GlucoseAdapter; -import br.edu.uepb.nutes.haniot.adapter.base.OnRecyclerViewListener; -import br.edu.uepb.nutes.haniot.data.model.Device; +import br.edu.uepb.nutes.haniot.adapter.base.BaseAdapter; import br.edu.uepb.nutes.haniot.data.model.DeviceType; import br.edu.uepb.nutes.haniot.data.model.ItemGridType; import br.edu.uepb.nutes.haniot.data.model.Measurement; import br.edu.uepb.nutes.haniot.data.model.MeasurementType; -import br.edu.uepb.nutes.haniot.data.model.Patient; -import br.edu.uepb.nutes.haniot.data.model.dao.DeviceDAO; -import br.edu.uepb.nutes.haniot.data.model.dao.MeasurementDAO; -import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; +import br.edu.uepb.nutes.haniot.devices.base.BaseDeviceActivity; import br.edu.uepb.nutes.haniot.service.ManagerDevices.GlucoseManager; import br.edu.uepb.nutes.haniot.service.ManagerDevices.callback.BloodGlucoseDataCallback; -import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import br.edu.uepb.nutes.haniot.utils.DateUtils; import butterknife.BindView; -import butterknife.ButterKnife; /** * Activity to capture the glucose data. @@ -67,36 +32,8 @@ * @version 1.2 * @copyright Copyright (c) 2017, NUTES UEPB */ -public class GlucoseActivity extends AppCompatActivity implements View.OnClickListener { +public class GlucoseActivity extends BaseDeviceActivity { private final String TAG = "GlucoseActivity"; - private final int REQUEST_ENABLE_BLUETOOTH = 1; - private final int REQUEST_ENABLE_LOCATION = 2; - private final int LIMIT_PER_PAGE = 20; - private final int INITIAL_PAGE = 1; - - private boolean mConnected = false; - - private Animation animation; - private Device mDevice; - private AppPreferencesHelper appPreferencesHelper; - private MeasurementDAO measurementDAO; - private DeviceDAO deviceDAO; - private GlucoseAdapter mAdapter; - private GlucoseManager glucoseManager; - - private Patient patient; - private HaniotNetRepository haniotNetRepository; - private int page = INITIAL_PAGE; - - /** - * We need this variable to lock and unlock loading more. - * We should not charge more when a request has already been made. - * The load will be activated when the requisition is completed. - */ - private boolean itShouldLoadMore = true; - - @BindView(R.id.toolbar) - Toolbar mToolbar; @BindView(R.id.glucose_textview) TextView mBloodGlucoseTextView; @@ -104,99 +41,34 @@ public class GlucoseActivity extends AppCompatActivity implements View.OnClickLi @BindView(R.id.unit_glucose_textview) TextView mUnitBloodGlucoseTextView; - @BindView(R.id.date_last_measurement_textView) - TextView mDateLastMeasurement; - - @BindView(R.id.no_data_textView) - TextView noDataMessage; - - @BindView(R.id.box_bar_layout) - AppBarLayout mAppBarLayout; - - @BindView(R.id.view_circle) - CircularProgressBar mCircularProgressBar; - - @BindView(R.id.collapsi_toolbar) - CollapsingToolbarLayout mCollapsingToolbarLayout; - @BindView(R.id.glucose_recyclerview) RecyclerView mRecyclerView; - @BindView(R.id.data_swiperefresh) - SwipeRefreshLayout mDataSwipeRefresh; - - @BindView(R.id.chart_floating_button) - FloatingActionButton mChartButton; - - @BindView(R.id.add_floating_button) - FloatingActionButton mAddButton; - private ProgressDialog progressDialog; - private boolean isGetAllMonitor; - @BindView(R.id.box_measurement) - RelativeLayout boxMeasurement; + private boolean isGetAllMonitor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_glucose); - ButterKnife.bind(this); - checkPermissions(); - - appPreferencesHelper = AppPreferencesHelper.getInstance(this); - - measurementDAO = MeasurementDAO.getInstance(this); - deviceDAO = DeviceDAO.getInstance(this); - glucoseManager = new GlucoseManager(this); - glucoseManager.setSimpleCallback(glucoseDataCallback); - - animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.blink); - mChartButton.setOnClickListener(this); - mAddButton.setOnClickListener(this); - - patient = appPreferencesHelper.getLastPatient(); - haniotNetRepository = HaniotNetRepository.getInstance(this); - - if (isTablet(this)) { - Log.i(TAG, "is tablet"); - boxMeasurement.getLayoutParams().height = 600; - mCollapsingToolbarLayout.getLayoutParams().height = 630; - boxMeasurement.requestLayout(); - mCollapsingToolbarLayout.requestLayout(); - } - - mDevice = deviceDAO.getByType(appPreferencesHelper.getUserLogged().get_id(), DeviceType.GLUCOMETER); - - initComponents(); - IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); - registerReceiver(mReceiver, filter); - } + manager = new GlucoseManager(this); + ((GlucoseManager) manager).setSimpleCallback(glucoseDataCallback); - /** - * Check if is tablet. - * - * @param context - * @return - */ - public static boolean isTablet(Context context) { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) - >= Configuration.SCREENLAYOUT_SIZE_LARGE; + mDevice = deviceDAO.getByType(appPreferencesHelper.getUserLogged().get_id(), DeviceType.GLUCOMETER); } private BloodGlucoseDataCallback glucoseDataCallback = new BloodGlucoseDataCallback() { @Override public void onConnected(@androidx.annotation.NonNull BluetoothDevice device) { mConnected = true; - updateConnectionState(true); + updateConnectionState(); } @Override public void onDisconnected(@androidx.annotation.NonNull BluetoothDevice device) { mConnected = false; - updateConnectionState(false); + updateConnectionState(); } @Override @@ -209,262 +81,24 @@ public void onMeasurementReceived(@NonNull BluetoothDevice device, int glucose, // if (mDevice != null) measurement.setDeviceId(mDevice.get_id()); measurement.setUserId(patient.get_id()); + synchronizeWithServer(measurement); updateUILastMeasurement(measurement, true); } }; - - /** - * Initialize components - */ - private void initComponents() { - initToolBar(); - initRecyclerView(); - initDataSwipeRefresh(); - } - - /** - * Initialize ToolBar - */ - private void initToolBar() { - setSupportActionBar(mToolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setDisplayShowTitleEnabled(false); - - mCollapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent)); - mCollapsingToolbarLayout.setCollapsedTitleTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorTextDark)); - - mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { - boolean isShow = false; - int scrollRange = -1; - - @Override - public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - if (scrollRange == -1) - scrollRange = appBarLayout.getTotalScrollRange(); - - if (scrollRange + verticalOffset == 0) { - mCollapsingToolbarLayout.setTitle(getString(R.string.glucose)); - isShow = true; - } else if (isShow) { - mCollapsingToolbarLayout.setTitle(""); - isShow = false; - } - } - }); - } - - /** - * Init RecyclerView - */ - private void initRecyclerView() { - mAdapter = new GlucoseAdapter(this); - mRecyclerView.setHasFixedSize(true); - mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); - mRecyclerView.setItemAnimator(new DefaultItemAnimator()); - - mAdapter.setListener(new OnRecyclerViewListener() { - @Override - public void onItemClick(Measurement item) { - } - - @Override - public void onLongItemClick(View v, Measurement item) { - } - - @Override - public void onMenuContextClick(View v, Measurement item) { - } - }); - - mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - if (dy > 0) { - // Recycle view scrolling downwards... - // this if statement detects when user reaches the end of recyclerView, this is only time we should load more - if (!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)) { - // here we are now allowed to load more, but we need to be careful - // we must check if itShouldLoadMore variable is true [unlocked] - if (itShouldLoadMore) loadData(false); - } - } - } - }); - mRecyclerView.setAdapter(mAdapter); - } - - /** - * Initialize SwipeRefresh - */ - private void initDataSwipeRefresh() { - mDataSwipeRefresh.setOnRefreshListener(() -> { - if (itShouldLoadMore) loadData(true); - }); - } - - /** - * Load data from the local database. - * It should only be called when there is no internet connection or - * when an error occurs on the first request with the server. - */ - private void loadDataLocal() { - mAdapter.addItems(measurementDAO.list(MeasurementType.BLOOD_GLUCOSE, - patient.get_id(), 0, 100)); - - if (!mAdapter.itemsIsEmpty()) { - updateUILastMeasurement(mAdapter.getFirstItem(), false); - } else { - toggleNoDataMessage(true); // Enable message no data - } - toggleLoading(false); - } - - /** - * Load data. - * If there is no internet connection, we can display the local database. - * Otherwise it displays from the remote server. - * - * @param clearList True if clearList - */ - private void loadData(boolean clearList) { - if (clearList) { - mAdapter.clearItems(); // clear list - page = INITIAL_PAGE; - } - - if (!ConnectionUtils.internetIsEnabled(this)) { - loadDataLocal(); - } else { - DisposableManager.add(haniotNetRepository - .getAllMeasurementsByType(patient.get_id(), - MeasurementType.BLOOD_GLUCOSE, "-timestamp", null, - null, page, LIMIT_PER_PAGE) - .doOnSubscribe(disposable -> { - Log.w(TAG, "loadData - doOnSubscribe"); - toggleLoading(true); - toggleNoDataMessage(false); - }) - .doAfterTerminate(() -> { - Log.w(TAG, "loadData - doAfterTerminate"); - toggleLoading(false); // Disable loading - }) - .subscribe(measurements -> { - Log.w(TAG, "loadData - onResult()"); - if (measurements != null && measurements.size() > 0) { - mAdapter.addItems(measurements); - page++; - itShouldLoadMore = true; - updateUILastMeasurement(mAdapter.getFirstItem(), false); - } else { - toggleLoading(false); - if (mAdapter.itemsIsEmpty()) - toggleNoDataMessage(true); // Enable message no data - itShouldLoadMore = false; - } - }, error -> { - Log.w(TAG, "loadData - onError()"); - if (mAdapter.itemsIsEmpty()) { - printMessage(getString(R.string.error_500)); - } else loadDataLocal(); - } - ) - ); - } - } - - /** - * Enable/Disable display loading data. - * - * @param enabled boolean - */ - private void toggleLoading(boolean enabled) { - runOnUiThread(() -> { - mDataSwipeRefresh.setRefreshing(enabled); - }); - } - /** * Enable/Disable display messgae no data. * * @param visible boolean */ - private void toggleNoDataMessage(boolean visible) { - runOnUiThread(() -> { - if (visible) { - if (!ConnectionUtils.internetIsEnabled(getApplicationContext())) { - noDataMessage.setText(getString(R.string.connect_network_try_again)); - } else { - noDataMessage.setText(getString(R.string.no_data_available)); - } - noDataMessage.setVisibility(View.VISIBLE); - } else { - noDataMessage.setVisibility(View.GONE); - } - }); - } - - /** - * Print Toast Messages. - * - * @param message - */ - private void printMessage(String message) { - runOnUiThread(() -> Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show()); - } - - /** - * @param isConnected - */ - private void updateConnectionState(final boolean isConnected) { - runOnUiThread(() -> { - if (progressDialog != null && !isConnected && isGetAllMonitor) { - isGetAllMonitor = false; - progressDialog.dismiss(); - loadData(true); -// synchronizeWithServer(); - } - mCircularProgressBar.setProgress(0); - mCircularProgressBar.setProgressWithAnimation(100); // Default animate duration = 1500ms - - if (isConnected) { - mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); - mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAlertDanger)); - } else { - mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAlertDanger)); - mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); - } - }); - } - - @Override - protected void onResume() { - super.onResume(); - loadData(true); - - if (glucoseManager.getConnectionState() == BluetoothProfile.STATE_DISCONNECTED && mDevice != null) - glucoseManager.connectDevice(BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mDevice.getAddress())); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - DisposableManager.dispose(); - unregisterReceiver(mReceiver); - glucoseManager.close(); - - } + protected void toggleNoDataMessage(boolean visible) { + super.toggleNoDataMessage(visible); + if (visible) { + mBloodGlucoseTextView.setText(""); + mUnitBloodGlucoseTextView.setText(""); + } else { - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - glucoseManager.disconnect(); - super.onBackPressed(); - break; } - return super.onOptionsItemSelected(item); } @Override @@ -517,7 +151,7 @@ public String valueToString(Measurement measurement) { * * @param measurement {@link Measurement} */ - private void updateUILastMeasurement(Measurement measurement, boolean applyAnimation) { + protected void updateUILastMeasurement(Measurement measurement, boolean applyAnimation) { if (measurement == null) return; runOnUiThread(() -> { @@ -537,119 +171,47 @@ private void updateUILastMeasurement(Measurement measurement, boolean applyAnima }); } - /** - * Performs routine for data synchronization with server. - * - * @param measurement Measurement to save in server - */ - private void synchronizeWithServer(Measurement measurement) { - DisposableManager.add(haniotNetRepository - .saveMeasurement(measurement) - .doAfterSuccess(measurement1 -> { - printMessage(getString(R.string.measurement_save)); - loadData(true); - }) - .subscribe(measurement1 -> { - }, error -> { - Log.w(TAG, error.getMessage()); - printMessage(getString(R.string.error_500)); - })); - } - - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - - if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { - final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, - BluetoothAdapter.ERROR); - if (state == BluetoothAdapter.STATE_OFF) { - printMessage(getString(R.string.bluetooth_disabled)); - } else if (state == BluetoothAdapter.STATE_ON) { -// showMessage(-1); - } - } - } - }; - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.chart_floating_button: -// startActivity(new Intent(getApplicationContext(), GlucoseChartActivity.class)); - break; - case R.id.add_floating_button: - Intent it = new Intent(getApplicationContext(), AddMeasurementActivity.class); - appPreferencesHelper.saveInt(getResources().getString(R.string.measurementType), ItemGridType.BLOOD_GLUCOSE); - startActivity(it); - break; - } + protected String getMeasurementType() { + return MeasurementType.BLOOD_GLUCOSE; } - /** - * Checks if you have permission to use. - * Required bluetooth ble and location. - */ - public void checkPermissions() { - if (BluetoothAdapter.getDefaultAdapter() != null && - !BluetoothAdapter.getDefaultAdapter().isEnabled()) { - requestBluetoothEnable(); - } else if (!hasLocationPermissions()) { - requestLocationPermission(); - } + @Override + protected int getLayout() { + return R.layout.activity_glucose; } - /** - * Request Bluetooth permission - */ - private void requestBluetoothEnable() { - startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), - REQUEST_ENABLE_BLUETOOTH); + @Override + protected RecyclerView getRecyclerView() { + return mRecyclerView; } - /** - * Checks whether the location permission was given. - * - * @return boolean - */ - public boolean hasLocationPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == - PackageManager.PERMISSION_GRANTED; - } - return true; + @Override + protected BaseAdapter getAdapter() { + return new GlucoseAdapter(this); } - /** - * Request Location permission. - */ - protected void requestLocationPermission() { - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_ENABLE_LOCATION); + @Override + protected String getTitleActivity() { + return getString(R.string.glucose); } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - // If request is cancelled, the result arrays are empty. - if ((requestCode == REQUEST_ENABLE_LOCATION) && - (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED)) { - requestLocationPermission(); - } + protected String getTag() { + return TAG; } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_ENABLE_BLUETOOTH) { - if (resultCode != Activity.RESULT_OK) { - requestBluetoothEnable(); - } else { - requestLocationPermission(); - } + public void onClick(View v) { + switch (v.getId()) { + case R.id.chart_floating_button: + startActivity(new Intent(getApplicationContext(), GlucoseChartActivity.class)); + break; + case R.id.add_floating_button: + Intent it = new Intent(getApplicationContext(), AddMeasurementActivity.class); + appPreferencesHelper.saveInt(getResources().getString(R.string.measurementType), ItemGridType.BLOOD_GLUCOSE); + startActivity(it); + break; } - super.onActivityResult(requestCode, resultCode, data); } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/HeartRateActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/HeartRateActivity.java index c269ed7b..9f59851c 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/HeartRateActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/HeartRateActivity.java @@ -1,68 +1,35 @@ package br.edu.uepb.nutes.haniot.devices; -import android.Manifest; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; -import android.app.Activity; -import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothProfile; -import android.content.BroadcastReceiver; -import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.util.Log; -import android.view.MenuItem; import android.view.View; import android.widget.ImageView; -import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; - -import com.github.clans.fab.FloatingActionButton; -import com.mikhaellopez.circularprogressbar.CircularProgressBar; import java.util.ArrayList; import java.util.List; import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.activity.AddMeasurementActivity; +import br.edu.uepb.nutes.haniot.activity.charts.HeartRateChartActivity; import br.edu.uepb.nutes.haniot.adapter.HeartRateAdapter; -import br.edu.uepb.nutes.haniot.adapter.base.OnRecyclerViewListener; -import br.edu.uepb.nutes.haniot.data.model.Device; +import br.edu.uepb.nutes.haniot.adapter.base.BaseAdapter; import br.edu.uepb.nutes.haniot.data.model.DeviceType; import br.edu.uepb.nutes.haniot.data.model.HeartRateItem; import br.edu.uepb.nutes.haniot.data.model.ItemGridType; import br.edu.uepb.nutes.haniot.data.model.Measurement; import br.edu.uepb.nutes.haniot.data.model.MeasurementType; -import br.edu.uepb.nutes.haniot.data.model.Patient; -import br.edu.uepb.nutes.haniot.data.model.dao.DeviceDAO; -import br.edu.uepb.nutes.haniot.data.model.dao.MeasurementDAO; -import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; +import br.edu.uepb.nutes.haniot.devices.base.BaseDeviceActivity; import br.edu.uepb.nutes.haniot.fragment.GenericDialogFragment; import br.edu.uepb.nutes.haniot.service.ManagerDevices.HeartRateManager; import br.edu.uepb.nutes.haniot.service.ManagerDevices.callback.HeartRateDataCallback; -import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import br.edu.uepb.nutes.haniot.utils.DateUtils; import butterknife.BindView; -import butterknife.ButterKnife; /** * Activity to capture the heart rate data. @@ -71,39 +38,13 @@ * @version 1.0 * @copyright Copyright (c) 2017, NUTES UEPB */ -public class HeartRateActivity extends AppCompatActivity implements View.OnClickListener, GenericDialogFragment.OnClickDialogListener { +public class HeartRateActivity extends BaseDeviceActivity implements GenericDialogFragment.OnClickDialogListener { private final String TAG = "HeartRateActivity"; - private final int REQUEST_ENABLE_BLUETOOTH = 1; - private final int REQUEST_ENABLE_LOCATION = 2; public static final String EXTRA_DEVICE_ADDRESS = "device_address"; public static final String EXTRA_DEVICE_INFORMATIONS = "device_informations"; public final int DIALOG_SAVE_DATA = 1; - private final int LIMIT_PER_PAGE = 20; - private final int INITIAL_PAGE = 1; - - private boolean mConnected = false; private ObjectAnimator heartAnimation; - private Device mDevice; - private AppPreferencesHelper appPreferencesHelper; - private MeasurementDAO measurementDAO; - private DeviceDAO deviceDAO; - private HeartRateAdapter mAdapter; - private HeartRateManager heartRateManager; - - private HaniotNetRepository haniotNetRepository; - private Patient patient; - public int page = INITIAL_PAGE; - - /** - * We need this variable to lock and unlock loading more. - * We should not charge more when a request has already been made. - * The load will be activated when the requisition is completed. - */ - private boolean itShouldLoadMore = true; - - @BindView(R.id.toolbar) - Toolbar mToolbar; @BindView(R.id.heart_rate_textview) TextView mHeartRateTextView; @@ -111,84 +52,20 @@ public class HeartRateActivity extends AppCompatActivity implements View.OnClick @BindView(R.id.heart_rate_unit_textview) TextView mUnitHeartRateTextView; - @BindView(R.id.date_last_measurement_textView) - TextView mDateLastMeasurement; - - @BindView(R.id.no_data_textView) - TextView noDataMessage; - - @BindView(R.id.view_circle) - CircularProgressBar mCircularProgressBar; - - @BindView(R.id.collapsi_toolbar) - CollapsingToolbarLayout mCollapsingToolbarLayout; - - @BindView(R.id.box_bar_layout) - AppBarLayout mAppBarLayout; - @BindView(R.id.heart_rate_recyclerview) RecyclerView mRecyclerView; - @BindView(R.id.data_swiperefresh) - SwipeRefreshLayout mDataSwipeRefresh; - - @BindView(R.id.chart_floating_button) - FloatingActionButton mChartButton; - @BindView(R.id.heart_imageview) ImageView mHeartImageView; - @BindView(R.id.add_floating_button) - FloatingActionButton mAddMeasurementButton; - - @BindView(R.id.box_measurement) - RelativeLayout boxMeasurement; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_heart_rate); - ButterKnife.bind(this); - checkPermissions(); - - appPreferencesHelper = AppPreferencesHelper.getInstance(this); - measurementDAO = MeasurementDAO.getInstance(this); - deviceDAO = DeviceDAO.getInstance(this); - heartRateManager = new HeartRateManager(this); - heartRateManager.setSimpleCallback(heartRateDataCallback); - - patient = appPreferencesHelper.getLastPatient(); - haniotNetRepository = HaniotNetRepository.getInstance(this); - - if (isTablet(this)) { - Log.i(TAG, "is tablet"); - boxMeasurement.getLayoutParams().height = 600; - mCollapsingToolbarLayout.getLayoutParams().height = 630; - boxMeasurement.requestLayout(); - mCollapsingToolbarLayout.requestLayout(); - } - - mDevice = deviceDAO.getByType(appPreferencesHelper.getUserLogged().get_id(), DeviceType.HEART_RATE); - - mChartButton.setOnClickListener(this); - mAddMeasurementButton.setOnClickListener(this); - initComponents(); + manager = new HeartRateManager(this); + ((HeartRateManager) manager).setSimpleCallback(heartRateDataCallback); - IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); - registerReceiver(mReceiver, filter); - } - - /** - * Check if is tablet. - * - * @param context - * @return - */ - public static boolean isTablet(Context context) { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) - >= Configuration.SCREENLAYOUT_SIZE_LARGE; + mDevice = deviceDAO.getByType(appPreferencesHelper.getUserLogged().get_id(), DeviceType.HEART_RATE); } HeartRateDataCallback heartRateDataCallback = new HeartRateDataCallback() { @@ -207,37 +84,29 @@ public void onMeasurementReceived(@NonNull BluetoothDevice device, int heartRate // if (mDevice != null) // measurement.setDeviceId(mDevice.get_id()); - /** - * Save in local - * Send to server saved successfully - */ - if (measurementDAO.save(measurement)) { - synchronizeWithServer(measurement); - } + synchronizeWithServer(measurement); updateUILastMeasurement(measurement, true); } @Override public void onConnected(@androidx.annotation.NonNull BluetoothDevice device) { mConnected = true; - updateConnectionState(true); + updateConnectionState(); } @Override public void onDisconnected(@androidx.annotation.NonNull BluetoothDevice device) { mConnected = false; - updateConnectionState(false); + updateConnectionState(); } }; /** * Initialize components */ - private void initComponents() { + protected void initComponents() { initAnimation(); - initToolBar(); - initRecyclerView(); - initDataSwipeRefresh(); + super.initComponents(); } /** @@ -254,247 +123,20 @@ private void initAnimation() { heartAnimation.setRepeatMode(ObjectAnimator.REVERSE); } - /** - * Initialize ToolBar - */ - private void initToolBar() { - setSupportActionBar(mToolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setDisplayShowTitleEnabled(false); - - mCollapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent)); - mCollapsingToolbarLayout.setCollapsedTitleTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorTextDark)); - - mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { - boolean isShow = false; - int scrollRange = -1; - - @Override - public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - if (scrollRange == -1) - scrollRange = appBarLayout.getTotalScrollRange(); - - if (scrollRange + verticalOffset == 0) { - mCollapsingToolbarLayout.setTitle(getString(R.string.heart_rate)); - isShow = true; - } else if (isShow) { - mCollapsingToolbarLayout.setTitle(""); - isShow = false; - } - } - }); - } - - /** - * Init RecyclerView - */ - private void initRecyclerView() { - mAdapter = new HeartRateAdapter(this); - mRecyclerView.setHasFixedSize(true); - mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); - mRecyclerView.setItemAnimator(new DefaultItemAnimator()); - - mAdapter.setListener(new OnRecyclerViewListener() { - @Override - public void onItemClick(Measurement item) { - Log.w(TAG, "onItemClick()"); - } - - @Override - public void onLongItemClick(View v, Measurement item) { - } - - @Override - public void onMenuContextClick(View v, Measurement item) { - } - }); - - mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - if (dy > 0) { - // Recycle view scrolling downwards... - // this if statement detects when user reaches the end of recyclerView, this is only time we should load more - if (!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)) { - // here we are now allowed to load more, but we need to be careful - // we must check if itShouldLoadMore variable is true [unlocked] - if (itShouldLoadMore) loadData(false); - } - } - } - }); - - mRecyclerView.setAdapter(mAdapter); - } - - /** - * Initialize SwipeRefresh - */ - private void initDataSwipeRefresh() { - mDataSwipeRefresh.setOnRefreshListener(() -> { - loadData(true); - }); - } - - /** - * Load data from the local database. - * It should only be called when there is no internet connection or - * when an error occurs on the first request with the server. - */ - private void loadDataLocal() { - //mAdapter.addItems(measurementDAO.list(MeasurementType.HEART_RATE, patient.get_id(), 0, 100)); - - if (!mAdapter.itemsIsEmpty()) { - updateUILastMeasurement(mAdapter.getFirstItem(), false); - } else { - toggleNoDataMessage(true); // Enable message no data - } - toggleLoading(false); - } - - /** - * Load data. - * If there is no internet connection, we can display the local database. - * Otherwise it displays from the remote server. - * - * @param clearList True if clearList - */ - private void loadData(boolean clearList) { - if (clearList) { - mAdapter.clearItems(); // clear list - page = INITIAL_PAGE; - } - - if (!ConnectionUtils.internetIsEnabled(this)) { - loadDataLocal(); - } else { - DisposableManager.add(haniotNetRepository. - getAllMeasurementsByType(patient.get_id(), MeasurementType.HEART_RATE, - "-timestamp", null, null, page, LIMIT_PER_PAGE) - .doOnSubscribe(disposable -> { - Log.w(TAG, "loadData - doOnSubscribe"); - toggleLoading(true); - toggleNoDataMessage(false); - }) - .doAfterTerminate(() -> { - Log.w(TAG, "loadData - doAfterTerminate"); - toggleLoading(false); // Disable loading - }) - .subscribe(measurements -> { - Log.w(TAG, "loadData - onResult()"); - if (measurements != null && measurements.size() > 0) { - mAdapter.addItems(measurements); - page++; - itShouldLoadMore = true; - updateUILastMeasurement(mAdapter.getFirstItem(), false); - } else { - toggleLoading(false); - if (mAdapter.itemsIsEmpty()) - toggleNoDataMessage(true); // Enable message no data - itShouldLoadMore = false; - } - }, error -> { - Log.w(TAG, "loadData - onError()"); - if (mAdapter.itemsIsEmpty()) - printMessage(getString(R.string.error_500)); - else - loadDataLocal(); - })); - } - } - - /** - * Enable/Disable display loading data. - * - * @param enabled boolean - */ - private void toggleLoading(boolean enabled) { - runOnUiThread(() -> { - mDataSwipeRefresh.setRefreshing(enabled); - }); - } - /** * Enable/Disable display messgae no data. * * @param visible boolean */ - private void toggleNoDataMessage(boolean visible) { - runOnUiThread(() -> { - if (visible) { - if (!ConnectionUtils.internetIsEnabled(getApplicationContext())) { - noDataMessage.setText(getString(R.string.connect_network_try_again)); - } else { - noDataMessage.setText(getString(R.string.no_data_available)); - } - noDataMessage.setVisibility(View.VISIBLE); - } else { - noDataMessage.setVisibility(View.GONE); - } - }); - } - - /** - * Print Toast Messages. - * - * @param message - */ - private void printMessage(String message) { - runOnUiThread(() -> Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show()); - } - - @Override - protected void onStart() { - super.onStart(); - if (heartRateManager.getConnectionState() == BluetoothProfile.STATE_DISCONNECTED && mDevice != null) - heartRateManager.connectDevice(BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mDevice.getAddress())); - } - - @Override - protected void onResume() { - super.onResume(); - loadData(true); - - if (heartRateManager.getConnectionState() == BluetoothProfile.STATE_DISCONNECTED && mDevice != null) - heartRateManager.connectDevice(BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mDevice.getAddress())); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - DisposableManager.dispose(); - unregisterReceiver(mReceiver); - heartRateManager.close(); - - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - heartRateManager.disconnect(); - super.onBackPressed(); - break; + protected void toggleNoDataMessage(boolean visible) { + super.toggleNoDataMessage(visible); + if (visible) { + mHeartRateTextView.setText(""); + mUnitHeartRateTextView.setText(""); + mHeartImageView.setVisibility(View.GONE); + } else { + mHeartImageView.setVisibility(View.VISIBLE); } - return super.onOptionsItemSelected(item); - } - - private void updateConnectionState(final boolean isConnected) { - runOnUiThread(() -> { - mCircularProgressBar.setProgress(0); - mCircularProgressBar.setProgressWithAnimation(100); // Default animate duration = 1500ms - - if (isConnected) { - heartAnimation.start(); - mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); - mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAlertDanger)); - } else { - heartAnimation.pause(); - mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAlertDanger)); - mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); - } - }); } /** @@ -502,11 +144,11 @@ private void updateConnectionState(final boolean isConnected) { * * @param measurement {@link Measurement} */ - private void updateUILastMeasurement(Measurement measurement, boolean applyAnimation) { + protected void updateUILastMeasurement(Measurement measurement, boolean applyAnimation) { if (measurement == null) return; runOnUiThread(() -> { - if(measurement.getDataset() != null && measurement.getDataset().isEmpty()) return; + if (measurement.getDataset() != null && measurement.getDataset().isEmpty()) return; mHeartRateTextView.setText(String.format("%03d", (int) measurement.getDataset().get(0).getValue())); mUnitHeartRateTextView.setText(measurement.getUnit()); @@ -521,49 +163,44 @@ private void updateUILastMeasurement(Measurement measurement, boolean applyAnima } mHeartImageView.setVisibility(View.VISIBLE); }); + if (applyAnimation) mHeartRateTextView.startAnimation(animation); } - /** - * Performs routine for data synchronization with server. - * - * @param measurement Measurement to save in server - */ - private void synchronizeWithServer(Measurement measurement) { - DisposableManager.add(haniotNetRepository - .saveMeasurement(measurement) - .doAfterSuccess(measurement1 -> { - printMessage(getString(R.string.measurement_save)); - loadData(true); - }) - .subscribe(measurement1 -> { - }, error -> { - Log.w(TAG, error.getMessage()); - printMessage(getString(R.string.error_500)); - })); + @Override + protected String getMeasurementType() { + return MeasurementType.HEART_RATE; } - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - - if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { - final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, - BluetoothAdapter.ERROR); - if (state == BluetoothAdapter.STATE_OFF) { - printMessage(getString(R.string.bluetooth_disabled)); - } else if (state == BluetoothAdapter.STATE_ON) { -// showMessage(-1); - } - } - } - }; + @Override + protected int getLayout() { + return R.layout.activity_heart_rate; + } + + @Override + protected RecyclerView getRecyclerView() { + return mRecyclerView; + } + + @Override + protected BaseAdapter getAdapter() { + return new HeartRateAdapter(this); + } + + @Override + protected String getTitleActivity() { + return getString(R.string.heart_rate); + } + + @Override + protected String getTag() { + return TAG; + } @Override public void onClick(View view) { switch (view.getId()) { case R.id.chart_floating_button: -// startActivity(new Intent(getApplicationContext(), HeartRateChartActivity.class)); + startActivity(new Intent(getApplicationContext(), HeartRateChartActivity.class)); break; case R.id.add_floating_button: Intent it = new Intent(getApplicationContext(), AddMeasurementActivity.class); @@ -594,71 +231,4 @@ public void onClickDialog(int id, int button) { // } // } } - - /** - * Checks if you have permission to use. - * Required bluetooth ble and location. - */ - public void checkPermissions() { - if (BluetoothAdapter.getDefaultAdapter() != null && - !BluetoothAdapter.getDefaultAdapter().isEnabled()) { - requestBluetoothEnable(); - } else if (!hasLocationPermissions()) { - requestLocationPermission(); - } - } - - /** - * Request Bluetooth permission - */ - private void requestBluetoothEnable() { - startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), - REQUEST_ENABLE_BLUETOOTH); - } - - /** - * Checks whether the location permission was given. - * - * @return boolean - */ - public boolean hasLocationPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == - PackageManager.PERMISSION_GRANTED; - } - return true; - } - - /** - * Request Location permission. - */ - protected void requestLocationPermission() { - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_ENABLE_LOCATION); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - // If request is cancelled, the result arrays are empty. - if ((requestCode == REQUEST_ENABLE_LOCATION) && - (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED)) { - requestLocationPermission(); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_ENABLE_BLUETOOTH) { - if (resultCode != Activity.RESULT_OK) { - requestBluetoothEnable(); - } else { - requestLocationPermission(); - } - } - super.onActivityResult(requestCode, resultCode, data); - } - } \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/ScaleActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/ScaleActivity.java index 19429022..b037bea9 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/ScaleActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/ScaleActivity.java @@ -1,69 +1,30 @@ package br.edu.uepb.nutes.haniot.devices; -import android.Manifest; -import android.app.Activity; -import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothProfile; -import android.content.BroadcastReceiver; -import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.nfc.Tag; -import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; import android.util.Log; -import android.view.MenuItem; import android.view.View; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; - -import com.github.clans.fab.FloatingActionButton; -import com.mikhaellopez.circularprogressbar.CircularProgressBar; - -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.util.Locale; import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.activity.AddMeasurementActivity; +import br.edu.uepb.nutes.haniot.activity.charts.BodyCompositionChartActivity; import br.edu.uepb.nutes.haniot.adapter.BodyCompositionAdapter; -import br.edu.uepb.nutes.haniot.adapter.base.OnRecyclerViewListener; +import br.edu.uepb.nutes.haniot.adapter.base.BaseAdapter; import br.edu.uepb.nutes.haniot.data.model.BodyFat; -import br.edu.uepb.nutes.haniot.data.model.Device; import br.edu.uepb.nutes.haniot.data.model.DeviceType; import br.edu.uepb.nutes.haniot.data.model.ItemGridType; import br.edu.uepb.nutes.haniot.data.model.Measurement; import br.edu.uepb.nutes.haniot.data.model.MeasurementType; -import br.edu.uepb.nutes.haniot.data.model.Patient; -import br.edu.uepb.nutes.haniot.data.model.dao.DeviceDAO; -import br.edu.uepb.nutes.haniot.data.model.dao.MeasurementDAO; -import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; -import br.edu.uepb.nutes.haniot.fragment.MeasurementsGridFragment; +import br.edu.uepb.nutes.haniot.devices.base.BaseDeviceActivity; import br.edu.uepb.nutes.haniot.service.ManagerDevices.ScaleManager; import br.edu.uepb.nutes.haniot.service.ManagerDevices.callback.ScaleDataCallback; -import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import br.edu.uepb.nutes.haniot.utils.DateUtils; import butterknife.BindView; -import butterknife.ButterKnife; /** * Activity to capture the balance data. @@ -72,37 +33,8 @@ * @version 1.0 * @copyright Copyright (c) 2017, NUTES UEPB */ -public class ScaleActivity extends AppCompatActivity implements View.OnClickListener { +public class ScaleActivity extends BaseDeviceActivity { private final String TAG = "ScaleActivity"; - private final int REQUEST_ENABLE_BLUETOOTH = 1; - private final int REQUEST_ENABLE_LOCATION = 2; - private final int LIMIT_PER_PAGE = 20; - private final int INITIAL_PAGE = 1; - - private boolean mConnected = false; - private boolean showAnimation = true; - private Animation animation; - private Device mDevice; - private AppPreferencesHelper appPreferencesHelper; - private MeasurementDAO measurementDAO; - private DeviceDAO deviceDAO; - private DecimalFormat decimalFormat; - private BodyCompositionAdapter mAdapter; - private ScaleManager scaleManager; - - private HaniotNetRepository haniotNetRepository; - private Patient patient; - private int page = INITIAL_PAGE; - - /** - * We need this variable to lock and unlock loading more. - * We should not charge more when a request has already been made. - * The load will be activated when the requisition is completed. - */ - private boolean itShouldLoadMore = true; - - @BindView(R.id.toolbar) - Toolbar mToolbar; @BindView(R.id.body_mass_textview) TextView bodyMassTextView; @@ -125,81 +57,27 @@ public class ScaleActivity extends AppCompatActivity implements View.OnClickList @BindView(R.id.bmi_textview) TextView bmiTextView; - @BindView(R.id.date_last_measurement_textView) - TextView mDateLastMeasurement; - - @BindView(R.id.no_data_textView) - TextView noDataMessage; - - @BindView(R.id.view_circle) - CircularProgressBar mCircularProgressBar; - - @BindView(R.id.collapsi_toolbar) - CollapsingToolbarLayout mCollapsingToolbarLayout; - - @BindView(R.id.box_bar_layout) - AppBarLayout mAppBarLayout; - @BindView(R.id.body_composition_recyclerview) RecyclerView mRecyclerView; - @BindView(R.id.data_swiperefresh) - SwipeRefreshLayout mDataSwipeRefresh; - - @BindView(R.id.chart_floating_button) - FloatingActionButton mChartButton; - - @BindView(R.id.add_floating_button) - FloatingActionButton mAddButton; - - @BindView(R.id.box_measurement) - RelativeLayout boxMeasurement; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_body_composition); - ButterKnife.bind(this); - checkPermissions(); - scaleManager = new ScaleManager(this); - - appPreferencesHelper = AppPreferencesHelper.getInstance(this); - measurementDAO = MeasurementDAO.getInstance(this); - deviceDAO = DeviceDAO.getInstance(this); - decimalFormat = new DecimalFormat(getString(R.string.format_number2), new DecimalFormatSymbols(Locale.US)); - - animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.blink); - mChartButton.setOnClickListener(this); - mAddButton.setOnClickListener(this); - - haniotNetRepository = HaniotNetRepository.getInstance(this); - patient = appPreferencesHelper.getLastPatient(); + manager = new ScaleManager(this); mDevice = deviceDAO.getByType(appPreferencesHelper.getUserLogged().get_id(), DeviceType.BODY_COMPOSITION); + } - if (isTablet(this)) { - Log.i(TAG, "is tablet"); - boxMeasurement.getLayoutParams().height = 600; - mCollapsingToolbarLayout.getLayoutParams().height = 630; - boxMeasurement.requestLayout(); - mCollapsingToolbarLayout.requestLayout(); - } - initComponents(); - - IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); - registerReceiver(mReceiver, filter); + @Override + protected void onResume() { + ((ScaleManager) manager).setSimpleCallback(scaleDataCallback); + super.onResume(); } - /** - * Check if is tablet. - * - * @param context - * @return - */ - public static boolean isTablet(Context context) { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) - >= Configuration.SCREENLAYOUT_SIZE_LARGE; + @Override + protected void onPause() { + ((ScaleManager) manager).setSimpleCallback(null); + super.onPause(); } /** @@ -236,10 +114,6 @@ public void onMeasurementReceived(@NonNull BluetoothDevice device, double bodyMa // if (mDevice != null) // measurement.setDeviceId(mDevice.get_id()); - /** - * Save in local - * Send to server saved successfully - */ if (bodyMass > 0) { synchronizeWithServer(measurement); updateUILastMeasurement(measurement, true); @@ -249,183 +123,44 @@ public void onMeasurementReceived(@NonNull BluetoothDevice device, double bodyMa @Override public void onConnected(@androidx.annotation.NonNull BluetoothDevice device) { mConnected = true; - updateConnectionState(true); + updateConnectionState(); } @Override public void onDisconnected(@androidx.annotation.NonNull BluetoothDevice device) { mConnected = false; - updateConnectionState(false); + updateConnectionState(); } }; - /** - * Initialize components - */ - private void initComponents() { - initToolBar(); - initRecyclerView(); - initDataSwipeRefresh(); - } - - - private void initToolBar() { - setSupportActionBar(mToolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setDisplayShowTitleEnabled(false); - - mCollapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent)); - mCollapsingToolbarLayout.setCollapsedTitleTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorTextDark)); - - mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { - boolean isShow = false; - int scrollRange = -1; - - @Override - public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - if (scrollRange == -1) { - scrollRange = appBarLayout.getTotalScrollRange(); - } - if (scrollRange + verticalOffset == 0) { - mCollapsingToolbarLayout.setTitle(getString(R.string.body_weight_scale)); - isShow = true; - } else if (isShow) { - mCollapsingToolbarLayout.setTitle(""); - isShow = false; - } - } - }); + @Override + protected String getTitleActivity() { + return getString(R.string.body_weight_scale); } - /** - * Init RecyclerView - */ - private void initRecyclerView() { - mAdapter = new BodyCompositionAdapter(this); - mRecyclerView.setHasFixedSize(true); - mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); - mRecyclerView.setItemAnimator(new DefaultItemAnimator()); - - mAdapter.setListener(new OnRecyclerViewListener() { - @Override - public void onItemClick(Measurement item) { - Log.w(TAG, "onItemClick()"); - } - - @Override - public void onLongItemClick(View v, Measurement item) { - } - - @Override - public void onMenuContextClick(View v, Measurement item) { - } - }); - - mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - if (dy > 0) { - // Recycle view scrolling downwards... - // this if statement detects when user reaches the end of recyclerView, this is only time we should load more - if (!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)) { - // here we are now allowed to load more, but we need to be careful - // we must check if itShouldLoadMore variable is true [unlocked] - if (itShouldLoadMore) loadData(false); - } - } - } - }); - mRecyclerView.setAdapter(mAdapter); + @Override + protected BaseAdapter getAdapter() { + return new BodyCompositionAdapter(this); } - /** - * Initialize SwipeRefresh - */ - private void initDataSwipeRefresh() { - mDataSwipeRefresh.setOnRefreshListener(() -> { - loadData(true); - }); + @Override + protected RecyclerView getRecyclerView() { + return mRecyclerView; } - /** - * Load data from the local database. - * It should only be called when there is no internet connection or - * when an error occurs on the first request with the server. - */ - private void loadDataLocal() { - page = INITIAL_PAGE; // returns to initial page - mAdapter.addItems(measurementDAO.list(MeasurementType.BODY_MASS, patient.get_id(), 0, 100)); - - if (!mAdapter.itemsIsEmpty()) { - updateUILastMeasurement(mAdapter.getFirstItem(), false); - } else { - toggleNoDataMessage(true); // Enable message no data - } - toggleLoading(false); + @Override + public String getTag() { + return TAG; } - /** - * Load data. - * If there is no internet connection, we can display the local database. - * Otherwise it displays from the remote server. - * - * @param clearList True if clearList - */ - private void loadData(boolean clearList) { - if (clearList) { - page = INITIAL_PAGE; - mAdapter.clearItems(); - } - - if (!ConnectionUtils.internetIsEnabled(this)) { - loadDataLocal(); - } else { - DisposableManager.add(haniotNetRepository - .getAllMeasurementsByType(patient.get_id(), - MeasurementType.BODY_MASS, "-timestamp", - null, null, page, LIMIT_PER_PAGE) - .doOnSubscribe(disposable -> { - Log.w(TAG, "loadData - doOnSubscribe"); - toggleLoading(true); - toggleNoDataMessage(false); - }) - .doAfterTerminate(() -> { - Log.w(TAG, "loadData - doAfterTerminate"); - toggleLoading(false); // Disable loading - }) - .subscribe(measurements -> { - Log.w(TAG, "loadData - onResult()"); - if (measurements != null && measurements.size() > 0) { - mAdapter.addItems(measurements); - itShouldLoadMore = true; - if (page == INITIAL_PAGE) { - updateUILastMeasurement(mAdapter.getFirstItem(), false); - } - page++; - } else { - toggleLoading(false); - if (mAdapter.itemsIsEmpty()) - toggleNoDataMessage(true); // Enable message no data - itShouldLoadMore = false; - } - }, erro -> { - Log.w(TAG, "loadData - onError()"); - if (mAdapter.itemsIsEmpty()) printMessage(getString(R.string.error_500)); - else loadDataLocal(); - })); - } + @Override + protected int getLayout() { + return R.layout.activity_body_composition; } - /** - * Enable/Disable display loading data. - * - * @param enabled boolean - */ - private void toggleLoading(boolean enabled) { - runOnUiThread(() -> { - mDataSwipeRefresh.setRefreshing(enabled); - }); + @Override + protected String getMeasurementType() { + return MeasurementType.BODY_MASS; } /** @@ -433,87 +168,20 @@ private void toggleLoading(boolean enabled) { * * @param visible boolean */ - private void toggleNoDataMessage(boolean visible) { - runOnUiThread(() -> { - if (visible) { - if (!ConnectionUtils.internetIsEnabled(getApplicationContext())) { - noDataMessage.setText(getString(R.string.connect_network_try_again)); - } else { - noDataMessage.setText(getString(R.string.no_data_available)); - } - noDataMessage.setVisibility(View.VISIBLE); - } else { - noDataMessage.setVisibility(View.GONE); - } - }); - } - - /** - * Print Toast Messages. - * - * @param message - */ - private void printMessage(String message) { - runOnUiThread(() -> Toast.makeText(this, message, Toast.LENGTH_LONG).show()); - } - - @Override - protected void onResume() { - scaleManager.setSimpleCallback(scaleDataCallback); - loadData(true); - - if (mDevice != null) - scaleManager.connect(BluetoothAdapter.getDefaultAdapter() - .getRemoteDevice(mDevice.getAddress())).useAutoConnect(true).enqueue(); - - if (scaleManager.getConnectionState() != BluetoothProfile.STATE_CONNECTED && mDevice != null) { - scaleManager.connect(BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mDevice.getAddress())); - } - super.onResume(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - DisposableManager.dispose(); - unregisterReceiver(mReceiver); - scaleManager.close(); - Log.w(TAG, "onDestroy"); - } - - @Override - protected void onPause() { - scaleManager.setSimpleCallback(null); - Log.w(TAG, "onPause"); - super.onPause(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - scaleManager.disconnect(); - super.onBackPressed(); - break; - default: - break; + protected void toggleNoDataMessage(boolean visible) { + super.toggleNoDataMessage(visible); + if (visible) { + bodyMassTextView.setText(""); + bodyMassUnitTextView.setText(""); + bodyFatTextView.setText(""); + unitBodyFatTextView.setText(""); + titleBmiTextView.setVisibility(View.GONE); + titleBodyFatTextView.setVisibility(View.GONE); + bmiTextView.setText(""); + } else { + titleBmiTextView.setVisibility(View.VISIBLE); + titleBodyFatTextView.setVisibility(View.VISIBLE); } - return super.onOptionsItemSelected(item); - } - - private void updateConnectionState(final boolean isConnected) { - runOnUiThread(() -> { - mCircularProgressBar.setProgress(0); - mCircularProgressBar.setProgressWithAnimation(100); // Default animate duration = 1500ms - - if (isConnected) { - mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); - mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAlertDanger)); - } else { - mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAlertDanger)); - mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); - } - }); } /** @@ -545,7 +213,7 @@ private String formatNumber(double value) { * * @param measurement {@link Measurement} */ - private void updateUILastMeasurement(Measurement measurement, boolean applyAnimation) { + protected void updateUILastMeasurement(Measurement measurement, boolean applyAnimation) { if (measurement == null) return; runOnUiThread(() -> { @@ -587,48 +255,11 @@ private void updateUILastMeasurement(Measurement measurement, boolean applyAnima }); } - /** - * Performs routine for data synchronization with server. - * - * @param measurement Measurement to save in server - */ - private void synchronizeWithServer(Measurement measurement) { - DisposableManager.add(haniotNetRepository - .saveMeasurement(measurement) - .doAfterSuccess(measurement1 -> { - printMessage(getString(R.string.measurement_save)); - loadData(true); - }) - .subscribe(measurement1 -> { - }, error -> { - measurementDAO.save(measurement); - Log.w(TAG, error.getMessage()); - printMessage(getString(R.string.error_500)); - })); - } - - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - - if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { - final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, - BluetoothAdapter.ERROR); - if (state == BluetoothAdapter.STATE_OFF) { - printMessage(getString(R.string.bluetooth_disabled)); - } else if (state == BluetoothAdapter.STATE_ON) { -// showMessage(-1); - } - } - } - }; - @Override public void onClick(View v) { switch (v.getId()) { case R.id.chart_floating_button: -// startActivity(new Intent(getApplicationContext(), BodyCompositionChartActivity.class)); + startActivity(new Intent(getApplicationContext(), BodyCompositionChartActivity.class)); break; case R.id.add_floating_button: Intent it = new Intent(getApplicationContext(), AddMeasurementActivity.class); @@ -636,74 +267,6 @@ public void onClick(View v) { getResources().getString(R.string.measurementType), ItemGridType.WEIGHT); startActivity(it); break; - default: - break; - } - } - - /** - * Checks if you have permission to use. - * Required bluetooth ble and location. - */ - public void checkPermissions() { - if (BluetoothAdapter.getDefaultAdapter() != null && - !BluetoothAdapter.getDefaultAdapter().isEnabled()) { - requestBluetoothEnable(); - } else if (!hasLocationPermissions()) { - requestLocationPermission(); - } - } - - /** - * Request Bluetooth permission - */ - private void requestBluetoothEnable() { - startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), - REQUEST_ENABLE_BLUETOOTH); - } - - /** - * Checks whether the location permission was given. - * - * @return boolean - */ - public boolean hasLocationPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == - PackageManager.PERMISSION_GRANTED; - } - return true; - } - - /** - * Request Location permission. - */ - protected void requestLocationPermission() { - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_ENABLE_LOCATION); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - // If request is cancelled, the result arrays are empty. - if ((requestCode == REQUEST_ENABLE_LOCATION) && - (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED)) { - requestLocationPermission(); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_ENABLE_BLUETOOTH) { - if (resultCode != Activity.RESULT_OK) { - requestBluetoothEnable(); - } else { - requestLocationPermission(); - } } - super.onActivityResult(requestCode, resultCode, data); } } \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/SmartBandActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/SmartBandActivity.java index 5a8422cd..2fae4a54 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/SmartBandActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/SmartBandActivity.java @@ -238,6 +238,11 @@ public void onLongItemClick(View v, Measurement item) { public void onMenuContextClick(View v, Measurement item) { } + + @Override + public void onItemSwiped(Measurement item, int position) { + + } }); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/ThermometerActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/ThermometerActivity.java index b172da38..f06d9908 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/ThermometerActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/ThermometerActivity.java @@ -1,59 +1,27 @@ package br.edu.uepb.nutes.haniot.devices; -import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothProfile; -import android.content.Context; import android.content.Intent; -import android.content.res.Configuration; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; -import android.support.v4.content.ContextCompat; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.util.Log; -import android.view.MenuItem; import android.view.View; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; - -import com.github.clans.fab.FloatingActionButton; -import com.mikhaellopez.circularprogressbar.CircularProgressBar; - -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.util.Locale; import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.activity.AddMeasurementActivity; +import br.edu.uepb.nutes.haniot.activity.charts.TemperatureChartActivity; import br.edu.uepb.nutes.haniot.adapter.TemperatureAdapter; -import br.edu.uepb.nutes.haniot.adapter.base.OnRecyclerViewListener; -import br.edu.uepb.nutes.haniot.data.model.Device; +import br.edu.uepb.nutes.haniot.adapter.base.BaseAdapter; import br.edu.uepb.nutes.haniot.data.model.DeviceType; import br.edu.uepb.nutes.haniot.data.model.ItemGridType; import br.edu.uepb.nutes.haniot.data.model.Measurement; import br.edu.uepb.nutes.haniot.data.model.MeasurementType; -import br.edu.uepb.nutes.haniot.data.model.Patient; -import br.edu.uepb.nutes.haniot.data.model.dao.DeviceDAO; -import br.edu.uepb.nutes.haniot.data.model.dao.MeasurementDAO; -import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; -import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; +import br.edu.uepb.nutes.haniot.devices.base.BaseDeviceActivity; import br.edu.uepb.nutes.haniot.service.ManagerDevices.ThermometerManager; import br.edu.uepb.nutes.haniot.service.ManagerDevices.callback.TemperatureDataCallback; -import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; import br.edu.uepb.nutes.haniot.utils.DateUtils; import butterknife.BindView; -import butterknife.ButterKnife; /** * Activity to capture the thermometer data. @@ -62,35 +30,8 @@ * @version 1.0 * @copyright Copyright (c) 2017, NUTES UEPB */ -public class ThermometerActivity extends AppCompatActivity implements View.OnClickListener { +public class ThermometerActivity extends BaseDeviceActivity { private final String TAG = "ThermometerActivity"; - private final int LIMIT_PER_PAGE = 20; - private final int INITIAL_PAGE = 1; - - private boolean mConnected = false; - - private Animation animation; - private Device mDevice; - private AppPreferencesHelper appPreferencesHelper; - private MeasurementDAO measurementDAO; - private DeviceDAO deviceDAO; - private DecimalFormat decimalFormat; - private TemperatureAdapter mAdapter; - private ThermometerManager thermometerManager; - - private HaniotNetRepository haniotNetRepository; - private Patient patient; - public int page = INITIAL_PAGE; - - /** - * We need this variable to lock and unlock loading more. - * We should not charge more when a request has already been made. - * The load will be activated when the requisition is completed. - */ - private boolean itShouldLoadMore = true; - - @BindView(R.id.toolbar) - Toolbar mToolbar; @BindView(R.id.temperature_textview) TextView mTemperatureTextView; @@ -98,77 +39,17 @@ public class ThermometerActivity extends AppCompatActivity implements View.OnCli @BindView(R.id.unit_temperature_textview) TextView mUnitTemperatureTextView; - @BindView(R.id.date_last_measurement_textView) - TextView mDateLastMeasurement; - - @BindView(R.id.no_data_textView) - TextView noDataMessage; - - @BindView(R.id.view_circle) - CircularProgressBar mCircularProgressBar; - - @BindView(R.id.collapsi_toolbar) - CollapsingToolbarLayout mCollapsingToolbarLayout; - - @BindView(R.id.box_bar_layout) - AppBarLayout mAppBarLayout; - @BindView(R.id.temperature_recyclerview) RecyclerView mRecyclerView; - @BindView(R.id.data_swiperefresh) - SwipeRefreshLayout mDataSwipeRefresh; - - @BindView(R.id.chart_floating_button) - FloatingActionButton mChartButton; - - @BindView(R.id.add_floating_button) - FloatingActionButton mAddButton; - - @BindView(R.id.box_measurement) - RelativeLayout boxMeasurement; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_thermometer); - ButterKnife.bind(this); - appPreferencesHelper = AppPreferencesHelper.getInstance(this); - measurementDAO = MeasurementDAO.getInstance(this); - deviceDAO = DeviceDAO.getInstance(this); - decimalFormat = new DecimalFormat(getString(R.string.format_number1), new DecimalFormatSymbols(Locale.US)); - thermometerManager = new ThermometerManager(this); - thermometerManager.setSimpleCallback(temperatureDataCallback); - - haniotNetRepository = HaniotNetRepository.getInstance(this); - patient = appPreferencesHelper.getLastPatient(); + manager = new ThermometerManager(this); + ((ThermometerManager) manager).setSimpleCallback(temperatureDataCallback); mDevice = deviceDAO.getByType(appPreferencesHelper.getUserLogged().get_id(), DeviceType.THERMOMETER); - animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.blink); - mChartButton.setOnClickListener(this); - mAddButton.setOnClickListener(this); - - if (isTablet(this)) { - Log.i(TAG, "is tablet"); - boxMeasurement.getLayoutParams().height = 600; - mCollapsingToolbarLayout.getLayoutParams().height = 630; - boxMeasurement.requestLayout(); - mCollapsingToolbarLayout.requestLayout(); - } - initComponents(); - } - - /** - * Check if is tablet. - * - * @param context - * @return - */ - public static boolean isTablet(Context context) { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) - >= Configuration.SCREENLAYOUT_SIZE_LARGE; } private TemperatureDataCallback temperatureDataCallback = new TemperatureDataCallback() { @@ -182,269 +63,62 @@ public void onMeasurementReceived(@NonNull BluetoothDevice device, double temp, measurement.setUserId(patient.get_id()); measurement.setType(MeasurementType.BODY_TEMPERATURE); - // Save in local - // Send to server saved successfully - if (measurementDAO.save(measurement)) { - saveMeasurementInServer(measurement); - } + synchronizeWithServer(measurement); } @Override public void onConnected(@androidx.annotation.NonNull BluetoothDevice device) { mConnected = true; - updateConnectionState(true); + updateConnectionState(); } @Override public void onDisconnected(@androidx.annotation.NonNull BluetoothDevice device) { mConnected = false; - updateConnectionState(false); + updateConnectionState(); } }; - /** - * Initialize components - */ - private void initComponents() { - initToolBar(); - initRecyclerView(); - initDataSwipeRefresh(); - } - - /** - * Initialize ToolBar - */ - private void initToolBar() { - setSupportActionBar(mToolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setDisplayShowTitleEnabled(false); - - mCollapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent)); - mCollapsingToolbarLayout.setCollapsedTitleTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorTextDark)); - - mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { - boolean isShow = false; - int scrollRange = -1; - - @Override - public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - if (scrollRange == -1) - scrollRange = appBarLayout.getTotalScrollRange(); - - if (scrollRange + verticalOffset == 0) { - mCollapsingToolbarLayout.setTitle(getString(R.string.temperature)); - isShow = true; - } else if (isShow) { - mCollapsingToolbarLayout.setTitle(""); - isShow = false; - } - } - }); - } - - /** - * Init RecyclerView - */ - private void initRecyclerView() { - mAdapter = new TemperatureAdapter(this); - mRecyclerView.setHasFixedSize(true); - mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); - mRecyclerView.setItemAnimator(new DefaultItemAnimator()); - - mAdapter.setListener(new OnRecyclerViewListener() { - @Override - public void onItemClick(Measurement item) { - Log.w(TAG, "onItemClick()"); - } - - @Override - public void onLongItemClick(View v, Measurement item) { - } - - @Override - public void onMenuContextClick(View v, Measurement item) { - } - }); - - mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - - if (dy > 0) { - // Recycle view scrolling downwards... - // this if statement detects when user reaches the end of recyclerView, this is only time we should load more - if (!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)) { - // here we are now allowed to load more, but we need to be careful - // we must check if itShouldLoadMore variable is true [unlocked] - if (itShouldLoadMore) loadData(false); - } - } - } - }); - mRecyclerView.setAdapter(mAdapter); - } - - /** - * Initialize SwipeRefresh - */ - private void initDataSwipeRefresh() { - mDataSwipeRefresh.setOnRefreshListener(() -> { - loadData(true); - }); - } - - /** - * Load data from the local database. - * It should only be called when there is no internet connection or - * when an error occurs on the first request with the server. - */ - private void loadDataLocal() { - page = INITIAL_PAGE; // returns to initial page - mAdapter.replace(measurementDAO.list(MeasurementType.BODY_TEMPERATURE, patient.get_id(), 0, 100)); - - if (!mAdapter.itemsIsEmpty()) { - updateUILastMeasurement(mAdapter.getFirstItem(), false); - } else { - toggleNoDataMessage(true); // Enable message no data - } - toggleLoading(false); - } - - /** - * Load data. - * If there is no internet connection, we can display the local database. - * Otherwise it displays from the remote server. - * - * @param clearList True if clearList - */ - private void loadData(boolean clearList) { - if (clearList) { - mAdapter.clearItems(); - page = INITIAL_PAGE; - } - - if (!ConnectionUtils.internetIsEnabled(this)) { - loadDataLocal(); - } else { - DisposableManager.add(haniotNetRepository - .getAllMeasurementsByType(patient.get_id(), - MeasurementType.BODY_TEMPERATURE, "-timestamp", null, - null, page, LIMIT_PER_PAGE) - .doOnSubscribe(disposable -> { - Log.w(TAG, "loadData - doOnSubscribe"); - toggleLoading(true); - toggleNoDataMessage(false); - }) - .doAfterTerminate(() -> { - Log.w(TAG, "loadData - doAfterTerminate"); - toggleLoading(false); // Disable loading - }) - .subscribe(measurements -> { - Log.w(TAG, "loadData - onResult()"); - if (measurements != null && measurements.size() > 0) { - mAdapter.addItems(measurements); - page++; - itShouldLoadMore = true; - updateUILastMeasurement(mAdapter.getFirstItem(), false); - } else { - toggleLoading(false); - if (mAdapter.itemsIsEmpty()) - toggleNoDataMessage(true); // Enable message no data - itShouldLoadMore = false; - } - }, error -> { - Log.w(TAG, "loadData - onError()"); - if (mAdapter.itemsIsEmpty()) { - printMessage(getString(R.string.error_500)); - } else loadDataLocal(); - } - ) - ); - } - } - - - /** - * Enable/Disable display loading data. - * - * @param enabled boolean - */ - private void toggleLoading(boolean enabled) { - runOnUiThread(() -> { - mDataSwipeRefresh.setRefreshing(enabled); - }); - } - /** * Enable/Disable display messgae no data. * * @param visible boolean */ - private void toggleNoDataMessage(boolean visible) { - runOnUiThread(() -> { - if (visible) { - if (!ConnectionUtils.internetIsEnabled(getApplicationContext())) { - noDataMessage.setText(getString(R.string.connect_network_try_again)); - } else { - noDataMessage.setText(getString(R.string.no_data_available)); - } - noDataMessage.setVisibility(View.VISIBLE); - } else { - noDataMessage.setVisibility(View.GONE); - } - }); + protected void toggleNoDataMessage(boolean visible) { + super.toggleNoDataMessage(visible); + if (visible) { + mTemperatureTextView.setText(""); + mUnitTemperatureTextView.setText(""); + } } - - /** - * Print Toast Messages. - * - * @param message - */ - private void printMessage(String message) { - runOnUiThread(() -> Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show()); + @Override + protected String getMeasurementType() { + return MeasurementType.BODY_TEMPERATURE; } @Override - protected void onResume() { - super.onResume(); - loadData(true); - - if (thermometerManager.getConnectionState() == BluetoothProfile.STATE_DISCONNECTED && mDevice != null) - thermometerManager.connectDevice(BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mDevice.getAddress())); + protected int getLayout() { + return R.layout.activity_thermometer; } @Override - protected void onDestroy() { - super.onDestroy(); - DisposableManager.dispose(); - thermometerManager.close(); + protected RecyclerView getRecyclerView() { + return mRecyclerView; } @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - thermometerManager.disconnect(); - super.onBackPressed(); - break; - } - return super.onOptionsItemSelected(item); + protected BaseAdapter getAdapter() { + return new TemperatureAdapter(this); } - private void updateConnectionState(final boolean isConnected) { - runOnUiThread(() -> { - mCircularProgressBar.setProgress(0); - mCircularProgressBar.setProgressWithAnimation(100); // Default animate duration = 1500ms + @Override + protected String getTitleActivity() { + return getString(R.string.temperature); + } - if (isConnected) { - mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); - mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAlertDanger)); - } else { - mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAlertDanger)); - mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); - } - }); + @Override + protected String getTag() { + return TAG; } /** @@ -452,7 +126,7 @@ private void updateConnectionState(final boolean isConnected) { * * @param m {@link Measurement} */ - private void updateUILastMeasurement(Measurement m, boolean applyAnimation) { + protected void updateUILastMeasurement(Measurement m, boolean applyAnimation) { if (m == null) return; runOnUiThread(() -> { @@ -472,30 +146,11 @@ private void updateUILastMeasurement(Measurement m, boolean applyAnimation) { }); } - /** - * Performs routine for data synchronization with server. - * - * @param measurement Measurement to save in server - */ - private void saveMeasurementInServer(Measurement measurement) { - DisposableManager.add(haniotNetRepository - .saveMeasurement(measurement) - .doAfterSuccess(measurement1 -> { - printMessage(getString(R.string.measurement_save)); - loadData(true); - }) - .subscribe(measurement1 -> { - }, error -> { - Log.w(TAG, error.getMessage()); - printMessage(getString(R.string.error_500)); - })); - } - @Override public void onClick(View v) { switch (v.getId()) { case R.id.chart_floating_button: -// startActivity(new Intent(getApplicationContext(), TemperatureChartActivity.class)); + startActivity(new Intent(getApplicationContext(), TemperatureChartActivity.class)); break; case R.id.add_floating_button: Intent it = new Intent(getApplicationContext(), AddMeasurementActivity.class); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/base/BaseDeviceActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/base/BaseDeviceActivity.java new file mode 100644 index 00000000..7df25481 --- /dev/null +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/base/BaseDeviceActivity.java @@ -0,0 +1,665 @@ +package br.edu.uepb.nutes.haniot.devices.base; + +import android.Manifest; +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothProfile; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.support.annotation.NonNull; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CollapsingToolbarLayout; +import android.support.design.widget.Snackbar; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.github.clans.fab.FloatingActionButton; +import com.mikhaellopez.circularprogressbar.CircularProgressBar; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import br.edu.uepb.nutes.haniot.R; +import br.edu.uepb.nutes.haniot.adapter.base.BaseAdapter; +import br.edu.uepb.nutes.haniot.adapter.base.OnRecyclerViewListener; +import br.edu.uepb.nutes.haniot.data.model.Device; +import br.edu.uepb.nutes.haniot.data.model.Measurement; +import br.edu.uepb.nutes.haniot.data.model.Patient; +import br.edu.uepb.nutes.haniot.data.model.dao.DeviceDAO; +import br.edu.uepb.nutes.haniot.data.model.dao.MeasurementDAO; +import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; +import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; +import br.edu.uepb.nutes.haniot.service.ManagerDevices.BluetoothManager; +import br.edu.uepb.nutes.haniot.utils.ConnectionUtils; +import br.edu.uepb.nutes.haniot.utils.NetworkUtil; +import butterknife.BindView; +import butterknife.ButterKnife; + +public abstract class BaseDeviceActivity extends AppCompatActivity implements View.OnClickListener { + protected final int REQUEST_ENABLE_BLUETOOTH = 1; + protected final int REQUEST_ENABLE_LOCATION = 2; + private final String BLUETOOTH = "bluetooth"; + private final String WIRELESS = "wifi"; + private final String CONNECTIVITY_CHANGE = "android.net.conn.CONNECTIVITY_CHANGE"; + + private final int LIMIT_PER_PAGE = 20; + private final int INITIAL_PAGE = 1; + private int page = INITIAL_PAGE; + + protected boolean mConnected = false; + // private boolean showAnimation = true; + protected Animation animation; + protected Device mDevice; + protected AppPreferencesHelper appPreferencesHelper; + private MeasurementDAO measurementDAO; + protected DeviceDAO deviceDAO; + protected DecimalFormat decimalFormat; + private BaseAdapter mAdapter; + protected BluetoothManager manager; + + protected HaniotNetRepository haniotNetRepository; + protected Patient patient; + + private boolean wifiRequest; + private boolean bluetoothRequest; + private boolean isFirst; + + private List measurementIdToDelete; + private Handler handler; + private Runnable runnable; + private Snackbar snackbar; + /** + * We need this variable to lock and unlock loading more. + * We should not charge more when a request has already been made. + * The load will be activated when the requisition is completed. + */ + private boolean itShouldLoadMore = true; + + @BindView(R.id.toolbar) + Toolbar mToolbar; + + @BindView(R.id.date_last_measurement_textView) + protected + TextView mDateLastMeasurement; + + @BindView(R.id.no_data_textView) + TextView noDataMessage; + + @BindView(R.id.view_circle) + CircularProgressBar mCircularProgressBar; + + @BindView(R.id.collapsi_toolbar) + CollapsingToolbarLayout mCollapsingToolbarLayout; + + @BindView(R.id.box_bar_layout) + AppBarLayout mAppBarLayout; + + @BindView(R.id.data_swiperefresh) + SwipeRefreshLayout mDataSwipeRefresh; + + @BindView(R.id.chart_floating_button) + FloatingActionButton mChartButton; + + @BindView(R.id.add_floating_button) + FloatingActionButton mAddButton; + + @BindView(R.id.box_measurement) + RelativeLayout boxMeasurement; + + @BindView(R.id.box_message_error) + LinearLayout boxMessage; + + @BindView(R.id.message_error) + TextView messageError; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(getLayout()); + ButterKnife.bind(this); + + appPreferencesHelper = AppPreferencesHelper.getInstance(this); + measurementDAO = MeasurementDAO.getInstance(this); + deviceDAO = DeviceDAO.getInstance(this); + decimalFormat = new DecimalFormat(getString(R.string.format_number2), new DecimalFormatSymbols(Locale.US)); + measurementIdToDelete = new ArrayList<>(); + animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.blink); + mChartButton.setOnClickListener(this); + mAddButton.setOnClickListener(this); + + haniotNetRepository = HaniotNetRepository.getInstance(this); + patient = appPreferencesHelper.getLastPatient(); + + if (isTablet(this)) { + Log.i(getTag(), "is tablet"); + boxMeasurement.getLayoutParams().height = 600; + mCollapsingToolbarLayout.getLayoutParams().height = 630; + boxMeasurement.requestLayout(); + mCollapsingToolbarLayout.requestLayout(); + } + initComponents(); + isFirst = true; + + IntentFilter filterBluetooth = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); + registerReceiver(mReceiver, filterBluetooth); + IntentFilter filterInternet = new IntentFilter(CONNECTIVITY_CHANGE); + registerReceiver(mReceiver, filterInternet); + } + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + int status = NetworkUtil.getConnectivityStatusString(context); + + if (CONNECTIVITY_CHANGE.equals(action)) { + if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) { + Log.w(getTag(), "mReceiver: wifi desligado"); + showMessageConnection(WIRELESS, true); + } else { + Log.w(getTag(), "mReceiver: wifi ligado"); + showMessageConnection(WIRELESS, false); + + if (!isFirst) { + loadData(true); + } + isFirst = false; + } + } + if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { + final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, + BluetoothAdapter.ERROR); + if (state == BluetoothAdapter.STATE_OFF) { + Log.w(getTag(), "mReceiver: Bluetooth desligado"); + showMessageConnection(BLUETOOTH, true); + } else if (state == BluetoothAdapter.STATE_ON) { + Log.w(getTag(), "mReceiver: Bluetooth ligado"); + appPreferencesHelper.saveBluetoothMode(true); + showMessageConnection(BLUETOOTH, false); + } + } + } + }; + + /** + * Enable/Disable display messgae no data. + * + * @param visible boolean + */ + protected void toggleNoDataMessage(boolean visible) { + runOnUiThread(() -> { + if (visible) { + if (!ConnectionUtils.internetIsEnabled(getApplicationContext())) { + noDataMessage.setText(getString(R.string.connect_network_try_again)); + } else { + noDataMessage.setText(getString(R.string.no_data_available)); + } + noDataMessage.setVisibility(View.VISIBLE); + mDateLastMeasurement.setText(""); + } else { + noDataMessage.setVisibility(View.GONE); + } + }); + } + + /** + * Check if is tablet. + * + * @param context Context + * @return True if is tablet, False otherwise + */ + public static boolean isTablet(Context context) { + return (context.getResources().getConfiguration().screenLayout + & Configuration.SCREENLAYOUT_SIZE_MASK) + >= Configuration.SCREENLAYOUT_SIZE_LARGE; + } + + /** + * Initialize components + */ + protected void initComponents() { + initToolBar(); + initRecyclerView(); + initDataSwipeRefresh(); + } + + private void initToolBar() { + setSupportActionBar(mToolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowTitleEnabled(false); + + mCollapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent)); + mCollapsingToolbarLayout.setCollapsedTitleTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorTextDark)); + + mAppBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { + + if (Math.abs(verticalOffset) == appBarLayout.getTotalScrollRange()) { + mCollapsingToolbarLayout.setTitle(getTitleActivity()); + } else { + mCollapsingToolbarLayout.setTitle(""); + } + }); + } + + /** + * Init RecyclerView + */ + private void initRecyclerView() { + mAdapter = getAdapter(); + + RecyclerView mRecyclerView = getRecyclerView(); + mRecyclerView.setHasFixedSize(true); + mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); + mRecyclerView.setItemAnimator(new DefaultItemAnimator()); + + mAdapter.setListener(new OnRecyclerViewListener() { + @Override + public void onItemClick(Measurement item) { + Log.w(getTag(), "onItemClick()"); + } + + @Override + public void onLongItemClick(View v, Measurement item) { + } + + @Override + public void onMenuContextClick(View v, Measurement item) { + } + + @Override + public void onItemSwiped(Measurement item, int position) { + mAdapter.removeItem(item); + measurementIdToDelete.add(item.get_id()); + handler = new Handler(); + runnable = () -> { + removePendingMeasurements(); + }; + handler.postDelayed(runnable, 4000); + + snackbar = Snackbar + .make(findViewById(R.id.root), getString(R.string.confirm_remove_measurement), Snackbar.LENGTH_LONG); + snackbar.setAction(getString(R.string.undo), view -> { + mAdapter.restoreItem(item, position); + mRecyclerView.scrollToPosition(position); + measurementIdToDelete.remove(item.get_id()); +// handler.removeCallbacks(runnable); + }); + snackbar.show(); + } + }); + + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + if (dy > 0) { + // Recycle view scrolling downwards... + // this if statement detects when user reaches the end of recyclerView, this is only time we should load more + if (!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)) { + // here we are now allowed to load more, but we need to be careful + // we must check if itShouldLoadMore variable is true [unlocked] + if (itShouldLoadMore) loadData(false); + } + } + } + }); + mRecyclerView.setAdapter(mAdapter); + mAdapter.enableSwipe(this); + } + + /** + * Initialize SwipeRefresh + */ + private void initDataSwipeRefresh() { + mDataSwipeRefresh.setOnRefreshListener(() -> { + loadData(true); + }); + } + + @Override + protected void onPause() { + super.onPause(); + new Thread() { + @Override + public void run() { + Log.w("XXX", "onPause() - run()"); + if (snackbar != null && snackbar.isShown()) snackbar.dismiss(); + if (handler != null) { + removePendingMeasurements(); + handler.removeCallbacks(runnable); + } + } + }.start(); + } + + private void removePendingMeasurements() { + Log.w("XXX", "removePendingMeasurements()"); + if (measurementIdToDelete == null || measurementIdToDelete.isEmpty()) return; + for (String id : measurementIdToDelete) + DisposableManager.add(haniotNetRepository + .deleteMeasurement(patient.get_id(), id).subscribe(() -> { + measurementIdToDelete.remove(id); + })); + } + + /** + * Load data from the local database. + * It should only be called when there is no internet connection or + * when an error occurs on the first request with the server. + */ + private void loadDataLocal() { + page = INITIAL_PAGE; // returns to initial page + mAdapter.addItems(measurementDAO.list(getMeasurementType(), patient.get_id(), 0, 100)); + + if (!mAdapter.itemsIsEmpty()) { + updateUILastMeasurement((Measurement) mAdapter.getFirstItem(), false); + } else { + toggleNoDataMessage(true); // Enable message no data + } + toggleLoading(false); + } + + /** + * Load data. + * If there is no internet connection, we can display the local database. + * Otherwise it displays from the remote server. + * + * @param clearList True if clearList + */ + private void loadData(boolean clearList) { + if (clearList) { + page = INITIAL_PAGE; + mAdapter.clearItems(); + } + + if (!ConnectionUtils.internetIsEnabled(this)) { + loadDataLocal(); + } else { + removePendingMeasurements(); + DisposableManager.add(haniotNetRepository + .getAllMeasurementsByType(patient.get_id(), + getMeasurementType(), "-timestamp", + null, null, page, LIMIT_PER_PAGE) + .doOnSubscribe(disposable -> { + Log.w(getTag(), "loadData - doOnSubscribe"); + toggleLoading(true); + toggleNoDataMessage(false); + }) + .doAfterTerminate(() -> { + Log.w(getTag(), "loadData - doAfterTerminate"); + toggleLoading(false); // Disable loading + }) + .subscribe(measurements -> { + Log.w(getTag(), "loadData - onResult()"); + if (measurements != null && measurements.size() > 0) { + mAdapter.addItems(measurements); + itShouldLoadMore = true; + if (page == INITIAL_PAGE) { + updateUILastMeasurement((Measurement) mAdapter.getFirstItem(), false); + } + page++; + } else { + toggleLoading(false); + if (mAdapter.itemsIsEmpty()) + toggleNoDataMessage(true); // Enable message no data + itShouldLoadMore = false; + } + }, erro -> { + Log.w(getTag(), "loadData - onError()"); + if (mAdapter.itemsIsEmpty()) printMessage(getString(R.string.error_500)); + else loadDataLocal(); + })); + } + } + + /** + * Enable/Disable display loading data. + * + * @param enabled boolean + */ + private void toggleLoading(boolean enabled) { + runOnUiThread(() -> { + mDataSwipeRefresh.setRefreshing(enabled); + }); + } + + /** + * Print Toast Messages. + * + * @param message Message + */ + protected void printMessage(String message) { + runOnUiThread(() -> Toast.makeText(this, message, Toast.LENGTH_LONG).show()); + } + + /** + * Displays message. + */ + public void showMessageConnection(String typeMessageError, boolean show) { + + if (typeMessageError.equals(WIRELESS)) { + if (show) { + wifiRequest = true; + messageError.setOnClickListener(null); + messageError.setText(getString(R.string.wifi_disabled)); + } else { + wifiRequest = false; + if (bluetoothRequest) { + showMessageConnection(BLUETOOTH, true); + } + } + } else if (typeMessageError.equals(BLUETOOTH)) { + if (show) { + bluetoothRequest = true; + messageError.setText(getString(R.string.bluetooth_disabled)); + messageError.setOnClickListener(v -> { + appPreferencesHelper.saveBluetoothMode(true); + checkPermissions(); + }); + } else { + bluetoothRequest = false; + if (wifiRequest) { + showMessageConnection(WIRELESS, true); + } + } + } + + if (wifiRequest || bluetoothRequest) { + runOnUiThread(() -> { + boxMessage.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); + boxMessage.setVisibility(View.VISIBLE); + }); + } else { + boxMessage.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); + boxMessage.setVisibility(View.GONE); + } + } + + @Override + protected void onResume() { + super.onResume(); + if (!wifiRequest && !bluetoothRequest) { + boxMessage.setVisibility(View.GONE); + } + checkPermissions(); + loadData(true); + updateConnectionState(); + + if(!ConnectionUtils.isSupportedBluetooth()) return; + + if (mDevice != null && manager != null) { + manager.connect(BluetoothAdapter.getDefaultAdapter() + .getRemoteDevice(mDevice.getAddress())).useAutoConnect(true).enqueue(); + } + + if (manager != null && + (manager.getConnectionState() != BluetoothProfile.STATE_CONNECTED && mDevice != null)) { + manager.connect(BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mDevice.getAddress())); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + DisposableManager.dispose(); + if (manager != null) manager.close(); + unregisterReceiver(mReceiver); + } + + protected void updateConnectionState() { + Log.w(getTag(), "updateConnectionState: " + mConnected); + + runOnUiThread(() -> { + mCircularProgressBar.setProgress(0); + mCircularProgressBar.setProgressWithAnimation(100); // Default animate duration = 1500ms + + if (mConnected) { + mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); + mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorButtonDanger)); + } else { + mCircularProgressBar.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorButtonDanger)); + mCircularProgressBar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); + } + }); + } + + /** + * Performs routine for data synchronization with server. + * + * @param measurement Measurement to save in server + */ + protected void synchronizeWithServer(Measurement measurement) { + DisposableManager.add(haniotNetRepository + .saveMeasurement(measurement) + .doAfterSuccess(measurement1 -> { + printMessage(getString(R.string.measurement_save)); + Log.w(getTag(), "SINCRONIZAR..."); + loadData(true); + }) + .subscribe(measurement1 -> { + }, error -> { + measurementDAO.save(measurement); + Log.w(getTag(), error.getMessage()); + printMessage(getString(R.string.error_500)); + })); + } + + protected abstract String getMeasurementType(); + + protected abstract int getLayout(); + + protected abstract RecyclerView getRecyclerView(); + + protected abstract BaseAdapter getAdapter(); + + protected abstract String getTitleActivity(); + + protected abstract String getTag(); + + protected abstract void updateUILastMeasurement(Measurement firstItem, boolean b); + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + if (manager != null) manager.disconnect(); + super.onBackPressed(); + } + return super.onOptionsItemSelected(item); + } + + /** + * Checks if you have permission to use. + * Required bluetooth ble and location. + */ + public void checkPermissions() { + if (BluetoothAdapter.getDefaultAdapter() != null && + !BluetoothAdapter.getDefaultAdapter().isEnabled()) { + showMessageConnection(BLUETOOTH, true); + if (appPreferencesHelper.getBluetoothMode()) + requestBluetoothEnable(); + } else if (!hasLocationPermissions()) { + requestLocationPermission(); + } + } + + /** + * Request Bluetooth permission + */ + protected void requestBluetoothEnable() { + startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), + REQUEST_ENABLE_BLUETOOTH); + } + + /** + * Checks whether the location permission was given. + * + * @return boolean + */ + public boolean hasLocationPermissions() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == + PackageManager.PERMISSION_GRANTED; + } + return true; + } + + /** + * Request Location permission. + */ + protected void requestLocationPermission() { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_ENABLE_LOCATION); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + // If request is cancelled, the result arrays are empty. + if ((requestCode == REQUEST_ENABLE_LOCATION) && + (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED)) { + requestLocationPermission(); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_ENABLE_BLUETOOTH) { + if (resultCode != Activity.RESULT_OK) { + appPreferencesHelper.saveBluetoothMode(false); + showMessageConnection(BLUETOOTH, true); + } else { + appPreferencesHelper.saveBluetoothMode(true); + requestLocationPermission(); + } + } + super.onActivityResult(requestCode, resultCode, data); + } +} diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/register/DeviceManagerActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/register/DeviceManagerActivity.java index eb80b693..7ba649f7 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/register/DeviceManagerActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/register/DeviceManagerActivity.java @@ -1,15 +1,14 @@ package br.edu.uepb.nutes.haniot.devices.register; -import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothDevice; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBar; -import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; @@ -18,9 +17,10 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.ScrollView; import android.widget.TextView; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -40,6 +40,12 @@ import butterknife.BindView; import butterknife.ButterKnife; +import static br.edu.uepb.nutes.haniot.utils.GattAttributes.SERVICE_GLUCOSE; +import static br.edu.uepb.nutes.haniot.utils.GattAttributes.SERVICE_HEALTH_THERMOMETER; +import static br.edu.uepb.nutes.haniot.utils.GattAttributes.SERVICE_HEART_RATE; +import static br.edu.uepb.nutes.haniot.utils.GattAttributes.SERVICE_SCALE_YUNMAI; +import static br.edu.uepb.nutes.haniot.utils.GattAttributes.SERVICE_STEPS_DISTANCE_CALORIES; + public class DeviceManagerActivity extends AppCompatActivity { private final String LOG_TAG = getClass().getSimpleName(); @@ -60,8 +66,11 @@ public class DeviceManagerActivity extends AppCompatActivity { @BindView(R.id.available_devices_recyclerview) RecyclerView mAvailableRecyclerView; - @BindView(R.id.no_registered_devices_textView) - TextView mNoRegisteredDevices; + @BindView(R.id.box_not_devices) + LinearLayout mNoRegisteredDevices; + + @BindView(R.id.title_registered) + TextView mTitleRegistered; @BindView(R.id.no_available_devices_textView) TextView mNoAvailableDevices; @@ -84,12 +93,28 @@ public class DeviceManagerActivity extends AppCompatActivity { @BindView(R.id.devices_registered_available) LinearLayout boxRegisteredAvailable; + @BindView(R.id.content_devices) + ScrollView contentDevices; + + @BindView(R.id.content_error) + LinearLayout contentError; + + @BindView(R.id.manager_devices_swipe_refresh) + SwipeRefreshLayout swipeRefreshLayoutDevices; + + @BindView(R.id.box_content) + RelativeLayout boxContent; + private User user; private DeviceAdapter mAdapterDeviceAvailable; private DeviceAdapter mAdapterDeviceRegistered; private AppPreferencesHelper appPreferences; private DeviceDAO mDeviceDAO; private HaniotNetRepository haniotRepository; + private List deviceIdToDelete; + private Handler handler; + private Runnable runnable; + private Snackbar snackbar; @Override protected void onCreate(Bundle savedInstanceState) { @@ -102,8 +127,11 @@ protected void onCreate(Bundle savedInstanceState) { user = appPreferences.getUserLogged(); if (user == null || user.get_id().isEmpty()) finish(); - + deviceIdToDelete = new ArrayList<>(); initComponents(); + checkConnectivity(); + initDataSwipeRefresh(); + showErrorConnection(false); } @Override @@ -117,7 +145,71 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override protected void onResume() { super.onResume(); - populateView(); + swipeRefreshLayoutDevices.setEnabled(false); + downloadDevicesData(); + } + + @Override + protected void onPause() { + super.onPause(); + new Thread() { + @Override + public void run() { + Log.w("XXX", "onPause() - run()"); + if (snackbar != null && snackbar.isShown()) snackbar.dismiss(); + if (handler != null) { + removePendingDevices(); + handler.removeCallbacks(runnable); + } + } + }.start(); + } + + /** + * @param enabled + */ + private void showErrorConnection(boolean enabled) { + if (enabled) { + contentError.setVisibility(View.VISIBLE); + contentDevices.setVisibility(View.GONE); + } else { + contentError.setVisibility(View.GONE); + contentDevices.setVisibility(View.VISIBLE); + } + } + + /** + * Initialize SwipeRefresh + */ + private void initDataSwipeRefresh() { + swipeRefreshLayoutDevices.setOnRefreshListener(this::downloadDevicesData); + } + + /** + * Download list of devices registered. + */ + public void downloadDevicesData() { + DisposableManager.add( + haniotRepository + .getAllDevices(user.get_id()) + .doOnSubscribe(disposable -> { + swipeRefreshLayoutDevices.setRefreshing(true); + contentDevices.setVisibility(View.GONE); + }) + .doAfterTerminate(() -> { + swipeRefreshLayoutDevices.setEnabled(true); + swipeRefreshLayoutDevices.setRefreshing(false); + }) + .subscribe(devices -> { + Log.w("AAA", Arrays.toString(devices.toArray())); + contentDevices.setVisibility(View.VISIBLE); + populateDevicesRegistered(setImagesDevices(devices)); + + + populateDevicesAvailable(mDeviceDAO.list(user.get_id())); + showErrorConnection(false); + }, err -> showErrorConnection(true)) + ); } /** @@ -140,28 +232,10 @@ private void initToolBar() { actionBar.setDisplayHomeAsUpEnabled(true); } - private void populateView() { + private void checkConnectivity() { if (!ConnectionUtils.internetIsEnabled(getApplicationContext())) { - mMessageAlert.setVisibility(View.VISIBLE); - mBoxDevicesRegistered.setVisibility(View.GONE); - mBoxDevicesAvailable.setVisibility(View.GONE); - return; + showErrorConnection(true); } - - DisposableManager.add( - haniotRepository - .getAllDevices(user.get_id()) - .doOnSubscribe(disposable -> displayLoading(true)) - .doAfterTerminate(() -> displayLoading(false)) - .subscribe(devices -> { - Log.w("AAA", Arrays.toString(devices.toArray())); - populateDevicesRegistered(populateImagesDevices(devices)); - populateDevicesAvailable(mDeviceDAO.list(user.get_id())); - }, err -> { - messageErrorServer.setVisibility(View.VISIBLE); - boxRegisteredAvailable.setVisibility(View.INVISIBLE); - }) - ); } /** @@ -170,7 +244,7 @@ private void populateView() { * @param devices {@link List} * @return {@link List} */ - public List populateImagesDevices(List devices) { + public List setImagesDevices(List devices) { for (Device d : devices) { switch (d.getType()) { case DeviceType.THERMOMETER: @@ -208,6 +282,7 @@ private void displayLoading(boolean show) { mBoxDevicesAvailable.setVisibility(View.GONE); mProgressBar.setVisibility(View.VISIBLE); } else { + boxContent.setVisibility(View.VISIBLE); mBoxDevicesRegistered.setVisibility(View.VISIBLE); mBoxDevicesAvailable.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.GONE); @@ -223,15 +298,17 @@ private void initRegisteredDevicesRecyclerView() { mRegisteredRecyclerView.setHasFixedSize(true); mRegisteredRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRegisteredRecyclerView.setItemAnimator(new DefaultItemAnimator()); - mRegisteredRecyclerView.addItemDecoration(new DividerItemDecoration( - mRegisteredRecyclerView.getContext(), - new LinearLayoutManager(this).getOrientation()) - ); - mAdapterDeviceRegistered.setListener(new OnRecyclerViewListener() { + private void run() { + removePendingDevices(); + } + + /** + * @param item + */ @Override public void onItemClick(Device item) { - confirmRemoveDeviceRegister(item); + } @Override @@ -241,8 +318,40 @@ public void onLongItemClick(View v, Device item) { @Override public void onMenuContextClick(View v, Device item) { } + + @Override + public void onItemSwiped(Device item, int position) { + mAdapterDeviceRegistered.removeItem(item); + deviceIdToDelete.add(item.get_id()); + handler = new Handler(); + runnable = this::run; + handler.postDelayed(runnable, 4000); + + snackbar = Snackbar + .make(findViewById(R.id.root), getString(R.string.confirm_remove_devices), Snackbar.LENGTH_LONG); + snackbar.setAction(getString(R.string.undo), view -> { + mAdapterDeviceRegistered.restoreItem(item, position); + mRegisteredRecyclerView.scrollToPosition(position); + deviceIdToDelete.remove(item.get_id()); + }); + snackbar.show(); + showNoDevices(mAdapterDeviceRegistered.itemsIsEmpty()); + } }); mRegisteredRecyclerView.setAdapter(mAdapterDeviceRegistered); + mAdapterDeviceRegistered.enableSwipe(this); + } + + private void removePendingDevices() { + Log.w("XXX", "removePendingDevices()"); + if (deviceIdToDelete == null || deviceIdToDelete.isEmpty()) return; + for (String idDevice : deviceIdToDelete) + DisposableManager.add(haniotRepository + .deleteDevice(user.get_id(), idDevice).subscribe(() -> { + mDeviceDAO.remove(idDevice); + deviceIdToDelete.remove(idDevice); + + })); } /** @@ -253,15 +362,13 @@ private void initAvailableDevicesRecyclerView() { mAvailableRecyclerView.setHasFixedSize(true); mAvailableRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mAvailableRecyclerView.setItemAnimator(new DefaultItemAnimator()); - mAvailableRecyclerView.addItemDecoration(new DividerItemDecoration( - mAvailableRecyclerView.getContext(), - new LinearLayoutManager(this).getOrientation()) - ); mAdapterDeviceAvailable.setListener(new OnRecyclerViewListener() { @Override - public void onItemClick(Device item) { - openRegister(item); + public void onItemClick(Device device) { + Intent intent = new Intent(DeviceManagerActivity.this, DeviceRegisterActivity.class); + intent.putExtra(EXTRA_DEVICE, device); + startActivity(intent); } @Override @@ -273,6 +380,11 @@ public void onLongItemClick(View v, Device item) { public void onMenuContextClick(View v, Device item) { } + + @Override + public void onItemSwiped(Device item, int position) { + + } }); mAvailableRecyclerView.setAdapter(mAdapterDeviceAvailable); @@ -288,14 +400,20 @@ public void populateDevicesRegistered(@NonNull List devicesRegistered) { mAdapterDeviceRegistered.addItems(devicesRegistered); runOnUiThread(() -> { - if (devicesRegistered.isEmpty()) { - mNoRegisteredDevices.setVisibility(View.VISIBLE); - } else { - mNoRegisteredDevices.setVisibility(View.GONE); - } + showNoDevices(devicesRegistered.isEmpty()); }); } + private void showNoDevices(boolean enabled) { + if (enabled) { + mNoRegisteredDevices.setVisibility(View.VISIBLE); + mTitleRegistered.setVisibility(View.INVISIBLE); + } else { + mNoRegisteredDevices.setVisibility(View.GONE); + mTitleRegistered.setVisibility(View.VISIBLE); + } + } + /** * Only those who have not been registered. * @@ -306,22 +424,22 @@ public void populateDevicesAvailable(@NonNull List devicesRegistered) { devicesAvailable.add(new Device("Ear Thermometer ".concat(NUMBER_MODEL_THERM_DL8740), "Philips", NUMBER_MODEL_THERM_DL8740, - R.drawable.device_thermometer_philips_dl8740_mini, DeviceType.THERMOMETER)); + R.drawable.device_thermometer_philips_dl8740_mini, DeviceType.THERMOMETER, SERVICE_HEALTH_THERMOMETER)); devicesAvailable.add(new Device("Accu-Chek ".concat(NUMBER_MODEL_GLUCOMETER_PERFORMA), "Accu-Chek", NUMBER_MODEL_GLUCOMETER_PERFORMA, - R.drawable.device_glucose_accuchek, DeviceType.GLUCOMETER)); + R.drawable.device_glucose_accuchek, DeviceType.GLUCOMETER, SERVICE_GLUCOSE)); devicesAvailable.add(new Device("Scale YUNMAI Mini ".concat(NUMBER_MODEL_SCALE_1501), "Yunmai", NUMBER_MODEL_SCALE_1501, - R.drawable.device_scale_yunmai_mini_color, DeviceType.BODY_COMPOSITION)); + R.drawable.device_scale_yunmai_mini_color, DeviceType.BODY_COMPOSITION, SERVICE_SCALE_YUNMAI)); devicesAvailable.add(new Device("Heart Rate Sensor", NUMBER_MODEL_HEART_RATE, - NUMBER_MODEL_HEART_RATE, R.drawable.device_heart_rate_h10, DeviceType.HEART_RATE)); + NUMBER_MODEL_HEART_RATE, R.drawable.device_heart_rate_h10, DeviceType.HEART_RATE, SERVICE_HEART_RATE)); devicesAvailable.add(new Device("Smartband ".concat(NUMBER_MODEL_SMARTBAND_MI2), "Xiaomi", NUMBER_MODEL_SMARTBAND_MI2, - R.drawable.device_smartband_miband2, DeviceType.SMARTBAND)); + R.drawable.device_smartband_miband2, DeviceType.SMARTBAND, SERVICE_STEPS_DISTANCE_CALORIES)); mAdapterDeviceAvailable.clearItems(); mAdapterDeviceAvailable.addItems( @@ -342,69 +460,20 @@ public void populateDevicesAvailable(@NonNull List devicesRegistered) { */ private List mergeDevicesAvailableRegistered(List registeredList, List availableList) { + + Log.w("AAA", "DAO: " + Arrays.toString(registeredList.toArray())); + Log.w("AAA", "Available"); + for (Device device : availableList) { + Log.w("AAA", device.toJson()); + } + // Add only devices that have not been registered + Log.w("AAA", "Registered"); for (Device d : registeredList) { - if (availableList.contains(d)) { - availableList.remove(d); - } + Log.w("AAA", d.toJson()); +// Log.w("AAA", "Registered: " + d.toJson() + " - Disponível: " + availableList.indexOf(d)); + availableList.remove(d); } return availableList; } - - private void openRegister(Device device) { - Intent intent = new Intent(this, DeviceRegisterActivity.class); - intent.putExtra(EXTRA_DEVICE, device); - startActivity(intent); - } - - /** - * Dialog to confirm removal of associated device. - * - * @param device {@link Device} - */ - private void confirmRemoveDeviceRegister(Device device) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(R.drawable.ic_action_warning); - builder.setTitle(R.string.attention); - builder.setMessage(getString(R.string.remove_device, device.getName())); - //define a button how to remove - builder.setPositiveButton(R.string.remove, (arg0, arg1) -> { - //removes the device from the server database - removeDeviceRegister(device); - }); - //define a button how to cancel. - builder.setNegativeButton(R.string.cancel, (arg0, arg1) -> { - }); - builder.create().show(); - } - - private void removeDeviceRegister(Device device) { - DisposableManager.add( - haniotRepository.deleteDevice(user.get_id(), device.get_id()) - .doOnSubscribe(disposable -> displayLoading(true)) - .doAfterTerminate(() -> displayLoading(false)) - .subscribe(() -> { - mDeviceDAO.remove(device.getAddress()); - unpairDevice(device); - populateView(); - }, err -> { - Log.w(LOG_TAG, "ERROR DELETE DEVICE: " + err.getMessage()); - }) - ); - } - - private void unpairDevice(Device device) { - if (device.getAddress().isEmpty()) return; - BluetoothDevice mBluetoothDevice = BluetoothAdapter.getDefaultAdapter(). - getRemoteDevice(device.getAddress()); - try { - Method m = mBluetoothDevice.getClass() - .getMethod("removeBond", (Class[]) null); - m.invoke(mBluetoothDevice, (Object[]) null); - } catch (Exception e) { - Log.d(LOG_TAG, "error removing pairing " + e.getMessage()); - } - } - } \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/register/DeviceRegisterActivity.java b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/register/DeviceRegisterActivity.java index c953fc0e..cfdaa409 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/devices/register/DeviceRegisterActivity.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/devices/register/DeviceRegisterActivity.java @@ -20,7 +20,6 @@ import android.view.View; import android.view.Window; import android.view.WindowManager; -import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; @@ -39,23 +38,18 @@ import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; -import br.edu.uepb.nutes.haniot.utils.GattAttributes; import br.edu.uepb.nutes.simpleblescanner.SimpleBleScanner; import br.edu.uepb.nutes.simpleblescanner.SimpleScannerCallback; import butterknife.BindView; import butterknife.ButterKnife; import pl.bclogic.pulsator4droid.library.PulsatorLayout; +import static br.edu.uepb.nutes.haniot.utils.GattAttributes.SERVICE_SCALE_YUNMAI; + public class DeviceRegisterActivity extends AppCompatActivity implements View.OnClickListener { private final String LOG_TAG = "DeviceRegisterActivity "; private final String NAME_DEVICE_THERM_DL8740 = "Ear Thermometer DL8740"; - private final String NAME_DEVICE_GLUCOMETER_PERFORMA = "Accu-Chek Performa Connect"; - private final String NAME_DEVICE_SCALE_1501 = "Scale YUNMAI Mini 1501"; - private final String NAME_DEVICE_YUNMAI = "YUNMAI-SIGNAL-M1US"; - private final String NAME_DEVICE_HEART_RATE = "Heart Rate Sensor"; - private final String NAME_DEVICE_SMARTBAND_MI2 = "Smartband MI Band 2"; - private final String SERVICE_SCALE_1501 = "00001310-0000-1000-8000-00805f9b34fb"; private final String PIN_YUNMAI = "000000"; private static final int REQUEST_ENABLE_BLUETOOTH = 1; @@ -66,7 +60,6 @@ public class DeviceRegisterActivity extends AppCompatActivity implements View.On private DeviceDAO mDeviceDAO; private AppPreferencesHelper appPreferences; private HaniotNetRepository haniotRepository; - private BluetoothDevice btDevice; private User user; @BindView(R.id.box_scanner) @@ -78,14 +71,23 @@ public class DeviceRegisterActivity extends AppCompatActivity implements View.On @BindView(R.id.box_response) FrameLayout boxResponse; + @BindView(R.id.box_error) + FrameLayout boxError; + + @BindView(R.id.txt_device_error) + TextView scanDeviceError; + + @BindView(R.id.btn_try_again) + TextView btnTryAgain; + @BindView(R.id.btn_device_register_scanner) - Button btnDeviceRegisterScanner; + TextView btnDeviceRegisterScanner; @BindView(R.id.name_device_scanner) TextView nameDeviceScanner; @BindView(R.id.btn_device_register_stop) - Button btnDeviceRegisterStop; + TextView btnDeviceRegisterStop; @BindView(R.id.name_device_scanner_register) TextView nameDeviceScannerRegister; @@ -99,11 +101,14 @@ public class DeviceRegisterActivity extends AppCompatActivity implements View.On @BindView(R.id.img_device_register) ImageView imgDeviceRegister; + @BindView(R.id.img_device_sucess) + ImageView imgDeviceSucess; + @BindView(R.id.btn_close_register) ImageButton btnCloseRegister; @BindView(R.id.btn_close_response) - Button btnCloseResponse; + TextView btnCloseResponse; @BindView(R.id.pulsator) PulsatorLayout mPulsatorLayout; @@ -114,139 +119,140 @@ public class DeviceRegisterActivity extends AppCompatActivity implements View.On @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_NO_TITLE); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_device_register); ButterKnife.bind(this); - appPreferences = AppPreferencesHelper.getInstance(this); - haniotRepository = HaniotNetRepository.getInstance(this); - mDeviceDAO = DeviceDAO.getInstance(this); - - - btnDeviceRegisterScanner.setOnClickListener(this); - btnDeviceRegisterStop.setOnClickListener(this); - btnCloseRegister.setOnClickListener(this); - btnCloseResponse.setOnClickListener(this); - - mDevice = getIntent().getParcelableExtra(DeviceManagerActivity.EXTRA_DEVICE); + initComponents(); + user = appPreferences.getUserLogged(); + if (user == null) { + finish(); + return; + } + populateView(); //Initialize scanner settings mScanner = new SimpleBleScanner.Builder() .addScanPeriod(15000) // 15s - .addFilterServiceUuid(getServiceUuidDevice(mDevice.getName())) + .addFilterServiceUuid(mDevice.getUuid()) .build(); - //Broadcasts when bond state changes (ie:pairing) IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); registerReceiver(mBroadcastReceiver, filter); - user = appPreferences.getUserLogged(); - if (user == null) { - finish(); - return; - } - - initComponents(); - } - - @Override - protected void onResume() { - super.onResume(); - checkPermissions(); - } - - @Override - - protected void onDestroy() { - Log.d(LOG_TAG, "onDestroy: called."); - super.onDestroy(); - unregisterReceiver(mBroadcastReceiver); - DisposableManager.dispose(); } /** - * Checks if you have permission to use. - * Required bluetooth ble and location. + * When device is registered. + * + * @param device */ - private void checkPermissions() { - if (!BluetoothAdapter.getDefaultAdapter().isEnabled()) { - requestBluetoothEnable(); - } - if (!hasLocationPermissions()) { - requestLocationPermission(); + public void onDeviceRegistered(Device device) { + if (device != null) { + mPulsatorLayout.stop(); + deviceSuccessfullyRegistered + .setText(getString(R.string.device_registered_success, device.getName())); + boxRegister.setVisibility(View.GONE); + boxScanner.setVisibility(View.GONE); + boxResponse.setVisibility(View.VISIBLE); + progressBarPairing.setVisibility(View.INVISIBLE); + boxError.setVisibility(View.GONE); + } else { + boxError.setVisibility(View.VISIBLE); +// deviceConnectionStatus.setText(R.string.failed_pairing_device); +// btnDeviceRegisterScanner.setEnabled(true); +// btnDeviceRegisterScanner.setText(R.string.start_scanner_try); +// progressBarPairing.setVisibility(View.INVISIBLE); } } /** - * Request Bluetooth permission + * When device founded from Scanner. + * + * @param device */ - private void requestBluetoothEnable() { - startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), - REQUEST_ENABLE_BLUETOOTH); + public void onDeviceFounded(BluetoothDevice device) { + if (device != null) { + mDevice.setAddress(device.getAddress()); + unpairDevice(mDevice); + mDevice.setUserId(user.get_id()); + device.createBond(); + animationScanner(false); + progressBarPairing.setVisibility(View.VISIBLE); + } else { + animationScanner(false); + boxError.setVisibility(View.VISIBLE); +// nameDeviceScannerRegister.setText(mDevice.getName()); +// deviceConnectionStatus.setText(R.string.device_not_found_try_again); + } } /** - * Checks whether the location permission was given. + * Save device in remote server. * - * @return boolean + * @param device {@link Device} */ - private boolean hasLocationPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == - PackageManager.PERMISSION_GRANTED; - } - return true; + public void saveDeviceInServer(final Device device) { + Log.i("AAA", device.toJson()); + device.setModelNumber(null); // TODO Remover quando a API der suporte + device.setUserId(user.get_id()); + DisposableManager.add(haniotRepository + .saveDevice(device) + .subscribe(deviceRest -> { + deviceRest.setImg(device.getImg()); + deviceRest.setUserId(user.get_id()); + Log.w("AAA", "User: " + user.get_id()); + Log.w("AAA", "subscribe: " + deviceRest.toJson()); + mDeviceDAO.save(deviceRest); + onDeviceRegistered(mDevice); + }, err -> { + onDeviceFounded(null); + Log.w(LOG_TAG, "ERROR SAVE:" + err.getMessage() + device); + }) + ); } /** - * Request Location permission. + * Unpair device from cellphone. + * + * @param device + * @return */ - private void requestLocationPermission() { - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_ENABLE_LOCATION); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - // If request is cancelled, the result arrays are empty. - if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { - requestLocationPermission(); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_ENABLE_BLUETOOTH && resultCode != Activity.RESULT_OK) { - requestBluetoothEnable(); + private boolean unpairDevice(Device device) { + boolean confirmed = false; + if (!device.getAddress().isEmpty()) { + BluetoothDevice mBluetoothDevice = BluetoothAdapter.getDefaultAdapter(). + getRemoteDevice(device.getAddress()); + try { + Method m = mBluetoothDevice.getClass() + .getMethod("removeBond", (Class[]) null); + m.invoke(mBluetoothDevice, (Object[]) null); + confirmed = true; + } catch (Exception e) { + Log.d(LOG_TAG, "error removing pairing " + e.getMessage()); + } } + return confirmed; } + /** + * Callback for result scan devices. + */ public final SimpleScannerCallback mScanCallback = new SimpleScannerCallback() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onScanResult(int callbackType, @NonNull ScanResult scanResult) { - mScanner.stopScan(); - btDevice = scanResult.getDevice(); + BluetoothDevice btDevice = scanResult.getDevice(); + Log.d(LOG_TAG, "onScanResult: " + btDevice.getName()); + Log.w("AAAA", scanResult.toString()); - if (btDevice == null) { - mScanner.stopScan(); + if (btDevice == null || btDevice.getName() == null) return; - } - Log.d(LOG_TAG, "onScanResult: " + btDevice.getName()); - mDevice.setAddress(btDevice.getAddress()); - mDevice.setUserId(user.get_id()); + mScanner.stopScan(); - // removes a device from the local database and server - removeDeviceForType(mDevice); + onDeviceFounded(btDevice); } @Override @@ -257,7 +263,7 @@ public void onBatchScanResults(@NonNull List scanResults) { @Override public void onFinish() { Log.d(LOG_TAG, "Scanner onFinish()"); - deviceAvailable(null); + onDeviceFounded(null); } @Override @@ -269,57 +275,45 @@ public void onScanFailed(int errorCode) { /** * Broadcast Receiver that detects bond state changes (Pairing status changes) */ - private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); + Log.w("AAA", "Action: " + action); if (action != null && action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) { BluetoothDevice mBluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - //case1: bonded already + // Case 1: Bonded. if (mBluetoothDevice.getBondState() == BluetoothDevice.BOND_BONDED) { Log.d(LOG_TAG, "BroadcastReceiver: BOND_BONDED."); - deviceAvailable(mBluetoothDevice); - - if (mBluetoothDevice.getName().equals(NAME_DEVICE_YUNMAI)) { - unregisterReceiver(broadCastReceiver); - } + saveDeviceInServer(mDevice); } - //case2: creating a bone + + // Case 2: Bonding. if (mBluetoothDevice.getBondState() == BluetoothDevice.BOND_BONDING) { Log.d(LOG_TAG, "BroadcastReceiver: BOND_BONDING. " + mBluetoothDevice.getName()); - deviceConnectionStatus.setText(R.string.pairing_device); - progressBarPairing.setVisibility(View.VISIBLE); - btnDeviceRegisterScanner.setEnabled(false); + showLoadingPairing(true); - if (mBluetoothDevice.getName().equals(NAME_DEVICE_YUNMAI)) { - //Broadcasts for balance pairing yunmai + if (mDevice.getUuid().equals(SERVICE_SCALE_YUNMAI)) { + // Set PIN in Yunmai. IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST); intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); registerReceiver(broadCastReceiver, intentFilter); } } - // case3: breaking a bond + + // Case 3: None Bond. if (mBluetoothDevice.getBondState() == BluetoothDevice.BOND_NONE) { Log.d(LOG_TAG, "BroadcastReceiver: BOND_NONE."); - - if (mBluetoothDevice.getName().equals(NAME_DEVICE_YUNMAI) && broadCastReceiver != null) { - Log.i("AAA", mBluetoothDevice.getName() + " - " +broadCastReceiver.getResultCode()); - unregisterReceiver(broadCastReceiver); - } - deviceConnectionStatus.setText(R.string.failed_pairing_device); - btnDeviceRegisterScanner.setEnabled(true); - btnDeviceRegisterScanner.setText(R.string.start_scanner_try); - progressBarPairing.setVisibility(View.INVISIBLE); + onDeviceRegistered(null); } } } }; /** - * method for balance pairing yunmai + * method for balance pairing Yunmai. */ private BroadcastReceiver broadCastReceiver = new BroadcastReceiver() { @Override @@ -334,13 +328,98 @@ public void onReceive(Context context, Intent intent) { } } }; - //end scanner library ble + + @Override + protected void onResume() { + super.onResume(); + checkPermissions(); + } + + @Override + protected void onDestroy() { + Log.d(LOG_TAG, "onDestroy: called."); + super.onDestroy(); + unregisterReceiver(mBroadcastReceiver); + DisposableManager.dispose(); + } + + /** + * Checks if you have permission to use. + * Required bluetooth ble and location. + */ + private void checkPermissions() { + if (!BluetoothAdapter.getDefaultAdapter().isEnabled()) { + requestBluetoothEnable(); + } + if (!hasLocationPermissions()) { + requestLocationPermission(); + } + } + + /** + * Request Bluetooth permission + */ + private void requestBluetoothEnable() { + startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), + REQUEST_ENABLE_BLUETOOTH); + } + + /** + * Checks whether the location permission was given. + * + * @return boolean + */ + private boolean hasLocationPermissions() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == + PackageManager.PERMISSION_GRANTED; + } + return true; + } + + /** + * Request Location permission. + */ + private void requestLocationPermission() { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_ENABLE_LOCATION); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + // If request is cancelled, the result arrays are empty. + if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { + requestLocationPermission(); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_ENABLE_BLUETOOTH && resultCode != Activity.RESULT_OK) { + requestBluetoothEnable(); + } + } /** * Initialize the components. */ private void initComponents() { - populateView(); + + mDevice = getIntent().getParcelableExtra(DeviceManagerActivity.EXTRA_DEVICE); + appPreferences = AppPreferencesHelper.getInstance(this); + haniotRepository = HaniotNetRepository.getInstance(this); + mDeviceDAO = DeviceDAO.getInstance(this); + + btnDeviceRegisterScanner.setOnClickListener(this); + btnDeviceRegisterStop.setOnClickListener(this); + btnCloseRegister.setOnClickListener(this); + btnCloseResponse.setOnClickListener(this); + btnTryAgain.setOnClickListener(this); + } @Override @@ -351,55 +430,21 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } + /** + * Populate view with info device. + */ public void populateView() { if (mDevice == null) return; + scanDeviceError.setText(getString(R.string.device_registered_error, mDevice.getName())); nameDeviceScannerRegister.setText(mDevice.getName()); if (mDevice.getName().equalsIgnoreCase(NAME_DEVICE_THERM_DL8740)) { imgDeviceRegister.setImageResource(R.drawable.device_thermometer_philips_dl8740); + imgDeviceSucess.setImageResource(R.drawable.device_thermometer_philips_dl8740); return; } imgDeviceRegister.setImageResource(mDevice.getImg()); - } + imgDeviceSucess.setImageResource(mDevice.getImg()); - public String getServiceUuidDevice(String nameDevice) { - String service = null; - - if (!nameDevice.isEmpty()) { - if (nameDevice.equalsIgnoreCase(NAME_DEVICE_THERM_DL8740)) { - service = GattAttributes.SERVICE_HEALTH_THERMOMETER; - } else if (nameDevice.equalsIgnoreCase(NAME_DEVICE_GLUCOMETER_PERFORMA)) { - service = GattAttributes.SERVICE_GLUCOSE; - } else if (nameDevice.equalsIgnoreCase(NAME_DEVICE_SCALE_1501)) { - service = SERVICE_SCALE_1501; - } else if (nameDevice.equalsIgnoreCase(NAME_DEVICE_HEART_RATE)) { - service = GattAttributes.SERVICE_HEART_RATE; - } else if (nameDevice.equalsIgnoreCase(NAME_DEVICE_SMARTBAND_MI2)) { - service = GattAttributes.SERVICE_STEPS_DISTANCE_CALORIES; - } - } - return service; - } - - - public void deviceAvailable(BluetoothDevice device) { - if (device != null) { - mDevice.setAddress(device.getAddress()); - // Save in the server - saveDeviceRegister(mDevice); - - mPulsatorLayout.stop(); - deviceSuccessfullyRegistered.setText( - getString(R.string.device_registered_success, - device.getName()) - ); - boxRegister.setVisibility(View.GONE); - boxScanner.setVisibility(View.GONE); - boxResponse.setVisibility(View.VISIBLE); - } else { - animationScanner(false); - nameDeviceScannerRegister.setText(mDevice.getName()); - deviceConnectionStatus.setText(R.string.device_not_found_try_again); - } } public void animationScanner(boolean show) { @@ -411,6 +456,7 @@ public void animationScanner(boolean show) { boxScanner.setVisibility(View.VISIBLE); mPulsatorLayout.start(); } else { + boxError.setVisibility(View.GONE); boxResponse.setVisibility(View.GONE); boxScanner.setVisibility(View.GONE); boxRegister.setVisibility(View.VISIBLE); @@ -419,6 +465,19 @@ public void animationScanner(boolean show) { }); } + /** + * Show loading of Pairing. + */ + private void showLoadingPairing(boolean enabled) { + if (enabled) { + deviceConnectionStatus.setText(R.string.pairing_device); + progressBarPairing.setVisibility(View.VISIBLE); + btnDeviceRegisterScanner.setEnabled(false); + } else { + progressBarPairing.setVisibility(View.GONE); + } + } + @Override public void onClick(View v) { int id = v.getId(); @@ -433,75 +492,18 @@ public void onClick(View v) { } else if (id == R.id.btn_device_register_stop) { Log.d(LOG_TAG, "onClick: stop scanner"); - animationScanner(false); mScanner.stopScan(); + finish(); } else if (id == R.id.btn_close_register) { finish(); } else if (id == R.id.btn_close_response) { finish(); + } else if (id == R.id.btn_try_again) { + boxError.setVisibility(View.GONE); + boxResponse.setVisibility(View.GONE); + boxScanner.setVisibility(View.GONE); + boxRegister.setVisibility(View.VISIBLE); + showLoadingPairing(false); } } - - /** - * Save device in remote server. - * - * @param device {@link Device} - */ - public void saveDeviceRegister(final Device device) { - Log.i("AAA", device.toJson()); - device.setModelNumber(null); // TODO Remover quando a API der suporte - DisposableManager.add(haniotRepository - .saveDevice(device) - .subscribe(deviceRest -> { - deviceRest.setImg(device.getImg()); - deviceRest.setUserId(user.get_id()); - mDeviceDAO.save(deviceRest); - }, err -> { - deviceAvailable(null); - Log.w(LOG_TAG, "ERROR SAVE:" + err.getMessage() + device); - }) - ); - } - - /** - * Remove device according to its type. - * This ensures that only one device per type will be registered. - * - * @param device {@link Device} - */ - public void removeDeviceForType(Device device) { - Device registered = mDeviceDAO.getByType(user.get_id(), device.getType()); - Log.w(LOG_TAG, "registered:" + registered); - if (registered != null) { - DisposableManager.add( - haniotRepository - .deleteDevice(user.get_id(), registered.get_id()) - .subscribe(() -> { - mDeviceDAO.remove(registered.getAddress()); - unpairDevice(mDevice); - btDevice.createBond(); - }, err -> Log.w(LOG_TAG, "ERROR DELETE:" + err.getMessage())) - ); - } else { - unpairDevice(mDevice); - btDevice.createBond(); - } - } - - private boolean unpairDevice(Device device) { - boolean confirmed = false; - if (!device.getAddress().isEmpty()) { - BluetoothDevice mBluetoothDevice = BluetoothAdapter.getDefaultAdapter(). - getRemoteDevice(device.getAddress()); - try { - Method m = mBluetoothDevice.getClass() - .getMethod("removeBond", (Class[]) null); - m.invoke(mBluetoothDevice, (Object[]) null); - confirmed = true; - } catch (Exception e) { - Log.d(LOG_TAG, "error removing pairing " + e.getMessage()); - } - } - return confirmed; - } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/DashboardChartsFragment.java b/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/DashboardChartsFragment.java index bc1185c9..401c7f5f 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/DashboardChartsFragment.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/DashboardChartsFragment.java @@ -1,9 +1,11 @@ package br.edu.uepb.nutes.haniot.fragment; +import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.os.Bundle; import android.support.annotation.StringRes; import android.support.v4.app.Fragment; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -20,10 +22,14 @@ import br.edu.uepb.nutes.haniot.R; import br.edu.uepb.nutes.haniot.activity.MainActivity; import br.edu.uepb.nutes.haniot.data.model.Patient; +import br.edu.uepb.nutes.haniot.data.model.User; import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import butterknife.BindView; import butterknife.ButterKnife; +import static br.edu.uepb.nutes.haniot.data.model.UserType.ADMIN; +import static br.edu.uepb.nutes.haniot.data.model.UserType.PATIENT; + /** * DashboardChartsFragment implementation. * @@ -40,13 +46,21 @@ public class DashboardChartsFragment extends Fragment { TextView textValueMeasurement; @BindView(R.id.text_pilot_study) TextView textPilotStudy; - @BindView(R.id.text_professional) + @BindView(R.id.text_name_professional) TextView textProfessional; + @BindView(R.id.title_pilot_study) + TextView titlePilotStudy; + @BindView(R.id.title_professional) + TextView titleProfessional; Communicator communicator; @BindView(R.id.box_message_error) LinearLayout boxMessage; @BindView(R.id.message_error) TextView messageError; + String typeMessageError; + boolean wifiRequest; + boolean bluetoothRequest; + private User user; public DashboardChartsFragment() { // Required empty public constructor @@ -66,7 +80,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa View view = inflater.inflate(R.layout.fragment_charts_dashboard, container, false); ButterKnife.bind(this, view); AppPreferencesHelper preferencesHelper = AppPreferencesHelper.getInstance(getContext()); - + user = preferencesHelper.getUserLogged(); Calendar calendar = Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat( getResources().getString(R.string.date_format2), @@ -75,10 +89,20 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa textDate.setText(simpleDateFormat.format(calendar.getTime())); updateNamePatient(preferencesHelper.getLastPatient()); - textPilotStudy.setText(preferencesHelper.getLastPilotStudy().getName()); - textProfessional.setText(preferencesHelper.getUserLogged().getName()); - messageError.setOnClickListener(v -> ((MainActivity) Objects.requireNonNull(getActivity())) - .checkPermissions()); + Log.w("AAA", "TIPO: " + preferencesHelper.getUserLogged().getUserType()); + if (preferencesHelper.getUserLogged().getUserType().equals(PATIENT)) { + textPilotStudy.setVisibility(View.INVISIBLE); + textProfessional.setVisibility(View.INVISIBLE); + titlePilotStudy.setVisibility(View.INVISIBLE); + titleProfessional.setVisibility(View.INVISIBLE); + } else if (preferencesHelper.getUserLogged().getUserType().equals(ADMIN)) { + titleProfessional.setText(getString(R.string.admin)); + } + if (user.getPilotStudyIDSelected() != null && preferencesHelper.getLastPilotStudy() != null) + textPilotStudy.setText(preferencesHelper.getLastPilotStudy().getName()); + if (preferencesHelper.getUserLogged().getName() != null) + textProfessional.setText(preferencesHelper.getUserLogged().getName()); + return view; } @@ -92,20 +116,15 @@ public void onAttach(Context context) { } } - @Override - public void onStart() { - super.onStart(); - } - - @Override - public void onStop() { - super.onStop(); - } - @Override public void onResume() { super.onResume(); - boxMessage.setVisibility(View.GONE); + if (!wifiRequest && !bluetoothRequest) + boxMessage.setVisibility(View.GONE); + + if (BluetoothAdapter.getDefaultAdapter() != null && + !BluetoothAdapter.getDefaultAdapter().isEnabled()) + showMessageConnection("bluetooth", true); } /** @@ -117,12 +136,58 @@ public void updateValueMeasurement(String valueMeasurement) { textValueMeasurement.setText(valueMeasurement); } + /** + * Displays message. + */ + public void showMessageConnection(String typeMessageError, boolean show) { + Log.w("MainActivity", "show message: " + typeMessageError); + if (getContext() != null) { + if (typeMessageError.equals("wifi")) { + if (show) { + wifiRequest = true; + messageError.setOnClickListener(null); + messageError.setText(getString(R.string.wifi_disabled)); + } else { + wifiRequest = false; + if (bluetoothRequest) { + showMessageConnection("bluetooth", true); + } + } + } else if (typeMessageError.equals("bluetooth")) { + if (show) { + bluetoothRequest = true; + messageError.setText(getString(R.string.bluetooth_disabled)); + messageError.setOnClickListener(v -> { + AppPreferencesHelper.getInstance(getContext()).saveBluetoothMode(true); + ((MainActivity) Objects.requireNonNull(getActivity())).checkPermissions(); + }); + } else { + bluetoothRequest = false; + if (wifiRequest) { + showMessageConnection("wifi", true); + } + } + } + + if (wifiRequest || bluetoothRequest) { + Objects.requireNonNull(getActivity()).runOnUiThread(() -> { + boxMessage.startAnimation(AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in)); + boxMessage.setVisibility(View.VISIBLE); + }); + } else { + boxMessage.startAnimation(AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_out)); + boxMessage.setVisibility(View.GONE); + } + } + } + /** * Displays message. * * @param str @StringRes message. */ public void showMessage(@StringRes int str) { + Log.w("MainActivity", "show message: " + str); if (getContext() != null) { if (str == -1) { boxMessage.setVisibility(View.GONE); @@ -145,7 +210,8 @@ public void showMessage(@StringRes int str) { */ public void updateNamePatient(Patient patient) { if (patient != null) { - patientName.setText(patient.getName()); + String namePatient = patient.getName().split("\\s+")[0]; + patientName.setText(namePatient); if (patient.getGender().equals("male")) patientSex.setImageResource(R.drawable.x_boy); else diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/FragmentBloodPressure.java b/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/FragmentBloodPressure.java index 63721eca..ef280888 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/FragmentBloodPressure.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/FragmentBloodPressure.java @@ -107,7 +107,7 @@ public Measurement getMeasurement() { measurement.setSystolic(Integer.parseInt(systolic.getText().toString())); measurement.setDiastolic(Integer.parseInt(diastolic.getText().toString())); measurement.setPulse(pulseValue); - measurement.setUnit(getContext().getResources().getString(R.string.unit_glucose_mg_dL)); + measurement.setUnit(getContext().getResources().getString(R.string.unit_pressure)); measurement.setType("blood_pressure"); return measurement; } else { diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/MeasurementsGridFragment.java b/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/MeasurementsGridFragment.java index c17abab2..efcfbfd3 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/MeasurementsGridFragment.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/fragment/MeasurementsGridFragment.java @@ -31,6 +31,8 @@ import androidx.annotation.RequiresApi; +import com.github.clans.fab.FloatingActionMenu; + import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; @@ -63,6 +65,7 @@ import br.edu.uepb.nutes.haniot.data.repository.local.pref.AppPreferencesHelper; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.DisposableManager; import br.edu.uepb.nutes.haniot.data.repository.remote.haniot.HaniotNetRepository; +import br.edu.uepb.nutes.haniot.devices.BloodPressureActivity; import br.edu.uepb.nutes.haniot.devices.GlucoseActivity; import br.edu.uepb.nutes.haniot.devices.HeartRateActivity; import br.edu.uepb.nutes.haniot.devices.ScaleActivity; @@ -171,6 +174,30 @@ private void downloadLastMeasurements() { @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + FloatingActionMenu fab = ((MainActivity) getActivity()).patientActionsMenu; + if (fab == null) { + Log.w("AAA", "fab null"); + return; + } + +// gridMeasurement.addOnScrollListener(new RecyclerView.OnScrollListener() { +// +// @Override +// public void onScrolled(RecyclerView recyclerView, int dx, int dy) { +// if (dy > 0 || dy < 0 && fab.isShown()) +//// fab.hideMenu(true); +// fab.setVisibility(View.GONE); +// } +// +// @Override +// public void onScrollStateChanged(RecyclerView recyclerView, int newState) { +// Log.w("AAA", "onScrollStateChanged"); +// if (newState == RecyclerView.SCROLL_STATE_IDLE) +//// fab.hideMenu(false); +// fab.setVisibility(View.VISIBLE); +// super.onScrollStateChanged(recyclerView, newState); +// } +// }); // refreshManagerBLE(); } @@ -202,7 +229,7 @@ public void onPause() { bloodPressureManager = null; glucoseManager = null; heartRateManager = null; - if (simpleBleScanner != null) simpleBleScanner.stopScan(); +// if (simpleBleScanner != null) simpleBleScanner.stopScan(); } /** @@ -214,7 +241,7 @@ private void startScan() { && ((MainActivity) getActivity()).hasLocationPermissions()) { simpleBleScanner.startScan(simpleScannerCallback); } else if (isAdded() && getActivity() != null) { - communicator.showMessage(R.string.bluetooth_disabled); +// communicator.showMessageConnection(R.string.bluetooth_disabled); } } @@ -921,20 +948,23 @@ private MeasurementMonitor getMeasurementMonitor(int type) { public void onItemClick(MeasurementMonitor item) { switch (item.getType()) { case ItemGridType.TEMPERATURE: + if (thermometerManager != null) thermometerManager.close(); startActivity(new Intent(mContext, ThermometerActivity.class)); break; case ItemGridType.BLOOD_GLUCOSE: + if (glucoseManager != null) glucoseManager.close(); startActivity(new Intent(mContext, GlucoseActivity.class)); break; case ItemGridType.HEART_RATE: + if (heartRateManager != null) heartRateManager.close(); startActivity(new Intent(mContext, HeartRateActivity.class)); break; case ItemGridType.WEIGHT: + if (scaleManager != null) scaleManager.close(); startActivity(new Intent(mContext, ScaleActivity.class)); break; case ItemGridType.BLOOD_PRESSURE: - break; - default: + startActivity(new Intent(mContext, BloodPressureActivity.class)); break; } } @@ -984,4 +1014,9 @@ public void onMenuContextClick(View v, MeasurementMonitor item) { break; } } + + @Override + public void onItemSwiped(MeasurementMonitor item, int position) { + + } } \ No newline at end of file diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/service/ManagerDevices/GlucoseManager.java b/app/src/main/java/br/edu/uepb/nutes/haniot/service/ManagerDevices/GlucoseManager.java index 0a29aa49..ba701d99 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/service/ManagerDevices/GlucoseManager.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/service/ManagerDevices/GlucoseManager.java @@ -10,6 +10,7 @@ import android.util.Log; import android.util.SparseArray; +import java.util.Arrays; import java.util.Calendar; import java.util.UUID; @@ -77,17 +78,15 @@ protected void initializeCharacteristic() { enableNotifications(characteristicContext).enqueue(); } - private DataReceivedCallback contextDataReceivedCallback = new DataReceivedCallback() { - @Override - public void onDataReceived(@NonNull BluetoothDevice device, @NonNull Data data) { - processContext(device, data); - } - }; + private DataReceivedCallback contextDataReceivedCallback = (device, data) -> processContext(device, data); private ManagerCallback bleManagerCallbacks = new ManagerCallback() { @Override public void measurementReceiver(@NonNull BluetoothDevice device, @NonNull Data data) { if (glucoseDataCallback == null) return; + + Log.w(TAG, "DATA: " + data.toString()); + Log.w(TAG, "VALUE: " + Arrays.toString(data.getValue())); int offset = 0; final int flags = data.getIntValue(Data.FORMAT_UINT8, offset); offset += 1; @@ -151,6 +150,7 @@ public void measurementReceiver(@NonNull BluetoothDevice device, @NonNull Data d // if there is no context information following the measurement data, // notify callback about the new record if (!contextInfoFollows) { + Log.w(TAG, "PARSE: " + record.glucoseConcentration); glucoseDataCallback.onMeasurementReceived( device, record.glucoseConcentration, @@ -256,6 +256,8 @@ public void onDeviceNotSupported(@NonNull BluetoothDevice device) { * {@link } */ private void processContext(final BluetoothDevice device, final Data data) { + Log.w(TAG, "CONTEXT DATA: " + data.toString()); + Log.w(TAG, "CONTEXT VALUE: " + Arrays.toString(data.getValue())); final int UNIT_kg = 0; final int UNIT_l = 1; diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/service/ManagerDevices/ScaleManager.java b/app/src/main/java/br/edu/uepb/nutes/haniot/service/ManagerDevices/ScaleManager.java index a86b3f5c..d4b81f76 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/service/ManagerDevices/ScaleManager.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/service/ManagerDevices/ScaleManager.java @@ -59,7 +59,7 @@ public void measurementReceiver(@NonNull BluetoothDevice device, @NonNull Data d // 01 - unfinished weighing // 02 - finished weighing boolean isFinalized = String.format("%02X", data[3]).equals("02"); - + Log.w("AAA", "isFinalized " + isFinalized + " | isFinishMeasurement: " + isFinishMeasurement); // unfinished weighing // 08-09: weight - BE uint16 times 0.01 bodyMass = Integer.valueOf(String.format("%02X", data[8]) + @@ -84,6 +84,7 @@ public void measurementReceiver(@NonNull BluetoothDevice device, @NonNull Data d String.format("%02X", data[18]), 16) * 0.01f; if (scaleDataCallback != null) { + Log.w("AAA", "scaleDataCallback != null && !isFinishMeasurement"); scaleDataCallback.onMeasurementReceived( device, bodyMass, @@ -96,6 +97,7 @@ public void measurementReceiver(@NonNull BluetoothDevice device, @NonNull Data d if (scaleDataCallback != null && !isFinishMeasurement) { scaleDataCallback.onMeasurementReceiving(bodyMass, bodyMassUnit); } + isFinishMeasurement = false; } } diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/service/TokenExpirationService.java b/app/src/main/java/br/edu/uepb/nutes/haniot/service/TokenExpirationService.java index 9ecfbc26..3612a73d 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/service/TokenExpirationService.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/service/TokenExpirationService.java @@ -123,7 +123,7 @@ public TokenExpirationService getService() { /** * Class of Broadcast Receiver of Token Alarm. */ - public class TokenAlarmReceiver extends BroadcastReceiver { + public static class TokenAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { EventBus.getDefault().post("unauthorized"); diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/utils/ConnectionUtils.java b/app/src/main/java/br/edu/uepb/nutes/haniot/utils/ConnectionUtils.java index 9ec6aed5..67658bf7 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/utils/ConnectionUtils.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/utils/ConnectionUtils.java @@ -32,7 +32,7 @@ public final class ConnectionUtils { * @return true for device supports bluetooth or false otherwise. */ public static boolean isSupportedBluetooth() { - return (BluetoothAdapter.getDefaultAdapter() == null) ? false : true; + return BluetoothAdapter.getDefaultAdapter() != null; } /** diff --git a/app/src/main/java/br/edu/uepb/nutes/haniot/utils/GattAttributes.java b/app/src/main/java/br/edu/uepb/nutes/haniot/utils/GattAttributes.java index f665a987..0a289cfa 100644 --- a/app/src/main/java/br/edu/uepb/nutes/haniot/utils/GattAttributes.java +++ b/app/src/main/java/br/edu/uepb/nutes/haniot/utils/GattAttributes.java @@ -13,6 +13,7 @@ public class GattAttributes { public static String SERVICE_BLOOD_PRESSURE = "00001810-0000-1000-8000-00805f9b34fb"; public static String SERVICE_DEVICE_INFOR = "0000180a-0000-1000-8000-00805f9b34fb"; public static String SERVICE_SCALE = "0000ffe0-0000-1000-8000-00805f9b34fb"; + public static String SERVICE_SCALE_YUNMAI = "00001310-0000-1000-8000-00805f9b34fb"; public static String SERVICE_SCALE_USER_DATA = "0000ffe5-0000-1000-8000-00805f9b34fb"; public static String SERVICE_HEART_RATE = "0000180d-0000-1000-8000-00805f9b34fb"; diff --git a/app/src/main/res/anim/fade.xml b/app/src/main/res/anim/fade.xml new file mode 100644 index 00000000..5862a70a --- /dev/null +++ b/app/src/main/res/anim/fade.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/hide_to_bottom.xml b/app/src/main/res/anim/hide_to_bottom.xml new file mode 100644 index 00000000..2b46af60 --- /dev/null +++ b/app/src/main/res/anim/hide_to_bottom.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/anim/show_from_bottom.xml b/app/src/main/res/anim/show_from_bottom.xml new file mode 100644 index 00000000..5532d219 --- /dev/null +++ b/app/src/main/res/anim/show_from_bottom.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-pt-xxhdpi/zaddarrow.png b/app/src/main/res/drawable-pt-xxhdpi/zaddarrow.png deleted file mode 100644 index ed501a2c..00000000 Binary files a/app/src/main/res/drawable-pt-xxhdpi/zaddarrow.png and /dev/null differ diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 00000000..71e6e7ee --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_login.xml b/app/src/main/res/drawable/bg_button_login.xml new file mode 100644 index 00000000..a60181a7 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_login.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_device.xml b/app/src/main/res/drawable/bg_device.xml new file mode 100644 index 00000000..34e14e6c --- /dev/null +++ b/app/src/main/res/drawable/bg_device.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_admin.xml b/app/src/main/res/drawable/ic_admin.xml new file mode 100644 index 00000000..4440cfd3 --- /dev/null +++ b/app/src/main/res/drawable/ic_admin.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 00000000..8bed121a --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_error_device.xml b/app/src/main/res/drawable/ic_error_device.xml new file mode 100644 index 00000000..c66e088b --- /dev/null +++ b/app/src/main/res/drawable/ic_error_device.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/ic_error_server.png b/app/src/main/res/drawable/ic_error_server.png new file mode 100644 index 00000000..51c2e564 Binary files /dev/null and b/app/src/main/res/drawable/ic_error_server.png differ diff --git a/app/src/main/res/drawable/ic_form.png b/app/src/main/res/drawable/ic_form.png new file mode 100644 index 00000000..8893af47 Binary files /dev/null and b/app/src/main/res/drawable/ic_form.png differ diff --git a/app/src/main/res/drawable/ic_health_professional.xml b/app/src/main/res/drawable/ic_health_professional.xml new file mode 100644 index 00000000..74d11dd5 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_professional.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_no_devices.xml b/app/src/main/res/drawable/ic_no_devices.xml new file mode 100644 index 00000000..fcb9872f --- /dev/null +++ b/app/src/main/res/drawable/ic_no_devices.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_no_pilot_study.xml b/app/src/main/res/drawable/ic_no_pilot_study.xml new file mode 100644 index 00000000..4d1f3aa5 --- /dev/null +++ b/app/src/main/res/drawable/ic_no_pilot_study.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_not_form.png b/app/src/main/res/drawable/ic_not_form.png new file mode 100644 index 00000000..9bc78b2c Binary files /dev/null and b/app/src/main/res/drawable/ic_not_form.png differ diff --git a/app/src/main/res/layout-sw600dp/activity_main.xml b/app/src/main/res/layout-sw600dp/activity_main.xml index b1c202e8..4d59d252 100644 --- a/app/src/main/res/layout-sw600dp/activity_main.xml +++ b/app/src/main/res/layout-sw600dp/activity_main.xml @@ -37,7 +37,6 @@ android:id="@+id/nestedScrollView" android:layout_width="match_parent" android:layout_height="0dp" - android:fillViewport="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -72,6 +71,8 @@ android:layout_alignParentBottom="true" android:layout_margin="@dimen/fab_margin" android:paddingLeft="10dp" + app:menu_fab_hide_animation="@anim/hide_to_bottom" + app:menu_fab_show_animation="@anim/show_from_bottom" android:paddingRight="10dp" app:layout_constraintBottom_toBottomOf="parent" fab:menu_colorNormal="@color/colorAccent" diff --git a/app/src/main/res/layout-sw600dp/fragment_charts_dashboard.xml b/app/src/main/res/layout-sw600dp/fragment_charts_dashboard.xml index 3ccdee0f..19476ba2 100644 --- a/app/src/main/res/layout-sw600dp/fragment_charts_dashboard.xml +++ b/app/src/main/res/layout-sw600dp/fragment_charts_dashboard.xml @@ -176,7 +176,7 @@ android:textSize="12sp" /> + android:text="@string/settings_monitor_measurements" /> diff --git a/app/src/main/res/layout/activity_add_measurement.xml b/app/src/main/res/layout/activity_add_measurement.xml index ccb78bdf..beb39825 100644 --- a/app/src/main/res/layout/activity_add_measurement.xml +++ b/app/src/main/res/layout/activity_add_measurement.xml @@ -28,7 +28,6 @@ app:elevation="0dp"> - + android:visibility="visible" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="@null" + android:textColor="@color/colorTextDark" /> + android:layout_below="@+id/box_message_error" + android:layout_marginTop="15dp"> + + tools:context=".devices.BloodPressureActivity"> - - - - - + - - - + android:orientation="vertical" + android:layout_marginTop="60dp"> - - - + android:background="@color/colorButtonDanger" + android:gravity="center" + android:visibility="visible" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:textColor="@color/colorTextDark" /> + - + - + android:layout_height="match_parent" + android:gravity="center"> + - + + - + - + - + + - - - + - + + + + + + + + + + + + - - - - + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_body_composition.xml b/app/src/main/res/layout/activity_body_composition.xml index 26669627..aed3b8e1 100644 --- a/app/src/main/res/layout/activity_body_composition.xml +++ b/app/src/main/res/layout/activity_body_composition.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fab="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".devices.ScaleActivity"> @@ -14,162 +15,175 @@ android:fitsSystemWindows="true" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> - - - - - - - - - - - - - - - - - - - + + - - - - + + - - - - + android:visibility="visible" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + + + android:layout_marginTop="10dp" + android:layout_marginBottom="60dp" + android:scaleType="centerCrop" + app:layout_collapseMode="parallax"> - + android:layout_centerHorizontal="true" + app:cpb_background_progressbar_color="@color/colorAlertDanger" + app:cpb_background_progressbar_width="6dp" + app:cpb_progressbar_color="@color/colorAccent" + app:cpb_progressbar_width="6dp" /> + android:textColor="@color/colorTextDark" + android:textSize="55sp" + tools:ignore="HardcodedText" /> + android:layout_alignBaseline="@+id/body_mass_textview" + android:layout_alignBottom="@+id/body_mass_textview" + android:layout_marginStart="2dp" + android:layout_toEndOf="@+id/body_mass_textview" + android:text="@null" + android:textSize="20sp" /> + android:textSize="15sp" /> - + - + - + - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_forgot_password.xml b/app/src/main/res/layout/activity_forgot_password.xml new file mode 100644 index 00000000..f6cba9c9 --- /dev/null +++ b/app/src/main/res/layout/activity_forgot_password.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_glucose.xml b/app/src/main/res/layout/activity_glucose.xml index f21398d2..4d03e19e 100644 --- a/app/src/main/res/layout/activity_glucose.xml +++ b/app/src/main/res/layout/activity_glucose.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fab="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".devices.GlucoseActivity"> @@ -14,90 +15,14 @@ android:fitsSystemWindows="true" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_heart_rate.xml b/app/src/main/res/layout/activity_heart_rate.xml index 10c32a88..1ea6e88a 100644 --- a/app/src/main/res/layout/activity_heart_rate.xml +++ b/app/src/main/res/layout/activity_heart_rate.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fab="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".devices.HeartRateActivity"> @@ -17,100 +18,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -169,21 +182,21 @@ + app:layout_constraintBottom_toBottomOf="parent" + fab:menu_colorNormal="@color/colorAccent" + fab:menu_colorPressed="@color/colorPrimaryDark" + fab:menu_icon="@drawable/ic_add" + fab:menu_labels_colorNormal="@color/cardview_light_background" + fab:menu_labels_ellipsize="end" + fab:menu_labels_singleLine="true" + fab:menu_labels_textColor="@color/cardview_dark_background"> + fab:fab_size="mini" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 2ab3758a..0bd862e3 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -15,22 +15,28 @@ android:layout_height="wrap_content" android:animateLayoutChanges="true" android:orientation="vertical" - android:padding="30dp"> + android:padding="40dp"> + + + + @@ -39,6 +38,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:fillViewport="true" + android:descendantFocusability="blocksDescendants" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -47,6 +47,7 @@ - - + - - - + android:layout_below="@+id/toolbar_include"> - - - - - + android:layout_height="wrap_content"> - + android:visibility="gone"> + + + android:layout_marginTop="12dp" + android:gravity="center" + android:padding="@dimen/activity_horizontal_margin" + android:text="Opss! Houve algum erro." + android:textColor="@color/colorBlackGrey" + android:textSize="24sp" + android:textStyle="bold" + android:visibility="visible" /> + android:padding="@dimen/activity_horizontal_margin" + android:text="@string/error_500" + android:visibility="visible" /> - - - - - - + android:scrollbarSize="3sp" + android:scrollbarThumbVertical="@color/colorAccent" + android:scrollbars="vertical"> - - - - - - - - - - - + android:layout_marginBottom="@dimen/activity_horizontal_margin" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_patient_info.xml b/app/src/main/res/layout/activity_patient_info.xml deleted file mode 100644 index f0f7712f..00000000 --- a/app/src/main/res/layout/activity_patient_info.xml +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pilot_study.xml b/app/src/main/res/layout/activity_pilot_study.xml index 51af4215..30b8ebb4 100644 --- a/app/src/main/res/layout/activity_pilot_study.xml +++ b/app/src/main/res/layout/activity_pilot_study.xml @@ -1,77 +1,119 @@ + + - + android:layout_height="wrap_content" + app:layout_constraintTop_toBottomOf="@+id/toolbar_layout"> - - - - + android:orientation="vertical"> + + android:visibility="gone"> - + + + android:padding="@dimen/activity_horizontal_margin" + android:text="Opss! Você ainda não possui Piloto Estudo." + android:textColor="@color/colorBlackGrey" + android:textSize="24sp" + android:textStyle="bold" + android:visibility="visible" /> - - + + + + + android:paddingBottom="@dimen/activity_horizontal_margin"> - - + android:orientation="vertical" + android:visibility="gone"> - + + + + + + + + + - - - - + + - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_thermometer.xml b/app/src/main/res/layout/activity_thermometer.xml index d664e067..def2ba00 100644 --- a/app/src/main/res/layout/activity_thermometer.xml +++ b/app/src/main/res/layout/activity_thermometer.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fab="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".devices.ThermometerActivity"> @@ -17,68 +18,11 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -137,21 +168,21 @@ + app:layout_constraintBottom_toBottomOf="parent" + fab:menu_colorNormal="@color/colorAccent" + fab:menu_colorPressed="@color/colorPrimaryDark" + fab:menu_icon="@drawable/ic_add" + fab:menu_labels_colorNormal="@color/cardview_light_background" + fab:menu_labels_ellipsize="end" + fab:menu_labels_singleLine="true" + fab:menu_labels_textColor="@color/cardview_dark_background"> + fab:fab_size="mini" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_blood_pressure_measurement.xml b/app/src/main/res/layout/fragment_blood_pressure_measurement.xml index b58a56ea..1338a4d9 100644 --- a/app/src/main/res/layout/fragment_blood_pressure_measurement.xml +++ b/app/src/main/res/layout/fragment_blood_pressure_measurement.xml @@ -10,8 +10,8 @@ android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" - android:paddingBottom="70dp" - android:fillViewport="true"> + android:fillViewport="true" + android:paddingBottom="70dp"> @@ -78,8 +78,8 @@ android:layout_centerHorizontal="true" android:layout_marginTop="-90dp" android:layout_marginBottom="7dp" - android:text="/" android:gravity="center" + android:text="/" android:textColor="@color/colorPrimary" android:textSize="70sp" android:textStyle="bold" /> @@ -149,12 +149,10 @@ android:layout_below="@+id/value" android:layout_alignParentStart="true" android:layout_alignParentEnd="false" - android:layout_marginStart="336dp" + android:layout_marginStart="270dp" android:layout_marginTop="-6dp" - android:text="bpm " + android:text="@string/unit_heart_rate" android:textColor="@color/colorSubmenu" /> - /> - diff --git a/app/src/main/res/layout/fragment_charts_dashboard.xml b/app/src/main/res/layout/fragment_charts_dashboard.xml index d07692c7..fa21db07 100644 --- a/app/src/main/res/layout/fragment_charts_dashboard.xml +++ b/app/src/main/res/layout/fragment_charts_dashboard.xml @@ -180,7 +180,7 @@ android:textSize="12sp" /> - + android:text="@string/settings_monitor_measurements" /> diff --git a/app/src/main/res/layout/item_device.xml b/app/src/main/res/layout/item_device.xml index 164ca0eb..004c4cc7 100644 --- a/app/src/main/res/layout/item_device.xml +++ b/app/src/main/res/layout/item_device.xml @@ -1,41 +1,70 @@ + android:focusable="true"> - + android:background="?android:attr/selectableItemBackground" + android:padding="8dp" + card_view:cardCornerRadius="6dp" + card_view:cardElevation="1dp" + card_view:cardPreventCornerOverlap="false" + card_view:cardUseCompatPadding="true"> - + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/layout/item_evaluation.xml b/app/src/main/res/layout/item_evaluation.xml index 03313556..bcbd5155 100644 --- a/app/src/main/res/layout/item_evaluation.xml +++ b/app/src/main/res/layout/item_evaluation.xml @@ -64,16 +64,6 @@ android:textAlignment="textStart" android:textSize="16sp" /> - - @@ -257,7 +246,6 @@ android:layout_below="@+id/textDescription" android:layout_alignParentStart="true" android:layout_marginTop="4dp" - android:layout_toStartOf="@+id/check_item" android:visibility="gone"> diff --git a/app/src/main/res/layout/item_evaluation_section.xml b/app/src/main/res/layout/item_evaluation_section.xml index 51b1d9f3..5ddced4e 100644 --- a/app/src/main/res/layout/item_evaluation_section.xml +++ b/app/src/main/res/layout/item_evaluation_section.xml @@ -18,7 +18,7 @@ android:layout_marginEnd="1dp" android:text="@string/heart_rate" android:textAlignment="textStart" - android:textSize="18sp" /> + android:textSize="14sp" /> -