AndroidAPS/app/src/main/java/info/nightscout/androidaps/dialogs/LoopDialog.kt

311 lines
15 KiB
Kotlin
Raw Normal View History

2020-12-25 16:47:42 +01:00
package info.nightscout.androidaps.dialogs
2020-12-26 17:40:16 +01:00
import android.content.Intent
2020-12-25 16:47:42 +01:00
import android.os.Bundle
2020-12-26 17:40:16 +01:00
import android.view.*
2020-12-25 16:47:42 +01:00
import androidx.fragment.app.FragmentManager
import dagger.android.support.DaggerDialogFragment
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
2020-12-26 17:40:16 +01:00
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.events.EventRefreshOverview
import info.nightscout.androidaps.interfaces.*
2020-12-25 16:47:42 +01:00
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
2020-12-26 17:40:16 +01:00
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
import info.nightscout.androidaps.plugins.aps.loop.events.EventNewOpenLoopNotification
2020-12-25 16:47:42 +01:00
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
2020-12-26 17:40:16 +01:00
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
import info.nightscout.androidaps.queue.Callback
import info.nightscout.androidaps.utils.*
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
2020-12-25 16:47:42 +01:00
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
2020-12-26 17:40:16 +01:00
import kotlinx.android.synthetic.main.dialog_loop.*
2020-12-25 16:47:42 +01:00
import javax.inject.Inject
class LoopDialog : DaggerDialogFragment() {
@Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var mainApp: MainApp
@Inject lateinit var sp: SP
@Inject lateinit var rxBus: RxBusWrapper
@Inject lateinit var fabricPrivacy: FabricPrivacy
@Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var profileFunction: ProfileFunction
2020-12-26 17:40:16 +01:00
@Inject lateinit var loopPlugin: LoopPlugin
2020-12-25 16:47:42 +01:00
@Inject lateinit var activePlugin: ActivePluginProvider
2020-12-26 17:40:16 +01:00
@Inject lateinit var commandQueue: CommandQueueProvider
@Inject lateinit var configBuilderPlugin: ConfigBuilderPlugin
2020-12-25 16:47:42 +01:00
private var disposable: CompositeDisposable = CompositeDisposable()
2020-12-26 17:40:16 +01:00
private var showOkCancel: Boolean = true
2020-12-25 16:47:42 +01:00
override fun onStart() {
super.onStart()
dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
override fun onSaveInstanceState(savedInstanceState: Bundle) {
super.onSaveInstanceState(savedInstanceState)
2020-12-26 17:40:16 +01:00
savedInstanceState.putInt("showOkCancel", if (showOkCancel) 1 else 0)
2020-12-25 16:47:42 +01:00
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
2020-12-26 17:40:16 +01:00
// load data from bundle
(savedInstanceState ?: arguments)?.let { bundle ->
showOkCancel = bundle.getInt("showOkCancel", 1) == 1
}
2020-12-25 16:47:42 +01:00
dialog?.window?.requestFeature(Window.FEATURE_NO_TITLE)
dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
isCancelable = true
dialog?.setCanceledOnTouchOutside(false)
2020-12-26 17:40:16 +01:00
return inflater.inflate(R.layout.dialog_loop, container, false)
2020-12-25 16:47:42 +01:00
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
2020-12-26 17:40:16 +01:00
updateGUI("LoopDialogOnViewCreated")
overview_disable?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_enable?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_resume?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_reconnect?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_suspend_1h?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_suspend_2h?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_suspend_3h?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_suspend_10h?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_disconnect_15m?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_disconnect_30m?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_disconnect_1h?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_disconnect_2h?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
overview_disconnect_3h?.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() }
2020-12-25 16:47:42 +01:00
// cancel button
2020-12-26 17:40:16 +01:00
cancel?.setOnClickListener { dismiss() }
2020-12-25 16:47:42 +01:00
// bus
disposable.add(rxBus
2020-12-26 17:40:16 +01:00
.toObservable(EventNewOpenLoopNotification::class.java)
2020-12-25 16:47:42 +01:00
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
2020-12-26 17:40:16 +01:00
activity?.runOnUiThread { updateGUI("EventNewOpenLoopNotification") }
2020-12-25 16:47:42 +01:00
}, { fabricPrivacy.logException(it) })
)
}
override fun onDestroyView() {
super.onDestroyView()
disposable.clear()
}
2020-12-26 17:40:16 +01:00
fun updateGUI(from: String) {
aapsLogger.debug("UpdateGUI from $from")
val pumpDescription: PumpDescription = activePlugin.activePump.pumpDescription
if (profileFunction.isProfileValid("LoopDialogUpdateGUI")) {
if (loopPlugin.isEnabled(PluginType.LOOP)) {
overview_enable?.visibility = View.GONE //sp.getBoolean(R.string.key_usesuperbolus, false).toVisibility()
overview_disable?.visibility = View.VISIBLE
2020-12-26 18:26:46 +01:00
overview_loop_header?.text = resourceHelper.gs(R.string.disableloop)
2020-12-26 17:40:16 +01:00
if (!loopPlugin.isSuspended) {
overview_suspend_header?.text=resourceHelper.gs(R.string.suspendloop)
overview_resume?.visibility = View.GONE
overview_suspend_buttons?.visibility=View.VISIBLE
overview_suspend?.visibility=View.VISIBLE
} else {
if (!loopPlugin.isDisconnected) {
overview_suspend_header?.text = resourceHelper.gs(R.string.resumeloop)
overview_resume?.visibility = View.VISIBLE
overview_suspend_buttons?.visibility=View.GONE
overview_suspend?.visibility=View.VISIBLE
} else
overview_suspend?.visibility = View.GONE
}
} else {
overview_enable?.visibility = View.VISIBLE
overview_disable?.visibility = View.GONE
2020-12-26 18:26:46 +01:00
overview_loop_header?.text = resourceHelper.gs(R.string.enableloop)
2020-12-26 17:40:16 +01:00
overview_suspend?.visibility = View.GONE
}
if (!loopPlugin.isDisconnected) {
overview_pump_header?.text = resourceHelper.gs(R.string.disconnectpump)
overview_disconnect_15m?.visibility = if (pumpDescription.tempDurationStep15mAllowed) View.VISIBLE else View.GONE
overview_disconnect_15m?.visibility = if (pumpDescription.tempDurationStep30mAllowed) View.VISIBLE else View.GONE
overview_disconnect_buttons?.visibility = View.VISIBLE
overview_reconnect?.visibility = View.GONE
} else {
overview_pump_header?.text = resourceHelper.gs(R.string.reconnect)
overview_disconnect_buttons?.visibility = View.GONE
overview_reconnect?.visibility = View.VISIBLE
}
2020-12-25 16:47:42 +01:00
}
val profile = profileFunction.getProfile()
val profileStore = activePlugin.activeProfileInterface.profile
if (profile == null || profileStore == null) {
ToastUtils.showToastInUiThread(mainApp, resourceHelper.gs(R.string.noprofile))
dismiss()
return
}
}
2020-12-26 17:40:16 +01:00
fun onClick_OkCancelEnabled(v: View): Boolean {
var description = ""
when(v.id) {
R.id.overview_disable -> description = resourceHelper.gs(R.string.disableloop)
R.id.overview_enable -> description = resourceHelper.gs(R.string.enableloop)
R.id.overview_resume -> description = resourceHelper.gs(R.string.resume)
R.id.overview_reconnect -> description = resourceHelper.gs(R.string.reconnect)
R.id.overview_suspend_1h -> description = resourceHelper.gs(R.string.suspendloopfor1h)
R.id.overview_suspend_2h -> description = resourceHelper.gs(R.string.suspendloopfor2h)
R.id.overview_suspend_3h -> description = resourceHelper.gs(R.string.suspendloopfor3h)
R.id.overview_suspend_10h -> description = resourceHelper.gs(R.string.suspendloopfor10h)
R.id.overview_disconnect_15m -> description = resourceHelper.gs(R.string.disconnectpumpfor15m)
R.id.overview_disconnect_30m -> description = resourceHelper.gs(R.string.disconnectpumpfor30m)
R.id.overview_disconnect_1h -> description = resourceHelper.gs(R.string.disconnectpumpfor1h)
R.id.overview_disconnect_2h -> description = resourceHelper.gs(R.string.disconnectpumpfor2h)
R.id.overview_disconnect_3h -> description = resourceHelper.gs(R.string.disconnectpumpfor3h)
}
activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.confirm), description, Runnable {
onClick(v)
})
2020-12-25 16:47:42 +01:00
}
2020-12-26 17:40:16 +01:00
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
fun onClick(v: View): Boolean {
val profile = profileFunction.getProfile() ?: return true
when (v.id) {
R.id.overview_disable -> {
aapsLogger.debug("USER ENTRY: LOOP DISABLED")
loopPlugin.setPluginEnabled(PluginType.LOOP, false)
loopPlugin.setFragmentVisible(PluginType.LOOP, false)
configBuilderPlugin.storeSettings("DisablingLoop")
rxBus.send(EventRefreshOverview("suspendmenu"))
commandQueue.cancelTempBasal(true, object : Callback() {
override fun run() {
if (!result.success) {
ToastUtils.showToastInUiThread(context, resourceHelper.gs(R.string.tempbasaldeliveryerror))
}
}
})
loopPlugin.createOfflineEvent(24 * 60) // upload 24h, we don't know real duration
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_enable -> {
aapsLogger.debug("USER ENTRY: LOOP ENABLED")
loopPlugin.setPluginEnabled(PluginType.LOOP, true)
loopPlugin.setFragmentVisible(PluginType.LOOP, true)
configBuilderPlugin.storeSettings("EnablingLoop")
rxBus.send(EventRefreshOverview("suspendmenu"))
loopPlugin.createOfflineEvent(0)
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_resume, R.id.overview_reconnect -> {
aapsLogger.debug("USER ENTRY: RESUME")
loopPlugin.suspendTo(0L)
rxBus.send(EventRefreshOverview("suspendmenu"))
commandQueue.cancelTempBasal(true, object : Callback() {
override fun run() {
if (!result.success) {
val i = Intent(context, ErrorHelperActivity::class.java)
i.putExtra("soundid", R.raw.boluserror)
i.putExtra("status", result.comment)
i.putExtra("title", resourceHelper.gs(R.string.tempbasaldeliveryerror))
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context?.startActivity(i)
}
}
})
sp.putBoolean(R.string.key_objectiveusereconnect, true)
loopPlugin.createOfflineEvent(0)
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_suspend_1h -> {
aapsLogger.debug("USER ENTRY: SUSPEND 1h")
loopPlugin.suspendLoop(60)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_suspend_2h -> {
aapsLogger.debug("USER ENTRY: SUSPEND 2h")
loopPlugin.suspendLoop(120)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_suspend_3h -> {
aapsLogger.debug("USER ENTRY: SUSPEND 3h")
loopPlugin.suspendLoop(180)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_suspend_10h -> {
aapsLogger.debug("USER ENTRY: SUSPEND 10h")
loopPlugin.suspendLoop(600)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_disconnect_15m -> {
aapsLogger.debug("USER ENTRY: DISCONNECT 15m")
loopPlugin.disconnectPump(15, profile)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_disconnect_30m -> {
aapsLogger.debug("USER ENTRY: DISCONNECT 30m")
loopPlugin.disconnectPump(30, profile)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
}
2020-12-25 16:47:42 +01:00
2020-12-26 17:40:16 +01:00
R.id.overview_disconnect_1h -> {
aapsLogger.debug("USER ENTRY: DISCONNECT 1h")
loopPlugin.disconnectPump(60, profile)
sp.putBoolean(R.string.key_objectiveusedisconnect, true)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
2020-12-25 16:47:42 +01:00
}
2020-12-26 17:40:16 +01:00
R.id.overview_disconnect_2h -> {
aapsLogger.debug("USER ENTRY: DISCONNECT 2h")
loopPlugin.disconnectPump(120, profile)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
2020-12-25 16:47:42 +01:00
}
2020-12-26 17:40:16 +01:00
R.id.overview_disconnect_3h -> {
aapsLogger.debug("USER ENTRY: DISCONNECT 3h")
loopPlugin.disconnectPump(180, profile)
rxBus.send(EventRefreshOverview("suspendmenu"))
return true
2020-12-25 16:47:42 +01:00
}
}
2020-12-26 17:40:16 +01:00
return false
2020-12-25 16:47:42 +01:00
}
override fun show(manager: FragmentManager, tag: String?) {
try {
manager.beginTransaction().let {
it.add(this, tag)
it.commitAllowingStateLoss()
}
} catch (e: IllegalStateException) {
aapsLogger.debug(e.localizedMessage)
}
}
}