diff --git a/pump/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/DashPodHistoryActivity.kt b/pump/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/DashPodHistoryActivity.kt index 8565ddf6f6..e88f1f1209 100644 --- a/pump/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/DashPodHistoryActivity.kt +++ b/pump/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/DashPodHistoryActivity.kt @@ -53,6 +53,7 @@ class DashPodHistoryActivity : TranslatedDaggerAppCompatActivity() { private var recyclerViewAdapter: RecyclerViewAdapter? = null private var manualChange = false private var typeListFull: List? = null + private var selectedGroup: PumpHistoryEntryGroup = PumpHistoryEntryGroup.All private fun prepareData() { val gc = GregorianCalendar() @@ -356,7 +357,6 @@ class DashPodHistoryActivity : TranslatedDaggerAppCompatActivity() { companion object { - private var selectedGroup: PumpHistoryEntryGroup = PumpHistoryEntryGroup.All const val DAYS_TO_DISPLAY = 5 } } diff --git a/pump/omnipod-eros/src/main/AndroidManifest.xml b/pump/omnipod-eros/src/main/AndroidManifest.xml index a125db69e5..9d76b8d14f 100644 --- a/pump/omnipod-eros/src/main/AndroidManifest.xml +++ b/pump/omnipod-eros/src/main/AndroidManifest.xml @@ -21,6 +21,6 @@ + android:theme="@style/AppTheme" /> \ No newline at end of file diff --git a/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodHistoryActivity.java b/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodHistoryActivity.java deleted file mode 100644 index 6608569376..0000000000 --- a/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodHistoryActivity.java +++ /dev/null @@ -1,344 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui; - -import android.os.Bundle; -import android.os.SystemClock; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.Spinner; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.GregorianCalendar; -import java.util.List; - -import javax.inject.Inject; - -import dagger.android.support.DaggerAppCompatActivity; -import info.nightscout.androidaps.plugins.pump.omnipod.eros.R; -import info.nightscout.androidaps.plugins.pump.omnipod.eros.definition.PodHistoryEntryType; -import info.nightscout.androidaps.plugins.pump.omnipod.eros.history.ErosHistory; -import info.nightscout.androidaps.plugins.pump.omnipod.eros.history.database.ErosHistoryRecordEntity; -import info.nightscout.androidaps.plugins.pump.omnipod.eros.util.AapsOmnipodUtil; -import info.nightscout.interfaces.profile.Profile; -import info.nightscout.interfaces.pump.defs.PumpType; -import info.nightscout.pump.common.defs.PumpHistoryEntryGroup; -import info.nightscout.pump.common.defs.TempBasalPair; -import info.nightscout.pump.common.utils.ProfileUtil; -import info.nightscout.rx.logging.AAPSLogger; -import info.nightscout.rx.logging.LTag; -import info.nightscout.shared.interfaces.ResourceHelper; - -public class ErosPodHistoryActivity extends DaggerAppCompatActivity { - - @Inject AAPSLogger aapsLogger; - @Inject AapsOmnipodUtil aapsOmnipodUtil; - @Inject ResourceHelper rh; - @Inject ErosHistory erosHistory; - - private Spinner historyTypeSpinner; - private TextView statusView; - private RecyclerView recyclerView; - private LinearLayoutManager linearLayoutManager; - - private static PumpHistoryEntryGroup selectedGroup = PumpHistoryEntryGroup.All; - private final List fullHistoryList = new ArrayList<>(); - private final List filteredHistoryList = new ArrayList<>(); - - private RecyclerViewAdapter recyclerViewAdapter; - private boolean manualChange = false; - - private List typeListFull; - - - public ErosPodHistoryActivity() { - super(); - } - - - private void prepareData() { - GregorianCalendar gc = new GregorianCalendar(); - gc.add(Calendar.HOUR_OF_DAY, -24); - - fullHistoryList.addAll(erosHistory.getAllErosHistoryRecordsFromTimestamp(gc.getTimeInMillis())); - } - - - private void filterHistory(PumpHistoryEntryGroup group) { - - this.filteredHistoryList.clear(); - - aapsLogger.debug(LTag.PUMP, "Items on full list: {}", fullHistoryList.size()); - - if (group == PumpHistoryEntryGroup.All) { - this.filteredHistoryList.addAll(fullHistoryList); - } else { - for (ErosHistoryRecordEntity pumpHistoryEntry : fullHistoryList) { - if (PodHistoryEntryType.getByCode(pumpHistoryEntry.getPodEntryTypeCode()).getGroup() == group) { - this.filteredHistoryList.add(pumpHistoryEntry); - } - } - } - - if (this.recyclerViewAdapter != null) { - this.recyclerViewAdapter.setHistoryList(this.filteredHistoryList); - this.recyclerViewAdapter.notifyDataSetChanged(); - } - - aapsLogger.debug(LTag.PUMP, "Items on filtered list: {}", filteredHistoryList.size()); - } - - - @Override - protected void onResume() { - super.onResume(); - filterHistory(selectedGroup); - setHistoryTypeSpinner(); - } - - - private void setHistoryTypeSpinner() { - this.manualChange = true; - - for (int i = 0; i < typeListFull.size(); i++) { - if (typeListFull.get(i).entryGroup == selectedGroup) { - historyTypeSpinner.setSelection(i); - break; - } - } - - SystemClock.sleep(200); - this.manualChange = false; - } - - - @Override - protected void onPause() { - super.onPause(); - } - - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.omnipod_eros_pod_history_activity); - - historyTypeSpinner = findViewById(R.id.omnipod_historytype); - statusView = findViewById(R.id.omnipod_historystatus); - recyclerView = findViewById(R.id.omnipod_history_recyclerview); - recyclerView.setHasFixedSize(true); - - linearLayoutManager = new LinearLayoutManager(this); - recyclerView.setLayoutManager(linearLayoutManager); - - prepareData(); - - recyclerViewAdapter = new RecyclerViewAdapter(filteredHistoryList); - recyclerView.setAdapter(recyclerViewAdapter); - - statusView.setVisibility(View.GONE); - - typeListFull = getTypeList(PumpHistoryEntryGroup.Companion.getTranslatedList(rh)); - - ArrayAdapter spinnerAdapter = new ArrayAdapter<>(this, info.nightscout.core.ui.R.layout.spinner_centered, typeListFull); - historyTypeSpinner.setAdapter(spinnerAdapter); - - historyTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (manualChange) - return; - TypeList selected = (TypeList) historyTypeSpinner.getSelectedItem(); - selectedGroup = selected.entryGroup; - filterHistory(selectedGroup); - } - - - @Override - public void onNothingSelected(AdapterView parent) { - if (manualChange) - return; - filterHistory(PumpHistoryEntryGroup.All); - } - }); - - } - - - private List getTypeList(List list) { - - ArrayList typeList = new ArrayList<>(); - - for (PumpHistoryEntryGroup pumpHistoryEntryGroup : list) { - typeList.add(new TypeList(pumpHistoryEntryGroup)); - } - - return typeList; - } - - static class TypeList { - - final PumpHistoryEntryGroup entryGroup; - final String name; - - TypeList(PumpHistoryEntryGroup entryGroup) { - this.entryGroup = entryGroup; - this.name = entryGroup.getTranslated(); - } - - @NonNull - @Override - public String toString() { - return name; - } - } - - public class RecyclerViewAdapter extends RecyclerView.Adapter { - - List historyList; - - RecyclerViewAdapter(List historyList) { - this.historyList = historyList; - } - - - void setHistoryList(List historyList) { - this.historyList = historyList; - Collections.sort(this.historyList); - } - - - @NonNull - @Override - public HistoryViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { - View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.omnipod_eros_pod_history_item, // - viewGroup, false); - return new HistoryViewHolder(v); - } - - - @Override - public void onBindViewHolder(@NonNull HistoryViewHolder holder, int position) { - ErosHistoryRecordEntity record = historyList.get(position); - - if (record != null) { - holder.timeView.setText(record.getDateTimeString()); - holder.typeView.setText(PodHistoryEntryType.getByCode(record.getPodEntryTypeCode()).getResourceId()); - setValue(record, holder.valueView); - } - } - - - private void setValue(ErosHistoryRecordEntity historyEntry, TextView valueView) { - //valueView.setText(""); - - if (historyEntry.isSuccess()) { - PodHistoryEntryType entryType = PodHistoryEntryType.getByCode(historyEntry.getPodEntryTypeCode()); - switch (entryType) { - - case SET_TEMPORARY_BASAL: - case SPLIT_TEMPORARY_BASAL: { - TempBasalPair tempBasalPair = aapsOmnipodUtil.getGsonInstance().fromJson(historyEntry.getData(), TempBasalPair.class); - valueView.setText(rh.gs(R.string.omnipod_eros_history_tbr_value, tempBasalPair.getInsulinRate(), tempBasalPair.getDurationMinutes())); - } - break; - - case INSERT_CANNULA: - case SET_BASAL_SCHEDULE: { - if (historyEntry.getData() != null) { - setProfileValue(historyEntry.getData(), valueView); - } - } - break; - - case SET_BOLUS: { - if (historyEntry.getData().contains(";")) { - String[] splitVal = historyEntry.getData().split(";"); - valueView.setText(rh.gs(R.string.omnipod_eros_history_bolus_value_with_carbs, Double.valueOf(splitVal[0]), Double.valueOf(splitVal[1]))); - } else { - valueView.setText(rh.gs(R.string.omnipod_eros_history_bolus_value, Double.valueOf(historyEntry.getData()))); - } - } - break; - - case PLAY_TEST_BEEP: { - if (historyEntry.getData() != null) { - valueView.setText(historyEntry.getData()); - } - } - break; - case GET_POD_STATUS: - case GET_POD_INFO: - case SET_TIME: - case INITIALIZE_POD: - case CANCEL_TEMPORARY_BASAL_BY_DRIVER: - case CANCEL_TEMPORARY_BASAL: - case CONFIGURE_ALERTS: - case CANCEL_BOLUS: - case DEACTIVATE_POD: - case DISCARD_POD: - case ACKNOWLEDGE_ALERTS: - case SUSPEND_DELIVERY: - case RESUME_DELIVERY: - case UNKNOWN_ENTRY_TYPE: - default: - valueView.setText(""); - break; - - } - } else { - valueView.setText(historyEntry.getData()); - } - - } - - private void setProfileValue(String data, TextView valueView) { - aapsLogger.debug(LTag.PUMP, "Profile json:\n" + data); - - try { - Profile.ProfileValue[] profileValuesArray = aapsOmnipodUtil.getGsonInstance().fromJson(data, Profile.ProfileValue[].class); - valueView.setText(ProfileUtil.INSTANCE.getBasalProfilesDisplayable(profileValuesArray, PumpType.OMNIPOD_EROS)); - } catch (Exception e) { - aapsLogger.error(LTag.PUMP, "Problem parsing Profile json. Ex: {}, Data:\n{}", e.getMessage(), data); - valueView.setText(""); - } - } - - - @Override - public int getItemCount() { - return historyList.size(); - } - - - @Override - public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { - super.onAttachedToRecyclerView(recyclerView); - } - - - class HistoryViewHolder extends RecyclerView.ViewHolder { - - final TextView timeView; - final TextView typeView; - final TextView valueView; - - HistoryViewHolder(View itemView) { - super(itemView); - timeView = itemView.findViewById(R.id.omnipod_history_time); - typeView = itemView.findViewById(R.id.omnipod_history_source); - valueView = itemView.findViewById(R.id.omnipod_history_description); - } - } - } - -} diff --git a/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodHistoryActivity.kt b/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodHistoryActivity.kt new file mode 100644 index 0000000000..689c140929 --- /dev/null +++ b/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodHistoryActivity.kt @@ -0,0 +1,250 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui + +import android.annotation.SuppressLint +import android.os.Bundle +import android.os.SystemClock +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.Spinner +import android.widget.TextView +import androidx.core.view.MenuProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import dagger.android.support.DaggerAppCompatActivity +import info.nightscout.androidaps.plugins.pump.omnipod.eros.R +import info.nightscout.androidaps.plugins.pump.omnipod.eros.definition.PodHistoryEntryType +import info.nightscout.androidaps.plugins.pump.omnipod.eros.history.ErosHistory +import info.nightscout.androidaps.plugins.pump.omnipod.eros.history.database.ErosHistoryRecordEntity +import info.nightscout.androidaps.plugins.pump.omnipod.eros.util.AapsOmnipodUtil +import info.nightscout.interfaces.profile.Profile.ProfileValue +import info.nightscout.interfaces.pump.defs.PumpType +import info.nightscout.pump.common.defs.PumpHistoryEntryGroup +import info.nightscout.pump.common.defs.PumpHistoryEntryGroup.Companion.getTranslatedList +import info.nightscout.pump.common.defs.TempBasalPair +import info.nightscout.pump.common.utils.ProfileUtil.getBasalProfilesDisplayable +import info.nightscout.rx.logging.AAPSLogger +import info.nightscout.rx.logging.LTag +import info.nightscout.shared.interfaces.ResourceHelper +import java.util.Calendar +import java.util.GregorianCalendar +import javax.inject.Inject + +class ErosPodHistoryActivity : DaggerAppCompatActivity() { + + @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var aapsOmnipodUtil: AapsOmnipodUtil + @Inject lateinit var rh: ResourceHelper + @Inject lateinit var erosHistory: ErosHistory + + private var historyTypeSpinner: Spinner? = null + private var statusView: TextView? = null + private var recyclerView: RecyclerView? = null + private var linearLayoutManager: LinearLayoutManager? = null + private val fullHistoryList: MutableList = ArrayList() + private val filteredHistoryList: MutableList = ArrayList() + private var recyclerViewAdapter: RecyclerViewAdapter? = null + private var manualChange = false + private var typeListFull: List = ArrayList() + private var selectedGroup = PumpHistoryEntryGroup.All + private fun prepareData() { + val gc = GregorianCalendar() + gc.add(Calendar.HOUR_OF_DAY, -24) + fullHistoryList.addAll(erosHistory.getAllErosHistoryRecordsFromTimestamp(gc.timeInMillis)) + } + + @SuppressLint("NotifyDataSetChanged") + private fun filterHistory(group: PumpHistoryEntryGroup) { + filteredHistoryList.clear() + aapsLogger.debug(LTag.PUMP, "Items on full list: {}", fullHistoryList.size) + if (group === PumpHistoryEntryGroup.All) { + filteredHistoryList.addAll(fullHistoryList) + } else { + for (pumpHistoryEntry in fullHistoryList) { + if (PodHistoryEntryType.getByCode(pumpHistoryEntry.podEntryTypeCode).group === group) { + filteredHistoryList.add(pumpHistoryEntry) + } + } + } + recyclerViewAdapter?.setHistoryList(filteredHistoryList) + recyclerViewAdapter?.notifyDataSetChanged() + aapsLogger.debug(LTag.PUMP, "Items on filtered list: {}", filteredHistoryList.size) + } + + override fun onResume() { + super.onResume() + filterHistory(selectedGroup) + setHistoryTypeSpinner() + } + + private fun setHistoryTypeSpinner() { + manualChange = true + for (i in typeListFull.indices) { + if (typeListFull[i].entryGroup === selectedGroup) { + historyTypeSpinner?.setSelection(i) + break + } + } + SystemClock.sleep(200) + manualChange = false + } + + public override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.omnipod_eros_pod_history_activity) + + title = rh.gs(info.nightscout.androidaps.plugins.pump.omnipod.common.R.string.omnipod_common_pod_management_button_pod_history) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowHomeEnabled(true) + + historyTypeSpinner = findViewById(R.id.omnipod_historytype) + statusView = findViewById(R.id.omnipod_historystatus) + recyclerView = findViewById(R.id.omnipod_history_recyclerview) + recyclerView?.setHasFixedSize(true) + linearLayoutManager = LinearLayoutManager(this) + recyclerView?.layoutManager = linearLayoutManager + prepareData() + recyclerViewAdapter = RecyclerViewAdapter(filteredHistoryList) + recyclerView?.adapter = recyclerViewAdapter + statusView?.visibility = View.GONE + typeListFull = getTypeList(getTranslatedList(rh)) + historyTypeSpinner?.adapter = ArrayAdapter(this, info.nightscout.core.ui.R.layout.spinner_centered, typeListFull) + historyTypeSpinner?.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>?, view: View, position: Int, id: Long) { + if (manualChange) return + val selected = historyTypeSpinner?.selectedItem as TypeList + selectedGroup = selected.entryGroup + filterHistory(selectedGroup) + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + if (manualChange) return + filterHistory(PumpHistoryEntryGroup.All) + } + } + + // Add menu items without overriding methods in the Activity + addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {} + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = + when (menuItem.itemId) { + android.R.id.home -> { + onBackPressedDispatcher.onBackPressed() + true + } + + else -> false + } + }) + } + + private fun getTypeList(list: List): List { + val typeList = ArrayList() + for (pumpHistoryEntryGroup in list) { + typeList.add(TypeList(pumpHistoryEntryGroup)) + } + return typeList + } + + internal class TypeList(val entryGroup: PumpHistoryEntryGroup) { + + val name: String = entryGroup.translated ?: "" + override fun toString(): String = name + } + + inner class RecyclerViewAdapter internal constructor(private var historyList: MutableList) : RecyclerView.Adapter() { + + fun setHistoryList(historyList: MutableList) { + this.historyList = historyList + this.historyList.sort() + } + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): HistoryViewHolder { + val v = LayoutInflater.from(viewGroup.context).inflate( + R.layout.omnipod_eros_pod_history_item, // + viewGroup, false + ) + return HistoryViewHolder(v) + } + + override fun onBindViewHolder(holder: HistoryViewHolder, position: Int) { + val record = historyList[position] + holder.timeView.text = record.dateTimeString + holder.typeView.setText(PodHistoryEntryType.getByCode(record.podEntryTypeCode).resourceId) + setValue(record, holder.valueView) + } + + private fun setValue(historyEntry: ErosHistoryRecordEntity, valueView: TextView) { + //valueView.setText(""); + if (historyEntry.isSuccess) { + when (PodHistoryEntryType.getByCode(historyEntry.podEntryTypeCode)) { + PodHistoryEntryType.SET_TEMPORARY_BASAL, PodHistoryEntryType.SPLIT_TEMPORARY_BASAL -> { + val tempBasalPair = aapsOmnipodUtil.gsonInstance.fromJson(historyEntry.data, TempBasalPair::class.java) + valueView.text = rh.gs(R.string.omnipod_eros_history_tbr_value, tempBasalPair.insulinRate, tempBasalPair.durationMinutes) + } + + PodHistoryEntryType.INSERT_CANNULA, PodHistoryEntryType.SET_BASAL_SCHEDULE -> { + if (historyEntry.data != null) { + setProfileValue(historyEntry.data, valueView) + } + } + + PodHistoryEntryType.SET_BOLUS -> { + if (historyEntry.data.contains(";")) { + val splitVal = historyEntry.data.split(";".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + valueView.text = rh.gs(R.string.omnipod_eros_history_bolus_value_with_carbs, java.lang.Double.valueOf(splitVal[0]), java.lang.Double.valueOf(splitVal[1])) + } else { + valueView.text = rh.gs(R.string.omnipod_eros_history_bolus_value, java.lang.Double.valueOf(historyEntry.data)) + } + } + + PodHistoryEntryType.PLAY_TEST_BEEP -> { + if (historyEntry.data != null) { + valueView.text = historyEntry.data + } + } + + PodHistoryEntryType.GET_POD_STATUS, PodHistoryEntryType.GET_POD_INFO, PodHistoryEntryType.SET_TIME, PodHistoryEntryType.INITIALIZE_POD, PodHistoryEntryType.CANCEL_TEMPORARY_BASAL_BY_DRIVER, PodHistoryEntryType.CANCEL_TEMPORARY_BASAL, PodHistoryEntryType.CONFIGURE_ALERTS, PodHistoryEntryType.CANCEL_BOLUS, PodHistoryEntryType.DEACTIVATE_POD, PodHistoryEntryType.DISCARD_POD, PodHistoryEntryType.ACKNOWLEDGE_ALERTS, PodHistoryEntryType.SUSPEND_DELIVERY, PodHistoryEntryType.RESUME_DELIVERY, PodHistoryEntryType.UNKNOWN_ENTRY_TYPE -> valueView.text = + "" + + else -> valueView.text = + "" + } + } else { + valueView.text = historyEntry.data + } + } + + private fun setProfileValue(data: String, valueView: TextView) { + aapsLogger.debug(LTag.PUMP, "Profile json:\n$data") + try { + val profileValuesArray = aapsOmnipodUtil.gsonInstance.fromJson(data, Array::class.java) + valueView.text = getBasalProfilesDisplayable(profileValuesArray, PumpType.OMNIPOD_EROS) + } catch (e: Exception) { + aapsLogger.error(LTag.PUMP, "Problem parsing Profile json. Ex: {}, Data:\n{}", e.message, data) + valueView.text = "" + } + } + + override fun getItemCount(): Int = historyList.size + + inner class HistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + val timeView: TextView + val typeView: TextView + val valueView: TextView + + init { + timeView = itemView.findViewById(R.id.omnipod_history_time) + typeView = itemView.findViewById(R.id.omnipod_history_source) + valueView = itemView.findViewById(R.id.omnipod_history_description) + } + } + } +}