From a82fa7fa4f462b3c4764aa5296e5df93661ad292 Mon Sep 17 00:00:00 2001 From: Sagar S Date: Mon, 11 Nov 2019 16:04:35 +0530 Subject: [PATCH] #737 Design & Implementation of SAMS logo & download mindmap zip #744 Implementation of Notifications when doctor has provided the prescription & add prescription icon on Activities #726 Remove repeated questions from Associated Symptoms #557 Improve the formatting for associated complaints --- app/build.gradle | 4 - app/src/main/AndroidManifest.xml | 4 +- .../ActivePatientActivity.java | 67 +++++- .../ActivePatientAdapter.java | 34 ++- .../ComplaintNodeActivity.java | 19 +- .../FamilyHistoryActivity.java | 7 +- .../activities/homeActivity/HomeActivity.java | 165 ++++++++++++--- .../activities/homeActivity/HomeAdapter.java | 3 +- .../loginActivity/LoginActivity.java | 195 ++++++------------ .../PastMedicalHistoryActivity.java | 6 +- .../PhysicalExamActivity.java | 16 +- .../PrivacyNotice_Activity.java | 2 +- .../QuestionNodeActivity.java | 96 ++++++++- .../setupActivity/SetupActivity.java | 117 ++++++++++- .../TodayPatientActivity.java | 14 +- .../TodayPatientAdapter.java | 9 +- .../VisitSummaryActivity.java | 120 +++++++++-- .../vitalActivity/VitalsActivity.java | 3 +- .../client/database/dao/SyncDAO.java | 71 ++++++- .../client/networkApiCalls/ApiInterface.java | 6 + .../client/utilities/SessionManager.java | 2 +- app/src/main/res/layout/activity_home.xml | 9 +- .../res/layout/activity_privacy_notice_2.xml | 20 ++ app/src/main/res/menu/today_filter.xml | 2 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4905 -> 4657 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2783 -> 2643 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6895 -> 5956 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10413 -> 11486 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15132 -> 14849 bytes 31 files changed, 749 insertions(+), 252 deletions(-) delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/app/build.gradle b/app/build.gradle index 148bb98b28..33756e74f5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,10 +102,6 @@ dependencies { implementation('com.github.SandroMachado:restaurant:0.2.0@aar') { transitive = true } - - implementation 'com.rengwuxian.materialedittext:library:2.1.4' - - } apply plugin: 'com.google.gms.google-services' // Google Play services Gradle plugin diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 954ff82b5c..2ca6e9bed4 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,7 +31,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true" - android:roundIcon="@mipmap/ic_launcher" + android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true"> @@ -233,7 +233,7 @@ - + diff --git a/app/src/main/java/io/intelehealth/client/activities/activePatientsActivity/ActivePatientActivity.java b/app/src/main/java/io/intelehealth/client/activities/activePatientsActivity/ActivePatientActivity.java index 904e5af49e..3ba0cf1a53 100644 --- a/app/src/main/java/io/intelehealth/client/activities/activePatientsActivity/ActivePatientActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/activePatientsActivity/ActivePatientActivity.java @@ -24,13 +24,18 @@ import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; import io.intelehealth.client.R; import io.intelehealth.client.activities.homeActivity.HomeActivity; import io.intelehealth.client.app.AppConstants; +import io.intelehealth.client.database.dao.EncounterDAO; import io.intelehealth.client.database.dao.ProviderDAO; +import io.intelehealth.client.database.dao.VisitsDAO; import io.intelehealth.client.models.ActivePatientModel; +import io.intelehealth.client.models.dto.EncounterDTO; +import io.intelehealth.client.models.dto.VisitDTO; import io.intelehealth.client.utilities.Logger; import io.intelehealth.client.utilities.SessionManager; import io.intelehealth.client.utilities.StringUtils; @@ -46,6 +51,8 @@ public class ActivePatientActivity extends AppCompatActivity { RecyclerView recyclerView; AlertDialog.Builder dialogBuilder; + private ArrayList listPatientUUID = new ArrayList(); + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -73,6 +80,50 @@ protected void onCreate(Bundle savedInstanceState) { recyclerView.setVisibility(View.VISIBLE); doQuery(); } + + getVisits(); + } + + private void getVisits() { + + ArrayList encounterVisitUUID = new ArrayList(); + HashSet hsPatientUUID = new HashSet(); + + //Get all Visits + VisitsDAO visitsDAO = new VisitsDAO(); + List visitsDTOList = visitsDAO.getAllVisits(); + + //Get all Encounters + EncounterDAO encounterDAO = new EncounterDAO(); + List encounterDTOList = encounterDAO.getAllEncounters(); + + //Get Visit Note Encounters only, visit note encounter id - d7151f82-c1f3-4152-a605-2f9ea7414a79 + if (encounterDTOList.size() > 0) { + for (int i = 0; i < encounterDTOList.size(); i++) { + if (encounterDTOList.get(i).getEncounterTypeUuid().equalsIgnoreCase("d7151f82-c1f3-4152-a605-2f9ea7414a79")) { + encounterVisitUUID.add(encounterDTOList.get(i).getVisituuid()); + } + } + } + + //Get patientUUID from visitList + for (int i = 0; i < encounterVisitUUID.size(); i++) { + + for (int j = 0; j < visitsDTOList.size(); j++) { + + if (encounterVisitUUID.get(i).equalsIgnoreCase(visitsDTOList.get(j).getUuid())) { + listPatientUUID.add(visitsDTOList.get(j).getPatientuuid()); + } + } + } + + if (listPatientUUID.size() > 0) { + + hsPatientUUID.addAll(listPatientUUID); + listPatientUUID.clear(); + listPatientUUID.addAll(hsPatientUUID); + + } } /** @@ -84,9 +135,9 @@ private void doQuery() { List activePatientList = new ArrayList<>(); Date cDate = new Date(); String query = "SELECT a.uuid, a.patientuuid, a.startdate, a.enddate, b.first_name, b.middle_name, b.last_name, b.date_of_birth,b.openmrs_id " + - "FROM tbl_visit a, tbl_patient b " + - "WHERE a.patientuuid = b.uuid " + - "AND a.enddate is NULL OR a.enddate='' GROUP BY a.uuid ORDER BY a.startdate ASC"; + "FROM tbl_visit a, tbl_patient b " + + "WHERE a.patientuuid = b.uuid " + + "AND a.enddate is NULL OR a.enddate='' GROUP BY a.uuid ORDER BY a.startdate ASC"; final Cursor cursor = db.rawQuery(query, null); if (cursor != null) { @@ -119,7 +170,7 @@ private void doQuery() { for (ActivePatientModel activePatientModel : activePatientList) Logger.logD(TAG, activePatientModel.getFirst_name() + " " + activePatientModel.getLast_name()); - ActivePatientAdapter mActivePatientAdapter = new ActivePatientAdapter(activePatientList, ActivePatientActivity.this); + ActivePatientAdapter mActivePatientAdapter = new ActivePatientAdapter(activePatientList, ActivePatientActivity.this, listPatientUUID); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ActivePatientActivity.this); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.addItemDecoration(new @@ -259,9 +310,9 @@ private boolean endVisit(String patientUuid, String patientName, String visitUUI private void doQueryWithProviders(List providersuuids) { List activePatientList = new ArrayList<>(); String query = "select distinct a.uuid,c.uuid AS patientuuid,a.startdate AS startdate,a.enddate AS enddate, c.first_name,c.middle_name,c.last_name,c.openmrs_id,c.date_of_birth " + - "from tbl_visit a,tbl_encounter b ,tbl_patient c " + - "where b.visituuid=a.uuid and b.provider_uuid in ('" + StringUtils.convertUsingStringBuilder(providersuuids) + "') " + - "and a.patientuuid=c.uuid and (a.enddate is null OR a.enddate='') order by a.startdate ASC"; + "from tbl_visit a,tbl_encounter b ,tbl_patient c " + + "where b.visituuid=a.uuid and b.provider_uuid in ('" + StringUtils.convertUsingStringBuilder(providersuuids) + "') " + + "and a.patientuuid=c.uuid and (a.enddate is null OR a.enddate='') order by a.startdate ASC"; Logger.logD(TAG, query); final Cursor cursor = db.rawQuery(query, null); @@ -295,7 +346,7 @@ private void doQueryWithProviders(List providersuuids) { for (ActivePatientModel activePatientModel : activePatientList) Logger.logD(TAG, activePatientModel.getFirst_name() + " " + activePatientModel.getLast_name()); - ActivePatientAdapter mActivePatientAdapter = new ActivePatientAdapter(activePatientList, ActivePatientActivity.this); + ActivePatientAdapter mActivePatientAdapter = new ActivePatientAdapter(activePatientList, ActivePatientActivity.this, listPatientUUID); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ActivePatientActivity.this); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.addItemDecoration(new diff --git a/app/src/main/java/io/intelehealth/client/activities/activePatientsActivity/ActivePatientAdapter.java b/app/src/main/java/io/intelehealth/client/activities/activePatientsActivity/ActivePatientAdapter.java index 5a5535c8a8..f32f4edde0 100644 --- a/app/src/main/java/io/intelehealth/client/activities/activePatientsActivity/ActivePatientAdapter.java +++ b/app/src/main/java/io/intelehealth/client/activities/activePatientsActivity/ActivePatientAdapter.java @@ -7,8 +7,10 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; +import java.util.ArrayList; import java.util.List; import io.intelehealth.client.R; @@ -26,10 +28,12 @@ public class ActivePatientAdapter extends RecyclerView.Adapter activePatientModels; Context context; LayoutInflater layoutInflater; + ArrayList listPatientUUID; - public ActivePatientAdapter(List activePatientModels, Context context) { + public ActivePatientAdapter(List activePatientModels, Context context, ArrayList _listPatientUUID) { this.activePatientModels = activePatientModels; this.context = context; + this.listPatientUUID = _listPatientUUID; } @Override @@ -48,7 +52,7 @@ public void onBindViewHolder(ActivePatientViewHolder holder, int position) { final ActivePatientModel activePatientModel = activePatientModels.get(position); String header; if (activePatientModel.getOpenmrs_id() != null) { - header = String.format("%s %s - " + context.getString(R.string.visit_summary_heading_id) + ": %s", activePatientModel.getFirst_name(), + header = String.format("%s %s, %s", activePatientModel.getFirst_name(), activePatientModel.getLast_name(), activePatientModel.getOpenmrs_id()); } else { header = String.format("%s %s", activePatientModel.getFirst_name(), @@ -56,11 +60,8 @@ public void onBindViewHolder(ActivePatientViewHolder holder, int position) { } int age = DateAndTimeUtils.getAge(activePatientModel.getDate_of_birth()); String dob = DateAndTimeUtils.SimpleDatetoLongDate(activePatientModel.getDate_of_birth()); - String body = String.format(context.getString(R.string.id_number) + ": %s \n " + - context.getString(R.string.identification_screen_prompt_phone_number) + ": %s\n" + - context.getString(R.string.identification_screen_prompt_birthday) + - ": %s (" + context.getString(R.string.identification_screen_prompt_age) + " %d)", activePatientModel.getOpenmrs_id(), activePatientModel.getPhone_number(), - dob, age); + String body = String.format(context.getString(R.string.identification_screen_prompt_age) + " %d yrs", age); + holder.getHeadTextView().setText(header); holder.getBodyTextView().setText(body); @@ -79,11 +80,28 @@ public void onClick(View v) { intent.putExtra("patientUuid", activePatientModel.getPatientuuid()); intent.putExtra("status", patientStatus); intent.putExtra("tag", ""); + + if (holder.ivPriscription.getTag().equals("1")) { + intent.putExtra("hasPrescription", "true"); + } else { + intent.putExtra("hasPrescription", "false"); + } context.startActivity(intent); } }); + + for (int i = 0; i < listPatientUUID.size(); i++) { + if (activePatientModels.get(position).getPatientuuid().equalsIgnoreCase(listPatientUUID.get(i))) { + holder.ivPriscription.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_prescription_green)); + holder.ivPriscription.setTag("1"); + } + } } + @Override + public int getItemViewType(int position) { + return position; + } @Override public int getItemCount() { @@ -95,12 +113,14 @@ public class ActivePatientViewHolder extends RecyclerView.ViewHolder { private TextView bodyTextView; private TextView indicatorTextView; private View rootView; + private ImageView ivPriscription; public ActivePatientViewHolder(View itemView) { super(itemView); headTextView = itemView.findViewById(R.id.list_item_head_text_view); bodyTextView = itemView.findViewById(R.id.list_item_body_text_view); indicatorTextView = itemView.findViewById(R.id.list_item_indicator_text_view); + ivPriscription = itemView.findViewById(R.id.iv_prescription); rootView = itemView; } public TextView getHeadTextView() { diff --git a/app/src/main/java/io/intelehealth/client/activities/complaintNodeActivity/ComplaintNodeActivity.java b/app/src/main/java/io/intelehealth/client/activities/complaintNodeActivity/ComplaintNodeActivity.java index 8bfd5a5bbf..b5fb099c33 100644 --- a/app/src/main/java/io/intelehealth/client/activities/complaintNodeActivity/ComplaintNodeActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/complaintNodeActivity/ComplaintNodeActivity.java @@ -2,6 +2,7 @@ import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Typeface; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AlertDialog; @@ -16,6 +17,7 @@ import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.Button; import android.widget.ListView; import com.crashlytics.android.Crashlytics; @@ -47,12 +49,8 @@ public class ComplaintNodeActivity extends AppCompatActivity { String state; String patientName; String intentTag; - SearchView searchView; - - List complaints; - CustomArrayAdapter listAdapter; String encounterVitals; String encounterAdultIntials; @@ -119,7 +117,8 @@ public void onClick(View view) { boolean hasLicense = false; - if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) +// if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) + if (!sessionManager.getLicenseKey().isEmpty()) hasLicense = true; JSONObject currentFile = null; if (hasLicense) { @@ -200,6 +199,9 @@ public void onClick(DialogInterface dialog, int which) { }); AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); + Button pb = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + pb.setTextColor(getResources().getColor((R.color.colorPrimary))); + pb.setTypeface(Typeface.DEFAULT,Typeface.BOLD); } else { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); alertDialogBuilder.setTitle(R.string.complaint_dialog_title); @@ -207,6 +209,7 @@ public void onClick(DialogInterface dialog, int which) { View convertView = inflater.inflate(R.layout.list_dialog_complaint, null); alertDialogBuilder.setView(convertView); ListView listView = convertView.findViewById(R.id.complaint_dialog_list_view); + listView.setDivider(null); ArrayAdapter arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, displaySelection); listView.setAdapter(arrayAdapter); alertDialogBuilder.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() { @@ -236,6 +239,12 @@ public void onClick(DialogInterface dialog, int which) { }); AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); + Button pb = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + Button nb = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + pb.setTextColor(getResources().getColor((R.color.colorPrimary))); + pb.setTypeface(Typeface.DEFAULT,Typeface.BOLD); + nb.setTextColor(getResources().getColor((R.color.colorPrimary))); + nb.setTypeface(Typeface.DEFAULT,Typeface.BOLD); } } } diff --git a/app/src/main/java/io/intelehealth/client/activities/familyHistoryActivity/FamilyHistoryActivity.java b/app/src/main/java/io/intelehealth/client/activities/familyHistoryActivity/FamilyHistoryActivity.java index 9c22e966c5..7cc535d2f7 100644 --- a/app/src/main/java/io/intelehealth/client/activities/familyHistoryActivity/FamilyHistoryActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/familyHistoryActivity/FamilyHistoryActivity.java @@ -50,11 +50,8 @@ public class FamilyHistoryActivity extends AppCompatActivity { String patientName; String intentTag; - ArrayList physicalExams; - String mFileName = "famHist.json"; - int lastExpandedPosition = -1; Node familyHistoryMap; @@ -157,7 +154,8 @@ public void onClick(View view) { } }); - if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) +// if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) + if (!sessionManager.getLicenseKey().isEmpty()) hasLicense = true; if (hasLicense) { @@ -257,6 +255,7 @@ private void onFabClick() { intent.putExtra("state", state); intent.putExtra("name", patientName); intent.putExtra("tag", intentTag); + intent.putExtra("hasPrescription", "false"); startActivity(intent); } else { diff --git a/app/src/main/java/io/intelehealth/client/activities/homeActivity/HomeActivity.java b/app/src/main/java/io/intelehealth/client/activities/homeActivity/HomeActivity.java index 54f3612057..ed6f90ef56 100644 --- a/app/src/main/java/io/intelehealth/client/activities/homeActivity/HomeActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/homeActivity/HomeActivity.java @@ -13,6 +13,7 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Paint; +import android.net.ConnectivityManager; import android.os.Build; import android.os.Bundle; import android.os.CountDownTimer; @@ -21,6 +22,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.CardView; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -34,6 +36,7 @@ import androidx.work.ExistingPeriodicWorkPolicy; import androidx.work.WorkManager; +import java.io.File; import java.util.Locale; import io.intelehealth.client.R; @@ -46,12 +49,21 @@ import io.intelehealth.client.activities.todayPatientActivity.TodayPatientActivity; import io.intelehealth.client.activities.videoLibraryActivity.VideoLibraryActivity; import io.intelehealth.client.app.AppConstants; +import io.intelehealth.client.models.DownloadMindMapRes; +import io.intelehealth.client.networkApiCalls.ApiClient; +import io.intelehealth.client.networkApiCalls.ApiInterface; import io.intelehealth.client.services.DownloadProtocolsTask; import io.intelehealth.client.syncModule.SyncUtils; import io.intelehealth.client.utilities.ConfigUtils; +import io.intelehealth.client.utilities.DownloadMindMaps; import io.intelehealth.client.utilities.Logger; import io.intelehealth.client.utilities.OfflineLogin; import io.intelehealth.client.utilities.SessionManager; +import io.intelehealth.client.widget.materialprogressbar.CustomProgressDialog; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; import static io.intelehealth.client.app.AppConstants.UNIQUE_WORK_NAME; @@ -76,6 +88,11 @@ public class HomeActivity extends AppCompatActivity { private String key = null; private String licenseUrl = null; + Context context; + CustomProgressDialog customProgressDialog; + private String mindmapURL = ""; + private DownloadMindMaps mTask; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -92,6 +109,8 @@ protected void onCreate(Bundle savedInstanceState) { getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); } setTitle(R.string.title_activity_login); + context = HomeActivity.this; + customProgressDialog = new CustomProgressDialog(context); reMyreceive = new Myreceiver(); filter = new IntentFilter("lasysync"); @@ -157,8 +176,8 @@ public void onClick(View v) { }); WorkManager.getInstance().enqueueUniquePeriodicWork(UNIQUE_WORK_NAME, ExistingPeriodicWorkPolicy.KEEP, AppConstants.PERIODIC_WORK_REQUEST); if (sessionManager.isFirstTimeLaunched()) { - TempDialog = new ProgressDialog(HomeActivity.this); - TempDialog.setMessage("Please wait..."); + TempDialog = new ProgressDialog(HomeActivity.this, R.style.AlertDialogStyle); //thats how to add a style! + TempDialog.setTitle("Sync in progress"); TempDialog.setCancelable(false); TempDialog.setProgress(i); @@ -166,7 +185,8 @@ public void onClick(View v) { CDT = new CountDownTimer(7000, 1000) { public void onTick(long millisUntilFinished) { - TempDialog.setMessage("Please wait.. Syncing"); + TempDialog.setTitle("Sync in progress"); + TempDialog.setMessage("Please wait..."); i--; } @@ -188,6 +208,11 @@ public void onFinish() { } + private boolean isNetworkConnected() { + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + + return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected(); + } @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -208,14 +233,12 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; case R.id.updateProtocolsOption: { - if (sessionManager.getLicenseKey() != null && sessionManager.getLicenseKey().equalsIgnoreCase("http://mindmaps.intelehealth.io:4040")) { - String license = sessionManager.getLicenseKey(); - if (license != null) { - DownloadProtocolsTask downloadProtocolsTask = new DownloadProtocolsTask(this); - downloadProtocolsTask.execute(license); - } else { - Toast.makeText(this, "License invalid", Toast.LENGTH_SHORT).show(); - } + if (!sessionManager.getLicenseKey().isEmpty()) { + + String licenseUrl = sessionManager.getMindMapServerUrl(); + String licenseKey = sessionManager.getLicenseKey(); + getMindmapDownloadURL("http://" + licenseUrl + ":3004/", licenseKey); + } else { AlertDialog.Builder dialog = new AlertDialog.Builder(this); LayoutInflater li = LayoutInflater.from(this); @@ -228,29 +251,25 @@ public void onClick(DialogInterface dialog, int which) { Dialog d = (Dialog) dialog; - EditText text = d.findViewById(R.id.licensekey); - // text.setText(sessionManager.getLicenseKey()); - EditText url = d.findViewById(R.id.licenseurl); - // url.setText(sessionManager.getMindMapServerUrl()); - if (text.getText().toString().isEmpty() && text.getText() == null || url.getText().toString().isEmpty() && url.getText() == null) { - text.setFocusable(true); - text.setError("Enter license key"); + EditText etURL = d.findViewById(R.id.licenseurl); + EditText etKey = d.findViewById(R.id.licensekey); + String url = etURL.getText().toString().trim(); + String key = etKey.getText().toString().trim(); + + if (url.isEmpty()) { + etURL.setError("Enter Server URL"); + etURL.requestFocus(); + return; } - if (sessionManager.getLicenseKey() != null && sessionManager.getLicenseKey().equalsIgnoreCase("http://mindmaps.intelehealth.io:4040")) { - text.setText(sessionManager.getLicenseKey()); - url.setText(sessionManager.getMindMapServerUrl()); + if (key.isEmpty()) { + etKey.setError("Enter License Key"); + etKey.requestFocus(); + return; } - key = text.getText().toString(); - licenseUrl = url.getText().toString(); - sessionManager.setMindMapServerUrl(licenseUrl); + sessionManager.setMindMapServerUrl(url); + getMindmapDownloadURL("http://" + url + ":3004/", key); - if (keyVerified(key)) { - DownloadProtocolsTask downloadProtocolsTask = new DownloadProtocolsTask(HomeActivity.this); - downloadProtocolsTask.execute(key); - - - } } }) .setNegativeButton(getString(R.string.button_cancel), new DialogInterface.OnClickListener() { @@ -272,7 +291,7 @@ public void onClick(DialogInterface dialog, int which) { // boolean i = imagesPushDAO.patientProfileImagesPush(); // boolean o = imagesPushDAO.obsImagesPush(); if (isSynced) - AppConstants.notificationUtils.showNotifications("ImageUpload", "ImageUpload Completed", 4, this); + AppConstants.notificationUtils.showNotifications_noProgress("Sync not available", "Please connect to an internet connection!", getApplicationContext()); else AppConstants.notificationUtils.showNotifications("ImageUpload", "ImageUpload failed", 4, this); return true; @@ -385,4 +404,88 @@ public void onReceive(Context context, Intent intent) { } } + private void getMindmapDownloadURL(String url, String key) { + customProgressDialog.show(); + ApiClient.changeApiBaseUrl(url); + ApiInterface apiService = ApiClient.createService(ApiInterface.class); + try { + Observable resultsObservable = apiService.DOWNLOAD_MIND_MAP_RES_OBSERVABLE(key); + resultsObservable + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new DisposableObserver() { + @Override + public void onNext(DownloadMindMapRes res) { + customProgressDialog.dismiss(); + if (res.getMessage() != null && res.getMessage().equalsIgnoreCase("Success")) { + + Log.e("MindMapURL", "Successfully get MindMap URL"); + mTask = new DownloadMindMaps(context); + mindmapURL = res.getMindmap().trim(); + sessionManager.setLicenseKey(key); + checkExistingMindMaps(); + + } else { + Toast.makeText(context, getResources().getString(R.string.no_mindmaps_found), Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onError(Throwable e) { + customProgressDialog.dismiss(); + Toast.makeText(context, getResources().getString(R.string.unable_to_get_proper_response), Toast.LENGTH_SHORT).show(); + } + + @Override + public void onComplete() { + + } + }); + } catch (IllegalArgumentException e) { + Log.e(TAG, "changeApiBaseUrl: " + e.getMessage()); + Log.e(TAG, "changeApiBaseUrl: " + e.getStackTrace()); + } + } + + private void checkExistingMindMaps() { + + //Check is there any existing mindmaps are present, if yes then delete. + + File engines = new File(context.getFilesDir().getAbsolutePath(), "/Engines"); + Log.e(TAG, "Engines folder=" + engines.exists()); + if (engines.exists()) { + engines.delete(); + } + File logo = new File(context.getFilesDir().getAbsolutePath(), "/logo"); + Log.e(TAG, "Logo folder=" + logo.exists()); + if (logo.exists()) { + logo.delete(); + } + File physicalExam = new File(context.getFilesDir().getAbsolutePath() + "/physExam.json"); + Log.e(TAG, "physExam.json=" + physicalExam.exists()); + if (physicalExam.exists()) { + physicalExam.delete(); + } + File familyHistory = new File(context.getFilesDir().getAbsolutePath() + "/famHist.json"); + Log.e(TAG, "famHist.json=" + familyHistory.exists()); + if (familyHistory.exists()) { + familyHistory.delete(); + } + File pastMedicalHistory = new File(context.getFilesDir().getAbsolutePath() + "/patHist.json"); + Log.e(TAG, "patHist.json=" + pastMedicalHistory.exists()); + if (pastMedicalHistory.exists()) { + pastMedicalHistory.delete(); + } + File config = new File(context.getFilesDir().getAbsolutePath() + "/config.json"); + Log.e(TAG, "config.json=" + config.exists()); + if (config.exists()) { + config.delete(); + } + + //Start downloading mindmaps + mTask.execute(mindmapURL, context.getFilesDir().getAbsolutePath() + "/mindmaps.zip"); + Log.e("DOWNLOAD", "isSTARTED"); + + } + } diff --git a/app/src/main/java/io/intelehealth/client/activities/homeActivity/HomeAdapter.java b/app/src/main/java/io/intelehealth/client/activities/homeActivity/HomeAdapter.java index 6d8a47e3d2..6f26699e49 100644 --- a/app/src/main/java/io/intelehealth/client/activities/homeActivity/HomeAdapter.java +++ b/app/src/main/java/io/intelehealth/client/activities/homeActivity/HomeAdapter.java @@ -28,7 +28,6 @@ public class HomeAdapter extends RecyclerView.Adapter { final static String TAG = HomeAdapter.class.getSimpleName(); - final String[] options = {IntelehealthApplication.getAppContext().getString(R.string.new_patient), IntelehealthApplication.getAppContext().getString(R.string.find_patient), IntelehealthApplication.getAppContext().getString(R.string.today_patient), @@ -42,7 +41,7 @@ public class HomeAdapter extends RecyclerView.Adapter 4; } - private void showProgress(final boolean show) { - if (progress == null) { - progress = new ProgressDialog(LoginActivity.this); - progress.setTitle(getString(R.string.please_wait_progress)); - progress.setMessage(getString(R.string.logging_in)); - } - if (show) progress.show(); - else progress.dismiss(); - } - public void cant_log() { final SpannableString span_string = new SpannableString(getApplicationContext().getText(R.string.email_link)); Linkify.addLinks(span_string, Linkify.EMAIL_ADDRESSES); @@ -266,32 +258,11 @@ public void onClick(DialogInterface dialog, int which) { */ public void UserLoginTask(String mEmail, String mPassword) { -// private final String mEmail; -// private final String mPassword; -// boolean success = false; - -// UserLoginTask(String email, String password) { -// mEmail = email; -// mPassword = password; -// } - -// @Override -// protected void onPreExecute() { -// super.onPreExecute(); -// showProgress(true); -// } - -// @Override -// protected Boolean doInBackground(Void... params) { - - -// Log.d(TAG, "UN: " + USERNAME); -// Log.d(TAG, "PW: " + PASSWORD); String urlString = urlModifiers.loginUrl(sessionManager.getServerUrl()); - Logger.logD(TAG, "usernaem and password" + mEmail + mPassword); + Logger.logD(TAG, "username and password" + mEmail + mPassword); encoded = base64Utils.encoded(mEmail, mPassword); sessionManager.setEncoded(encoded); - showProgress(true); + cpd.show(); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); Observable loginModelObservable = AppConstants.apiInterface.LOGIN_MODEL_OBSERVABLE(urlString, "Basic " + encoded); @@ -325,17 +296,15 @@ public void onNext(LoginProviderModel loginProviderModel) { for (int i = 0; i < loginProviderModel.getResults().size(); i++) { Log.i(TAG, "doInBackground: " + loginProviderModel.getResults().get(i).getUuid()); sessionManager.setProviderID(loginProviderModel.getResults().get(i).getUuid()); -// success = true; final Account account = new Account(mEmail, "io.intelehealth.openmrs"); manager.addAccountExplicitly(account, mPassword, null); offlineLogin.invalidateLoginCredentials(); offlineLogin.setUpOfflineLogin(mEmail, mPassword); Intent intent = new Intent(LoginActivity.this, HomeActivity.class); intent.putExtra("login", true); -// startJobDispatcherService(LoginActivity.this); startActivity(intent); finish(); - showProgress(false); + cpd.dismiss(); sessionManager.setReturningUser(true); @@ -346,8 +315,7 @@ public void onNext(LoginProviderModel loginProviderModel) { @Override public void onError(Throwable e) { Logger.logD(TAG, "handle provider error" + e.getMessage()); -// success = false; - showProgress(false); + cpd.dismiss(); } @Override @@ -361,16 +329,9 @@ public void onComplete() { @Override public void onError(Throwable e) { Logger.logD(TAG, "Login Failure" + e.getMessage()); -// success = false; - showProgress(false); -// DialogUtils dialogUtils=new DialogUtils(); -// dialogUtils.showerrorDialog(LoginActivity.this,"Error Login",getString(R.string.error_incorrect_password),"ok"); + cpd.dismiss(); Toast.makeText(LoginActivity.this, getString(R.string.error_incorrect_password), Toast.LENGTH_SHORT).show(); - mPasswordView.setError(""); - mUsernameView.setError(""); - mPasswordView.setText(""); - mUsernameView.setText(""); - mPasswordView.requestFocus(); + } @Override @@ -379,28 +340,6 @@ public void onComplete() { } }); - -// return true; -// -// } - -// @Override -// protected void onPostExecute(final Boolean success) { -// mAuthTask = null; - - -// if (success) { - -// } else { -// -// } -// } - -// @Override -// protected void onCancelled() { -// mAuthTask = null; -// showProgress(false); -// } } } diff --git a/app/src/main/java/io/intelehealth/client/activities/pastMedicalHistoryActivity/PastMedicalHistoryActivity.java b/app/src/main/java/io/intelehealth/client/activities/pastMedicalHistoryActivity/PastMedicalHistoryActivity.java index 7641fc28a1..de56673211 100644 --- a/app/src/main/java/io/intelehealth/client/activities/pastMedicalHistoryActivity/PastMedicalHistoryActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/pastMedicalHistoryActivity/PastMedicalHistoryActivity.java @@ -61,7 +61,7 @@ public class PastMedicalHistoryActivity extends AppCompatActivity { boolean hasLicense = false; -// String mFileName = "DemoHistory.json"; +// String mFileName = "DemoHistory.json"; private static final String TAG = PastMedicalHistoryActivity.class.getSimpleName(); @@ -191,6 +191,7 @@ public void onClick(View view) { intent.putExtra("state", state); intent.putExtra("name", patientName); intent.putExtra("tag", intentTag); + intent.putExtra("hasPrescription", "false"); startActivity(intent); } else { @@ -227,7 +228,8 @@ public void onClick(View view) { }); - if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) +// if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) + if (!sessionManager.getLicenseKey().isEmpty()) hasLicense = true; if (hasLicense) { diff --git a/app/src/main/java/io/intelehealth/client/activities/physcialExamActivity/PhysicalExamActivity.java b/app/src/main/java/io/intelehealth/client/activities/physcialExamActivity/PhysicalExamActivity.java index 57d923fa32..bf26551499 100644 --- a/app/src/main/java/io/intelehealth/client/activities/physcialExamActivity/PhysicalExamActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/physcialExamActivity/PhysicalExamActivity.java @@ -4,6 +4,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; @@ -21,6 +22,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.TextView; @@ -94,11 +96,11 @@ protected void onCreate(Bundle savedInstanceState) { localdb = AppConstants.inteleHealthDatabaseHelper.getWriteDb(); sessionManager = new SessionManager(this); AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); - alertDialogBuilder.setMessage(R.string.wash_hands); + alertDialogBuilder.setTitle(R.string.wash_hands); LayoutInflater factory = LayoutInflater.from(this); final View view = factory.inflate(R.layout.hand_wash, null); alertDialogBuilder.setView(view); - alertDialogBuilder.setNeutralButton(R.string.generic_ok, new DialogInterface.OnClickListener() { + alertDialogBuilder.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); @@ -107,6 +109,10 @@ public void onClick(DialogInterface dialog, int which) { AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); + Button pb = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + pb.setTextColor(getResources().getColor((R.color.colorPrimary))); + pb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + selectedExamsList = new ArrayList<>(); Intent intent = this.getIntent(); // The intent was passed to the activity if (intent != null) { @@ -136,7 +142,8 @@ public void onClick(DialogInterface dialog, int which) { for (String string : selectedExamsList) Log.d(TAG, string); boolean hasLicense = false; - if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) +// if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) + if (!sessionManager.getLicenseKey().isEmpty()) hasLicense = true; if (hasLicense) { @@ -218,6 +225,8 @@ public void onClick(View view) { intent.putExtra("state", state); intent.putExtra("name", patientName); intent.putExtra("tag", intentTag); + intent.putExtra("hasPrescription", "false"); + for (String exams : selectedExamsList) { Log.i(TAG, "onClick:++ " + exams); } @@ -233,6 +242,7 @@ public void onClick(View view) { intent1.putExtra("state", state); intent1.putExtra("name", patientName); intent1.putExtra("tag", intentTag); + intent1.putExtra("hasPrescription", "false"); // intent1.putStringArrayListExtra("exams", selectedExamsList); startActivity(intent1); } diff --git a/app/src/main/java/io/intelehealth/client/activities/privacyNoticeActivity/PrivacyNotice_Activity.java b/app/src/main/java/io/intelehealth/client/activities/privacyNoticeActivity/PrivacyNotice_Activity.java index 8ce3aa27b9..3652be2bd1 100644 --- a/app/src/main/java/io/intelehealth/client/activities/privacyNoticeActivity/PrivacyNotice_Activity.java +++ b/app/src/main/java/io/intelehealth/client/activities/privacyNoticeActivity/PrivacyNotice_Activity.java @@ -47,7 +47,7 @@ protected void onCreate(Bundle savedInstanceState) { txt_next = findViewById(R.id.txt_privacy); - if (sessionManager.valueContains("licensekey")) + if (!sessionManager.getLicenseKey().isEmpty()) hasLicense = true; //Check for license key and load the correct config file diff --git a/app/src/main/java/io/intelehealth/client/activities/questionNodeActivity/QuestionNodeActivity.java b/app/src/main/java/io/intelehealth/client/activities/questionNodeActivity/QuestionNodeActivity.java index b6c89b3306..751fe93bf2 100644 --- a/app/src/main/java/io/intelehealth/client/activities/questionNodeActivity/QuestionNodeActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/questionNodeActivity/QuestionNodeActivity.java @@ -15,6 +15,7 @@ import com.crashlytics.android.Crashlytics; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -22,6 +23,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -75,6 +77,12 @@ public class QuestionNodeActivity extends AppCompatActivity { private String encounterVitals; private String encounterAdultIntials; + private List optionsList = new ArrayList<>(); + Node assoSympNode; + private JSONObject assoSympObj = new JSONObject(); + private JSONArray assoSympArr = new JSONArray(); + private JSONObject finalAssoSympObj = new JSONObject(); + @Override protected void onCreate(Bundle savedInstanceState) { sessionManager = new SessionManager(this); @@ -95,7 +103,8 @@ protected void onCreate(Bundle savedInstanceState) { complaintsNodes = new ArrayList<>(); boolean hasLicense = false; - if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) +// if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) + if (!sessionManager.getLicenseKey().isEmpty()) hasLicense = true; JSONObject currentFile = null; @@ -281,6 +290,10 @@ private void fabClick() { complaintNumber++; setupQuestions(complaintNumber); complaintConfirmed = false; + } else if (complaints.size() > 1 && complaintNumber == complaints.size() - 1) { + complaintNumber++; + removeDuplicateSymptoms(); + complaintConfirmed = false; } else { if (intentTag != null && intentTag.equals("edit")) { Log.i(TAG, "fabClick: update" + insertion); @@ -394,7 +407,13 @@ private void updateDatabase(String string) { */ private void setupQuestions(int complaintIndex) { nodeComplete = false; - currentNode = complaintsNodes.get(complaintIndex); + + if (complaints.size() > 1) { + getAssociatedSymptoms(complaintIndex); + } else { + currentNode = complaintsNodes.get(complaintIndex); + } + adapter = new CustomExpandableListAdapter(this, currentNode, this.getClass().getSimpleName()); questionListView.setAdapter(adapter); questionListView.setChoiceMode(ExpandableListView.CHOICE_MODE_MULTIPLE); @@ -402,6 +421,79 @@ private void setupQuestions(int complaintIndex) { setTitle(patientName + ": " + currentNode.findDisplay()); } + private void getAssociatedSymptoms(int complaintIndex) { + + List assoComplaintsNodes = new ArrayList<>(); + assoComplaintsNodes.addAll(complaintsNodes); + + for (int i = 0; i < complaintsNodes.get(complaintIndex).size(); i++) { + + if (complaintsNodes.get(complaintIndex).getOptionsList().get(i).getText() + .equalsIgnoreCase("Associated symptoms")) { + + optionsList.addAll(complaintsNodes.get(complaintIndex).getOptionsList().get(i).getOptionsList()); + + assoComplaintsNodes.get(complaintIndex).getOptionsList().remove(i); + currentNode = assoComplaintsNodes.get(complaintIndex); + Log.e("CurrentNode", "" + currentNode); + + } + } + } + + private void removeDuplicateSymptoms() { + + nodeComplete = false; + + HashSet hashSet = new HashSet<>(); + + List finalOptionsList = new ArrayList<>(optionsList); + + if (optionsList.size() != 0) { + + for (int i = 0; i < optionsList.size(); i++) { + + if (hashSet.contains(optionsList.get(i).getText())) { + + finalOptionsList.remove(optionsList.get(i)); + + } else { + hashSet.add(optionsList.get(i).getText()); + } + } + + try { + assoSympObj.put("id", "ID_294177528"); + assoSympObj.put("text", "Associated symptoms"); + assoSympObj.put("display", "Do you have the following symptom(s)?"); + assoSympObj.put("display-or", "ତମର ଏହି ଲକ୍ଷଣ ସବୁ ଅଛି କି?"); + assoSympObj.put("pos-condition", "c."); + assoSympObj.put("neg-condition", "s."); + assoSympArr.put(0, assoSympObj); + finalAssoSympObj.put("id", "ID_844006222"); + finalAssoSympObj.put("text", "Associated symptoms"); + finalAssoSympObj.put("display-or", "ପେଟଯନ୍ତ୍ରଣା"); + finalAssoSympObj.put("perform-physical-exam", ""); + finalAssoSympObj.put("options", assoSympArr); + + } catch (JSONException e) { + e.printStackTrace(); + } + + assoSympNode = new Node(finalAssoSympObj); + assoSympNode.getOptionsList().get(0).setOptionsList(finalOptionsList); + assoSympNode.getOptionsList().get(0).setTerminal(false); + + currentNode = assoSympNode; + adapter = new CustomExpandableListAdapter(this, currentNode, this.getClass().getSimpleName()); + questionListView.setAdapter(adapter); + questionListView.setChoiceMode(ExpandableListView.CHOICE_MODE_MULTIPLE); + questionListView.expandGroup(0); + setTitle(patientName + ": " + currentNode.getText()); + + } + } + //Dialog Alert forcing user to answer all questions. //Can be removed if necessary //TODO: Add setting to allow for all questions unrequired..addAll(Arrays.asList(splitExams)) diff --git a/app/src/main/java/io/intelehealth/client/activities/setupActivity/SetupActivity.java b/app/src/main/java/io/intelehealth/client/activities/setupActivity/SetupActivity.java index a6f4a02a27..23d7e47bb4 100644 --- a/app/src/main/java/io/intelehealth/client/activities/setupActivity/SetupActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/setupActivity/SetupActivity.java @@ -5,8 +5,10 @@ import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Typeface; import android.os.Bundle; import android.os.Handler; import android.os.StrictMode; @@ -42,6 +44,7 @@ import io.intelehealth.client.activities.homeActivity.HomeActivity; import io.intelehealth.client.app.AppConstants; import io.intelehealth.client.app.IntelehealthApplication; +import io.intelehealth.client.models.DownloadMindMapRes; import io.intelehealth.client.models.Location; import io.intelehealth.client.models.Results; import io.intelehealth.client.models.loginModel.LoginModel; @@ -52,10 +55,12 @@ import io.intelehealth.client.utilities.AdminPassword; import io.intelehealth.client.utilities.Base64Utils; import io.intelehealth.client.utilities.DialogUtils; +import io.intelehealth.client.utilities.DownloadMindMaps; import io.intelehealth.client.utilities.Logger; import io.intelehealth.client.utilities.OfflineLogin; import io.intelehealth.client.utilities.SessionManager; import io.intelehealth.client.utilities.UrlModifiers; +import io.intelehealth.client.widget.materialprogressbar.CustomProgressDialog; import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -94,6 +99,11 @@ public class SetupActivity extends AppCompatActivity { private RadioButton r2; final Handler mHandler = new Handler(); + Context context; + private String mindmapURL = ""; + private DownloadMindMaps mTask; + CustomProgressDialog customProgressDialog; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -105,6 +115,9 @@ protected void onCreate(Bundle savedInstanceState) { Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); + context = SetupActivity.this; + customProgressDialog = new CustomProgressDialog(context); + // Set up the login form. mEmailView = findViewById(R.id.email); // populateAutoComplete(); TODO: create our own autocomplete code @@ -183,7 +196,7 @@ public void run() { // user didn't typed for 1.5 seconds, do whatever you want if (!mUrlField.getText().toString().trim().isEmpty() && mUrlField.getText().toString().length() >= 12) { if (Patterns.WEB_URL.matcher(mUrlField.getText().toString()).matches()) { - String BASE_URL = "https://" + mUrlField.getText().toString() + "/openmrs/ws/rest/v1/"; + String BASE_URL = "http://" + mUrlField.getText().toString() + "/openmrs/ws/rest/v1/"; if (URLUtil.isValidUrl(BASE_URL) && !isLocationFetched) getLocationFromServer(BASE_URL); else @@ -360,7 +373,7 @@ public void onRadioClick(View v) { case R.id.downloadMindmap: if (checked) { r1.setChecked(false); - AlertDialog.Builder dialog = new AlertDialog.Builder(this); + AlertDialog.Builder dialog = new AlertDialog.Builder(this, R.style.AlertDialogStyle); LayoutInflater li = LayoutInflater.from(this); View promptsView = li.inflate(R.layout.dialog_mindmap_cred, null); @@ -402,8 +415,9 @@ public void onClick(DialogInterface dialog, int which) { // UpdateProtocolsTask updateProtocolsTask = new UpdateProtocolsTask(SetupActivity.this); // updateProtocolsTask.execute(null, "AllFiles", "TRUE"); - DownloadProtocolsTask downloadProtocolsTask = new DownloadProtocolsTask(SetupActivity.this); - downloadProtocolsTask.execute(key); +// DownloadProtocolsTask downloadProtocolsTask = new DownloadProtocolsTask(SetupActivity.this); +// downloadProtocolsTask.execute(key); + getMindmapDownloadURL("http://" + licenseUrl + ":3004/"); } @@ -420,15 +434,18 @@ public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = dialog.create(); + alertDialog.setView(promptsView, 20, 0, 20, 0); alertDialog.show(); // Get the alert dialog buttons reference Button positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); Button negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); // Change the alert dialog buttons text and background color - positiveButton.setTextColor(getResources().getColor(R.color.colorPrimaryDark)); + positiveButton.setTextColor(getResources().getColor(R.color.colorPrimary)); + positiveButton.setTypeface(Typeface.DEFAULT, Typeface.BOLD); - negativeButton.setTextColor(getResources().getColor(R.color.colorPrimaryDark)); + negativeButton.setTextColor(getResources().getColor(R.color.colorPrimary)); + negativeButton.setTypeface(Typeface.DEFAULT, Typeface.BOLD); } @@ -499,7 +516,7 @@ public void onNext(LoginProviderModel loginProviderModel) { sessionManager.setLocationDescription(location.getDescription()); sessionManager.setServerUrl(CLEAN_URL); sessionManager.setServerUrlRest(BASE_URL); - sessionManager.setServerUrlBase("https://" + CLEAN_URL + "/openmrs"); + sessionManager.setServerUrlBase("http://" + CLEAN_URL + "/openmrs"); sessionManager.setBaseUrl(BASE_URL); sessionManager.setSetupComplete(true); @@ -508,14 +525,14 @@ public void onNext(LoginProviderModel loginProviderModel) { Parse.initialize(new Parse.Configuration.Builder(getApplicationContext()) .applicationId(AppConstants.IMAGE_APP_ID) - .server("https://" + CLEAN_URL + ":4040/parse/") + .server("http://" + CLEAN_URL + ":1337/parse/") .build() ); Log.i(TAG, "onPostExecute: Parse init"); Intent intent = new Intent(SetupActivity.this, HomeActivity.class); intent.putExtra("setup", true); if (r2.isChecked()) { - if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) { + if (!sessionManager.getLicenseKey().isEmpty()) { startActivity(intent); finish(); } else { @@ -564,5 +581,87 @@ public void onComplete() { } + private void getMindmapDownloadURL(String url) { + customProgressDialog.show(); + ApiClient.changeApiBaseUrl(url); + ApiInterface apiService = ApiClient.createService(ApiInterface.class); + try { + Observable resultsObservable = apiService.DOWNLOAD_MIND_MAP_RES_OBSERVABLE(key); + resultsObservable + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new DisposableObserver() { + @Override + public void onNext(DownloadMindMapRes res) { + customProgressDialog.dismiss(); + if (res.getMessage() != null && res.getMessage().equalsIgnoreCase("Success")) { + + Log.e("MindMapURL", "Successfully get MindMap URL"); + mTask = new DownloadMindMaps(context); + mindmapURL = res.getMindmap().trim(); + sessionManager.setLicenseKey(key); + checkExistingMindMaps(); + + } else { + Toast.makeText(SetupActivity.this, getResources().getString(R.string.no_mindmaps_found), Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onError(Throwable e) { + customProgressDialog.dismiss(); + Toast.makeText(SetupActivity.this, getResources().getString(R.string.unable_to_get_proper_response), Toast.LENGTH_SHORT).show(); + } + + @Override + public void onComplete() { + + } + }); + } catch (IllegalArgumentException e) { + Log.e(TAG, "changeApiBaseUrl: " + e.getMessage()); + Log.e(TAG, "changeApiBaseUrl: " + e.getStackTrace()); + } + } + + private void checkExistingMindMaps() { + + //Check is there any existing mindmaps are present, if yes then delete. + File engines = new File(context.getFilesDir().getAbsolutePath(), "/Engines"); + Log.e(TAG, "Engines folder=" + engines.exists()); + if (engines.exists()) { + engines.delete(); + } + File logo = new File(context.getFilesDir().getAbsolutePath(), "/logo"); + Log.e(TAG, "Logo folder=" + logo.exists()); + if (logo.exists()) { + logo.delete(); + } + File physicalExam = new File(context.getFilesDir().getAbsolutePath() + "/physExam.json"); + Log.e(TAG, "physExam.json=" + physicalExam.exists()); + if (physicalExam.exists()) { + physicalExam.delete(); + } + File familyHistory = new File(context.getFilesDir().getAbsolutePath() + "/famHist.json"); + Log.e(TAG, "famHist.json=" + familyHistory.exists()); + if (familyHistory.exists()) { + familyHistory.delete(); + } + File pastMedicalHistory = new File(context.getFilesDir().getAbsolutePath() + "/patHist.json"); + Log.e(TAG, "patHist.json=" + pastMedicalHistory.exists()); + if (pastMedicalHistory.exists()) { + pastMedicalHistory.delete(); + } + File config = new File(context.getFilesDir().getAbsolutePath() + "/config.json"); + Log.e(TAG, "config.json=" + config.exists()); + if (config.exists()) { + config.delete(); + } + + //Start downloading mindmaps + mTask.execute(mindmapURL, context.getFilesDir().getAbsolutePath() + "/mindmaps.zip"); + Log.e("DOWNLOAD", "isSTARTED"); + + } } diff --git a/app/src/main/java/io/intelehealth/client/activities/todayPatientActivity/TodayPatientActivity.java b/app/src/main/java/io/intelehealth/client/activities/todayPatientActivity/TodayPatientActivity.java index e6d1223816..e5293663db 100644 --- a/app/src/main/java/io/intelehealth/client/activities/todayPatientActivity/TodayPatientActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/todayPatientActivity/TodayPatientActivity.java @@ -18,6 +18,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.widget.Button; import com.crashlytics.android.Crashlytics; @@ -167,7 +168,7 @@ private void displaySingleSelectionDialog() { // boolean[] checkedItems = {false, false, false, false}; // ngo_numbers = getResources().getStringArray(R.array.ngo_numbers); dialogBuilder = new AlertDialog.Builder(TodayPatientActivity.this); - dialogBuilder.setTitle("Filter by Creator"); + dialogBuilder.setTitle("Filter by creator"); String[] finalCreator_names = creator_names; String[] finalCreator_uuid = creator_uuid; @@ -199,7 +200,16 @@ public void onClick(DialogInterface dialogInterface, int i) { }); dialogBuilder.setNegativeButton("Cancel", null); - dialogBuilder.show(); +// dialogBuilder.show(); + + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.show(); + + Button positiveButton = alertDialog.getButton(android.app.AlertDialog.BUTTON_POSITIVE); + positiveButton.setTextColor(getResources().getColor(R.color.colorPrimary)); + + Button negativeButton = alertDialog.getButton(android.app.AlertDialog.BUTTON_NEGATIVE); + negativeButton.setTextColor(getResources().getColor(R.color.colorPrimary)); } diff --git a/app/src/main/java/io/intelehealth/client/activities/todayPatientActivity/TodayPatientAdapter.java b/app/src/main/java/io/intelehealth/client/activities/todayPatientActivity/TodayPatientAdapter.java index d27680985e..3f98eaab0b 100644 --- a/app/src/main/java/io/intelehealth/client/activities/todayPatientActivity/TodayPatientAdapter.java +++ b/app/src/main/java/io/intelehealth/client/activities/todayPatientActivity/TodayPatientAdapter.java @@ -45,7 +45,7 @@ public void onBindViewHolder(TodayPatientViewHolder holder, int position) { final TodayPatientModel todayPatientModel = todayPatientModelList.get(position); String header; if (todayPatientModel.getOpenmrs_id() != null) { - header = String.format("%s %s - " + context.getString(R.string.visit_summary_heading_id) + ": %s", todayPatientModel.getFirst_name(), + header = String.format("%s %s, %s", todayPatientModel.getFirst_name(), todayPatientModel.getLast_name(), todayPatientModel.getOpenmrs_id()); } else { header = String.format("%s %s", todayPatientModel.getFirst_name(), @@ -53,11 +53,7 @@ public void onBindViewHolder(TodayPatientViewHolder holder, int position) { } int age = DateAndTimeUtils.getAge(todayPatientModel.getDate_of_birth()); String dob = DateAndTimeUtils.SimpleDatetoLongDate(todayPatientModel.getDate_of_birth()); - String body = String.format(context.getString(R.string.id_number) + ": %s \n" + - context.getString(R.string.identification_screen_prompt_phone_number) + ": %s\n" + - context.getString(R.string.identification_screen_prompt_birthday) + - ": %s (" + context.getString(R.string.identification_screen_prompt_age) + " %d)", todayPatientModel.getOpenmrs_id(), todayPatientModel.getPhone_number(), - dob, age); + String body = String.format(context.getString(R.string.identification_screen_prompt_age) + " %d yrs", age); holder.getHeadTextView().setText(header); holder.getBodyTextView().setText(body); @@ -76,6 +72,7 @@ public void onClick(View v) { intent.putExtra("patientUuid", todayPatientModel.getPatientuuid()); intent.putExtra("status", patientStatus); intent.putExtra("tag", ""); + intent.putExtra("hasPrescription", "false"); context.startActivity(intent); } }); diff --git a/app/src/main/java/io/intelehealth/client/activities/visitSummaryActivity/VisitSummaryActivity.java b/app/src/main/java/io/intelehealth/client/activities/visitSummaryActivity/VisitSummaryActivity.java index 65c5eced2a..720db4ea7b 100644 --- a/app/src/main/java/io/intelehealth/client/activities/visitSummaryActivity/VisitSummaryActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/visitSummaryActivity/VisitSummaryActivity.java @@ -14,6 +14,7 @@ import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Typeface; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; @@ -51,6 +52,7 @@ import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; @@ -241,6 +243,10 @@ public class VisitSummaryActivity extends AppCompatActivity { private TextView additionalImageDownloadText; private TextView physcialExaminationDownloadText; + ImageView ivPrescription; + private String hasPrescription = ""; + + @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); @@ -364,6 +370,7 @@ protected void onCreate(Bundle savedInstanceState) { patientName = intent.getStringExtra("name"); intentTag = intent.getStringExtra("tag"); isPastVisit = intent.getBooleanExtra("pastVisit", false); + hasPrescription = intent.getStringExtra("hasPrescription"); Set selectedExams = sessionManager.getVisitSummary(patientUuid); if (physicalExams == null) physicalExams = new ArrayList<>(); @@ -374,7 +381,7 @@ protected void onCreate(Bundle savedInstanceState) { } registerBroadcastReceiverDynamically(); registerDownloadPrescription(); - if (sessionManager.getLicenseKey() != null && !sessionManager.getLicenseKey().isEmpty()) + if (!sessionManager.getLicenseKey().isEmpty()) hasLicense = true; //Check for license key and load the correct config file @@ -430,6 +437,12 @@ protected void onCreate(Bundle savedInstanceState) { additionalCommentsTextView = findViewById(R.id.textView_content_additional_comments); followUpDateTextView = findViewById(R.id.textView_content_follow_up_date); + ivPrescription = findViewById(R.id.iv_prescription); + + if (hasPrescription.equalsIgnoreCase("true")) { + ivPrescription.setImageDrawable(getResources().getDrawable(R.drawable.ic_prescription_green)); + } + baseDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath(); obsImgdir = new File(AppConstants.IMAGE_PATH); @@ -484,7 +497,6 @@ protected void onCreate(Bundle savedInstanceState) { physcialExaminationImagesDownload(); - downloadButton.setEnabled(false); downloadButton.setVisibility(View.GONE); if (isPastVisit) { @@ -687,7 +699,11 @@ public void run() { respiratory.setText(resp.getValue()); spO2View.setText(spO2.getValue()); if (complaint.getValue() != null) - complaintView.setText(Html.fromHtml(complaint.getValue())); + complaintView.setText(Html.fromHtml(complaint.getValue().replace("○ c.", "
○ " + getResources().getString(R.string.patient_reports) + " ") + .replace("○ s.", "
○ " + getResources().getString(R.string.patient_denies) + " ") + .replace("c.", "") + .replace("s.", "") + .replace("
• Associated symptoms -", ""))); if (famHistory.getValue() != null) famHistView.setText(Html.fromHtml(famHistory.getValue())); if (patHistory.getValue() != null) @@ -781,7 +797,20 @@ public void onClick(DialogInterface dialogInterface, int i) { } }); - famHistDialog.show(); +// famHistDialog.show(); + AlertDialog alertDialog = famHistDialog.create(); + alertDialog.show(); + Button pb = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + pb.setTextColor(getResources().getColor((R.color.colorPrimary))); + pb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + + Button nb = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + nb.setTextColor(getResources().getColor((R.color.colorPrimary))); + nb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + + Button neutralb = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + neutralb.setTextColor(getResources().getColor((R.color.colorPrimary))); + neutralb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); } }); @@ -795,8 +824,13 @@ public void onClick(View v) { complaintDialog.setView(convertView); final TextView complaintText = convertView.findViewById(R.id.textView_entry); - if (complaint.getValue() != null) - complaintText.setText(Html.fromHtml(complaint.getValue())); + if (complaint.getValue() != null) { + complaintText.setText(Html.fromHtml(complaint.getValue().replace("○ c.", "
○ " + getResources().getString(R.string.patient_reports) + " ") + .replace("○ s.", "
○ " + getResources().getString(R.string.patient_denies) + " ") + .replace("c.", "") + .replace("s.", "") + .replace("
• Associated symptoms -", ""))); + } complaintText.setEnabled(false); complaintDialog.setPositiveButton(getString(R.string.generic_manual_entry), new DialogInterface.OnClickListener() { @@ -805,18 +839,31 @@ public void onClick(DialogInterface dialogInterface, int i) { final AlertDialog.Builder textInput = new AlertDialog.Builder(VisitSummaryActivity.this); textInput.setTitle(R.string.question_text_input); final EditText dialogEditText = new EditText(VisitSummaryActivity.this); - if (complaint.getValue() != null) - dialogEditText.setText(Html.fromHtml(complaint.getValue())); - else + if (complaint.getValue() != null) { + dialogEditText.setText(Html.fromHtml(complaint.getValue().replace("○ c.", "
○ " + getResources().getString(R.string.patient_reports) + " ") + .replace("○ s.", "
○ " + getResources().getString(R.string.patient_denies) + " ") + .replace("c.", "") + .replace("s.", "") + .replace("
• Associated symptoms -", ""))); + } else { dialogEditText.setText(""); + } textInput.setView(dialogEditText); textInput.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - complaint.setValue(dialogEditText.getText().toString()); + complaint.setValue(dialogEditText.getText().toString().replace("\n", "
")); if (complaint.getValue() != null) { - complaintText.setText(Html.fromHtml(complaint.getValue())); - complaintView.setText(Html.fromHtml(complaint.getValue())); + complaintText.setText(Html.fromHtml(complaint.getValue().replace("○ c.", "
○ " + getResources().getString(R.string.patient_reports) + " ") + .replace("○ s.", "
○ " + getResources().getString(R.string.patient_denies) + " ") + .replace("c.", "") + .replace("s.", "") + .replace("
• Associated symptoms -", ""))); + complaintView.setText(Html.fromHtml(complaint.getValue().replace("○ c.", "
○ " + getResources().getString(R.string.patient_reports) + " ") + .replace("○ s.", "
○ " + getResources().getString(R.string.patient_denies) + " ") + .replace("c.", "") + .replace("s.", "") + .replace("
• Associated symptoms -", ""))); } updateDatabase(complaint.getValue(), UuidDictionary.CURRENT_COMPLAINT); dialog.dismiss(); @@ -871,7 +918,20 @@ public void onClick(DialogInterface dialogInterface, int i) { } }); - complaintDialog.show(); + //complaintDialog.show(); + AlertDialog alertDialog = complaintDialog.create(); + alertDialog.show(); + Button pb = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + pb.setTextColor(getResources().getColor((R.color.colorPrimary))); + pb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + + Button nb = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + nb.setTextColor(getResources().getColor((R.color.colorPrimary))); + nb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + + Button neutralb = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + neutralb.setTextColor(getResources().getColor((R.color.colorPrimary))); + neutralb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); } }); @@ -904,7 +964,7 @@ public void onClick(DialogInterface dialogInterface, int i) { @Override public void onClick(DialogInterface dialog, int which) { - phyExam.setValue(dialogEditText.getText().toString()); + phyExam.setValue(dialogEditText.getText().toString().replace("\n", "
")); if (phyExam.getValue() != null) { physicalText.setText(Html.fromHtml(phyExam.getValue())); physFindingsView.setText(Html.fromHtml(phyExam.getValue())); @@ -963,7 +1023,19 @@ public void onClick(DialogInterface dialogInterface, int i) { } }); - physicalDialog.show(); + AlertDialog alertDialog = physicalDialog.create(); + alertDialog.show(); + Button pb = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + pb.setTextColor(getResources().getColor((R.color.colorPrimary))); + pb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + + Button nb = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + nb.setTextColor(getResources().getColor((R.color.colorPrimary))); + nb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + + Button neutralb = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + neutralb.setTextColor(getResources().getColor((R.color.colorPrimary))); + neutralb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); } }); @@ -1037,7 +1109,20 @@ public void onClick(DialogInterface dialogInterface, int i) { } }); - historyDialog.show(); +// historyDialog.show(); + AlertDialog alertDialog = historyDialog.create(); + alertDialog.show(); + Button pb = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + pb.setTextColor(getResources().getColor((R.color.colorPrimary))); + pb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + + Button nb = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + nb.setTextColor(getResources().getColor((R.color.colorPrimary))); + nb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + + Button neutralb = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + neutralb.setTextColor(getResources().getColor((R.color.colorPrimary))); + neutralb.setTypeface(Typeface.DEFAULT, Typeface.BOLD); } }); @@ -2187,8 +2272,7 @@ private void handleMessage(Intent msg) { //if any obs found then end the visit //endVisit(); - } - else { + } else { Log.i(TAG, "found sothing for test"); } diff --git a/app/src/main/java/io/intelehealth/client/activities/vitalActivity/VitalsActivity.java b/app/src/main/java/io/intelehealth/client/activities/vitalActivity/VitalsActivity.java index b64b1f97f2..dbe0e92a1c 100644 --- a/app/src/main/java/io/intelehealth/client/activities/vitalActivity/VitalsActivity.java +++ b/app/src/main/java/io/intelehealth/client/activities/vitalActivity/VitalsActivity.java @@ -111,7 +111,7 @@ protected void onCreate(Bundle savedInstanceState) { try { JSONObject obj = null; // #633 #632 - if (sessionManager.valueContains("licensekey")) { + if (!sessionManager.getLicenseKey().isEmpty()) { obj = new JSONObject(FileUtils.readFileRoot(AppConstants.CONFIG_FILE_NAME, this)); //Load the config file } else { obj = new JSONObject(String.valueOf(FileUtils.encodeJSON(this, AppConstants.CONFIG_FILE_NAME))); @@ -783,6 +783,7 @@ public void validateTable() { intent.putExtra("state", state); intent.putExtra("name", patientName); intent.putExtra("tag", intentTag); + intent.putExtra("hasPrescription", "false"); startActivity(intent); } catch (DAOException dao) { Crashlytics.getInstance().core.logException(dao); diff --git a/app/src/main/java/io/intelehealth/client/database/dao/SyncDAO.java b/app/src/main/java/io/intelehealth/client/database/dao/SyncDAO.java index 2a9301d726..06705be81f 100755 --- a/app/src/main/java/io/intelehealth/client/database/dao/SyncDAO.java +++ b/app/src/main/java/io/intelehealth/client/database/dao/SyncDAO.java @@ -2,13 +2,22 @@ import android.content.Context; import android.content.Intent; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import com.crashlytics.android.Crashlytics; import com.google.gson.Gson; +import java.util.ArrayList; +import java.util.List; + +import io.intelehealth.client.R; import io.intelehealth.client.app.AppConstants; import io.intelehealth.client.app.IntelehealthApplication; +import io.intelehealth.client.database.InteleHealthDatabaseHelper; +import io.intelehealth.client.models.ActivePatientModel; import io.intelehealth.client.models.dto.ResponseDTO; +import io.intelehealth.client.models.dto.VisitDTO; import io.intelehealth.client.models.pushRequestApiCall.PushRequestApiCall; import io.intelehealth.client.models.pushResponseApiCall.PushResponseApiCall; import io.intelehealth.client.services.LastSyncIntentService; @@ -27,6 +36,8 @@ public class SyncDAO { public static String TAG = "SyncDAO"; SessionManager sessionManager = null; + InteleHealthDatabaseHelper mDbHelper; + private SQLiteDatabase db; public boolean SyncData(ResponseDTO responseDTO) throws DAOException { boolean isSynced = true; @@ -64,10 +75,14 @@ public boolean SyncData(ResponseDTO responseDTO) throws DAOException { } public boolean pullData(final Context context) { + + mDbHelper = new InteleHealthDatabaseHelper(context); + db = mDbHelper.getWritableDatabase(); + sessionManager = new SessionManager(context); String encoded = sessionManager.getEncoded(); String oldDate = sessionManager.getPullExcutedTime(); - String url = "http://" + sessionManager.getServerUrl() + ":8080/EMR-Middleware/webapi/pull/pulldata/" + sessionManager.getLocationUuid() + "/" + sessionManager.getPullExcutedTime(); + String url = "http://" + sessionManager.getServerUrl() + "/EMR-Middleware/webapi/pull/pulldata/" + sessionManager.getLocationUuid() + "/" + sessionManager.getPullExcutedTime(); Call middleWarePullResponseCall = AppConstants.apiInterface.RESPONSE_DTO_CALL(url, "Basic " + encoded); Logger.logD("Start pull request", "Started"); middleWarePullResponseCall.enqueue(new Callback() { @@ -91,6 +106,10 @@ public void onResponse(Call call, Response response) { else AppConstants.notificationUtils.DownloadDone("sync", "failed synced,You can try again", 1, IntelehealthApplication.getAppContext()); + if (response.body().getData() != null) { + triggerVisitNotification(response.body().getData().getVisitDTO()); + } + } Logger.logD("End Pull request", "Ended"); @@ -109,6 +128,54 @@ public void onFailure(Call call, Throwable t) { return true; } + private void triggerVisitNotification(List listVisitDTO) { + + List activePatientList = new ArrayList<>(); + getPatients(activePatientList); + + List visitDTO = new ArrayList<>(); + visitDTO.addAll(listVisitDTO); + + if (visitDTO != null) { + for (int i = 0; i < visitDTO.size(); i++) { + for (int j = 0; j < activePatientList.size(); j++) { + if (visitDTO.get(i).getPatientuuid().equalsIgnoreCase(activePatientList.get(j).getPatientuuid())) { + AppConstants.notificationUtils.DownloadDone(IntelehealthApplication.getAppContext().getResources().getString(R.string.patient) + " " + activePatientList.get(j).getFirst_name() + " " + activePatientList.get(j).getLast_name(), IntelehealthApplication.getAppContext().getResources().getString(R.string.has_a_new_prescription), 2, IntelehealthApplication.getAppContext()); + } + } + } + } + } + + private void getPatients(List activePatientList) { + + String query = + "SELECT a.uuid, a.patientuuid, a.startdate, a.enddate, b.first_name, b.middle_name, b.last_name, b.date_of_birth,b.openmrs_id " + + "FROM tbl_visit a, tbl_patient b " + + "WHERE a.patientuuid = b.uuid " + + "AND a.enddate is NULL OR a.enddate='' GROUP BY a.uuid ORDER BY a.startdate ASC"; + final Cursor cursor = db.rawQuery(query, null); + if (cursor != null) { + if (cursor.moveToFirst()) { + do { + activePatientList.add(new ActivePatientModel( + cursor.getString(cursor.getColumnIndexOrThrow("uuid")), + cursor.getString(cursor.getColumnIndexOrThrow("patientuuid")), + cursor.getString(cursor.getColumnIndexOrThrow("startdate")), + cursor.getString(cursor.getColumnIndexOrThrow("enddate")), + cursor.getString(cursor.getColumnIndexOrThrow("openmrs_id")), + cursor.getString(cursor.getColumnIndexOrThrow("first_name")), + cursor.getString(cursor.getColumnIndexOrThrow("middle_name")), + cursor.getString(cursor.getColumnIndexOrThrow("last_name")), + cursor.getString(cursor.getColumnIndexOrThrow("date_of_birth")), + "" + )); + } while (cursor.moveToNext()); + } + } + cursor.close(); + } + public boolean pushDataApi() { sessionManager = new SessionManager(IntelehealthApplication.getAppContext()); PatientsDAO patientsDAO = new PatientsDAO(); @@ -123,7 +190,7 @@ public boolean pushDataApi() { String encoded = sessionManager.getEncoded(); Gson gson = new Gson(); Logger.logD(TAG, "push request model" + gson.toJson(pushRequestApiCall)); - String url = "http://" + sessionManager.getServerUrl() + ":8080/EMR-Middleware/webapi/push/pushdata"; + String url = "http://" + sessionManager.getServerUrl() + "/EMR-Middleware/webapi/push/pushdata"; // push only happen if any one data exists. if (!pushRequestApiCall.getVisits().isEmpty() || !pushRequestApiCall.getPersons().isEmpty() || !pushRequestApiCall.getPatients().isEmpty() || !pushRequestApiCall.getEncounters().isEmpty()) { Single pushResponseApiCallObservable = AppConstants.apiInterface.PUSH_RESPONSE_API_CALL_OBSERVABLE(url, "Basic " + encoded, pushRequestApiCall); diff --git a/app/src/main/java/io/intelehealth/client/networkApiCalls/ApiInterface.java b/app/src/main/java/io/intelehealth/client/networkApiCalls/ApiInterface.java index d3559bcb69..2de54abead 100644 --- a/app/src/main/java/io/intelehealth/client/networkApiCalls/ApiInterface.java +++ b/app/src/main/java/io/intelehealth/client/networkApiCalls/ApiInterface.java @@ -1,6 +1,7 @@ package io.intelehealth.client.networkApiCalls; +import io.intelehealth.client.models.DownloadMindMapRes; import io.intelehealth.client.models.Location; import io.intelehealth.client.models.ObsImageModel.ObsJsonResponse; import io.intelehealth.client.models.ObsImageModel.ObsPushDTO; @@ -80,4 +81,9 @@ Observable OBS_JSON_RESPONSE_OBSERVABLE(@Url String url, @DELETE Observable DELETE_OBS_IMAGE(@Url String url, @Header("Authorization") String authHeader); + + + @GET("/api/mindmap/download") + Observable DOWNLOAD_MIND_MAP_RES_OBSERVABLE(@Query("key") String licenseKey); + } diff --git a/app/src/main/java/io/intelehealth/client/utilities/SessionManager.java b/app/src/main/java/io/intelehealth/client/utilities/SessionManager.java index df61144aa8..df0ae256e8 100755 --- a/app/src/main/java/io/intelehealth/client/utilities/SessionManager.java +++ b/app/src/main/java/io/intelehealth/client/utilities/SessionManager.java @@ -204,7 +204,7 @@ public void setServerUrlBase(String serverUrlBase) { } public String getLicenseKey() { - return pref.getString(LICENSE_KEY, null); + return pref.getString(LICENSE_KEY, ""); } public void setLicenseKey(String licenseKey) { diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 819c87ad1b..87ca1f41d3 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -45,6 +45,7 @@ @@ -86,6 +87,7 @@ android:layout_width="30dp" android:layout_height="30dp" android:contentDescription="TODO" + android:layout_centerVertical="true" app:srcCompat="@drawable/ic_search_24dp" /> @@ -138,7 +139,6 @@ @@ -169,6 +169,7 @@ android:layout_width="30dp" android:layout_height="30dp" android:contentDescription="TODO" + android:layout_centerVertical="true" app:srcCompat="@drawable/ic_calendar_intele_24dp" /> @@ -254,8 +256,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" - android:background="@color/white" + android:background="?attr/selectableItemBackground" android:clickable="true" + android:paddingHorizontal="5dp" android:text="@string/sync_now" android:textColor="@color/cardview_dark_background" android:textSize="15sp" /> diff --git a/app/src/main/res/layout/activity_privacy_notice_2.xml b/app/src/main/res/layout/activity_privacy_notice_2.xml index c8e1fb83c2..59c0b646de 100644 --- a/app/src/main/res/layout/activity_privacy_notice_2.xml +++ b/app/src/main/res/layout/activity_privacy_notice_2.xml @@ -4,8 +4,24 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".activities.privacyNoticeActivity.PrivacyNotice_Activity"> + + + + + + @@ -61,6 +79,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/buttons" + android:layout_below="@+id/actionbar" android:layout_marginBottom="15dp"> \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cfe52..0000000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cfe52..0000000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index dffca3601eba7bf5f409bdd520820e2eb5122c75..affc7f45caf3860c7187e4f84979e55b7e1a77ec 100755 GIT binary patch literal 4657 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 literal 4905 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 s7!*vOq_gNOuuO8@`>07*qoM6N<$f(8xU*#H0l delta 2775 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 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 14ed0af35023e4f1901cf03487b6c524257b8483..97f99e77cd5af9e038d661e414231cd398dbb0c8 100755 GIT binary patch literal 5956 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 ae+2K1WW=5kbFARgaiF29t5U9H6aGJ$ZVB!H literal 6895 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index d8ae03154975f397f8ed1b84f2d4bf9783ecfa26..cafb043fdc99072fa13aee5e86a4687d2c6b711f 100755 GIT binary patch literal 11486 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 XdJ+W}DiIkV00000NkvXXu0mjfKBlg6 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index beed3cdd2c32af5114a7dc70b9ef5b698eb8797e..ea1d6aa985d7741e6b000d257ac1ddb60a96664e 100755 GIT binary patch literal 14849 zcmWk#WmHsK6h1S|P=j&;3KAlv(h`Caf~0f|B}l8Jw4{iLG*SadcL<0m-Q5lE zz8?d#7Hb{uJ+b#!=dF&G>MeX)d;q{Lbv0!@=r`v74=y(JQ*YV<2LNWEuB`aj%WUf@ zp5NnNznbxWD~^|u#g|1qArEe^=2ndV`sA1)=dpYOH#5JE%2=cZMJ4>4OX)lQCt@V| zRS&zGj>!X~kxx&U(eY*MB}$Y@ix(N1P4$i4)-TN7pGgv?dT;oz1Pz!z#Y%R~ZGjN{w6qrwuZ@nFQ4!VJJUMmxC--BaAHU*H^BP(|NQuSx2NB!+ z9nmhTB2uq&Y3DjXSjulFGU6sufZOYExFQ#UA1%E3MgPY)c6N48q0!F1)YjIP4i67cgz8Pc z9(Hd;97qNIk0g)gqJbTXFtw^SI0F5EJD=!7eSd)*R( zFKtRkPt)TX{dmC69MJ3(e4i%6IHgu^EaUS~=EHD8h99|RjXwTlq@)343=DtOULs`6b=B4JPDui#z4sT_m;2KK2Vhtms*fYp z^i;3`&*`DlgWizpo9l}m>4LmGg0E(c=LjV=vA8ZbBY}gSFcg*9V0U+S?eWx0&yVDI zCGZBG#3w}&U=~kq=_qM;Wo0Gqt5L=B>g434dBT&A4GlN>50aZCJ-4UdFD@>6YJxI3 ztZD*^0lQK)po151xRMo^IRZ_oiFA+S`0iET0KF1vohk4}Te$H%@;s_!bhag3+qruzNQFFr(*V-@|aV4xwFBFj4$u zW3PufC8w#g!e+3^u-;>f3YW#8Ph5w2Q`DCbVFm}^WP^ox_=*G(|+f;HWBYV7> z7CPf*{uJrvF0tc!4V2rUXOSSHQVut;>Ra>m5642Sj2AyUJ7=EIgbA6Rn3|eit{rdv z$!c0kGC9UY&*Bj)OMyJ&o3YQ2$Tr44i+tdcCrs9S+;NbUDd+EF3{9H(L9tkbHP~Hu zFB=b}S$F5o9aEW-rJ|y8nr`yHurjN}euoQ^_ANMSrrwfqbc}y956q<5dn;;G)Hm_y zeR8t+XT=cgc->{mZW8skw{L;lJy;}}DF-Wq&H9Z#M>F~_xS|eyo1N!c>!FoPQNyi^ zwtdH$Mt}V0EgQh)8jNL-e${Y&zHuXd_wM+I=iQcpJuFRVXnMCUkN-F^X+C&xQPV1p zyO$`bO~nQ69(mg<`*0#A#;H8@4>fIadQYfkeGswqlCIj&F%u!a6Iq+C$OZtaIk6wv z!p{rUCAxPQ-4m%$dX5Ucb0*yok?Uth#~^OOPDB~o@HQVRGxhYhq(xn{B+K@aS! zBzOA>2f;b6X|40z7Oj}Q=8H?XhraR9;1@THGaSuvDYW&cCT`}(>kZPB#C$ibCx5)G z5Rs9Q*WcV$268>Ork+HXC{8L8^8@Fwn|3O5%}g2Z{foW5y&A8D@A^;k(?~e^`LBHj z(j{4$0x$RcV$F$@1nndM2ETc3li#SE?fGPxC6ASrRp9aqoiEi#-0vMAEh`W?*udaaL|C|Vd#3p&{7LH$pC#d;Jq+>xnDIIH!mp`c5r>ij%i+uX z{LHLM@}hL)^X8(WeG(FDJXcBeiumE2{W@uvCfI<@*a7C^Y$fZP{Ok3x=EU%2D!c#+ z=EYiKJU?#$QxJSPUSh7DB_}Ijn#4>FW~CY?o_aoQg*KT1&Y!vGNYf)voiS^q6fVzd zadWTF#w@ibG|4-jGyVqTv8y`XSZJQh_{HF}f)>Kp&nydXUdXRueJMwH3{&7qT`}G; zI=lodBR_xs)D4Y)Ku?^&6V9g%BHo*RUm3_qbNltg;HtD_3TtN&U;fg6Z=RxjC;X8z z5_|78W^#dr^lIy(DIwuKr*+ekB-Gle{ueLWGRdhFJ+cc|zX<2tZ z)YjS~LYrh1cSp75ud1N38_$bHJZrC4EugE@S=azDLSSBbEkox@pj6B z8uoyPBq8opTw8nELcoLW$Ue(FyMvFEpoa{>p`Ga`Cn@QD*9vd)c&CLt!`0*tX-9I? z=TW-)z?*AJK9g!w>M?0SME6*2ett*u+Qn?phec1%fEOlWt)-;jwGewYW~2)*FS^g$ zyk#B?k-wQfP4$I!eJbigpVfPbTwv?$`qN&(Z!+Si3Qv`t9ooU=7C zY0el7+%QSGB`Ccfrv*OgY%R}Nt@eX*wz0}zy?4BuO-f42n%S`C)zjpEjlTB=^`r{X zltV7Rl#Q&pC!qryNT8E7KR+)3eWVhWo_SxC1JDvK?&kz7Fvd5pwD9ikt*>knjzl-j zZf{Qp4NsE3a$?Z#Ro~TR|J@77slc+?Dww|K!Z|bFeANL5Xn@r+rRC?x?66)LuKb!~)7jM2ZXF|O0KuwA6tR$9O-Dw)s+uy#q>d033 zRs2LG)Z7{`_{t&2(&?*lmBkC17=k%rdkUJdrgRG|a1e0sU}bSJ+7SWDKa|d$90bJ`6zu{fm&@PQSxp)h+B>w1>y} zhf(^E^g=U=hQq>DdPA^NYfQ?YwMVAm5HVif^FG6B0qBU6P6~4J5;aZDhQ>ZY3VMJA z+yVhGL}UH-UTm2&XGU3Y)S1SV5}QVS-sMCIM03}97j{rSVqT-33Xx7>p7N&;k7E{h zah?qOvd#S2ah)!hiHyu@nAsjVi@Ssi^b8G8RrK^m6yD%}f5d}D`P~AB)?=dGiIa9+ z?E2XeLnlwQn`pP$g#|zm9PpxH;6vr8GDUK(8$v$5C{A=cjv(Ag8fH`YRy3h{mKLOs z3rg0{+&WIf?z;-}COq(A#(NV%WmH=nZV6L3{f@+?0JBYTjI!sCKd?W{KBJUqSA6&$ zf@FplCf%jady}f@?mAHGWR)|Tm!4`;XynR`K^T1Y7Dy3%Rx#B3#LZ`B?d#UG^1H`= z>Ak;cQ28U1DUvQ3ChiS-S|5WLp1SuRW});wYJh^GLKu@=?;m(dvf&R1XQn|ti|{dL z(OFPAKBtFIOkG20eC_{D(g5l?<}W$-gdKxFnC&`c%L4dmgZtWh82T-%@YmJI$b*B$ zmQtZJS`+#81#RVvR-xd9&$aT2_~Bs|u{KgTt*b;>wwdj|y$A&dhmz+o458%Q`_MxF5ZGF@zzy{9INsI&YTPgIEeO*|0RtxJayZ6=3BRy~ zeJ~wXhL<9E_;ZnjTrQNiWbGjKszA{;A)csZndG1GTqT$TfS?Tm1|2o8{`%0|3!4Q@f!22czNmM7D37s9ket}XC?E@LU}WBds{ zg;_$iO2Rc=Qt9WRA|l=N=2$-9^7O+kT2U|F$00c=V4A@-v3kr?W2c$ZaX%n9_~eft z-Zt}Z_1c~o=NAE~A;OmI3@A)2<}&U!3UFwpd(~OCy(v?}86a)@I$XoEhe80EPVra& z8oc?Szosm$Z$6(k#0KkFnzX5FgWvYa@BF}K#PLXS+ZU_mZMSEbDCdmk7XKz#>k=pu z$J~8+TgAz&X*3+5fG+bc>~;$r)71~5_YMevxA{GzrD%{~Enzj7SxO*RP#&mKHvaY%X5~yBCoN?;p!DjnXMRvwN zKU$fykofruhH>+=f*`;vYGLcHWZFUAqO@9UG~4J4!-tU2+^J@3!2RR%QQ-w%C81*|7)<+J7tr z_D%HMCaq_498bnni=;BdZRs^$H&}FBt%cH2AfIt&Q}F`Rh2Ir6BK8xdSH6qH_k#PX z?rma&>9Q3ZCO_x4-MO|9vz2clB#rHfA?k(9)Mt)}Rc~xWs&6f}HVZp&10z(Y_aLq7KF5a!v~3|D5pToWgfIudWv6 zqAwOCM+KXlRI)zpG=e zfCC(+XHr&`aNjn&F7<3f1XhaV7RaUSI(hFJfb;pJMsm3H$mPiv&8AP_RjqtAXjs=Z zm8Dyw%+AYObcfb&ibN^d+}L(L-z`uY86kN+XRlV@~VH`0?d0VRe?&1iZJ(sb8j{{W*IA5 zA=N_4#-Qb_ZkPt|WS2?HCidH#sL3stzWHY|4!K5@*aq@>F#1=djDy@H)(C5 z|CH1O%)EN{3T7dQk3!ufCL|zG#TGo-6r@jJK)PAK?f~NQPP9_)oF5&&9BBqOy)!`( z28#rU_?;rSTtVp*`w9XYp&43bwsRq?*fu5gJpRU&*7sm{{{VM)&VDe%4iFj{n z8(kT4mJNQ!A9=+t^8$v(=Chlw-DAZCJ$NFw0q)u$1WGE3pL`itJGxZbtB*wr7ARxC zJ+NY*Q={9JXr_3r^z_pmEUOBT&QBC%3}hA_P@LF=JT;4e53@8vyMGUoRp|O{<0)@J z?J(x5)5h95kBCOt`Z;H)$qM}xC5B|B=H&}bJNNm^`K>jVJ91&09esaQhFNMTG1&^7 z_=}=?mt^x>4G2IzmB?d2NH1zjY%Tv?gf~x-8_Z4y`azvg1VVBjvsu$~CZP^VaN-$O zHn{ZUWM@UP?sy4loo=4XByXkX_m^(d-@B~C!wDv=<}yr?0JAAgcF~}>&q;`{(ZByM zlseUcLBe_VXl!hZ=7%JV0+dY3D+l7^J&%c`@5@NM=rqbMkchwPh%rEiS|3rLWgSV zCV0X05>%d~8Xz$yT;lnNJ8=mP9~`7zYD_kGAH*LX9*RF!qUo7A;sazcb4x9v{H7UH z&iDOA319L|R698p@BF| zeYNR6AY8JTo=j(nIha)fNlD3_yH5Z7xH)K*Gc5Cw*?<2LoMVCiS+g)df9dN8Ym*Jp zZC~5f&&^Ie~F6q*iT*_HUL;L+d{bm6Q zb_j8vK4ZXm6Sp&x|Ddt2uTPe?oOI;jAur}d04>@rKQ<+{_@uz`4XlD7$bn6eVx_

L-MHLjdmzA0M&!abqj{{kysDx6mx~aWnvHV^ByoQMG zE-!1|$X6HPL?l`-;%%EhDATO(aQWIF_K!u5xrc4Td5L2Yps0YeNTN~ zeAsiw(J#QT$?t4vt}UjWg_#LWXZzchco06jj}vn3@Tb~Q2~vA9U0I}Aen0Mn8*UBP zX@4Y(GF_E63-Ut(k$N_gNEB)9e^NwGgsCd1QC|(c(tmi537b~ytch_upe?js;GA>MzT`t#{d2!Y42tU zja+xGA?#MiC%R0rclL^rUH$z}-@ShiSO24=$fUdQN(dNU6Ok|jg=f0D!^@Bcd6(Z> zge}e92mti#(&FX5SiNcI8BM{Wrn|bt56y!EniQHXrBv&JhQ|}hn5Uu*_OQsPs1tTJ zHg_?YLcRKea}g=%`01&nrU&VxT54=lOX`)p7(pR0Ir?_vETr>nNt3|4LhJrKJ;VK9 zD85MMpq8lf*$-Z+aGEJuZtivj$lz8NX?1@H3r9M$VHkZkzw1M~+jU32!y9WiMqu%p zxF!NT&!XXb!^#!+tsDd!6Rd50da(Zk>9x~%@+O8+mR2>G{s7Ahlu=+DA?@c7QZa?3 z6N10`@>e0dINp#sH2tJaRdvzvYG-TjnPSY8`Sa;s%kpJ4MLeQPj#INYZ8t-+jm_`x6PAKk)@Cz@)ke*;G& zCl+GE?n(w6!c%>2q~KzT)4Qdkm>kacGc@L9JvC~XRQ~8j-;<^pNUY`JBwgfuI|~Dx z@kn%fdU{Qo*voN|$4XnvGNpWI%FoLY*=f}BN4I}HihSr~EI)d2+V`iDqkV-@=E0lS z;dnyVO$x(siIz212_vzm{v@sHrSto`p$L5NVAng@%FQR^@25rw*#5ym%`Zp> z1svoWSAd5=<0X1_)IJawaPsm_r^Lq-yQmA^8+P>xQ9^V@!k@2vz{yXws8hCm;{FV# zHxB>Z9WkYv{jYxKU{4 zK(CNfQ2c_!FuLR%SU`ul3*P3MKyo%x4n{NuRaxr+T8y(G^z&1K{_86lVa9A^*%3Ac zy}@Z!Cxi~c7?vWN8VZc_3T7*qA;19Q3m-b*MY4(6H{C()Hl0_J@&#(ypW)v@t+Z&p zT9$~^V)Xkb0Oc%Z1#{>Y%tS(V6$;l*amxW^O0+?5uFymDAI%^W-?kK7$AQ5pb{8M-AJ_^t1b@!KK-I`9 ztzGO};_)e4lx#YVAeRmXsEPUmPWH&IWJs@~_FV{=zVBV;$8#np3wvbG%%HX`{QC8aIe4>tV4b@2UV6eCR*iT1E+~<8}T2+F5pO~*Eg6?)G4861=Ddn!eJEzRowDeM;d7jD71 z2y@6Me*Zd1*TAB8JAt%(*J|~a@yv%Rg#sdC=m03EC?A4 z05`cNdtgkMk~!WdKv7b7M-Li`TB1dhFTQMYVC3vt}1~*zxA?ifo7i z4ZV_@H+zl*$p>^-XIsNm0k<(Kzc}3_nwOK^0!$v`3AYG%u!M+B;D)%a=KM`c+ra8t zxEi1LPsh7wRt+F*{C5Z{9~W>K=))1@#X#nQ*(PN2>_&VD_-a2SbGr(p*VbRkElG2_ zVfA5aM76lPdCj-;mo8&j;4jt+EEt~}IQVb4aCkxLbMMH=2%{=M;|cX>3Tj3ONwo&C zHbBHt)v5XFSltYc?!uW3YuwVxQ8-AWWEtu!?SF3ZgCBQdbN+G6k7`gOz|r0jEvTF? zvGv_$Ed1(sFXe2MKvT-ZSCblpAwTf-nS>N;AHb+G`HR{QWh(|2;{uBnY;LjYPv;No znibknCks-A*YAja!Y5w_d4U>Le}}=}3zQb^krdhlkX`xNS}EE}4rCHr_2Hz5*l3;K zBa%gkY_M+UZ(z+zwupZC@~F4%c*XO+qv$7@atZkfw!IAdT-w9-KV7r+-zIzrB?a&7 zA1~z*Ua#>clyC+c&ryPq1vmVGL;H;&vod=1lea?9tX9mjVUJ`Bt7@!6mHV1r z!%)&V7H<1}DR0n=Be-(ZBT}K65I%Y#l9KwALtrJ1z+R}JZWlV$f>CoNoTZZ+Wv1|D z>_!5#kX48KQ>bBjFuMhRZOV>EadL7_lD+K~G@wLJ2$+w{o7*f?^0d%1{r=|{L`Aq? z^Kqe{3bT)EIfUi|Hdh9HS1P@2{HL{a>PHsrlbXR*cS23$k8qyzfy;;ffQK&q!-tAe zqly!0WyN&r zjth-?5!2Jt{#;yKjVT&BmL}vH;hbPKk2;tB83eonw;=2xF&gzAiY{0-S2O=9pE1tbp^i2N2uO z5O@%5$&rFY^HKfp;gmiq(Da^o37ic9`#P!Z5&J~;qqM={cMx{MYPd^~GKhQo?<8D2S5J*a9bI z8RYT&)KMsViJ$|g`@I5L^+)3-s>;!aFC|(6m@t0(=|28nS7Q}edBmFT_$1i;>8^GS ze3K?mf&09qxA@>cCi zrf+uX?Pq2_l(Q&bp~3-8KANzV@qIyQ=as2_E8XfAa^~Owh7=;^ZGx3Ni%R=3C*g)w ztcI)OKXL!31inZR3f_8av`Ym;-w!S+9+KW^5P5#KzhusS=Z-fvkV9F(F)_0*p^md; zv5&7QR+!Y0oWjP6FM2NZb#L(OUD7=f5Wl%a(B?CU*W^40r;+nJb@T=-Su6H zU<1nng*n11uc$D9M51*YV{K*xot+Vy#a!ZIA*!_B(bPOiozmGqoQ!+!vLtS93Qk?6 zkSvLUUtnYANS#UDAZ`ln+>27kPQ@a*vV<^Cbv`8o2W#1G+d&;65K<00Z$cHStF&_9 zXiFIO1(-djur-}2=J3eW^r8ev2YB&o)ZHOlVx)PkX_^V76xns z!?F4*fS&wp7?oM=t$kRTu^L;$V}Rz2R}AVY*?X=PB+?`hU5_GM*qrPbWYcy_!@*FZ zMX-~?zSFiz`iA)6fn@%tw<})s(~3a4#y13>;LE2#ioS#hGs67G7^Xw*dAd8-$Nuo+ z*tZCvb2sj}lW}g6s*y&{?BeMP8f34ctP8E9iLmmC88t!~BwZJkAxqiP#laY;PT(x> z2PPtC&tYleP62YVvi=bqFwDZ~w2yydtz6oqUg+;IOXhUd-S#<`$#Eyk9(=&KQn*23 zh+;PRY&rA#vi%g&5KdpS`$`uePy0E`i3qn3>lbD+mvzn-*;YeZsEZ5!xt692$^ zo`BtXbW1=_v!t$>Q;YekE+O7dpiVOsh8$TVuwlJ9t@G)Gqj?)H_j^yYGo)VUW`hC6 zKxHs{2Gf@ycZI9QG5&>Ae^#JsXg&oj$cv-hdY4zH#N?WjI-e$Vdfd%fF65dnhbwTb zhdla=-f8xmk1@`MNJ66MtLfTCuFF~mDT(IT)8;-L3uuQIzXND!(I0O7u2^wuZ1p|?|JFWqs*^DkuW}##T!Mtud!)U8QHde)}-lj z!5x0E$EA|DG+0dgaHw4`gewGyzasa)>2@q!#;zu+@?y>oR=T5UMBeGo-P{}XvW!6<^3^|1&HeT>O;?dGQFFs@B}9g8dYuLc~g_Zdx_?lgWO`>kAqR}OyI>$ zZwtvl`Dh?>SRiG$JYyCKaQObSwOF}||@f=Cuo>a?tf|^>Wx=4%W^dHIz z&wq)+8hHrx*N;;IQ{w^qShd(dw1c~~N?|}k-dAOeaAS|%xOzJ-g4)!*ZS`7PRn}swL1M^c1+AGsfJlC zVt^Ml+qYXRD(_$Lju8F-(&)}K`J2C}ly^syu{W1B6bGN}O8a90hk;!*49l3`u*||A zk`N39v+o7@0pf-pqlJZv{R6m6%;ro~6^{0g*TMClo=Gf}MIKnDrzDefgRa3rj+4Kh z=7UeZ=(lJTh#snEK${fx%9wg}6b7mgoAj^{Y)42&tb6tMhvL!GE^}d^@U$yv)9)Ej z$oA&yEQCz!5y6_g$?OtcMw|41a`}_8AStJmm=x7U;wNB;hG68^&3}#3nWwG%Vchxh zQsfc&iVj-LdqFsiw(?dT(G*APzoJZmAt}H2h|~cxK@07Vo36{~6TrB5Du;7@*BN?9 z8#l$2-iXI2=lwhJ=tNZvI=rRE~n(iZg?I80TpRc!yQ zA01zrJ$<${$mhTO_fsT%*uRJgZ4;?$BjIv+x@UouD>j#}RQY5N7C-ET6p{5!l$EX^ z9_a8t5$lL^C2Q?RWgo~&_CCMehYbd>mzfWkWLrnA97cPw2Yu*1BEyfVl`CXw9$L{!$tyPkO+0x% zhVO9yKf-}y&=HpZI2K+l8`MRl>DT#I;Ir1q5zJa2*v9KJ4u3Om{xajW5L5N=qo{6- z-B7>;63w_k>8|tG*3Y}K+4K_wzG2QgtO^ixf($l^69rISCsZ>X0`7h6VhYknzu$Z%^l{i28MMA#bCY2ApkDWe2s}3Ml7pOmc z7LveDBH}MiQWo|d!t(@5dVv?`Ox`4#CZPmwh>po7)|03^gH~@ry7LI z`4U+sU||&09z}IiYTg_`1O?(AT|Aq9RfLVUgC(>G&ZJg}HnE(_Xe~APly-Q&^RoEH zK@7T<5gXB-wR{*T#Mi|E`Dg1XLRQz2>;9O%*BM7kf1Q{?wmy)vV}0s?Bh&}NZfHDxgLD4&qc+7PK>lfhm9;!Sz782kAoWzr5MaW>N@enbH z+72D=bEfJi-^&u@RZwv8V~BMU7=L^`7y^{)MDF_sT znDdl$`1c?S@St%ZL)x596JY@`&EHJxo;B=ozdIq?{RKaxzK!2&tNfb&!_U{EO;NQ? zLQE~DafZ|RErA#goBZ%;9K*_ULaQJG2N(w5VvA{$-R}R#x?WCmYWkBWT{$9BG!`DI zYy|s1^YHmzbgoi7vj{J&kIoAUsmy3Ue0Yl%TNwc2Q}&;W?_99Th%6?G{043(S@5fR z4u}jl$tQN$Ea=T4fT%KdOX1Ew9CLkj(arO%L3pI(04JyLx7powva$s_O%ysPbR%?? z`vU+U?`Wk+du~4s!M^3w1iko_((OM(MeQu1P!pwoExBt~0eoSA4*5L3WU)uOaoCtv z^>JYdt$7Nqhncnn*gYe1;51aEEyxF| z;iC7VeesO+K}ieb80>67Aa^H3$P*1myn0lRQPnlzcJoF}E9aY#3GEgBcfH9)BV$sb--pfR zH|$_&`@l^E4hrZjG(*0mxM~b-6^1;ZkoL6i@ihg;~t}s{Ke7(HB)oAng z7vX^+n3-XYn6Xm-#6727tfJjf#}F7OI)E&X-kyM~^G1wqK(?&tzqqKsMN+y%q0gcq z%0i7gET~ed{D7!J+>daFc*3{Kd8%f$=Jnz)@FqM0pczyoLJ$Bd`>_;sEQYpLIs8w@ zvWQW|M%VPazwVF6QX>)uAI%kfWJEAdnU`NOg)8*pqalX-*6*NSJoSI-KyDX6yZv(v zr_w;jOFn?K1skB?ADPf^jCZS7b)G$YHvduVhbKYC%5g~wy%pDDsYf658KbnorD5(H$;>G@}0ZKznXX+uZ`OHSz59O210>vp8^#P!79a;w$B$O}QY*6Wg%f`5fx~s>zy$&T{8;X}lPFvid>nu1XEG;@ zvIvWyH7hZ($_Wako;d#fAx2~usNp-QhcglON=ku~2nBCHH~-vetX(e~F+U|G(gbm_r{ufnc(E0g;_^M7(+=Tt)dKI^>%LYjmkC>Z@P z%V+(wHg-6nk!FW-ehT(UL?90q5fa}!UhC??QbDb9`Wh3&s_ z{8RmP9ZKP5_2p4g`XwDCo76r+T<^OFt61cwJ~Ne#TqAxRzmUvpWCcLbXTmu&i|-XGYBwAU zNV((M#N1+zhDe7E1XezJ{Cz!9JylY2f1C7UCciyu>q<`WcKVBbcRvw3QqI!;oTw#Ta0FRZ>#&>+0ep{K$vp zQwSFk&*kQMBMXIJZ+Vyt^>b!S9lQ*lK-;dkQU}@0@}f@vWPZq)l!m&P%6Qt_K6QnL zdJoyK$$bNk%$t>YL41z0iDKa@r)?@hUX&5%h%wSx%FQuaLuP8BXUgkP!h)$0GO?u# z^YXm3EVxIIP~b9tr}-ve1KQgMJy7NdFrBQ3tcIQk|{gRl^x z@sp5L6SEFo2?&J}z$$g>=}*{T1QU%4&v?YeYuq=+zkZv6w3r7EVVxhdRJ{#t#2r4$ zzXurO+qx;_O8L~d9nDaVFH`D8UkVPC+nTuZ`03}iJMQmX%~nS)+lb^Hj2gW5=pawH z%{U8R_O<)(RMXlp^~o@KQcmIv&F|(48{xY@X&G^&cg(z(68}L+We}p=DWR_KV%11` zbWCx0wOkHYb>Bk<`(|#O+z(0>_p;dorS!_uaD0Dd+(0%snu@*M4d0o8q#B!?S_q2C zGfY5XycsB3A5qJdj~fQOkLY!JoHr+hIIS->pj!i!AMc0PGgEYG=7>LR z#wx_~3fr*vMo^xP`SD6ND9B3F%e*0H(v5vSNI+9|uGUK`~Zqv(rqIwn3@s+1&d(4-|Gk zvqmwP=r4>$^HW|%EL=3KF!VgDE$^a3!K;%ZmTws{1L{@j0!SK(*{NH}gh5H`%?W6F zJ}SgyZzw(wP@EvhmVz!`NPEs=g0%kyTx>molAsciqH+`-m+GGhm(CyW{{C%3qUzmX z3-e+zNtbAIBT!bz#$=D*egWkLJ)e61eccSnCoUKN-weoBd$nQKfKOi(2aj}v>Q%)0 z=Km+``mWsw+iJ&sB%R#%BpWd~4_C#mJw#H3oBQ*@ZXQZ7gVpqc0O2upCx+T`4(Fvs z5V)3w#`J)eU}qQ_HwUsoqu+$mHsnxgsrV?yv8kE0Tuj%w-GOG728td{mqGU|cKX}% zjphoOF*6Io*xZMiqvy9R_ooghhi{u|De}Rwv0mOPaV*fz`X|Z9$JYn}jT(sE3DiOU zFJhUao~tc3Pm!0C6IgOUJQ3*_xDOpV^R3D6tOt;}42cVjm68;$Jtv=cM`x5RAIdxz znqP}e_6P4w_ex;5Qp?A1M_JP-1i!-hng!*UycgdQLJHOSb0}^5s@SAvTWppGLx;ah zN@~FvxY!6?n;;0nF(cY}RH(Hj2PJ;1p=uJ?mnkdVOYXzlSK`qbSfMm1Rh#MT`b4`s zid+q8?LjIB^9UZ!$VzN z-Jr9*{oU!Q7d&ehTOR(evMQTjO(EMZ{N?QSZj;yEr#*gt{=0H0eEa|zNTDQx&ctL5 zWLnAc7?fV_K$zFERg%IhbM_Ilj$$W#FltpNvdzP0w_*0+Hct?DuG+M=a*UwtGvuH9 zLDbAcGrMwQYt^y8A$IWQ|0X;Ixo{m&bF|Zes{CSTXs8sFdZ}8NpSNebbEj&IrX)Bx z7>i24Ovc>Q)UTkZX!Q`{Fb7b$(*L%&_=&B)zWz3J$ts|gmkSfina^qHTk$dLL>!49 zvs^aCi1H01xr`(PMyuojSaTFA@yZxyLwF@Op)8{uf5Ed!%kYD!B97iKMz=I?mht4i zoEf1o7Yt0{p8Qg=6k5AH5UWwhR_Z#Sa;D(^ve!a7J2U5``OVN`cwymS4Gu;L^?4S4 zlI_gYvIX&J$K%PGnuLv?mLN+xwaN%9X7L!c6^uUq#Fv0BX%KkHAJ1%hPrjVPW6)-; zXzj(9FA$QjXC?LF-c8h4h^>()HU1`VgLGR)L0t3Z;lO;xxzhK&y@H zPogrBPv-1mH95J{kUA={hCOWM#JtT^SN(c?6h{eXz|bVh56f)qK4r`2vS~8|GJP0E zPOo8aRwbbf+hEV{DNf4L46m#uAAHBt%r%l?Uqj&V3AvhqY(%bDiB3hr{iFJId}}41 zTp=0aw@r_p-pfC2?19(%_Lc8F3v{da8W|o{S^a0{?_b9|ljk=us>DpUA>!pI=xQfW MSJ6@~Rk8^F59f6l%m4rY literal 15132 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