Merge branch 'dev' into dagger3

This commit is contained in:
Milos Kozak 2020-02-28 18:20:31 +01:00
commit fcf1966f58
51 changed files with 478 additions and 118 deletions

View file

@ -1,9 +1,6 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="AUTODETECT_INDENTS" value="false" />
<AndroidXmlCodeStyleSettings>
<option name="ARRANGEMENT_SETTINGS_MIGRATED_TO_191" value="true" />
</AndroidXmlCodeStyleSettings>
<JetCodeStyleSettings>
<option name="ALIGN_IN_COLUMNS_CASE_BRANCH" value="true" />
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="6" />

View file

@ -333,6 +333,7 @@ dependencies {
/* Dagger2 - default dependency */
kapt 'com.google.dagger:dagger-compiler:2.25.2'
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
}
@ -359,7 +360,37 @@ task copyLibs(dependsOn: downloadAndUnzipFile, type: Copy) {
task full_clean(type: Delete) {
delete file("src/main/jniLibs")
}
/*
// Run 'adb' shell command to clear application data of main app for 'debug' variant
task clearMainAppData(type: Exec) {
// we have to iterate to find the 'debug' variant to obtain a variant reference
android.applicationVariants.all { variant ->
if (variant.name == "fullDebug") {
def applicationId = [variant.mergedFlavor.applicationId, variant.buildType.applicationIdSuffix].findAll().join()
def clearDataCommand = ['adb', 'shell', 'pm', 'clear', applicationId]
println "Clearing application data of ${variant.name} variant: [${clearDataCommand}]"
def stdout = new ByteArrayOutputStream()
exec {
commandLine clearDataCommand
standardOutput = stdout
}
String result = stdout.toString().trim()
if (!result.startsWith("Success")) {
println result
throw new GradleException(clearDataCommand.join(" "))
}
}
}
}
// Clear Application Data (once) before running instrumentation test
tasks.whenTaskAdded { task ->
// Both of these targets are equivalent today, although in future connectedCheck
// will also include connectedUiAutomatorTest (not implemented yet)
if(task.name == "connectedAndroidTest" || task.name == "connectedCheck"){
task.dependsOn(clearMainAppData)
}
}
*/
clean.dependsOn full_clean
preBuild.dependsOn copyLibs

View file

@ -4,6 +4,9 @@ import androidx.test.espresso.ViewAction
import androidx.test.espresso.ViewInteraction
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiSelector
fun ViewInteraction.isDisplayed(): Boolean {
try {
@ -25,3 +28,8 @@ fun ViewInteraction.waitAndPerform(viewActions: ViewAction): ViewInteraction? {
return perform(viewActions)
}
fun clickOkInDialog() {
val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
val button = uiDevice.findObject(UiSelector().clickable(true).checkable(false).index(1))
if (button.exists() && button.isEnabled) button.click()
}

View file

@ -0,0 +1,132 @@
package info.nightscout.androidaps
import android.os.SystemClock
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import androidx.test.rule.GrantPermissionRule
import info.nightscout.androidaps.data.Profile
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.L
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction
import info.nightscout.androidaps.plugins.constraints.objectives.ObjectivesPlugin
import info.nightscout.androidaps.plugins.general.actions.ActionsPlugin
import info.nightscout.androidaps.plugins.insulin.InsulinOrefUltraRapidActingPlugin
import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin
import info.nightscout.androidaps.plugins.pump.danaRv2.DanaRv2Plugin
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin
import info.nightscout.androidaps.plugins.source.RandomBgPlugin
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.extensions.isRunningTest
import info.nightscout.androidaps.utils.sharedPreferences.SP
import org.json.JSONObject
import org.junit.Assert
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.slf4j.LoggerFactory
import javax.inject.Inject
@LargeTest
@RunWith(AndroidJUnit4::class)
class RealPumpTest {
private val log = LoggerFactory.getLogger(L.CORE)
companion object {
const val R_PASSWORD = 1234
const val R_SERIAL = "PBB00013LR_P"
}
private val validProfile = "{\"dia\":\"6\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"10\"},{\"time\":\"2:00\",\"value\":\"11\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"0.1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4\"}],\"target_high\":[{\"time\":\"00:00\",\"value\":\"5\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}"
@Inject lateinit var pump : DanaRv2Plugin
@Inject lateinit var randomBgPlugin :RandomBgPlugin
@Inject lateinit var localProfilePlugin: LocalProfilePlugin
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var insulinOrefUltraRapidActingPlugin: InsulinOrefUltraRapidActingPlugin
@Inject lateinit var sensitivityOref1Plugin: SensitivityOref1Plugin
@Inject lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
@Inject lateinit var loopPlugin: LoopPlugin
@Inject lateinit var actionsPlugin: ActionsPlugin
@Inject lateinit var configBuilderPlugin: ConfigBuilderPlugin
@Inject lateinit var objectivesPlugin: ObjectivesPlugin
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin
@Inject lateinit var sp: SP
@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(MainActivity::class.java)
@Rule
@JvmField
var mGrantPermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
@Before
fun clear() {
sp.clear()
sp.putBoolean(R.string.key_setupwizard_processed, true)
sp.putString(R.string.key_aps_mode, "closed")
MainApp.getDbHelper().resetDatabases()
MainApp.devBranch = false
}
private fun preparePlugins() {
// Source
configBuilderPlugin.performPluginSwitch(randomBgPlugin,true, PluginType.BGSOURCE)
// Profile
configBuilderPlugin.performPluginSwitch(localProfilePlugin, true, PluginType.PROFILE)
val profile = Profile(JSONObject(validProfile), Constants.MGDL)
Assert.assertTrue(profile.isValid("Test"))
localProfilePlugin.profiles.clear()
localProfilePlugin.numOfProfiles = 0
val singleProfile = LocalProfilePlugin.SingleProfile().copyFrom(localProfilePlugin.rawProfile, profile, "TestProfile")
localProfilePlugin.addProfile(singleProfile)
val profileSwitch = profileFunction.prepareProfileSwitch(localProfilePlugin.createProfileStore(), "TestProfile", 0, 100, 0, DateUtil.now())
treatmentsPlugin.addToHistoryProfileSwitch(profileSwitch)
// Insulin
configBuilderPlugin.performPluginSwitch(insulinOrefUltraRapidActingPlugin, true, PluginType.INSULIN)
// Pump
sp.putInt(R.string.key_danar_password, R_PASSWORD)
sp.putString(R.string.key_danar_bt_name, R_SERIAL)
configBuilderPlugin.performPluginSwitch((pump as PluginBase), true, PluginType.PUMP)
// Sensitivity
configBuilderPlugin.performPluginSwitch(sensitivityOref1Plugin, true, PluginType.SENSITIVITY)
// APS
configBuilderPlugin.performPluginSwitch(openAPSSMBPlugin, true, PluginType.APS)
configBuilderPlugin.performPluginSwitch(loopPlugin, true, PluginType.LOOP)
// Enable common
configBuilderPlugin.performPluginSwitch(actionsPlugin, true, PluginType.GENERAL)
// Disable unneeded
MainApp.getPluginsList().remove(objectivesPlugin)
}
@Test
fun doTest() {
Assert.assertTrue(isRunningTest())
preparePlugins()
while (!pump.isInitialized) {
log.debug("Waiting for initialization")
SystemClock.sleep(1000)
}
while (true) {
log.debug("Tick")
SystemClock.sleep(1000)
}
}
}

View file

@ -1,6 +1,5 @@
package info.nightscout.androidaps
import android.os.SystemClock
import android.view.View
import android.view.ViewGroup
@ -9,7 +8,11 @@ import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.scrollTo
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withClassName
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withTagValue
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
@ -38,7 +41,6 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@LargeTest
@RunWith(AndroidJUnit4::class)
class SetupWizardActivityTest {
@ -49,12 +51,12 @@ class SetupWizardActivityTest {
@Rule
@JvmField
var mGrantPermissionRule =
GrantPermissionRule.grant(
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
var mGrantPermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
@Before
fun clear() {
@ -73,9 +75,9 @@ adb shell settings put global transition_animation_scale 0 &
adb shell settings put global animator_duration_scale 0 &
*/
@Test
fun setupWizardActivityTest() {
SP.clear()
Assert.assertTrue(isRunningTest())
// Welcome page
onView(withId(R.id.next_button)).perform(click())
@ -85,7 +87,7 @@ adb shell settings put global animator_duration_scale 0 &
// Agreement page
onView(withText("I UNDERSTAND AND AGREE")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Loction permission
// Location permission
var askButton = onView(withText("Ask for permission"))
if (askButton.isDisplayed()) {
askButton.perform(scrollTo(), click())
@ -98,6 +100,11 @@ adb shell settings put global animator_duration_scale 0 &
onView(withText("OK")).perform(click())
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// Import settings : skip of found
askButton = onView(withText("IMPORT SETTINGS"))
if (askButton.isDisplayed()) {
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// Units selection
onView(withText("mmol/L")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).perform(click())
@ -124,41 +131,44 @@ adb shell settings put global animator_duration_scale 0 &
// Local profile - IC
onView(withId(R.id.ic_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("IC-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("2"), ViewActions.closeSoftKeyboard())
.perform(ViewActions.replaceText("2"), ViewActions.closeSoftKeyboard())
// Local profile - ISF
onView(withId(R.id.isf_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("ISF-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("3"), ViewActions.closeSoftKeyboard())
.perform(ViewActions.replaceText("3"), ViewActions.closeSoftKeyboard())
// Local profile - BAS
onView(withId(R.id.basal_tab)).perform(scrollTo(), click())
onView(childAtPosition(Matchers.allOf(withId(R.id.localprofile_basal), childAtPosition(withClassName(Matchers.`is`("android.widget.LinearLayout")), 6)), 2))
.perform(scrollTo(), click())
.perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("1.1"), ViewActions.closeSoftKeyboard())
.perform(ViewActions.replaceText("1.1"), ViewActions.closeSoftKeyboard())
onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-1")), isDisplayed()))
.perform(ViewActions.replaceText("1.2"), ViewActions.closeSoftKeyboard())
.perform(ViewActions.replaceText("1.2"), ViewActions.closeSoftKeyboard())
onView(Matchers.allOf(withId(R.id.timelistedit_time), childAtPosition(childAtPosition(withId(R.id.localprofile_basal), 2), 0)))
.perform(scrollTo(), click())
.perform(scrollTo(), click())
onData(Matchers.anything()).inAdapterView(childAtPosition(withClassName(Matchers.`is`("android.widget.PopupWindow\$PopupBackgroundView")), 0)).atPosition(13)
.perform(click())
.perform(click())
// Local profile - TARGET
onView(withId(R.id.target_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("TARGET-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("6"), ViewActions.closeSoftKeyboard())
.perform(ViewActions.replaceText("6"), ViewActions.closeSoftKeyboard())
onView(Matchers.allOf(withTagValue(Matchers.`is`("TARGET-2-0")), isDisplayed()))
.perform(ViewActions.replaceText("6.5"), ViewActions.closeSoftKeyboard())
.perform(ViewActions.replaceText("6.5"), ViewActions.closeSoftKeyboard())
onView(withText("Save")).perform(scrollTo(), click())
onView(Matchers.allOf(withId(R.id.localprofile_profileswitch), isDisplayed()))
.perform(scrollTo(), click())
.perform(scrollTo(), click())
onView(allOf(withId(R.id.ok), isDisplayed())).perform(click())
onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click())
// confirm dialog
//onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click()) not working on real phone
clickOkInDialog()
onView(withId(R.id.next_button)).waitAndPerform(click())
// Profile switch
askButton = onView(withText("Do Profile Switch"))
if (askButton.isDisplayed()) {
askButton.perform(scrollTo(), click())
onView(allOf(withId(R.id.ok), isDisplayed())).perform(click())
onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click())
// onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click()) not working on real phone
clickOkInDialog()
while (ProfileFunctions.getInstance().profile == null) SystemClock.sleep(100)
onView(withId(R.id.next_button)).waitAndPerform(click())
}
@ -203,7 +213,7 @@ adb shell settings put global animator_duration_scale 0 &
}
private fun childAtPosition(
parentMatcher: Matcher<View>, position: Int): Matcher<View> {
parentMatcher: Matcher<View>, position: Int): Matcher<View> {
return object : TypeSafeMatcher<View>() {
override fun describeTo(description: Description) {
@ -214,7 +224,7 @@ adb shell settings put global animator_duration_scale 0 &
public override fun matchesSafely(view: View): Boolean {
val parent = view.parent
return parent is ViewGroup && parentMatcher.matches(parent)
&& view == parent.getChildAt(position)
&& view == parent.getChildAt(position)
}
}
}

View file

@ -66,6 +66,8 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import static info.nightscout.androidaps.utils.extensions.EspressoTestHelperKt.isRunningRealPumpTest;
public class MainActivity extends NoSplashAppCompatActivity {
private CompositeDisposable disposable = new CompositeDisposable();
@ -149,7 +151,7 @@ public class MainActivity extends NoSplashAppCompatActivity {
.subscribe(this::processPreferenceChange, exception -> FabricPrivacy.getInstance().logException(exception))
);
if (!sp.getBoolean(R.string.key_setupwizard_processed, false)) {
if (!sp.getBoolean(R.string.key_setupwizard_processed, false) && !isRunningRealPumpTest()) {
Intent intent = new Intent(this, SetupWizardActivity.class);
startActivity(intent);
}

View file

@ -63,6 +63,7 @@ class CalibrationDialog : DialogFragmentWithDate() {
if (bg > 0) {
activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.overview_calibration), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
aapsLogger.debug("USER ENTRY: CALIBRATION $bg")
XdripCalibrations.confirmAndSendCalibration(bg, context)
})
}

View file

@ -38,7 +38,7 @@ class CarbsDialog : DialogFragmentWithDate() {
@Inject lateinit var defaultValueHelper: DefaultValueHelper
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin;
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
companion object {
private const val FAV1_DEFAULT = 5
@ -189,6 +189,7 @@ class CarbsDialog : DialogFragmentWithDate() {
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.carbs), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
when {
activitySelected -> {
aapsLogger.debug("USER ENTRY: TEMPTARGET ACTIVITY $activityTT duration: $activityTTDuration")
val tempTarget = TempTarget()
.date(System.currentTimeMillis())
.duration(activityTTDuration)
@ -200,6 +201,7 @@ class CarbsDialog : DialogFragmentWithDate() {
}
eatingSoonSelected -> {
aapsLogger.debug("USER ENTRY: TEMPTARGET EATING SOON $eatingSoonTT duration: $eatingSoonTTDuration")
val tempTarget = TempTarget()
.date(System.currentTimeMillis())
.duration(eatingSoonTTDuration)
@ -211,6 +213,7 @@ class CarbsDialog : DialogFragmentWithDate() {
}
hypoSelected -> {
aapsLogger.debug("USER ENTRY: TEMPTARGET HYPO $hypoTT duration: $hypoTTDuration")
val tempTarget = TempTarget()
.date(System.currentTimeMillis())
.duration(hypoTTDuration)
@ -223,8 +226,10 @@ class CarbsDialog : DialogFragmentWithDate() {
}
if (carbsAfterConstraints > 0) {
if (duration == 0) {
aapsLogger.debug("USER ENTRY: CARBS $carbsAfterConstraints time: $time")
CarbsGenerator.createCarb(carbsAfterConstraints, time, CareportalEvent.CARBCORRECTION, notes)
} else {
aapsLogger.debug("USER ENTRY: CARBS $carbsAfterConstraints time: $time duration: $duration")
CarbsGenerator.generateCarbs(carbsAfterConstraints, time, duration, notes)
NSUpload.uploadEvent(CareportalEvent.NOTE, DateUtil.now() - 2000, resourceHelper.gs(R.string.generated_ecarbs_note, carbsAfterConstraints, duration, timeOffset))
}

View file

@ -184,6 +184,7 @@ class CareDialog : DialogFragmentWithDate() {
EventType.EXERCISE -> CareportalEvent.EXERCISE
}
careportalEvent.json = json.toString()
aapsLogger.debug("USER ENTRY: CAREPORTAL ${careportalEvent.eventType} json: ${careportalEvent.json}")
MainApp.getDbHelper().createOrUpdate(careportalEvent)
NSUpload.uploadCareportalEntryToNS(json)
}, null)

View file

@ -13,7 +13,6 @@ import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.services.AlarmSoundService
import kotlinx.android.synthetic.main.dialog_error.*
import javax.inject.Inject
@ -39,6 +38,7 @@ class ErrorDialog : DaggerDialogFragment() {
bundle.getString("title")?.let { title = it }
sound = bundle.getInt("sound", R.raw.error)
}
aapsLogger.debug("Error dialog displayed")
return inflater.inflate(R.layout.dialog_error, container, false)
}
@ -47,11 +47,11 @@ class ErrorDialog : DaggerDialogFragment() {
error_title.text = title
overview_error_ok.setOnClickListener {
aapsLogger.debug(LTag.UI, "Error dialog ok button pressed")
aapsLogger.debug("Error dialog ok button pressed")
dismiss()
}
overview_error_mute.setOnClickListener {
aapsLogger.debug(LTag.UI, "Error dialog mute button pressed")
aapsLogger.debug("Error dialog mute button pressed")
stopAlarm()
}
startAlarm()

View file

@ -72,6 +72,7 @@ class ExtendedBolusDialog : DialogFragmentWithDate() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.extended_bolus), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
aapsLogger.debug("USER ENTRY: EXTENDED BOLUS $insulinAfterConstraint duration: $durationInMinutes")
commandQueue.extendedBolus(insulinAfterConstraint, durationInMinutes, object : Callback() {
override fun run() {
if (!result.success) {

View file

@ -116,13 +116,16 @@ class FillDialog : DialogFragmentWithDate() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.primefill), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
if (insulinAfterConstraints > 0) {
aapsLogger.debug("USER ENTRY: PRIME BOLUS $insulinAfterConstraints")
requestPrimeBolus(insulinAfterConstraints, notes)
}
if (siteChange) {
aapsLogger.debug("USER ENTRY: SITE CHANGE")
generateCareportalEvent(CareportalEvent.SITECHANGE, eventTime, notes)
}
if (insulinChange) {
// add a second for case of both checked
aapsLogger.debug("USER ENTRY: INSULIN CHANGE")
generateCareportalEvent(CareportalEvent.INSULINCHANGE, eventTime + 1000, notes)
}
}, null)

View file

@ -154,6 +154,7 @@ class InsulinDialog : DialogFragmentWithDate() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.bolus), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
if (eatingSoonChecked) {
aapsLogger.debug("USER ENTRY: TEMPTARGET EATING SOON $eatingSoonTT duration: $eatingSoonTTDuration")
val tempTarget = TempTarget()
.date(System.currentTimeMillis())
.duration(eatingSoonTTDuration)
@ -171,9 +172,11 @@ class InsulinDialog : DialogFragmentWithDate() {
detailedBolusInfo.source = Source.USER
detailedBolusInfo.notes = notes
if (recordOnlyChecked) {
aapsLogger.debug("USER ENTRY: BOLUS RECORD ONLY $insulinAfterConstraints")
detailedBolusInfo.date = time
activePlugin.activeTreatments.addToHistoryTreatment(detailedBolusInfo, false)
} else {
aapsLogger.debug("USER ENTRY: BOLUS $insulinAfterConstraints")
detailedBolusInfo.date = DateUtil.now()
commandQueue.bolus(detailedBolusInfo, object : Callback() {
override fun run() {

View file

@ -102,6 +102,7 @@ class ProfileSwitchDialog : DialogFragmentWithDate() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.careportal_profileswitch), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
aapsLogger.debug("USER ENTRY: PROFILE SWITCH $profile percent: $percent timeshift: $timeShift duration: $duration")
treatmentsPlugin.doProfileSwitch(profileStore, profile, duration.toInt(), percent, timeShift, eventTime)
})
}

View file

@ -114,10 +114,13 @@ class TempBasalDialog : DialogFragmentWithDate() {
}
}
}
if (isPercentPump)
if (isPercentPump) {
aapsLogger.debug("USER ENTRY: TEMP BASAL $percent% duration: $durationInMinutes")
commandQueue.tempBasalPercent(percent, durationInMinutes, true, profile, callback)
else
} else {
aapsLogger.debug("USER ENTRY: TEMP BASAL $absolute duration: $durationInMinutes")
commandQueue.tempBasalAbsolute(absolute, durationInMinutes, true, profile, callback)
}
})
}
return true

View file

@ -120,11 +120,11 @@ class TempTargetDialog : DialogFragmentWithDate() {
val reason = overview_temptarget_reason.selectedItem.toString()
val unitResId = if (profileFunction.getUnits() == Constants.MGDL) R.string.mgdl else R.string.mmol
val target = overview_temptarget_temptarget.value
val duration = overview_temptarget_duration.value
if (target != 0.0 && duration != 0.0) {
val duration = overview_temptarget_duration.value.toInt()
if (target != 0.0 && duration != 0) {
actions.add(resourceHelper.gs(R.string.reason) + ": " + reason)
actions.add(resourceHelper.gs(R.string.nsprofileview_target_label) + ": " + Profile.toCurrentUnitsString(target) + " " + resourceHelper.gs(unitResId))
actions.add(resourceHelper.gs(R.string.duration) + ": " + resourceHelper.gs(R.string.format_hours, duration))
actions.add(resourceHelper.gs(R.string.duration) + ": " + resourceHelper.gs(R.string.format_mins, duration))
} else {
actions.add(resourceHelper.gs(R.string.stoptemptarget))
}
@ -133,7 +133,8 @@ class TempTargetDialog : DialogFragmentWithDate() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.careportal_temporarytarget), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
if (target == 0.0 || duration == 0.0) {
aapsLogger.debug("USER ENTRY: TEMP TARGET $target duration: $duration")
if (target == 0.0 || duration == 0) {
val tempTarget = TempTarget()
.date(eventTime)
.duration(0)
@ -143,14 +144,14 @@ class TempTargetDialog : DialogFragmentWithDate() {
} else {
val tempTarget = TempTarget()
.date(eventTime)
.duration(duration.toInt())
.duration(duration)
.reason(reason)
.source(Source.USER)
.low(Profile.toMgdl(target, profileFunction.getUnits()))
.high(Profile.toMgdl(target, profileFunction.getUnits()))
treatmentsPlugin.addToHistoryTempTarget(tempTarget)
}
if (duration == 10.0) sp.putBoolean(R.string.key_objectiveusetemptarget, true)
if (duration == 10) sp.putBoolean(R.string.key_objectiveusetemptarget, true)
})
}
return true

View file

@ -109,6 +109,7 @@ class TreatmentDialog : DialogFragmentWithDate() {
if (insulinAfterConstraints > 0 || carbsAfterConstraints > 0) {
activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.overview_treatment_label), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
aapsLogger.debug("USER ENTRY: BOLUS insulin $insulin carbs: $carbs")
val detailedBolusInfo = DetailedBolusInfo()
if (insulinAfterConstraints == 0.0) detailedBolusInfo.eventType = CareportalEvent.CARBCORRECTION
if (carbsAfterConstraints == 0) detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS

View file

@ -490,7 +490,7 @@ public class ConfigBuilderPlugin extends PluginBase implements ActivePluginProvi
}
}
private void performPluginSwitch(PluginBase changedPlugin, boolean enabled, @NonNull PluginType type) {
public void performPluginSwitch(PluginBase changedPlugin, boolean enabled, @NonNull PluginType type) {
changedPlugin.setPluginEnabled(type, enabled);
changedPlugin.setFragmentVisible(type, enabled);
processOnEnabledCategoryChanged(changedPlugin, type);

View file

@ -18,6 +18,7 @@ import info.nightscout.androidaps.events.*
import info.nightscout.androidaps.historyBrowser.HistoryBrowseActivity
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.CommandQueueProvider
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction
import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction
@ -34,10 +35,12 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import kotlinx.android.synthetic.main.actions_fragment.*
import kotlinx.android.synthetic.main.careportal_stats_fragment.*
import org.slf4j.LoggerFactory
import java.util.*
import javax.inject.Inject
class ActionsFragment : DaggerFragment() {
@Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var rxBus: RxBusWrapper
@Inject lateinit var sp: SP
@Inject lateinit var profileFunction: ProfileFunction
@ -77,6 +80,7 @@ class ActionsFragment : DaggerFragment() {
}
actions_extendedbolus_cancel.setOnClickListener {
if (activePlugin.activeTreatments.isInHistoryExtendedBoluslInProgress) {
aapsLogger.debug("USER ENTRY: CANCEL EXTENDED BOLUS")
commandQueue.cancelExtended(object : Callback() {
override fun run() {
if (!result.success) {
@ -96,6 +100,7 @@ class ActionsFragment : DaggerFragment() {
}
actions_canceltempbasal.setOnClickListener {
if (activePlugin.activeTreatments.isTempBasalInProgress) {
aapsLogger.debug("USER ENTRY: CANCEL TEMP BASAL")
commandQueue.cancelTempBasal(true, object : Callback() {
override fun run() {
if (!result.success) {

View file

@ -685,6 +685,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
if (profile == null)
return true;
if (item.getTitle().equals(resourceHelper.gs(R.string.disableloop))) {
aapsLogger.debug("USER ENTRY: LOOP DISABLED");
loopPlugin.setPluginEnabled(PluginType.LOOP, false);
loopPlugin.setFragmentVisible(PluginType.LOOP, false);
configBuilderPlugin.storeSettings("DisablingLoop");
@ -700,6 +701,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
loopPlugin.createOfflineEvent(24 * 60); // upload 24h, we don't know real duration
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.enableloop))) {
aapsLogger.debug("USER ENTRY: LOOP ENABLED");
loopPlugin.setPluginEnabled(PluginType.LOOP, true);
loopPlugin.setFragmentVisible(PluginType.LOOP, true);
configBuilderPlugin.storeSettings("EnablingLoop");
@ -708,6 +710,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.resume)) ||
item.getTitle().equals(resourceHelper.gs(R.string.reconnect))) {
aapsLogger.debug("USER ENTRY: RESUME");
loopPlugin.suspendTo(0L);
updateGUI("suspendmenu");
configBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
@ -722,39 +725,48 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
loopPlugin.createOfflineEvent(0);
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.suspendloopfor1h))) {
aapsLogger.debug("USER ENTRY: SUSPEND 1h");
loopPlugin.suspendLoop(60);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.suspendloopfor2h))) {
aapsLogger.debug("USER ENTRY: SUSPEND 2h");
loopPlugin.suspendLoop(120);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.suspendloopfor3h))) {
aapsLogger.debug("USER ENTRY: SUSPEND 3h");
loopPlugin.suspendLoop(180);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.suspendloopfor10h))) {
aapsLogger.debug("USER ENTRY: SUSPEND 10h");
loopPlugin.suspendLoop(600);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.disconnectpumpfor15m))) {
aapsLogger.debug("USER ENTRY: DISCONNECT 15m");
loopPlugin.disconnectPump(15, profile);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.disconnectpumpfor30m))) {
aapsLogger.debug("USER ENTRY: DISCONNECT 30m");
loopPlugin.disconnectPump(30, profile);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.disconnectpumpfor1h))) {
aapsLogger.debug("USER ENTRY: DISCONNECT 1h");
loopPlugin.disconnectPump(60, profile);
sp.putBoolean(R.string.key_objectiveusedisconnect, true);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.disconnectpumpfor2h))) {
aapsLogger.debug("USER ENTRY: DISCONNECT 2h");
loopPlugin.disconnectPump(120, profile);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(resourceHelper.gs(R.string.disconnectpumpfor3h))) {
aapsLogger.debug("USER ENTRY: DISCONNECT 3h");
loopPlugin.disconnectPump(180, profile);
updateGUI("suspendmenu");
return true;
@ -772,6 +784,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
if (manager != null)
pvd.show(manager, "ProfileViewDialog");
} else if (item.getTitle().equals(resourceHelper.gs(R.string.eatingsoon))) {
aapsLogger.debug("USER ENTRY: TEMP TARGET EATING SOON");
double target = Profile.toMgdl(defaultValueHelper.determineEatingSoonTT(), ProfileFunctions.getSystemUnits());
TempTarget tempTarget = new TempTarget()
.date(System.currentTimeMillis())
@ -782,6 +795,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
.high(target);
treatmentsPlugin.addToHistoryTempTarget(tempTarget);
} else if (item.getTitle().equals(resourceHelper.gs(R.string.activity))) {
aapsLogger.debug("USER ENTRY: TEMP TARGET ACTIVITY");
double target = Profile.toMgdl(defaultValueHelper.determineActivityTT(), ProfileFunctions.getSystemUnits());
TempTarget tempTarget = new TempTarget()
.date(now())
@ -792,6 +806,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
.high(target);
treatmentsPlugin.addToHistoryTempTarget(tempTarget);
} else if (item.getTitle().equals(resourceHelper.gs(R.string.hypo))) {
aapsLogger.debug("USER ENTRY: TEMP TARGET HYPO");
double target = Profile.toMgdl(defaultValueHelper.determineHypoTT(), ProfileFunctions.getSystemUnits());
TempTarget tempTarget = new TempTarget()
.date(now())
@ -806,6 +821,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
if (manager != null)
new TempTargetDialog().show(manager, "Overview");
} else if (item.getTitle().equals(resourceHelper.gs(R.string.cancel))) {
aapsLogger.debug("USER ENTRY: TEMP TARGET CANCEL");
TempTarget tempTarget = new TempTarget()
.source(Source.USER)
.date(now())
@ -922,6 +938,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
loopPlugin.invoke("Accept temp button", false);
if (loopPlugin.lastRun != null && loopPlugin.lastRun.lastAPSRun != null && loopPlugin.lastRun.constraintsProcessed.isChangeRequested()) {
OKDialog.showConfirmation(context, resourceHelper.gs(R.string.pump_tempbasal_label), loopPlugin.lastRun.constraintsProcessed.toSpanned(), () -> {
aapsLogger.debug("USER ENTRY: ACCEPT TEMP BASAL");
hideTempRecommendation();
clearNotification();
loopPlugin.acceptChangeRequest();

View file

@ -102,7 +102,7 @@ class LocalProfilePlugin @Inject constructor(
var isEdited: Boolean = false
var profiles: ArrayList<SingleProfile> = ArrayList()
private var numOfProfiles = 0
var numOfProfiles = 0
internal var currentProfileIndex = 0
fun currentProfile() = profiles[currentProfileIndex]

View file

@ -1548,6 +1548,12 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface,
data.put("created_at", DateUtil.toISOString(date));
data.put("eventType", CareportalEvent.NOTE);
data.put("notes", note);
CareportalEvent careportalEvent = new CareportalEvent();
careportalEvent.date = date;
careportalEvent.source = Source.USER;
careportalEvent.eventType = CareportalEvent.NOTE;
careportalEvent.json = data.toString();
MainApp.getDbHelper().createOrUpdate(careportalEvent);
NSUpload.uploadCareportalEntryToNS(data);
} catch (JSONException e) {
log.error("Unhandled exception", e);
@ -1576,6 +1582,12 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface,
if (!enteredBy.equals("")) data.put("enteredBy", enteredBy);
data.put("created_at", DateUtil.toISOString(date));
data.put("eventType", event);
CareportalEvent careportalEvent = new CareportalEvent();
careportalEvent.date = date;
careportalEvent.source = Source.USER;
careportalEvent.eventType = event;
careportalEvent.json = data.toString();
MainApp.getDbHelper().createOrUpdate(careportalEvent);
NSUpload.uploadCareportalEntryToNS(data);
} catch (JSONException e) {
log.error("Unhandled exception", e);

View file

@ -529,6 +529,12 @@ public class MedtronicHistoryData {
if (!enteredBy.equals("")) data.put("enteredBy", enteredBy);
data.put("created_at", DateUtil.toISOString(date));
data.put("eventType", event);
CareportalEvent careportalEvent = new CareportalEvent();
careportalEvent.date = date;
careportalEvent.source = Source.USER;
careportalEvent.eventType = event;
careportalEvent.json = data.toString();
MainApp.getDbHelper().createOrUpdate(careportalEvent);
NSUpload.uploadCareportalEntryToNS(data);
} catch (JSONException e) {
LOG.error("Unhandled exception", e);

View file

@ -9,6 +9,8 @@ import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.RequestDexcomPermissionActivity
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.db.CareportalEvent
import info.nightscout.androidaps.db.Source
import info.nightscout.androidaps.dialogs.CareDialog
import info.nightscout.androidaps.interfaces.BgSourceInterface
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
@ -96,6 +98,13 @@ class DexcomPlugin @Inject constructor(
jsonObject.put("glucoseType", "Finger")
jsonObject.put("glucose", meter.getInt("meterValue"))
jsonObject.put("units", Constants.MGDL)
val careportalEvent = CareportalEvent()
careportalEvent.date = timestamp
careportalEvent.source = Source.USER
careportalEvent.eventType = CareportalEvent.BGCHECK
careportalEvent.json = jsonObject.toString()
MainApp.getDbHelper().createOrUpdate(careportalEvent)
NSUpload.uploadCareportalEntryToNS(jsonObject)
}
}
@ -110,6 +119,12 @@ class DexcomPlugin @Inject constructor(
jsonObject.put("enteredBy", "AndroidAPS-Dexcom$sensorType")
jsonObject.put("created_at", DateUtil.toISOString(sensorInsertionTime))
jsonObject.put("eventType", CareportalEvent.SENSORCHANGE)
val careportalEvent = CareportalEvent()
careportalEvent.date = sensorInsertionTime
careportalEvent.source = Source.USER
careportalEvent.eventType = CareportalEvent.SENSORCHANGE
careportalEvent.json = jsonObject.toString()
MainApp.getDbHelper().createOrUpdate(careportalEvent)
NSUpload.uploadCareportalEntryToNS(jsonObject)
}
}

View file

@ -66,7 +66,7 @@ class RandomBgPlugin @Inject constructor(
}
override fun specialEnableCondition(): Boolean {
return virtualPumpPlugin.isEnabled(PluginType.PUMP) && (MainApp.engineeringMode || isRunningTest())
return isRunningTest() || virtualPumpPlugin.isEnabled(PluginType.PUMP) && MainApp.engineeringMode
}
override fun handleNewData(intent: Intent) {
@ -76,7 +76,7 @@ class RandomBgPlugin @Inject constructor(
val cal = GregorianCalendar()
val currentMinute = cal.get(Calendar.MINUTE) + (cal.get(Calendar.HOUR_OF_DAY) % 2) * 60
val bgMgdl = min + (max - min) * sin(currentMinute / 120.0 * 2 * PI)
val bgMgdl = min + (max - min) + (max - min) * sin(currentMinute / 120.0 * 2 * PI)
val bgReading = BgReading()
bgReading.value = bgMgdl

View file

@ -133,20 +133,23 @@ public class AndroidPermission {
}
public static synchronized void notifyForSystemWindowPermissions(Activity activity) {
if (!Settings.canDrawOverlays(activity)) {
NotificationWithAction notification = new NotificationWithAction(MainApp.instance(), Notification.PERMISSION_SYSTEM_WINDOW, MainApp.gs(R.string.needsystemwindowpermission), Notification.URGENT);
notification.action(R.string.request, () -> {
// Check if Android Q or higher
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + activity.getPackageName()));
activity.startActivity(intent);
}
});
RxBus.Companion.getINSTANCE().send(new EventNewNotification(notification));
} else
RxBus.Companion.getINSTANCE().send(new EventDismissNotification(Notification.PERMISSION_SYSTEM_WINDOW));
// Check if Android Q or higher
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
if (!Settings.canDrawOverlays(activity)) {
NotificationWithAction notification = new NotificationWithAction(MainApp.instance(), Notification.PERMISSION_SYSTEM_WINDOW, MainApp.gs(R.string.needsystemwindowpermission), Notification.URGENT);
notification.action(R.string.request, () -> {
// Check if Android Q or higher
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + activity.getPackageName()));
activity.startActivity(intent);
}
});
RxBus.Companion.getINSTANCE().send(new EventNewNotification(notification));
} else
RxBus.Companion.getINSTANCE().send(new EventDismissNotification(Notification.PERMISSION_SYSTEM_WINDOW));
}
}
}

View file

@ -9,3 +9,13 @@ fun isRunningTest(): Boolean {
false
}
}
@Synchronized
fun isRunningRealPumpTest(): Boolean {
return try {
Class.forName("info.nightscout.androidaps.RealPumpTest")
true
} catch (e: ClassNotFoundException) {
false
}
}

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<!-- <string name="fi_lang" translatable="false">Finnish</string> -->
<!-- <string name="he_lang" translatable="false">Hebrew</string> -->
@ -946,6 +945,7 @@
<string name="startobjective">Започнете първа цел</string>
<string name="permission">Разрешение</string>
<string name="askforpermission">Питане за разрешение</string>
<string name="needsystemwindowpermission">ААПС изисква разрешение за да може да Ви уведомява</string>
<string name="needlocationpermission">Приложението се нуждае от достъп до вашето местоположение за да активира BT сканиране</string>
<string name="needstoragepermission">Приложението се нуждае от разрешение да съхранява данни за да може съхранява лог файлове</string>
<string name="request">Искане</string>
@ -1449,4 +1449,8 @@
<string name="phonechecker">\"PhoneChecker\"</string>
<string name="chartmenu">Меню на графиката</string>
<string name="sensitivity_short">АS</string>
<string name="loop_smbrequest_time_label">Диапазон между изпълнение на SMB</string>
<string name="loop_smbexecution_time_label">Макс. време за изпълнение за SMB</string>
<string name="loop_tbrrequest_time_label">Диапазон между временни базали</string>
<string name="loop_tbrexecution_time_label">Продължителност на временни базали</string>
</resources>

View file

@ -846,7 +846,7 @@
<string name="combo_error_failure_reading_changed_basal_rate">Das Einlesen der geänderten Basalrate in der Pumpe schlug fehl</string>
<string name="combo_activity_checking_for_history_changes">Änderungen der Historie werden gesucht</string>
<string name="combo_error_multiple_boluses_with_identical_timestamp">Der Import mehrerer Boli der gleichen Menge, abgegeben in der gleichen Minute, ist gescheitert: Nur ein Datensatz konnte den Behandlungen hinzugefügt werden. Bitte überprüfe die Pumpe und verwende das Careportal, um fehlende Einträge hinzuzufügen. Stelle sicher, dass keine Einträge für genau dieselbe Minute mit derselben Menge hinzugefügt werden.</string>
<string name="about_link_urls">\n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nSupport:\nhttps://de.loopercommunity.org/ (de)\nhttp://facebook.androidaps.org</string>
<string name="about_link_urls">\n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nSupport:\nhttps://de.loopercommunity.org/\nhttp://facebook.androidaps.org</string>
<string name="combo_check_date">Der letzte Bolus liegt mehr als 24 Stunden zurück oder liegt in der Zukunft. Prüfe bitte das Datum auf der Pumpe.</string>
<string name="combo_suspious_bolus_time">Zeit/Datum des abgegebenen Boluses auf der Pumpe erscheint falsch, IOB ist wahrscheinlich nicht korrekt. Bitte prüfe Zeit/Datum der Pumpe.</string>
<string name="profileswitch_ismissing">Profil-Wechsel fehlt, bitte nimm einen Profil-Wechsel vor oder drücke \"AKTIVIERE PROFIL\" im lokalen Profil.</string>
@ -946,6 +946,7 @@
<string name="startobjective">Starte deine erste Zielsetzung</string>
<string name="permission">Berechtigung</string>
<string name="askforpermission">Nach Berechtigung fragen</string>
<string name="needsystemwindowpermission">Die App benötigt die Systemberechtigung für App-Benachrichtigungen</string>
<string name="needlocationpermission">AndroidAPS benötigt die Standortfreigabe für den BT-Scan.</string>
<string name="needstoragepermission">AndroidAPS benötigt Zugriff auf den Speicher, um Log-Dateien speichern zu können.</string>
<string name="request">Anfordern</string>
@ -1446,8 +1447,12 @@ Unerwartetes Verhalten.</string>
<string name="clearqueueconfirm">Warteschlange löschen? Alle Daten in der Warteschlange gehen verloren!</string>
<string name="ebstopsloop">Die Verwendung eines Verzögerungsbolus unterbricht dem Closed Loop Modus für die Dauer des Verzögerungsbolus. Willst Du das wirklich?</string>
<string name="closed_loop_disabled_with_eb">Closed Loop wegen Verzögerungsbolus unterbrochen</string>
<string name="extended_bolus_short">VB</string>
<string name="extended_bolus_short">VerzB</string>
<string name="phonechecker">\"PhoneChecker\"</string>
<string name="chartmenu">Diagrammmenü</string>
<string name="sensitivity_short">AS</string>
<string name="loop_smbrequest_time_label">SMB Anfragezeit</string>
<string name="loop_smbexecution_time_label">SMB Ausführungszeit</string>
<string name="loop_tbrrequest_time_label">Temp. BR Anfragezeit</string>
<string name="loop_tbrexecution_time_label">Temp. BR Ausführungszeit</string>
</resources>

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<!-- <string name="fi_lang" translatable="false">Finnish</string> -->
<!-- <string name="he_lang" translatable="false">Hebrew</string> -->
@ -1446,4 +1445,8 @@
<string name="ebstopsloop">El uso de la función de bolo extendido detendrá el modo de bucle cerrado durante el tiempo de ejecución del bolo extendido. ¿Realmente quieres esto?</string>
<string name="closed_loop_disabled_with_eb">Bucle cerrado inhabilitado debido a la ejecución del bolo extendido</string>
<string name="extended_bolus_short">EB</string>
<string name="chartmenu">Menú gráfico</string>
<string name="sensitivity_short">AS</string>
<string name="loop_smbrequest_time_label">Tiempo requerido de SMB</string>
<string name="loop_smbexecution_time_label">Tiempo de ejecución de SMB</string>
</resources>

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<!-- <string name="fi_lang" translatable="false">Finnish</string> -->
<!-- <string name="he_lang" translatable="false">Hebrew</string> -->
@ -157,7 +156,7 @@
<string name="changeyourinput">Changez vos entrées !</string>
<string name="configbuilder_bgsource">Source des glycémies</string>
<string name="configbuilder_bgsource_description">Quelle source de données doit être utilisée par AndroidAPS ?</string>
<string name="xdrip">xDrip</string>
<string name="xdrip">xDrip+</string>
<string name="apsmode_title">Mode APS</string>
<string name="closedloop">Boucle Fermée</string>
<string name="openloop">Boucle Ouverte</string>
@ -196,7 +195,7 @@
<string name="careportal_newnstreatment_sensor">Capteur</string>
<string name="careportal_newnstreatment_carbs_label">Glucides</string>
<string name="careportal_newnstreatment_insulin_label">Insuline</string>
<string name="careportal_newnstreatment_carbtime_label">Heure glucides</string>
<string name="careportal_newnstreatment_carbtime_label">Décalage horaire</string>
<string name="careportal_newnstreatment_split_label">Diviser</string>
<string name="careportal_newnstreatment_duration_label">Durée</string>
<string name="careportal_newnstreatment_percent_label">Pourcentage</string>
@ -220,7 +219,7 @@
<string name="nav_import">Importer les paramètres</string>
<string name="openapsma_maxbasal_title">Max. U/hr pour le débit temp Basal</string>
<string name="openapsma_maxbasal_summary">Cette valeur est appelée Basal Maximum dans le contexte OpenAPS</string>
<string name="openapsma_maxiob_title">Le Basal IA maximum que l\'OpenAPS pourra délivrer [U]</string>
<string name="openapsma_maxiob_title">IA basale max que OpenAPS pourra délivrer [U]</string>
<string name="openapsma_maxiob_summary">Cette valeur est appelée Max IA (Insuline Active) dans le contexte OpenAPS\nC\'estlle maximum d\'insuline en [U] que APS peut délivrer en une seule fois.</string>
<string name="dismiss">FERMER</string>
<string name="danarpump">DanaR</string>
@ -385,7 +384,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="resend_all_data">Renvoyer toutes les données</string>
<string name="open_settings_on_wear">Afficher les Paramètres sur la Montre</string>
<string name="pumperror">Erreur Pompe</string>
<string name="lowbattery">Niveau Batterie Bas</string>
<string name="lowbattery">Piles Faibles</string>
<string name="pumpshutdown">Arrêt de la Pompe</string>
<string name="batterydischarged">Batterie Pompe Déchargée</string>
<string name="danarkoreanpump">DanaR Coréenne</string>
@ -644,7 +643,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="insulin_peak_time">Temps du Pic [min]</string>
<string name="free_peak_oref">Profil d\'insuline ajustable Oref</string>
<string name="rapid_acting_oref">Insuline à Action Rapide Oref </string>
<string name="ultrarapid_oref">Insuline à Action Ultra Rapide Oref</string>
<string name="ultrarapid_oref">Insuline Ultra Rapide Oref</string>
<string name="dia_too_short">Durée dAction pour %1$f trop courte - utiliser %2$f à la place !</string>
<string name="activate_profile">Activer le profil</string>
<string name="date"> Date</string>
@ -701,7 +700,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="pumpdrivercorrected">Pilote pompe corrigé</string>
<string name="pump_unreachable">Pompe hors de portée</string>
<string name="missed_bg_readings">Valeurs de glycémie manquantes</string>
<string name="raise_notifications_as_android_notifications">Utiliser le système des notifications</string>
<string name="raise_notifications_as_android_notifications">Utiliser les notifications système pour les alertes et notifications</string>
<string name="localalertsettings_title">Alertes locales</string>
<string name="enable_missed_bg_readings_alert">Alerte pas nouvelle donnée glycémique</string>
<string name="enable_pump_unreachable_alert">Alerte si la pompe est hors de portée</string>
@ -766,7 +765,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="danar_history">Historique pompe</string>
<string name="combo_activity_setting_basal_profile">Définir le profil basal</string>
<string name="combo_pump_cartridge_low_warrning">Niveau réservoir pompe bas</string>
<string name="combo_pump_battery_low_warrning">Niveau batterie pompe bas</string>
<string name="combo_pump_battery_low_warrning">Pile pompe faible</string>
<string name="combo_is_in_error_state">La pompe affiche lerreur E%1$d: %2$s</string>
<string name="combo_reservoir_low">Bas</string>
<string name="combo_reservoir_empty">Vide</string>
@ -885,7 +884,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="reset">réinitialiser</string>
<string name="waitingfortimesynchronization">En attente de synchronisation de l\'heure (%1$d sec)</string>
<string name="loopdisconnectedfor">Déconnecté (%1$d m)</string>
<string name="openapssmb_maxiob_title">Maximum Insuline Active IA pour OpenAPS [U]</string>
<string name="openapssmb_maxiob_title">IA totale maximale pour OpenAPS [U]</string>
<string name="openapssmb_maxiob_summary">Cette valeur est appelée Max IA (Insuline Active) dans le contaxte OpenAPS\nOpenAPS najoutera pas plus dinsuline si l\'IA (Insuline Active) actuelle est supérieure à cette valeur</string>
<string name="pump_stopped">Pompe arrêtée</string>
<string name="pump_started">Pompe démarrée</string>
@ -909,15 +908,15 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="cgm">MGC</string>
<string name="ns_wifionly">Utilisez uniquement connexion Wi-fi</string>
<string name="ns_wifi_ssids">Wi-fi SSID</string>
<string name="ns_chargingonly">Wi-fi uniquement pendant la charge</string>
<string name="ns_chargingonly">Uniquement si en charge</string>
<string name="connectionsettings_title">Paramètres de connexion</string>
<string name="ns_wifi_allowedssids">SSIDs autorisés (séparés par point-virgule)</string>
<string name="ns_allowroaming">Autoriser connexion données itinérance</string>
<string name="openapsama_autosens_max">Maximum Ratio Autosens</string>
<string name="openapsama_autosens_min">Minimum Ratio Autosens</string>
<string name="openapsama_bolussnooze_dia_divisor">Diviseur de Bolus snooze DIA</string>
<string name="openapsama_max_daily_safety_multiplier">Maximum multiplicateur quotidien de sécurité</string>
<string name="openapsama_current_basal_safety_multiplier">Multiplicateur actuel de sécurité du Basal</string>
<string name="openapsama_bolussnooze_dia_divisor">Snooze bolus Diviseur de DAI</string>
<string name="openapsama_max_daily_safety_multiplier">Multiplicateur max quotidien de sécurité</string>
<string name="openapsama_current_basal_safety_multiplier">Multiplicateur de sécurité basale courante</string>
<string name="value_unavailable_short">ND</string>
<string name="virtualpump_type">Type de pompe virtuelle</string>
<string name="virtualpump_definition">Définition de pompe</string>
@ -947,6 +946,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="startobjective">Démarrez votre premier objectif</string>
<string name="permission">Autorisation</string>
<string name="askforpermission">Demande d\'autorisation</string>
<string name="needsystemwindowpermission">L\'application a besoin de l\'autorisation d\'accès à la fenêtre système pour les notifications</string>
<string name="needlocationpermission">L\'application requiert l\'autorisation de localisation pour le balayage Bluetooth</string>
<string name="needstoragepermission">L\'application requiert une autorisation de stockage de données afin de pouvoir sauvegarder les fichiers journaux</string>
<string name="request">Demande</string>
@ -1015,7 +1015,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="commanderror">Erreur de commande</string>
<string name="speederror">Erreur de vitesse</string>
<string name="insulinlimitviolation">Violation d\'une limite d\'insuline</string>
<string name="loop_openmode_min_change">Changement minimum possible [%]</string>
<string name="loop_openmode_min_change">Changement minimum [%]</string>
<string name="loop_openmode_min_change_summary">Le fonctionnement de la Boucle demandera une confirmation uniquement si le changement est supérieur à cette valeur en %. Par défaut, la valeur est 20%</string>
<string name="pairfirst">Appairez SVP votre pompe avec votre téléphone !</string>
<string name="searching_for_devices">Recherche d\'appareils en cours…</string>
@ -1244,7 +1244,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="medtronic_pump_frequency_worldwide">Mondial (868 Mhz)</string>
<string name="medtronic_pump_encoding_4b6b_local">Encodage logiciel 4b6b</string>
<string name="medtronic_pump_encoding_4b6b_rileylink">Encodage matériel 4b6b</string>
<string name="medtronic_custom_action_wake_and_tune">Réveil et mise au point</string>
<string name="medtronic_custom_action_wake_and_tune">Réveil et Réglage</string>
<string name="medtronic_custom_action_clear_bolus_block">Effacer le bloc Bolus</string>
<string name="medtronic_custom_action_reset_rileylink">Réinitialiser la config. RileyLink</string>
<string name="medtronic_pump_battery_select">Type de batterie (vue d\'alimentation)</string>
@ -1270,8 +1270,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<!-- RL Status Page -->
<string name="rileylink_settings_tab1">Paramètres</string>
<string name="rileylink_settings_tab2">Historique</string>
<string name="rileylink_status">Statut du RileyLink</string>
<string name="medtronic_pump_status">Statut de la pompe</string>
<string name="rileylink_status">État du RileyLink</string>
<string name="medtronic_pump_status">État de la pompe</string>
<string name="title_activity_rileylink_settings">Paramètres RileyLink</string>
<string name="rileylink_title">RileyLink</string>
<string name="rileylink_configured_address">Adresse configurée</string>
@ -1300,7 +1300,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="rileylink_error_bt_disabled">Bluetooth est désactivé</string>
<string name="rileylink_error_no_bt_adapter">Aucun adaptateur Bluetooth</string>
<string name="rileylink_error_tuneup_failed">Échec du réglage</string>
<string name="rileylink_error_pump_unreachable">Pompe inaccessible</string>
<string name="rileylink_error_pump_unreachable">Pompe hors de portée</string>
<string name="rileylink_error_pod_unreachable">Pod inaccessible</string>
<string name="rileylink_error_address_not_set_short">Non configuré</string>
<!-- RL Target Device -->
@ -1448,4 +1448,10 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="closed_loop_disabled_with_eb">Boucle fermée désactivée à cause du bolus étendu</string>
<string name="extended_bolus_short">EB</string>
<string name="phonechecker">\"Vérif. du téléphone\"</string>
<string name="chartmenu">Menu Graph</string>
<string name="sensitivity_short">AS</string>
<string name="loop_smbrequest_time_label">Heure de demande SMB</string>
<string name="loop_smbexecution_time_label">Heure d\'exécution SMB</string>
<string name="loop_tbrrequest_time_label">Heure de demande basal temp</string>
<string name="loop_tbrexecution_time_label">Heure d\'exécution basal temp</string>
</resources>

View file

@ -946,6 +946,7 @@
<string name="startobjective">Avvia il tuo primo obiettivo</string>
<string name="permission">Permesso</string>
<string name="askforpermission">Chiedi il permesso</string>
<string name="needsystemwindowpermission">L\'applicazione richiede il permesso finestra di sistema per le notifiche</string>
<string name="needlocationpermission">L\'applicazione richiede l\'accesso alla posizione per eseguire lo scan bluetooth</string>
<string name="needstoragepermission">L\'applicazione richiede l\'accesso alla memoria per salvare i file di log</string>
<string name="request">Richiesta</string>
@ -1449,4 +1450,8 @@
<string name="phonechecker">\"PhoneChecker\"</string>
<string name="chartmenu">Menu grafico</string>
<string name="sensitivity_short">AS</string>
<string name="loop_smbrequest_time_label">Tempo richiesta SMB</string>
<string name="loop_smbexecution_time_label">Tempo esecuzione SMB</string>
<string name="loop_tbrrequest_time_label">Tempo richiesta basale temporanea</string>
<string name="loop_tbrexecution_time_label">Tempo esecuzione basale temporanea</string>
</resources>

View file

@ -131,12 +131,12 @@
<string name="isf_profile">변경사항을 적용하는데 프로파일에서 ISF 값 변경하는 것으로 충분합니다.</string>
<string name="isf_hint1">https://androidaps.readthedocs.io/en/latest/CROWDIN/ko/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u</string>
<string name="isf_hint2">https://androidaps.readthedocs.io/en/latest/CROWDIN/ko/Usage/Profiles.html</string>
<string name="ic_label">Topic: IC(인슐린 대 탄수화물) 비율</string>
<string name="ic_label">주제: IC(인슐린-탄수화물 비)</string>
<string name="ic_increasingvalue">높은 IC 비율은 탄수화물 섭취시 인슐린이 보다 덜 주입되게 합니다.</string>
<string name="ic_decreasingvalue">낮은 IC 비율은 탄수화물 섭취시 인슐린이 보다 덜 주입되게 합니다.</string>
<string name="ic_noeffect">COB가 0 인 경우 IC 비율을 변경하면 혈당을 교정하기 위해 다른 양의 인슐린이 주입됩니다.</string>
<string name="ic_different">Bread Unit을 10g 혹은 12g으로 계산한다면 IC 값도 달라집니다.</string>
<string name="ic_meaning">IC의 의미는 다음과 같습니다: 1U의 인슐린에 대한 적정 Bread Unit 양</string>
<string name="ic_different">빵유닛(Bread Unit)을 10g 혹은 12g으로 계산한다면 IC 값도 달라집니다.</string>
<string name="ic_meaning">IC의 의미는 다음과 같습니다: 1U의 인슐린으로 얼마나 많은 빵유닛(Bread Units)이 처리되는지.</string>
<string name="ic_hint1">https://androidaps.readthedocs.io/en/latest/CROWDIN/ko/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u</string>
<string name="profileswitch_label">주제: 프로파일 변경</string>
<string name="profileswitch_pctwillchange">프로파일을 90%로 설정하면 어떻게 됩니까?</string>

View file

@ -28,13 +28,13 @@
<string name="accomplished">완료: %1$s</string>
<string name="objectives_usage_objective">AndroidAPS를 사용하는 방법을 배워봅니다</string>
<string name="objectives_usage_gate">AndroidAPS에서 다양한 작업을 수행해보세요</string>
<string name="objectives_useprofileswitch">10분동안 프로파일 90%를 설정해보세요(개요에서 프로파일명을 길게 눌러보세요)</string>
<string name="objectives_usedisconnectpump">샤워한다고 가정하고 펌프를 1시간 동안 펌프를 일시중지하세요 (개요에서 Open Loop를 길게 눌러보세요)</string>
<string name="objectives_useprofileswitch">10분동안 프로파일 90%를 설정해보세요(에서 프로파일명을 길게 눌러보세요)</string>
<string name="objectives_usedisconnectpump">샤워한다고 가정하고 펌프를 1시간 동안 펌프를 일시중지하세요 (에서 Open Loop를 길게 눌러보세요)</string>
<string name="objectives_usereconnectpump">... 그리고 같은 방법으로 펌프를 재연결하세요</string>
<string name="objectives_usetemptarget">10분의 사용자정의 임시 목표를 생성해 보세요 (개요에서 본인의 현재 목표혈당을 길게 눌러보세요)</string>
<string name="objectives_usetemptarget">사용자정의 임시 목표를 10분동안 실행해보세요 (홈에서 본인의 현재 목표혈당을 길게 눌러보세요)</string>
<string name="objectives_useactions">구성관리자에서 실행 플러그인을 활성화하고 메뉴에서 표시되게 합니다</string>
<string name="objectives_useloop">Loop 플러그인 내용을 표시합니다</string>
<string name="objectives_usescale">개요의 혈당 차트를 길게 눌러 차트 시간을 변경하세요</string>
<string name="objectives_usescale">의 혈당 차트를 길게 눌러 차트 시간을 변경하세요</string>
<string name="objectives_button_enter">입력</string>
<string name="enter_code_obtained_from_developers_to_bypass_the_rest_of_objectives">당신이 OpenAPS 사용자였고 당신의 NS가 최소 3개월의 Loop 데이터가 저장되어 있다면, objectives@androidaps.org로 메일을 보내 당신의 NS주소를 알려주시고 목표를 건너뛸 수 있는 코드를 요청하세요. 그리고 개발자로 부터 받은 코드를 입력하세요.</string>
<string name="codeaccepted">코드 인증</string>

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<!-- <string name="fi_lang" translatable="false">Finnish</string> -->
<!-- <string name="he_lang" translatable="false">Hebrew</string> -->
@ -105,7 +104,7 @@
<string name="reason">근거</string>
<string name="glucose">혈당</string>
<string name="delta">증분</string>
<string name="sms_delta">증분:</string>
<string name="sms_delta">Delta:</string>
<string name="configbuilder">구성 관리자</string>
<string name="objectives">목표</string>
<string name="openapsma">OpenAPS MA</string>
@ -155,7 +154,7 @@
<string name="sms_basal">Basal:</string>
<string name="carbs">탄수화물</string>
<string name="changeyourinput">입력값을 변경하세요!</string>
<string name="configbuilder_bgsource">혈당 소스</string>
<string name="configbuilder_bgsource">혈당 출처</string>
<string name="configbuilder_bgsource_description">AndroidAPS가 어디에서 데이터를 가져옵니까?</string>
<string name="xdrip">xDrip</string>
<string name="apsmode_title">APS 모드</string>
@ -183,7 +182,7 @@
<string name="careportal_insulincartridgechange">인슐린 카트리지 교체</string>
<string name="careportal_profileswitch">프로파일 변경</string>
<string name="careportal_snackbolus">간식Bolus</string>
<string name="careportal_mealbolus">식사Bolus</string>
<string name="careportal_mealbolus">Meal Bolus</string>
<string name="careportal_correctionbolus">교정Bolus</string>
<string name="careportal_combobolus">콤보Bolus</string>
<string name="careportal_tempbasalstart">임시Basal 시작</string>
@ -254,7 +253,7 @@
<string name="smscommunicator_allowednumbers">허가된 전화번호</string>
<string name="smscommunicator_allowednumbers_summary">+XXXXXXXXXX;+YYYYYYYYYY</string>
<string name="smscommunicator_bolusreplywithcode">Bolus %1$.2fU 을 주입하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_mealbolusreplywithcode">식사Bolus %1$.2f을 주입하려면 %2$s를 입력하고 답장하세요</string>
<string name="smscommunicator_mealbolusreplywithcode">MEAL Bolus %1$.2f을 주입하려면 %2$s를 입력하고 답장하세요</string>
<string name="smscommunicator_temptargetwithcode">임시목표 %1$s를 설정하려면 %2$s를 입력하고 답장하세요</string>
<string name="smscommunicator_temptargetcancel">임시목표를 취소하려면 %1$s를 입력하고 답장하세요</string>
<string name="smscommunicator_stopsmswithcode">SMS 원격 기능을 비활성화려면 %1$s를 입력하고 답장하세요.\n\nAAPS 마스터폰을 통해서만 다시 활성화할 수 있습니다.</string>
@ -267,13 +266,13 @@
<string name="bolusdelivered">Bolus %1$.2fU이 주입 완료되었습니다.</string>
<string name="bolusrequested">%1$.2fU을 주입합니다</string>
<string name="smscommunicator_bolusdelivered">Bolus %1$.2fU이 주입 완료되었습니다</string>
<string name="smscommunicator_mealbolusdelivered">식사Bolus %1$.2f이 주입 완료되었습니다</string>
<string name="smscommunicator_mealbolusdelivered">Meal Bolus %1$.2f이 주입 완료되었습니다</string>
<string name="smscommunicator_mealbolusdelivered_tt">%2$d 분 동안 목표 %1$s</string>
<string name="smscommunicator_tt_set">%2$d 분 동안 목표 %1$s 설정이 완료되었습니다</string>
<string name="smscommunicator_tt_canceled">임시 목표 취소가 완료되었습니다</string>
<string name="bolusdelivering">%1$.2fU 주입중</string>
<string name="smscommunicator_remotecommandsallowed">SMS 원격 명령 사용하기</string>
<string name="glucosetype_finger"></string>
<string name="glucosetype_finger"></string>
<string name="glucosetype_sensor">센서</string>
<string name="manual">수동</string>
<string name="careportal_temporarytarget">임시 목표</string>
@ -328,24 +327,24 @@
<string name="smscommunicator_remotecommandnotallowed">원격 명령이 허가되지 않았습니다</string>
<string name="smscommunicator_remotebolusnotallowed">원격 주입이 불가능합니다. 나중에 다시 시도해주세요.</string>
<string name="smscommunicator_basalreplywithcode">%2$d분 동안 Basal %1$.2fU/h 주입하려면 %3$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_profilereplywithcode">프로파일 %1$s %2$d%%로 변경하려면 %3$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_profilereplywithcode">프로파일 %1$s %2$d%%로 변경하려면 %3$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_extendedreplywithcode">%2$d분 동안 확장 Bolus %1$.2fU 주입하려면 %3$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_carbsreplywithcode">%2$s에 %1$dg을 입력하려면 %3$s를 입력하고 답장하세요</string>
<string name="smscommunicator_basalpctreplywithcode">%2$d 분 동안 Basal %1$d%% 주입하려면 %3$s을 입력하고 답장하세요</string>
<string name="smscommunicator_suspendreplywithcode">%1$d분동안 Loop 일시중지하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_tempbasalset">Temp Basal %1$.2fU/h for %2$d min started successfully</string>
<string name="smscommunicator_extendedset">%2$d분 동안 확장Bolus %1$.2fU주입이 성공적으로 시작되었습니다</string>
<string name="smscommunicator_extendedset">Extended bolus %1$.2fU for %2$d min started successfully</string>
<string name="smscommunicator_carbsset">탄수화물 %1$dg 입력이 완료되었습니다</string>
<string name="smscommunicator_carbsfailed">탄수화물 %1$dg 입력이 실패하였습니다</string>
<string name="smscommunicator_tempbasalset_percent">%2$d분 동안 임시Basal %1$d%%주입이 성공적으로 시작되었습니다</string>
<string name="smscommunicator_tempbasalset_percent">Temp basal %1$d%% for %2$d min started successfully</string>
<string name="smscommunicator_tempbasalfailed">Temp Basal start failed</string>
<string name="smscommunicator_extendedfailed">확장 Bolus 실행 실패</string>
<string name="smscommunicator_extendedfailed">Extended bolus start failed</string>
<string name="smscommunicator_basalstopreplywithcode">임시Basal을 중지하려면 %1$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_extendedstopreplywithcode">확장 Bolus를 중지하려면 %1$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_tempbasalcanceled">Temp Basal canceled</string>
<string name="smscommunicator_extendedcanceled">확장 Bolus 취소</string>
<string name="smscommunicator_extendedcanceled">Extended bolus canceled</string>
<string name="smscommunicator_tempbasalcancelfailed">Canceling Temp Basal failed</string>
<string name="smscommunicator_extendedcancelfailed">확장 Bolus 취소가 실패하였습니다.</string>
<string name="smscommunicator_extendedcancelfailed">Canceling extended bolus failed</string>
<string name="smscommunicator_unknowncommand">알려지지 않은 명령이거나 잘못된 답장입니다</string>
<string name="quickwizard">빠른마법사</string>
<string name="quickwizardsettings">빠른마법사 설정</string>
@ -355,12 +354,12 @@
<string name="overview_editquickwizardlistactivity_add">추가</string>
<string name="overview_quickwizard_item_edit_button">수정</string>
<string name="overview_quickwizard_item_remove_button">삭제</string>
<string name="mealbolus">식사</string>
<string name="mealbolus">Meal</string>
<string name="correctionbous">교정주입</string>
<string name="actions">실행</string>
<string name="androidaps_start">AndroidAPS 시작</string>
<string name="ns_upload_only">NS에 업로드만 하기(동기화 안됨)</string>
<string name="ns_upload_only_summary">NS에 업로드만 하기. 로컬소스(xDrip)가 선택되지 않으면 SGV에는 효력이 없습니다. NS프로파일이 사용중이라면 프로파일에는 효력이 없습니다.</string>
<string name="ns_upload_only_summary">NS에 업로드만 하기. xDrip같은 로컬 혈당 출처가 선택되지 않다면 SGV에는 효력이 없습니다. NS프로파일이 사용중이라면 프로파일에는 효력이 없습니다.</string>
<string name="pumpNotInitialized">펌프가 초기화 되지 않았습니다!</string>
<string name="pumpNotInitializedProfileNotSet">펌프가 초기화와 프로파일 설정이 되지 않았습니다!</string>
<string name="primefill">교체/채움</string>
@ -641,7 +640,7 @@
<string name="enableuam_summary">알리지 않은 식사 감지</string>
<string name="insulin_oref_peak">IOB 커브 피크 시간</string>
<string name="insulin_peak_time">피크 시간 [min]</string>
<string name="free_peak_oref">자유-피크 Oref</string>
<string name="free_peak_oref">사용자지정-피크 Oref</string>
<string name="rapid_acting_oref">초속효성 Oref</string>
<string name="ultrarapid_oref">초-초속효성 Oref</string>
<string name="dia_too_short">DIA %1$f는 너무 짧습니다. 대신 %2$f을 사용하세요!</string>
@ -668,7 +667,7 @@
<string name="default_temptargets">임시목표 기본값</string>
<string name="eatingsoon_duration">식사직전 기간</string>
<string name="eatingsoon_target">식사직전 목표</string>
<string name="activity_duration">activity 기간</string>
<string name="activity_duration">활동 기간</string>
<string name="activity_target">활동 목표</string>
<string name="hypo_duration">저혈당 기간</string>
<string name="hypo_target">저혈당 목표</string>
@ -783,15 +782,15 @@
<string name="ago"></string>
<string name="format_hours">%1$.2f 시간</string>
<string name="format_mins">%1$d 분</string>
<string name="enablesmbalways">항상 SMB를 사용합니다.</string>
<string name="enablesmbalways_summary">Bolus와 독립적으로 항상 SMB를 사용합니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다.</string>
<string name="enablesmbalways">항상 SMB 사용하기</string>
<string name="enablesmbalways_summary">Bolus와 독립적으로 항상 SMB를 사용합니다. G5처럼 잘 필터된 혈당출처와만 사용이 가능합니다.</string>
<string name="enablesmbaftercarbs">탄수화물 이후 SMB를 사용합니다.</string>
<string name="enablesmbaftercarbs_summary">탄수화물 이후 6시간동안 SMB를 사용합니다, 0 COB이라도 적용됩니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다.</string>
<string name="enablesmbaftercarbs_summary">탄수화물 이후 6시간동안 SMB를 사용합니다, 0 COB이라도 적용됩니다. G5처럼 잘 필터된 혈당출처와만 사용이 가능합니다.</string>
<string name="enablesmbwithcob">COB와 SMB를 사용합니다.</string>
<string name="enablesmbwithcob_summary">활성화된 COB가 있으면 SMB를 사용합니다.</string>
<string name="enablesmbwithtemptarget">임시 목표와 SMB를 사용합니다.</string>
<string name="enablesmbwithtemptarget">임시 목표에서 SMB 사용하기</string>
<string name="enablesmbwithtemptarget_summary">활성화된 임시 목표(식사직전, 운동)가 있으면 SMB를 사용합니다.</string>
<string name="enablesmbwithhightemptarget">높은임시 목표와 SMB를 사용합니다.</string>
<string name="enablesmbwithhightemptarget">높은 임시 목표에서 SMB 사용하기</string>
<string name="enablesmbwithhightemptarget_summary">활성화된 높은 임시 목표(운동)가 있으면 SMB를 사용합니다.</string>
<string name="let_temp_basal_run">임시Basal 허용</string>
<string name="mute">음소거</string>
@ -878,7 +877,7 @@
<string name="readstatusfailed">상태를 읽지 못했습니다.</string>
<string name="record_pump_site_change">펌프 위치 변경 기록</string>
<string name="record_insulin_cartridge_change">인슐린 카트리지 변경 기록</string>
<string name="smbalwaysdisabled">선택한 BG 소스가 고급 필터링을 지원하지 않기 때문에 SMB가 항상 비활성화됩니다.</string>
<string name="smbalwaysdisabled">선택한 혈당 출처가 고급 필터링을 지원하지 않기 때문에 SMB가 항상 비활성화됩니다.</string>
<string name="smbnotallowedinopenloopmode">Open Loop모드에선 SMB가 허용되지 않습니다.</string>
<string name="food_short">Food</string>
<string name="reset">재설정</string>
@ -940,12 +939,13 @@
<string name="setupwizard_sensitivity_url">https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB</string>
<string name="nsclientinfotext">NSClient는 Nightscout와의 연결을 처리합니다. 이 부분을 건너뛸 수 있지만 설정하기 전엔 목적을 수행할 수 없습니다.</string>
<string name="diawarning">새로운 인슐린 프로파일은 최소 5시간의 DIA가 요구됩니다. 새로운 프로파일의 DIA 5-6시간은 구식 인슐린 프로파일의 DIA 3시간과 동일합니다.</string>
<string name="bgsourcesetup">혈당소스 설정하기</string>
<string name="bgsourcesetup">혈당 출처 설정하기</string>
<string name="setupwizard_profile_description">프로파일 소스를 선택해주세요. 당뇨인이 어린이라면 NS 프로파일을 선택하여야 합니다. Nightscout으로 관리해줄 사람이 없다면 당신은 로컬 프로파일을 선호할 수도 있습니다. 여기선 프로파일의 소스를 선택할 뿐이라는 것을 명심하세요. 그 프로파일을 실제 사용하려면 \"프로파일 변경\"을 실행하여 프로파일을 활성화 시켜야합니다.</string>
<string name="setupwizard_aps_description">사용 가능한 알고리즘 중 하나를 선택하세요. 과거부터 최신의 순으로 정렬이 되어 있습니다. 일반적으로 새로운 알고리즘은 보다 강력하고 공격적입니다. 따라서 당신이 신규 사용자라면 최신의 알고리즘보단 AMA로 시작하는것이 나을 수 있습니다. 사용 전에 OpenAPS 문서를 읽어보고 설정하는 것을 잊지마세요.</string>
<string name="startobjective">첫번째 목표를 시작하세요.</string>
<string name="permission">권한</string>
<string name="askforpermission">권한 요청하기</string>
<string name="needsystemwindowpermission">알림에 대한 시스템 창 권한이 필요합니다</string>
<string name="needlocationpermission">블루투스 스캔을 위해 위치 권한이 필요로 합니다.</string>
<string name="needstoragepermission">로그 파일을 저장하기 위해 저장공간 권한이 필요로 합니다.</string>
<string name="request">요청</string>
@ -1449,4 +1449,8 @@
<string name="phonechecker">\"전화확인\"</string>
<string name="chartmenu">차트 메뉴</string>
<string name="sensitivity_short">AS</string>
<string name="loop_smbrequest_time_label">SMB 요청시간</string>
<string name="loop_smbexecution_time_label">SMB 실행시간</string>
<string name="loop_tbrrequest_time_label">임시 Basal 요청시간</string>
<string name="loop_tbrexecution_time_label">임시 Basal 실행시간</string>
</resources>

View file

@ -122,7 +122,7 @@
<string name="nsclient_xdripfollower">xDrip app in volg-modus.</string>
<string name="nsclient_looponiphone">Loop app op de iPhone.</string>
<string name="nsclient_spikeiphone">Spike app op de iPhone.</string>
<string name="nsclient_hint1">https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Children/kinderen.html</string>
<string name="nsclient_hint1">https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Children/Children.html</string>
<string name="isf_label">Onderwerp: Insulinegevoeligheidsfactor</string>
<string name="isf_increasingvalue">Hogere ISF-waarden leiden tot minder insulineafgifte wanneer AAPS voor hoge BG corrigeert.</string>
<string name="isf_decreasingvalue">Lagere ISF-waarden leiden tot minder insulineafgifte wanneer AAPS voor hoge BG corrigeert.</string>
@ -130,7 +130,7 @@
<string name="isf_preferences">U moet ISF invoeren in Instellingen.</string>
<string name="isf_profile">Het wijzigen van de ISF-waarde in uw profiel is voldoende om de wijziging toe te passen.</string>
<string name="isf_hint1">https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Getting-Started/FAQ.html#insuline-gevoeligheids-factor-insulin-sensitivity-factor-ISF-mmol-l-E-of-mg-dl-E</string>
<string name="isf_hint2">https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Usage/Profielen.html</string>
<string name="isf_hint2">https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Usage/Profiles.html</string>
<string name="ic_label">Onderwerp: De KH ratio</string>
<string name="ic_increasingvalue">Hogere KH ratios leiden tot minder insuline afgifte voor een bepaalde hoeveelheid koolhydraten.</string>
<string name="ic_decreasingvalue">Lagere KH ratios leiden tot minder insuline afgifte voor een bepaalde hoeveelheid koolhydraten.</string>

View file

@ -1447,4 +1447,6 @@
<string name="closed_loop_disabled_with_eb">Closed Loop desabilitado por causa da execução do Bólus Estendido</string>
<string name="extended_bolus_short">BE</string>
<string name="phonechecker">\"VerificadorTelefone\"</string>
<string name="chartmenu">Menu do Gráfico</string>
<string name="sensitivity_short">AS</string>
</resources>

View file

@ -946,6 +946,7 @@
<string name="startobjective">Iniciar primeiro objectivo</string>
<string name="permission">Permissão</string>
<string name="askforpermission">Pedir permissão</string>
<string name="needsystemwindowpermission">Aplicação precisa de permissão de janela do sistema para notificações</string>
<string name="needlocationpermission">Aplicação requer permissão de localização para pesquisa BT</string>
<string name="needstoragepermission">Aplicação necessita da permissão de armazenamento para ser capaz de armazenar ficheiros de registo</string>
<string name="request">Pedido</string>
@ -1449,4 +1450,8 @@
<string name="phonechecker">\"VerificadorTelefone\"</string>
<string name="chartmenu">Menu do Gráfico</string>
<string name="sensitivity_short">AS</string>
<string name="loop_smbrequest_time_label">Hora de solicitação SMB</string>
<string name="loop_smbexecution_time_label">Hora de execução do SMB</string>
<string name="loop_tbrrequest_time_label">Hora de solicitação Basal Temp</string>
<string name="loop_tbrexecution_time_label">Hora de execução Basal Temp</string>
</resources>

View file

@ -948,6 +948,7 @@ Context | Edit Context</string>
<string name="startobjective">Начните первую Цель</string>
<string name="permission">Права доступа</string>
<string name="askforpermission">Запросить права доступа</string>
<string name="needsystemwindowpermission">Приложению требуется разрешение системного окна для уведомлений</string>
<string name="needlocationpermission">Приложение нуждается в разрешении на доступ к определению местоположения для сканирования bluetooth</string>
<string name="needstoragepermission">Приложение нуждается в разрешении доступа к хранению данных для хранения лог-файлов</string>
<string name="request">Запрос</string>
@ -1451,4 +1452,8 @@ Context | Edit Context</string>
<string name="phonechecker">\"PhoneChecker\"</string>
<string name="chartmenu">Меню графика</string>
<string name="sensitivity_short">Авточувств</string>
<string name="loop_smbrequest_time_label">Время запроса микроболюса SMB</string>
<string name="loop_smbexecution_time_label">Время выполнения микроболюса SMB</string>
<string name="loop_tbrrequest_time_label">Время запроса временной базальной скорости</string>
<string name="loop_tbrexecution_time_label">Время выполнения временной базальной скорости</string>
</resources>

View file

@ -946,6 +946,7 @@
<string name="startobjective">Spusťte prvý cieľ</string>
<string name="permission">Povolenie</string>
<string name="askforpermission">Vyžiadať si povolenie</string>
<string name="needsystemwindowpermission">Aplikácia vyžaduje pre oznámenia systémové oprávnenie</string>
<string name="needlocationpermission">Aplikácia vyžaduje povolenie \"polohy\", aby mohla vyhľadávať BT zariadenia</string>
<string name="needstoragepermission">Aplikácia vyžaduje prístup k úložisku, aby mohla ukladať logy</string>
<string name="request">Požiadavka</string>
@ -1449,4 +1450,8 @@
<string name="phonechecker">PhoneChecker</string>
<string name="chartmenu">Grafové menu</string>
<string name="sensitivity_short">AS</string>
<string name="loop_smbrequest_time_label">Čas požiadavky SMB</string>
<string name="loop_smbexecution_time_label">Čas aplikácie SMB</string>
<string name="loop_tbrrequest_time_label">Čas požiadavky dočasného bazálu</string>
<string name="loop_tbrexecution_time_label">Čas spustenia dočasného bazálu</string>
</resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources></resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources></resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources></resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources></resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources></resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources></resources>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<!-- <string name="fi_lang" translatable="false">Finnish</string> -->
<!-- <string name="he_lang" translatable="false">Hebrew</string> -->
<!-- <string name="ga_lang" translatable="false">Irish</string> -->
<!-- <string name="ja_lang" translatable="false">Japanese</string> -->
<!-- Pump Abstract -->
<!-- Medtronic (MDT) - Base -->
<!-- MDT Configuration -->
<!-- RL BLE Scanning -->
<!-- RL Status Page -->
<!-- RL State -->
<!-- RL Errors -->
<!-- RL Target Device -->
<!-- MDT Errors -->
<!-- MDT History -->
<!-- MDT Pump Status -->
<!-- <string name="medtronic_cmd_profile_not_set">Remote Basal profile setting is not supported. Please modify Basal profile on your pump manually.</string> -->
</resources>

View file

@ -947,6 +947,7 @@ Eversense-appen.</string>
<string name="startobjective">Påbörja ditt första mål</string>
<string name="permission">Behörighet</string>
<string name="askforpermission">Be om behörighet</string>
<string name="needsystemwindowpermission">Applikationen behöver förhöjd behörighet för aviseringar</string>
<string name="needlocationpermission">Appen behöver behörighet att använda Platsinfo för att kunna söka efter Bluetooth-enheter</string>
<string name="needstoragepermission">Appen behöver behörighet att använda Lagring för att kunna spara loggfiler</string>
<string name="request">Begäran</string>
@ -1448,4 +1449,10 @@ Eversense-appen.</string>
<string name="closed_loop_disabled_with_eb">Closed Loop-läget inaktiverat pga att en förlängd bolus är aktiv</string>
<string name="extended_bolus_short">FB</string>
<string name="phonechecker">Telefonkontroll</string>
<string name="chartmenu">Diagrammeny</string>
<string name="sensitivity_short">AS</string>
<string name="loop_smbrequest_time_label">SMB begärd</string>
<string name="loop_smbexecution_time_label">SMB utförd</string>
<string name="loop_tbrrequest_time_label">Basalförändring begärd</string>
<string name="loop_tbrexecution_time_label">Basalförändring utförd</string>
</resources>

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="app_name">AAPS</string>
<string name="label_actions_activity">AAPS</string>
@ -51,6 +50,7 @@
<string name="pref_low">Bajo</string>
<string name="pref_medium">Medio</string>
<string name="pref_high">Alto</string>
<string name="pref_auto">Auto</string>
<string name="pref_big_numbers">Números grandes</string>
<string name="pref_ring_history">Historial de Ring</string>
<string name="pref_light_ring_history">Historial de Ring Light</string>

View file

@ -35,7 +35,7 @@
<string name="pref_show_ago">Afficher Min Passées</string>
<string name="pref_dark" comment="Enables dark visual theme">Sombre</string>
<string name="pref_highlight_basals">Surbrillance Basale</string>
<string name="pref_matching_divider" comment="To make divider match its background with background of whole watchface">Séparateur Noir</string>
<string name="pref_matching_divider" comment="To make divider match its background with background of whole watchface">Séparateur Invisible</string>
<string name="pref_chart_timeframe">Echelle Graphique</string>
<string name="pref_1_hour">1 heure</string>
<string name="pref_2_hours">2 heures</string>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources></resources>