From 26c0b7c896664a2f5763c30d74c95aea70a2d5d2 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 29 Jan 2023 22:33:23 +0100 Subject: [PATCH] Tidepool: improve settings, upload & and enable --- .../nightscout/androidaps/di/AppModule.kt | 4 +- .../androidaps/di/PluginsListModule.kt | 2 +- core/ui/src/main/res/values/strings.xml | 2 +- .../aps/src/main/res/xml/pref_openapsama.xml | 2 +- .../aps/src/main/res/xml/pref_openapssmb.xml | 2 +- .../res/xml/pref_openapssmbdynamicisf.xml | 2 +- .../main/src/main/res/xml/pref_overview.xml | 2 +- .../src/main/res/xml/pref_absorption_aaps.xml | 2 +- .../main/res/xml/pref_absorption_oref1.xml | 2 +- ...d.kt => EventConnectivityOptionChanged.kt} | 2 +- .../plugins/sync/nsclient/NSClientPlugin.kt | 8 +- ...eceiverDelegate.kt => ReceiverDelegate.kt} | 6 +- .../sync/nsclient/services/NSClientService.kt | 4 +- .../sync/nsclientV3/NSClientV3Plugin.kt | 14 +-- .../plugins/sync/tidepool/TidepoolFragment.kt | 74 ++++++++++---- .../plugins/sync/tidepool/TidepoolPlugin.kt | 40 ++++---- .../sync/tidepool/comm/TidepoolUploader.kt | 26 +++-- .../plugins/sync/tidepool/comm/UploadChunk.kt | 15 +-- .../sync/tidepool/elements/ProfileElement.kt | 23 +++-- .../main/res/layout/ns_client_fragment.xml | 2 +- .../src/main/res/layout/tidepool_fragment.xml | 96 ++++++------------- plugins/sync/src/main/res/values/strings.xml | 7 -- .../sync/src/main/res/xml/pref_ns_client.xml | 5 +- .../src/main/res/xml/pref_ns_client_v3.xml | 5 +- .../sync/src/main/res/xml/pref_tidepool.xml | 80 +++++++++------- ...elegateTest.kt => ReceiverDelegateTest.kt} | 6 +- .../sync/nsclientV3/NSClientV3PluginTest.kt | 6 +- .../nsclientV3/workers/LoadBgWorkerTest.kt | 8 +- 28 files changed, 234 insertions(+), 213 deletions(-) rename plugins/sync/src/main/java/info/nightscout/plugins/sync/nsShared/events/{EventNSConnectivityOptionChanged.kt => EventConnectivityOptionChanged.kt} (55%) rename plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/{NsClientReceiverDelegate.kt => ReceiverDelegate.kt} (95%) rename plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclient/{NsClientReceiverDelegateTest.kt => ReceiverDelegateTest.kt} (96%) diff --git a/app/src/main/java/info/nightscout/androidaps/di/AppModule.kt b/app/src/main/java/info/nightscout/androidaps/di/AppModule.kt index 5c38128af0..a02cf5afc2 100644 --- a/app/src/main/java/info/nightscout/androidaps/di/AppModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/di/AppModule.kt @@ -34,14 +34,14 @@ open class AppModule { @PluginsListModule.PumpDriver pumpDrivers: Lazy>, @PluginsListModule.NotNSClient notNsClient: Lazy>, @PluginsListModule.APS aps: Lazy>, - @PluginsListModule.Unfinished unfinished: Lazy> + //@PluginsListModule.Unfinished unfinished: Lazy> ) : List<@JvmSuppressWildcards PluginBase> { val plugins = allConfigs.toMutableMap() if (config.PUMPDRIVERS) plugins += pumpDrivers.get() if (config.APS) plugins += aps.get() if (!config.NSCLIENT) plugins += notNsClient.get() - if (config.isUnfinishedMode()) plugins += unfinished.get() + //if (config.isUnfinishedMode()) plugins += unfinished.get() return plugins.toList().sortedBy { it.first }.map { it.second } } diff --git a/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt b/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt index 7e1b89f547..e300898224 100644 --- a/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt @@ -318,7 +318,7 @@ abstract class PluginsListModule { abstract fun bindNSClientV3Plugin(plugin: NSClientV3Plugin): PluginBase @Binds - @Unfinished + @NotNSClient @IntoMap @IntKey(360) abstract fun bindTidepoolPlugin(plugin: TidepoolPlugin): PluginBase diff --git a/core/ui/src/main/res/values/strings.xml b/core/ui/src/main/res/values/strings.xml index 4f5f9b7ff3..a0e6dd9b13 100644 --- a/core/ui/src/main/res/values/strings.xml +++ b/core/ui/src/main/res/values/strings.xml @@ -45,7 +45,7 @@ Mute for 5 minutes Mute Success - Advanced Settings + Advanced Settings Extended bolus delivery error APS Mode Extended bolus diff --git a/plugins/aps/src/main/res/xml/pref_openapsama.xml b/plugins/aps/src/main/res/xml/pref_openapsama.xml index e1d6444080..155b434ef0 100644 --- a/plugins/aps/src/main/res/xml/pref_openapsama.xml +++ b/plugins/aps/src/main/res/xml/pref_openapsama.xml @@ -52,7 +52,7 @@ + android:title="@string/advanced_settings_title"> + android:title="@string/advanced_settings_title"> + android:title="@string/advanced_settings_title"> + android:title="@string/advanced_settings_title"> + android:title="@string/advanced_settings_title"> + android:title="@string/advanced_settings_title"> rxBus.send(EventNSClientNewLog("● CONNECTIVITY", ev.blockingReason)) diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/TidepoolFragment.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/TidepoolFragment.kt index eb4eeef486..827d8c5a2c 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/TidepoolFragment.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/TidepoolFragment.kt @@ -2,9 +2,14 @@ package info.nightscout.plugins.sync.tidepool import android.os.Bundle 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.ScrollView +import androidx.core.view.MenuProvider +import androidx.lifecycle.Lifecycle import dagger.android.support.DaggerFragment import info.nightscout.core.utils.fabric.FabricPrivacy import info.nightscout.plugins.sync.R @@ -15,12 +20,13 @@ import info.nightscout.plugins.sync.tidepool.events.EventTidepoolResetData import info.nightscout.plugins.sync.tidepool.events.EventTidepoolUpdateGUI import info.nightscout.rx.AapsSchedulers import info.nightscout.rx.bus.RxBus +import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.sharedPreferences.SP import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import javax.inject.Inject -class TidepoolFragment : DaggerFragment() { +class TidepoolFragment : DaggerFragment(), MenuProvider { @Inject lateinit var rxBus: RxBus @Inject lateinit var tidepoolPlugin: TidepoolPlugin @@ -28,6 +34,15 @@ class TidepoolFragment : DaggerFragment() { @Inject lateinit var sp: SP @Inject lateinit var fabricPrivacy: FabricPrivacy @Inject lateinit var aapsSchedulers: AapsSchedulers + @Inject lateinit var rh: ResourceHelper + + companion object { + + const val ID_MENU_LOGIN = 530 + const val ID_MENU_SEND_NOW = 531 + const val ID_MENU_REMOVE_ALL = 532 + const val ID_MENU_FULL_SYNC = 533 + } private var disposable: CompositeDisposable = CompositeDisposable() @@ -39,31 +54,59 @@ class TidepoolFragment : DaggerFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = TidepoolFragmentBinding.inflate(inflater, container, false) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) return binding.root } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.login.setOnClickListener { tidepoolUploader.doLogin(false) } - binding.uploadnow.setOnClickListener { rxBus.send(EventTidepoolDoUpload()) } - binding.removeall.setOnClickListener { rxBus.send(EventTidepoolResetData()) } - binding.resertstart.setOnClickListener { sp.putLong(R.string.key_tidepool_last_end, 0) } + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { + menu.add(Menu.FIRST, ID_MENU_LOGIN, 0, rh.gs(info.nightscout.core.ui.R.string.login)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) + menu.add(Menu.FIRST, ID_MENU_SEND_NOW, 0, rh.gs(R.string.upload_now)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) + menu.add(Menu.FIRST, ID_MENU_REMOVE_ALL, 0, rh.gs(R.string.remove_all)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) + menu.add(Menu.FIRST, ID_MENU_FULL_SYNC, 0, rh.gs(R.string.full_sync)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) + menu.setGroupDividerEnabled(true) } + override fun onMenuItemSelected(item: MenuItem): Boolean = + when (item.itemId) { + ID_MENU_LOGIN -> { + tidepoolUploader.doLogin(false) + true + } + + ID_MENU_SEND_NOW -> { + rxBus.send(EventTidepoolDoUpload()) + true + } + + ID_MENU_REMOVE_ALL -> { + rxBus.send(EventTidepoolResetData()) + true + } + + ID_MENU_FULL_SYNC -> { + sp.putLong(R.string.key_tidepool_last_end, 0) + true + } + + else -> false + } + @Synchronized override fun onResume() { super.onResume() disposable += rxBus .toObservable(EventTidepoolUpdateGUI::class.java) .observeOn(aapsSchedulers.main) - .subscribe({ - if (_binding == null) return@subscribe - tidepoolPlugin.updateLog() - binding.log.text = tidepoolPlugin.textLog - binding.status.text = tidepoolUploader.connectionStatus.name - binding.log.text = tidepoolPlugin.textLog - binding.logscrollview.fullScroll(ScrollView.FOCUS_DOWN) - }, fabricPrivacy::logException) + .subscribe({ updateGui() }, fabricPrivacy::logException) + updateGui() + } + + private fun updateGui() { + tidepoolPlugin.updateLog() + _binding?.log?.text = tidepoolPlugin.textLog + _binding?.status?.text = tidepoolUploader.connectionStatus.name + _binding?.log?.text = tidepoolPlugin.textLog + _binding?.logScrollview?.fullScroll(ScrollView.FOCUS_DOWN) } @Synchronized @@ -77,5 +120,4 @@ class TidepoolFragment : DaggerFragment() { super.onDestroyView() _binding = null } - } diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/TidepoolPlugin.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/TidepoolPlugin.kt index 549c0e6f8f..521d21e66f 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/TidepoolPlugin.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/TidepoolPlugin.kt @@ -10,11 +10,12 @@ import info.nightscout.interfaces.Constants import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.plugin.PluginDescription import info.nightscout.interfaces.plugin.PluginType -import info.nightscout.interfaces.receivers.ReceiverStatusStore import info.nightscout.interfaces.sync.Sync import info.nightscout.interfaces.ui.UiInteraction import info.nightscout.interfaces.utils.HtmlHelper import info.nightscout.plugins.sync.R +import info.nightscout.plugins.sync.nsShared.events.EventConnectivityOptionChanged +import info.nightscout.plugins.sync.nsclient.ReceiverDelegate import info.nightscout.plugins.sync.tidepool.comm.TidepoolUploader import info.nightscout.plugins.sync.tidepool.comm.UploadChunk import info.nightscout.plugins.sync.tidepool.events.EventTidepoolDoUpload @@ -24,7 +25,7 @@ import info.nightscout.plugins.sync.tidepool.events.EventTidepoolUpdateGUI import info.nightscout.plugins.sync.tidepool.utils.RateLimit import info.nightscout.rx.AapsSchedulers import info.nightscout.rx.bus.RxBus -import info.nightscout.rx.events.EventNetworkChange +import info.nightscout.rx.events.EventNSClientNewLog import info.nightscout.rx.events.EventNewBG import info.nightscout.rx.events.EventPreferenceChange import info.nightscout.rx.logging.AAPSLogger @@ -50,7 +51,7 @@ class TidepoolPlugin @Inject constructor( private val uploadChunk: UploadChunk, private val sp: SP, private val rateLimit: RateLimit, - private val receiverStatusStore: ReceiverStatusStore, + private val receiverDelegate: ReceiverDelegate, private val uiInteraction: UiInteraction ) : Sync, PluginBase( PluginDescription() @@ -67,10 +68,18 @@ class TidepoolPlugin @Inject constructor( private val listLog = ArrayList() var textLog: Spanned = HtmlHelper.fromHtml("") + private val isAllowed get() = receiverDelegate.allowed - @Suppress("UNNECESSARY_NOT_NULL_ASSERTION") override fun onStart() { super.onStart() + disposable += rxBus + .toObservable(EventConnectivityOptionChanged::class.java) + .observeOn(aapsSchedulers.io) + .subscribe({ ev -> + rxBus.send(EventNSClientNewLog("● CONNECTIVITY", ev.blockingReason)) + tidepoolUploader.resetInstance() + if (isAllowed) doUpload() + }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventTidepoolDoUpload::class.java) .observeOn(aapsSchedulers.io) @@ -94,17 +103,13 @@ class TidepoolPlugin @Inject constructor( disposable += rxBus .toObservable(EventNewBG::class.java) .observeOn(aapsSchedulers.io) - .filter { it.glucoseValueTimestamp != null } // better would be optional in API level >24 - .map { it.glucoseValueTimestamp!! } - .subscribe({ bgReadingTimestamp -> - if (bgReadingTimestamp < uploadChunk.getLastEnd()) - uploadChunk.setLastEnd(bgReadingTimestamp) - if (isEnabled() - && (!sp.getBoolean(R.string.key_tidepool_only_while_charging, false) || receiverStatusStore.isCharging) - && (!sp.getBoolean(R.string.key_tidepool_only_while_unmetered, false) || receiverStatusStore.isWifiConnected) - && rateLimit.rateLimit("tidepool-new-data-upload", T.mins(4).secs().toInt()) - ) - doUpload() + .subscribe({ + it.glucoseValueTimestamp?.let { bgReadingTimestamp -> + if (bgReadingTimestamp < uploadChunk.getLastEnd()) + uploadChunk.setLastEnd(bgReadingTimestamp) + if (isAllowed && rateLimit.rateLimit("tidepool-new-data-upload", T.mins(4).secs().toInt())) + doUpload() + } }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventPreferenceChange::class.java) @@ -116,11 +121,6 @@ class TidepoolPlugin @Inject constructor( ) tidepoolUploader.resetInstance() }, fabricPrivacy::logException) - disposable += rxBus - .toObservable(EventNetworkChange::class.java) - .observeOn(aapsSchedulers.io) - .subscribe({}, fabricPrivacy::logException) // TODO start upload on wifi connect - } override fun onStop() { diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/comm/TidepoolUploader.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/comm/TidepoolUploader.kt index bb1e8e930f..0e7b5374af 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/comm/TidepoolUploader.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/comm/TidepoolUploader.kt @@ -5,8 +5,8 @@ import android.os.PowerManager import android.os.SystemClock import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.interfaces.Config -import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.plugins.sync.R +import info.nightscout.plugins.sync.nsclient.ReceiverDelegate import info.nightscout.plugins.sync.tidepool.events.EventTidepoolStatus import info.nightscout.plugins.sync.tidepool.messages.AuthReplyMessage import info.nightscout.plugins.sync.tidepool.messages.AuthRequestMessage @@ -37,11 +37,12 @@ class TidepoolUploader @Inject constructor( private val rh: ResourceHelper, private val sp: SP, private val uploadChunk: UploadChunk, - private val activePlugin: ActivePlugin, private val dateUtil: DateUtil, + private val receiverDelegate: ReceiverDelegate, private val config: Config ) { + private val isAllowed get() = receiverDelegate.allowed private var wl: PowerManager.WakeLock? = null companion object { @@ -57,7 +58,7 @@ class TidepoolUploader @Inject constructor( private var session: Session? = null enum class ConnectionStatus { - DISCONNECTED, CONNECTING, CONNECTED, FAILED + BLOCKED, DISCONNECTED, CONNECTING, CONNECTED, FAILED } var connectionStatus: ConnectionStatus = ConnectionStatus.DISCONNECTED @@ -87,7 +88,6 @@ class TidepoolUploader @Inject constructor( return Session(AuthRequestMessage.getAuthRequestHeader(sp), SESSION_TOKEN_HEADER, service) } - // TODO: call on preference change fun resetInstance() { retrofit = null aapsLogger.debug(LTag.TIDEPOOL, "Instance reset") @@ -96,6 +96,11 @@ class TidepoolUploader @Inject constructor( @Synchronized fun doLogin(doUpload: Boolean = false) { + if (!isAllowed) { + connectionStatus = ConnectionStatus.BLOCKED + aapsLogger.debug(LTag.TIDEPOOL, "Blocked by connectivity settings") + return + } if (connectionStatus == ConnectionStatus.CONNECTED || connectionStatus == ConnectionStatus.CONNECTING) { aapsLogger.debug(LTag.TIDEPOOL, "Already connected") return @@ -139,7 +144,6 @@ class TidepoolUploader @Inject constructor( "Failed to log into Tidepool.\nCheck that your user name and password are correct." ) })) - } ?: OKDialog.show(rootContext, rh.gs(R.string.tidepool), "Cannot do login as user credentials have not been set correctly") @@ -197,6 +201,11 @@ class TidepoolUploader @Inject constructor( @Synchronized fun doUpload() { + if (!isAllowed) { + connectionStatus = ConnectionStatus.BLOCKED + aapsLogger.debug(LTag.TIDEPOOL, "Blocked by connectivity settings") + return + } session.let { session -> if (session == null) { aapsLogger.error("Session is null, cannot proceed") @@ -231,7 +240,7 @@ class TidepoolUploader @Inject constructor( releaseWakeLock() uploadNext() }, { - connectionStatus = ConnectionStatus.FAILED + connectionStatus = ConnectionStatus.DISCONNECTED rxBus.send(EventTidepoolStatus(("Upload FAILED"))) releaseWakeLock() })) @@ -242,6 +251,11 @@ class TidepoolUploader @Inject constructor( } private fun uploadNext() { + if (!isAllowed) { + connectionStatus = ConnectionStatus.BLOCKED + aapsLogger.debug(LTag.TIDEPOOL, "Blocked by connectivity settings") + return + } if (uploadChunk.getLastEnd() < dateUtil.now() - T.mins(1).msecs()) { SystemClock.sleep(3000) aapsLogger.debug(LTag.TIDEPOOL, "Restarting doUpload. Last: " + dateUtil.dateAndTimeString(uploadChunk.getLastEnd())) diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/comm/UploadChunk.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/comm/UploadChunk.kt index dc962f0f83..7f33da685b 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/comm/UploadChunk.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/comm/UploadChunk.kt @@ -69,16 +69,11 @@ class UploadChunk @Inject constructor( val records = LinkedList() - if (sp.getBoolean(R.string.key_tidepool_upload_bolus, true)) - records.addAll(getTreatments(start, end)) - if (sp.getBoolean(R.string.key_tidepool_upload_bg, true)) - records.addAll(getBloodTests(start, end)) - if (sp.getBoolean(R.string.key_tidepool_upload_tbr, true)) - records.addAll(getBasals(start, end)) - if (sp.getBoolean(R.string.key_tidepool_upload_cgm, true)) - records.addAll(getBgReadings(start, end)) - if (sp.getBoolean(R.string.key_tidepool_upload_profile, true)) - records.addAll(getProfiles(start, end)) + records.addAll(getTreatments(start, end)) + records.addAll(getBloodTests(start, end)) + records.addAll(getBasals(start, end)) + records.addAll(getBgReadings(start, end)) + records.addAll(getProfiles(start, end)) return GsonInstance.defaultGsonInstance().toJson(records) } diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/elements/ProfileElement.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/elements/ProfileElement.kt index 297bee3ca5..ea6ed877fb 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/elements/ProfileElement.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/tidepool/elements/ProfileElement.kt @@ -35,14 +35,21 @@ class ProfileElement(ps: EffectiveProfileSwitch, serialNumber: String, dateUtil: init { type = "pumpSettings" val profile: Profile = ProfileSealed.EPS(ps) - for (br in profile.getBasalValues()) - basalSchedules.Normal.add(BasalRate(br.timeAsSeconds * 1000, br.value)) - for (target in profile.getSingleTargetsMgdl()) - bgTargets.Normal.add(Target(target.timeAsSeconds * 1000, target.value.toInt())) - for (ic in profile.getIcsValues()) - carbRatios.Normal.add(Ratio(ic.timeAsSeconds * 1000, ic.value.toInt())) - for (isf in profile.getIsfsMgdlValues()) - insulinSensitivities.Normal.add(Ratio(isf.timeAsSeconds * 1000, isf.value.toInt())) + // for (br in profile.getBasalValues()) + // basalSchedules.Normal.add(BasalRate(br.timeAsSeconds * 1000, br.value)) + // for (target in profile.getSingleTargetsMgdl()) + // bgTargets.Normal.add(Target(target.timeAsSeconds * 1000, target.value.toInt())) + // for (ic in profile.getIcsValues()) + // carbRatios.Normal.add(Ratio(ic.timeAsSeconds * 1000, ic.value.toInt())) + // for (isf in profile.getIsfsMgdlValues()) + // insulinSensitivities.Normal.add(Ratio(isf.timeAsSeconds * 1000, isf.value.toInt())) + for (hour in 0..23) { + val seconds = hour * 3600 + basalSchedules.Normal.add(BasalRate(seconds * 1000, profile.getBasalTimeFromMidnight(seconds))) + bgTargets.Normal.add(Target(seconds * 1000, Profile.toMgdl((((profile.getTargetLowMgdlTimeFromMidnight(seconds) + profile.getTargetLowMgdlTimeFromMidnight(seconds))) / 2)).toInt())) + carbRatios.Normal.add(Ratio(seconds * 1000, profile.getIcTimeFromMidnight(seconds).toInt())) + insulinSensitivities.Normal.add(Ratio(seconds * 1000, profile.getIsfMgdlTimeFromMidnight(seconds).toInt())) + } } inner class BasalProfile internal constructor( diff --git a/plugins/sync/src/main/res/layout/ns_client_fragment.xml b/plugins/sync/src/main/res/layout/ns_client_fragment.xml index 3a92d3f400..8663f67361 100644 --- a/plugins/sync/src/main/res/layout/ns_client_fragment.xml +++ b/plugins/sync/src/main/res/layout/ns_client_fragment.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".sync.nsShared.NSClientFragment"> + tools:context="info.nightscout.plugins.sync.nsShared.NSClientFragment"> - + android:layout_height="match_parent" + tools:context="info.nightscout.plugins.sync.tidepool.TidepoolFragment"> - + android:layout_marginBottom="10dp" + android:layout_marginStart="5dp" + android:layout_marginEnd="5dp" + android:orientation="horizontal"> - + - + - - - + + android:id="@+id/log_scrollview" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:layout_marginStart="5dp" + android:layout_marginEnd="5dp"> - + android:text="" /> - + diff --git a/plugins/sync/src/main/res/values/strings.xml b/plugins/sync/src/main/res/values/strings.xml index 44263daa2d..3e2635dacf 100644 --- a/plugins/sync/src/main/res/values/strings.xml +++ b/plugins/sync/src/main/res/values/strings.xml @@ -115,14 +115,7 @@ tidepool_password tidepool_dev_servers tidepool_test_login - tidepool_only_while_charging - tidepool_only_while_unmetered tidepool_last_end - tidepool_upload_profile - tidepool_upload_tbr - tidepool_upload_cgm - tidepool_upload_bolus - tidepool_upload_bg Your Tidepool login user name, normally your email address Login User Name diff --git a/plugins/sync/src/main/res/xml/pref_ns_client.xml b/plugins/sync/src/main/res/xml/pref_ns_client.xml index c6f9cdb768..a3657bcad7 100644 --- a/plugins/sync/src/main/res/xml/pref_ns_client.xml +++ b/plugins/sync/src/main/res/xml/pref_ns_client.xml @@ -178,14 +178,13 @@ + android:title="@string/advanced_settings_title"> + android:summary="@string/ns_log_app_started_event" /> + android:title="@string/advanced_settings_title"> + android:summary="@string/ns_log_app_started_event" /> - + - + - + - + - + - + - + - + + + + + + + + diff --git a/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclient/NsClientReceiverDelegateTest.kt b/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclient/ReceiverDelegateTest.kt similarity index 96% rename from plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclient/NsClientReceiverDelegateTest.kt rename to plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclient/ReceiverDelegateTest.kt index 62b990ea56..6aa5d4f192 100644 --- a/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclient/NsClientReceiverDelegateTest.kt +++ b/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclient/ReceiverDelegateTest.kt @@ -15,7 +15,7 @@ import org.junit.jupiter.api.Test import org.mockito.Mock import org.mockito.Mockito.`when` -class NsClientReceiverDelegateTest : TestBase() { +class ReceiverDelegateTest : TestBase() { @Mock lateinit var sp: SP @Mock lateinit var rh: ResourceHelper @@ -23,12 +23,12 @@ class NsClientReceiverDelegateTest : TestBase() { private val rxBus = RxBus(aapsSchedulers, aapsLogger) @Mock private lateinit var receiverStatusStore: ReceiverStatusStore - private lateinit var sut: NsClientReceiverDelegate + private lateinit var sut: ReceiverDelegate @BeforeEach fun prepare() { //receiverStatusStore = ReceiverStatusStore(context, rxBus) - sut = NsClientReceiverDelegate(rxBus, rh, sp, receiverStatusStore, aapsSchedulers, fabricPrivacy) + sut = ReceiverDelegate(rxBus, rh, sp, receiverStatusStore, aapsSchedulers, fabricPrivacy) } @Test diff --git a/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclientV3/NSClientV3PluginTest.kt b/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclientV3/NSClientV3PluginTest.kt index 3d9e788eaa..dbc95ceff0 100644 --- a/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclientV3/NSClientV3PluginTest.kt +++ b/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclientV3/NSClientV3PluginTest.kt @@ -30,7 +30,7 @@ import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.ui.UiInteraction import info.nightscout.interfaces.workflow.WorkerClasses import info.nightscout.plugins.sync.nsShared.StoreDataForDbImpl -import info.nightscout.plugins.sync.nsclient.NsClientReceiverDelegate +import info.nightscout.plugins.sync.nsclient.ReceiverDelegate import info.nightscout.plugins.sync.nsclient.data.NSDeviceStatusHandler import info.nightscout.plugins.sync.nsclient.extensions.fromConstant import info.nightscout.sdk.interfaces.NSAndroidClient @@ -49,7 +49,7 @@ import org.mockito.internal.verification.Times @Suppress("SpellCheckingInspection") internal class NSClientV3PluginTest : TestBaseWithProfile() { - @Mock lateinit var nsClientReceiverDelegate: NsClientReceiverDelegate + @Mock lateinit var receiverDelegate: ReceiverDelegate @Mock lateinit var uiInteraction: UiInteraction @Mock lateinit var dataSyncSelector: DataSyncSelector @Mock lateinit var nsAndroidClient: NSAndroidClient @@ -77,7 +77,7 @@ internal class NSClientV3PluginTest : TestBaseWithProfile() { sut = NSClientV3Plugin( injector, aapsLogger, aapsSchedulers, rxBus, rh, context, fabricPrivacy, - sp, nsClientReceiverDelegate, config, dateUtil, uiInteraction, dataSyncSelector, mockedProfileFunction, repository, + sp, receiverDelegate, config, dateUtil, uiInteraction, dataSyncSelector, mockedProfileFunction, repository, nsDeviceStatusHandler, workManager, workerClasses, dataWorkerStorage, nsClientSource ) sut.nsAndroidClient = nsAndroidClient diff --git a/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclientV3/workers/LoadBgWorkerTest.kt b/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclientV3/workers/LoadBgWorkerTest.kt index a909367a83..33c7a48775 100644 --- a/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclientV3/workers/LoadBgWorkerTest.kt +++ b/plugins/sync/src/test/java/info/nightscout/plugins/sync/nsclientV3/workers/LoadBgWorkerTest.kt @@ -22,7 +22,7 @@ import info.nightscout.interfaces.source.NSClientSource import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.ui.UiInteraction import info.nightscout.interfaces.workflow.WorkerClasses -import info.nightscout.plugins.sync.nsclient.NsClientReceiverDelegate +import info.nightscout.plugins.sync.nsclient.ReceiverDelegate import info.nightscout.plugins.sync.nsclient.data.NSDeviceStatusHandler import info.nightscout.plugins.sync.nsclientV3.NSClientV3Plugin import info.nightscout.plugins.sync.nsclientV3.extensions.toNSSvgV3 @@ -66,7 +66,7 @@ internal class LoadBgWorkerTest : TestBase() { private val rxBus: RxBus = RxBus(aapsSchedulers, aapsLogger) private lateinit var nsClientV3Plugin: NSClientV3Plugin - private lateinit var nsClientReceiverDelegate: NsClientReceiverDelegate + private lateinit var receiverDelegate: ReceiverDelegate private lateinit var dataWorkerStorage: DataWorkerStorage private lateinit var sut: LoadBgWorker @@ -97,10 +97,10 @@ internal class LoadBgWorkerTest : TestBase() { Mockito.`when`(dateUtil.now()).thenReturn(now) Mockito.`when`(nsClientSource.isEnabled()).thenReturn(true) dataWorkerStorage = DataWorkerStorage(context) - nsClientReceiverDelegate = NsClientReceiverDelegate(rxBus, rh, sp, receiverStatusStore, aapsSchedulers, fabricPrivacy) + receiverDelegate = ReceiverDelegate(rxBus, rh, sp, receiverStatusStore, aapsSchedulers, fabricPrivacy) nsClientV3Plugin = NSClientV3Plugin( injector, aapsLogger, aapsSchedulers, rxBus, rh, context, fabricPrivacy, - sp, nsClientReceiverDelegate, config, dateUtil, uiInteraction, dataSyncSelector, profileFunction, repository, + sp, receiverDelegate, config, dateUtil, uiInteraction, dataSyncSelector, profileFunction, repository, nsDeviceStatusHandler, workManager, workerClasses, dataWorkerStorage, nsClientSource ) nsClientV3Plugin.newestDataOnServer = LastModified(LastModified.Collections())