com.jay.pea.mhealthapp2.safetyMonitor.SafetyMonitor.java Source code

Java tutorial

Introduction

Here is the source code for com.jay.pea.mhealthapp2.safetyMonitor.SafetyMonitor.java

Source

/*
 * Copyright (c) 2016.
 *
 * The source code contained in this file remains the intellectual property of Paul Wright (PeaJay).
 * Any reuse, adaption or replication of this code, without express permission, is prohibited.
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
 * ANY KIND, either express or implied.
 *
 *
 */

package com.jay.pea.mhealthapp2.safetyMonitor;

import android.content.Context;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.jay.pea.mhealthapp2.model.Dose;
import com.jay.pea.mhealthapp2.model.DoseComparator;
import com.jay.pea.mhealthapp2.model.MedComparator;
import com.jay.pea.mhealthapp2.model.MedDBOpenHelper;
import com.jay.pea.mhealthapp2.model.Medication;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by Paul on 12/07/2016.
 * <p/>
 * Safety monitor class that carries out all the safety functional checks and returns a
 * boolean for the safety state. Class has eight methods, on for each safety function.
 */
public class SafetyMonitor {

    public static final String PREFS_NAME_1 = "Alerts_Fired";
    public static final String PREFS_NAME_2 = "Alert_Times";
    MedDBOpenHelper dbHelper;
    ArrayList<Medication> medList;
    ArrayList<Medication> safeMedList;
    Context context;
    SQLiteDatabase db;
    SQLiteDatabase smdb;
    SafetyMonitorDBOpenHelper smDBHelper;
    String TAG = "SafetyMonitorDisplay";
    ArrayList<Dose> todaysDoseList;
    DateTimeFormatter dtfDate = DateTimeFormat.forPattern("dd-MMM-yy");
    DateTimeFormatter dtfTime = DateTimeFormat.forPattern("HH:mm");
    boolean safety1, safety2, safety3, safety4, safety5, safety6, safety7, safety8;
    SharedPreferences alertCount;
    SharedPreferences alertTimes;

    //constructor builds medArray and safetyArray
    public SafetyMonitor(Context context) {
        //get context
        this.context = context;

        //get medications
        medList = new ArrayList<>();
        medList.clear();
        dbHelper = new MedDBOpenHelper(context);
        //db = dbHelper.getWritableDatabase();
        medList = dbHelper.getAllMeds();
        Collections.sort(medList, new MedComparator());

        //get safety data
        safeMedList = new ArrayList<>();
        safeMedList.clear();
        smDBHelper = new SafetyMonitorDBOpenHelper(context);
        smdb = smDBHelper.getReadableDatabase();
        safeMedList = smDBHelper.getAllMeds();

        //        for (Medication med : safeMedList) {
        //            smDBHelper.deleteMedID(med.getDbID());
        //        }
        //
        //        for (Medication med : medList) {
        //            smDBHelper.addMed(smdb, med);
        //        }

        Collections.sort(safeMedList, new MedComparator());
    }

    /**
     * Method that verifies the medication data in the main DB against the data in the safety DB.
     *
     * @return
     */
    public boolean checkMedData() {

        if (medList.size() == 0)
            return true;
        Log.d(TAG, medList.get(0).getMedName() + " " + safeMedList.get(0).getMedName());
        Log.d(TAG, medList.get(1).getMedName() + " " + safeMedList.get(1).getMedName());
        Log.d(TAG, medList.get(2).getMedName() + " " + safeMedList.get(2).getMedName());

        for (int i = 0; i < medList.size(); i++) {
            if (!(medList.get(i).getDose() + medList.get(i).getMedName())
                    .equals(safeMedList.get(i).getDose() + safeMedList.get(i).getMedName())) {
                Log.d(TAG, medList.get(i).getDose() + medList.get(i).getMedName() + " = norm. Safe = "
                        + safeMedList.get(i).getDose() + safeMedList.get(i).getMedName());
                return false;
            }
        }
        return true;
    }

    /**
     * Independent Safety Monitor checks the number of doses taken per day for a medication and assures it does not exceed the required number of doses (frequency). Function must account for dismissed alarms.
     *
     * @return
     */
    public boolean checkDoseFreq() {
        //create a dose List to match the main dose list
        ArrayList<Dose> doseList = new ArrayList<>();
        if (medList.isEmpty())
            return true;
        //get all doses and add to doseList
        for (Medication med : medList) {
            HashMap<DateTime, DateTime> doseMap1 = med.getDoseMap1();
            HashMap<DateTime, Integer> doseMap2 = med.getDoseMap2();
            for (DateTime doseDate : doseMap1.keySet()) {
                //get takenDate and alertOn
                DateTime takenDate = doseMap1.get(doseDate);
                int alertOn = doseMap2.get(doseDate);
                Dose dose = new Dose(med, doseDate, takenDate, alertOn);
                doseList.add(dose);
            }
        }
        DateTime today = new DateTime().now();
        todaysDoseList = new ArrayList<>();
        //get today's doses
        for (Dose dose : doseList) {
            DateTimeFormatter dayFormat = DateTimeFormat.forPattern("dd MMM yyyy");
            if (dose.getDoseTime().toString(dayFormat).equals(today.toString(dayFormat))) {
                todaysDoseList.add(dose);
            }
            //sort collect, add to adaptor
            Collections.sort(todaysDoseList, new DoseComparator());
        }
        for (Dose d : todaysDoseList) {
            for (Medication safeMed : safeMedList) {
                if (safeMed.getMedName().equals(d.getMedication().getMedName())
                        & safeMed.getMedStart() == (d.getMedication().getMedStart())) {
                    if (d.getMedication().getFreq() == safeMed.getFreq()) {
                        return true;
                    }
                }
            }
        }
        // safety fail as have not matched frequency
        return false;
    }

    /**
     * Independent Safety monitor monitors the number of missed doses over a time period for each medication. If it exceeds a threshold the user will be notified.
     *
     * @return
     */
    public boolean checkMissedDoses() {

        int missedDoseCount = 0;
        for (Dose missedDose : todaysDoseList) {

            if (missedDose.getDoseTime().isBefore(new DateTime().now()) && missedDose.getMedication().getDoseMap1()
                    .get(missedDose.getDoseTime()).equals(new DateTime(0))) {
                missedDoseCount++;
            }
        }

        if (missedDoseCount > 0)
            return false;
        else
            return true;

        //        for (Medication med : medList) {
        //            HashMap<DateTime, DateTime> doseMap = med.getDoseMap1();
        //            for (DateTime dateTime : doseMap.keySet()) {
        //                DateTime doseDate = dateTime;
        //                DateTime today = new DateTime().now();
        //                if (doseDate.toString(dtfDate).equals(today.toString())) {
        //                    DateTime takenTime = doseMap.get(dateTime);
        //                    if (doseDate.isBefore(today) && takenTime.isBefore(new DateTime(0).plusYears(2))) {
        //                        return false;
        //                    }
        //                }
        //            }
        //        }
        //        return true;

    }

    /**
     * Independent Safety Monitor checks the number of doses taken per day for a medication and assures it does not exceed the required number of doses (frequency).
     *
     * @return
     */
    public boolean checkDosesTaken() {

        ArrayList<DateTime> takenAL = new ArrayList<>();
        for (Medication med : medList) {
            for (DateTime doseDateTime : med.getDoseMap1().keySet()) {
                DateTime takenDateTime = med.getDoseMap1().get(doseDateTime);
                if (takenDateTime != new DateTime(0)) {
                    takenAL.add(takenDateTime);
                }
            }
        }
        int doseTakenCount = 0;
        int tempCount = 0;
        for (DateTime takenDateTime : takenAL) {
            for (DateTime innerTakenDateTime : takenAL) {
                if (innerTakenDateTime.toString(dtfDate).equals(takenDateTime.toString(dtfDate))
                        && innerTakenDateTime != takenDateTime) {
                    tempCount++;
                }
            }
            if (tempCount > doseTakenCount) {
                doseTakenCount = tempCount;
            }
        }
        return true;
    }

    /**
     * Independent Safety monitor checks the number of alarms fired per day for a medication and assures it does not exceed the day's number of doses.
     *
     * @return
     */
    public boolean checkAlarms() {

        if (medList.isEmpty())
            return true;
        alertCount = context.getSharedPreferences(PREFS_NAME_1, 0);
        for (Medication med : medList) {
            if (med.getFreq() == alertCount.getInt(med.getMedName(), 0))
                return true;

        }
        return false;
    }

    // 6.X

    /**
     * Independent Safety Monitor checks alerts are fired within one hour of dose time.
     *
     * @return
     */
    public boolean alertTiming() {

        if (medList.isEmpty())
            return true;

        boolean match = false;
        alertTimes = context.getSharedPreferences(PREFS_NAME_2, 0);

        for (Medication med : medList) {

            Set<String> tempS1 = alertTimes.getStringSet(med.getDose(), new HashSet<String>());

            for (String string : tempS1) {

                for (DateTime doseTime : med.getDoseMap1().keySet()) {

                    if (doseTime.toString(dtfDate).equals(new DateTime().toString(dtfDate))) {

                        if (doseTime.toString(dtfTime).equals(string))
                            match = true;
                    }
                }
            }
        }
        return match;
    }

    /**
     * Independent Safety monitor checks Medication Start Date matches medication Start Dates input by user.
     *
     * @return
     */
    public boolean startDateValid() {

        if (medList.isEmpty())
            return true;

        for (Medication med : medList) {
            for (Medication safeMed : safeMedList) {
                if (safeMed.getMedName().equals(med.getMedName()) && safeMed.getMedEnd() == (med.getMedEnd())) {
                    if (med.getMedStart() == safeMed.getMedStart())
                        return true;
                }
            }
        }
        return false;
    }

    //  8.X

    /**
     * Independent Safety monitor checks Medication End Date matches medication End Date input by user.
     *
     * @return
     */
    public boolean endDateValid() {
        if (medList.isEmpty())
            return true;

        for (Medication med : medList) {
            for (Medication safeMed : safeMedList) {
                if (safeMed.getMedName().equals(med.getMedName()) && safeMed.getMedStart() == (med.getMedStart())) {
                    if (med.getMedEnd() == safeMed.getMedEnd())
                        return true;
                }
            }
        }
        return false;
    }

    /**
     * run all safety checks
     */
    public boolean runSafetyChecks() {
        safety1 = checkMedData();
        safety2 = checkDoseFreq();
        safety3 = checkMissedDoses();
        safety4 = checkDosesTaken();
        safety5 = checkAlarms();
        safety6 = alertTiming();
        safety7 = startDateValid();
        safety8 = endDateValid();

        if (!safety1 || !safety2 || !safety3 || !safety4 || !safety5 || !safety6 || !safety7 || !safety8) {
            return false;
        } else
            return true;
    }
}